Search in sources :

Example 36 with Change

use of com.gitblit.models.TicketModel.Change in project gitblit by gitblit.

the class ITicketService method deletePatchset.

/**
	 * Deletes a patchset from a ticket.
	 *
	 * @param ticket
	 * @param patchset
	 *            the patchset to delete (should be the highest revision)
	 * @param userName
	 * 			the user deleting the commit
	 * @return the revised ticket if the deletion was successful
	 * @since 1.8.0
	 */
public final TicketModel deletePatchset(TicketModel ticket, Patchset patchset, String userName) {
    Change deletion = new Change(userName);
    deletion.patchset = new Patchset();
    deletion.patchset.number = patchset.number;
    deletion.patchset.rev = patchset.rev;
    deletion.patchset.type = PatchsetType.Delete;
    //Find and delete references to tickets by the removed commits
    List<TicketLink> patchsetTicketLinks = JGitUtils.identifyTicketsBetweenCommits(repositoryManager.getRepository(ticket.repository), settings, patchset.base, patchset.tip);
    for (TicketLink link : patchsetTicketLinks) {
        link.isDelete = true;
    }
    deletion.pendingLinks = patchsetTicketLinks;
    RepositoryModel repositoryModel = repositoryManager.getRepositoryModel(ticket.repository);
    TicketModel revisedTicket = updateTicket(repositoryModel, ticket.number, deletion);
    return revisedTicket;
}
Also used : Patchset(com.gitblit.models.TicketModel.Patchset) TicketModel(com.gitblit.models.TicketModel) Change(com.gitblit.models.TicketModel.Change) RepositoryModel(com.gitblit.models.RepositoryModel) TicketLink(com.gitblit.models.TicketModel.TicketLink)

Example 37 with Change

use of com.gitblit.models.TicketModel.Change in project gitblit by gitblit.

the class TicketNotifier method setRecipients.

/**
	 * Set the proper recipients for a ticket.
	 *
	 * @param ticket
	 * @param mailing
	 */
protected void setRecipients(TicketModel ticket, Mailing mailing) {
    RepositoryModel repository = repositoryManager.getRepositoryModel(ticket.repository);
    //
    // Direct TO recipients
    // reporter & responsible
    //
    Set<String> tos = new TreeSet<String>();
    tos.add(ticket.createdBy);
    if (!StringUtils.isEmpty(ticket.responsible)) {
        tos.add(ticket.responsible);
    }
    Set<String> toAddresses = new TreeSet<String>();
    for (String name : tos) {
        UserModel user = userManager.getUserModel(name);
        if (user != null && !user.disabled) {
            if (!StringUtils.isEmpty(user.emailAddress)) {
                if (user.canView(repository)) {
                    toAddresses.add(user.emailAddress);
                } else {
                    LoggerFactory.getLogger(getClass()).warn(MessageFormat.format("ticket {0}-{1,number,0}: {2} can not receive notification", repository.name, ticket.number, user.username));
                }
            }
        }
    }
    //
    // CC recipients
    //
    Set<String> ccs = new TreeSet<String>();
    // repository owners
    if (!ArrayUtils.isEmpty(repository.owners)) {
        ccs.addAll(repository.owners);
    }
    // cc users mentioned in last comment
    Change lastChange = ticket.changes.get(ticket.changes.size() - 1);
    if (lastChange.hasComment()) {
        Pattern p = Pattern.compile(Constants.REGEX_TICKET_MENTION);
        Matcher m = p.matcher(lastChange.comment.text);
        while (m.find()) {
            String username = m.group("user");
            ccs.add(username);
        }
    }
    // cc users who are watching the ticket
    ccs.addAll(ticket.getWatchers());
    // TODO cc users who are watching the repository
    Set<String> ccAddresses = new TreeSet<String>();
    for (String name : ccs) {
        UserModel user = userManager.getUserModel(name);
        if (user != null && !user.disabled) {
            if (!StringUtils.isEmpty(user.emailAddress)) {
                if (user.canView(repository)) {
                    ccAddresses.add(user.emailAddress);
                } else {
                    LoggerFactory.getLogger(getClass()).warn(MessageFormat.format("ticket {0}-{1,number,0}: {2} can not receive notification", repository.name, ticket.number, user.username));
                }
            }
        }
    }
    // cc repository mailing list addresses
    if (!ArrayUtils.isEmpty(repository.mailingLists)) {
        ccAddresses.addAll(repository.mailingLists);
    }
    ccAddresses.addAll(settings.getStrings(Keys.mail.mailingLists));
    // respect the author's email preference
    UserModel lastAuthor = userManager.getUserModel(lastChange.author);
    if (lastAuthor != null && !lastAuthor.getPreferences().isEmailMeOnMyTicketChanges()) {
        toAddresses.remove(lastAuthor.emailAddress);
        ccAddresses.remove(lastAuthor.emailAddress);
    }
    mailing.setRecipients(toAddresses);
    mailing.setCCs(ccAddresses);
}
Also used : UserModel(com.gitblit.models.UserModel) Pattern(java.util.regex.Pattern) Matcher(java.util.regex.Matcher) TreeSet(java.util.TreeSet) RepositoryModel(com.gitblit.models.RepositoryModel) Change(com.gitblit.models.TicketModel.Change)

