| | |
| | | import com.gitblit.models.TicketModel.Patchset; |
| | | import com.gitblit.models.TicketModel.Status; |
| | | import com.gitblit.tickets.TicketIndexer.Lucene; |
| | | import com.gitblit.utils.DeepCopier; |
| | | import com.gitblit.utils.DiffUtils; |
| | | import com.gitblit.utils.DiffUtils.DiffStat; |
| | | import com.gitblit.utils.StringUtils; |
| | |
| | | } catch (IOException e) { |
| | | log.error("failed to create label " + label + " in " + repository, e); |
| | | } finally { |
| | | db.close(); |
| | | if (db != null) { |
| | | db.close(); |
| | | } |
| | | } |
| | | return lb; |
| | | } |
| | |
| | | } catch (IOException e) { |
| | | log.error("failed to update label " + label + " in " + repository, e); |
| | | } finally { |
| | | db.close(); |
| | | if (db != null) { |
| | | db.close(); |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | |
| | | } catch (IOException e) { |
| | | log.error("failed to rename label " + oldName + " in " + repository, e); |
| | | } finally { |
| | | db.close(); |
| | | if (db != null) { |
| | | db.close(); |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | |
| | | } catch (IOException e) { |
| | | log.error("failed to delete label " + label + " in " + repository, e); |
| | | } finally { |
| | | db.close(); |
| | | if (db != null) { |
| | | db.close(); |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | |
| | | public TicketMilestone getMilestone(RepositoryModel repository, String milestone) { |
| | | for (TicketMilestone ms : getMilestones(repository)) { |
| | | if (ms.name.equalsIgnoreCase(milestone)) { |
| | | TicketMilestone tm = DeepCopier.copy(ms); |
| | | String q = QueryBuilder.q(Lucene.rid.matches(repository.getRID())).and(Lucene.milestone.matches(milestone)).build(); |
| | | ms.tickets = indexer.queryFor(q, 1, 0, Lucene.number.name(), true); |
| | | return ms; |
| | | tm.tickets = indexer.queryFor(q, 1, 0, Lucene.number.name(), true); |
| | | return tm; |
| | | } |
| | | } |
| | | return null; |
| | |
| | | } catch (IOException e) { |
| | | log.error("failed to create milestone " + milestone + " in " + repository, e); |
| | | } finally { |
| | | db.close(); |
| | | if (db != null) { |
| | | db.close(); |
| | | } |
| | | } |
| | | return ms; |
| | | } |
| | |
| | | } catch (IOException e) { |
| | | log.error("failed to update milestone " + milestone + " in " + repository, e); |
| | | } finally { |
| | | db.close(); |
| | | if (db != null) { |
| | | db.close(); |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | |
| | | * @since 1.4.0 |
| | | */ |
| | | public synchronized boolean renameMilestone(RepositoryModel repository, String oldName, String newName, String createdBy) { |
| | | return renameMilestone(repository, oldName, newName, createdBy, true); |
| | | } |
| | | |
| | | /** |
| | | * Renames a milestone. |
| | | * |
| | | * @param repository |
| | | * @param oldName |
| | | * @param newName |
| | | * @param createdBy |
| | | * @param notifyOpenTickets |
| | | * @return true if successful |
| | | * @since 1.6.0 |
| | | */ |
| | | public synchronized boolean renameMilestone(RepositoryModel repository, String oldName, |
| | | String newName, String createdBy, boolean notifyOpenTickets) { |
| | | if (StringUtils.isEmpty(newName)) { |
| | | throw new IllegalArgumentException("new milestone can not be empty!"); |
| | | } |
| | |
| | | config.setString(MILESTONE, newName, STATUS, milestone.status.name()); |
| | | config.setString(MILESTONE, newName, COLOR, milestone.color); |
| | | if (milestone.due != null) { |
| | | config.setString(MILESTONE, milestone.name, DUE, |
| | | config.setString(MILESTONE, newName, DUE, |
| | | new SimpleDateFormat(DUE_DATE_PATTERN).format(milestone.due)); |
| | | } |
| | | config.save(); |
| | |
| | | Change change = new Change(createdBy); |
| | | change.setField(Field.milestone, newName); |
| | | TicketModel ticket = updateTicket(repository, qr.number, change); |
| | | notifier.queueMailing(ticket); |
| | | if (notifyOpenTickets && ticket.isOpen()) { |
| | | notifier.queueMailing(ticket); |
| | | } |
| | | } |
| | | notifier.sendAll(); |
| | | if (notifyOpenTickets) { |
| | | notifier.sendAll(); |
| | | } |
| | | |
| | | return true; |
| | | } catch (IOException e) { |
| | | log.error("failed to rename milestone " + oldName + " in " + repository, e); |
| | | } finally { |
| | | db.close(); |
| | | if (db != null) { |
| | | db.close(); |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | |
| | | * @since 1.4.0 |
| | | */ |
| | | public synchronized boolean deleteMilestone(RepositoryModel repository, String milestone, String createdBy) { |
| | | return deleteMilestone(repository, milestone, createdBy, true); |
| | | } |
| | | |
| | | /** |
| | | * 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); |
| | | db = repositoryManager.getRepository(repository.name); |
| | | StoredConfig config = db.getConfig(); |
| | | config.unsetSection(MILESTONE, milestone); |
| | |
| | | |
| | | 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 { |
| | | db.close(); |
| | | if (db != null) { |
| | | db.close(); |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | |
| | | * @since 1.4.0 |
| | | */ |
| | | public abstract boolean hasTicket(RepositoryModel repository, long ticketId); |
| | | |
| | | /** |
| | | * Returns all tickets. This is not a Lucene search! |
| | | * |
| | | * @return all tickets |
| | | */ |
| | | public List<TicketModel> getTickets() { |
| | | return getTickets(null, null); |
| | | } |
| | | |
| | | /** |
| | | * Returns all tickets. This is not a Lucene search! |
| | | * |
| | | * @param repository |
| | | * @return all tickets |
| | | * @return all tickets of a given repository |
| | | * @since 1.4.0 |
| | | */ |
| | | public List<TicketModel> getTickets(RepositoryModel repository) { |