Example 38 with Change

use of com.gitblit.models.TicketModel.Change in project gitblit by gitblit.

the class ITicketService method deleteMilestone.

/**
	 * Deletes a milestone.
	 *
	 * @param repository
	 * @param milestone
	 * @param createdBy
	 * @param notifyOpenTickets
	 * @return true if successful
	 * @since 1.6.0
	 */
public synchronized boolean deleteMilestone(RepositoryModel repository, String milestone, String createdBy, boolean notifyOpenTickets) {
    if (StringUtils.isEmpty(milestone)) {
        throw new IllegalArgumentException("milestone can not be empty!");
    }
    Repository db = null;
    try {
        TicketMilestone tm = getMilestone(repository, milestone);
        if (tm == null) {
            return false;
        }
        db = repositoryManager.getRepository(repository.name);
        StoredConfig config = db.getConfig();
        config.unsetSection(MILESTONE, milestone);
        config.save();
        milestonesCache.remove(repository.name);
        TicketNotifier notifier = createNotifier();
        for (QueryResult qr : tm.tickets) {
            Change change = new Change(createdBy);
            change.setField(Field.milestone, "");
            TicketModel ticket = updateTicket(repository, qr.number, change);
            if (notifyOpenTickets && ticket.isOpen()) {
                notifier.queueMailing(ticket);
            }
        }
        if (notifyOpenTickets) {
            notifier.sendAll();
        }
        return true;
    } catch (IOException e) {
        log.error("failed to delete milestone " + milestone + " in " + repository, e);
    } finally {
        if (db != null) {
            db.close();
        }
    }
    return false;
}
Also used : StoredConfig(org.eclipse.jgit.lib.StoredConfig) Repository(org.eclipse.jgit.lib.Repository) TicketModel(com.gitblit.models.TicketModel) Change(com.gitblit.models.TicketModel.Change) IOException(java.io.IOException)

Example 39 with Change

use of com.gitblit.models.TicketModel.Change in project gitblit by gitblit.

the class RedisTicketService method getTicketImpl.

/**
	 * Retrieves the ticket from the repository.
	 *
	 * @param repository
	 * @param ticketId
	 * @return a ticket, if it exists, otherwise null
	 */
@Override
protected TicketModel getTicketImpl(RepositoryModel repository, long ticketId) {
    Jedis jedis = pool.getResource();
    if (jedis == null) {
        return null;
    }
    try {
        List<Change> changes = getJournal(jedis, repository, ticketId);
        if (ArrayUtils.isEmpty(changes)) {
            log.warn("Empty journal for {}:{}", repository, ticketId);
            return null;
        }
        TicketModel ticket = TicketModel.buildTicket(changes);
        ticket.project = repository.projectPath;
        ticket.repository = repository.name;
        ticket.number = ticketId;
        log.debug("rebuilt ticket {} from Redis @ {}", ticketId, getUrl());
        return ticket;
    } catch (JedisException e) {
        log.error("failed to retrieve ticket from Redis @ " + getUrl(), e);
        pool.returnBrokenResource(jedis);
        jedis = null;
    } finally {
        if (jedis != null) {
            pool.returnResource(jedis);
        }
    }
    return null;
}
Also used : Jedis(redis.clients.jedis.Jedis) JedisException(redis.clients.jedis.exceptions.JedisException) TicketModel(com.gitblit.models.TicketModel) Change(com.gitblit.models.TicketModel.Change)

Example 40 with Change

use of com.gitblit.models.TicketModel.Change in project gitblit by gitblit.

the class TicketReferenceTest method newTicket.

private static Change newTicket(String title) {
    Change change = new Change("JUnit");
    change.setField(Field.title, title);
    change.setField(Field.type, TicketModel.Type.Bug);
    return change;
}
Also used : Change(com.gitblit.models.TicketModel.Change)

Aggregations

Change (com.gitblit.models.TicketModel.Change)45 TicketModel (com.gitblit.models.TicketModel)32 IOException (java.io.IOException)15 Repository (org.eclipse.jgit.lib.Repository)9 Test (org.junit.Test)9 Patchset (com.gitblit.models.TicketModel.Patchset)8 TicketLink (com.gitblit.models.TicketModel.TicketLink)7 ArrayList (java.util.ArrayList)7 RepositoryModel (com.gitblit.models.RepositoryModel)6 UserModel (com.gitblit.models.UserModel)5 RevCommit (org.eclipse.jgit.revwalk.RevCommit)4 Reference (com.gitblit.models.TicketModel.Reference)3 Ref (org.eclipse.jgit.lib.Ref)3 RevWalk (org.eclipse.jgit.revwalk.RevWalk)3 ReceiveCommand (org.eclipse.jgit.transport.ReceiveCommand)3 PatchsetHook (com.gitblit.extensions.PatchsetHook)2 PathChangeModel (com.gitblit.models.PathModel.PathChangeModel)2 RefModel (com.gitblit.models.RefModel)2 Attachment (com.gitblit.models.TicketModel.Attachment)2 Review (com.gitblit.models.TicketModel.Review)2