Package com.gitblit.models.TicketModel

Examples of com.gitblit.models.TicketModel.Change


    DataView<Change> reviewsView = new DataView<Change>("reviews", reviewsDp) {
      private static final long serialVersionUID = 1L;

      @Override
      public void populateItem(final Item<Change> item) {
        Change change = item.getModelObject();
        final String username = change.author;
        UserModel user = app().users().getUserModel(username);
        if (user == null) {
          item.add(new Label("reviewer", username));
        } else {
View Full Code Here


  }

  protected void review(Score score) {
    UserModel user = GitBlitWebSession.get().getUser();
    Patchset ps = ticket.getCurrentPatchset();
    Change change = new Change(user.username);
    change.review(ps, score, !ticket.isReviewer(user.username));
    if (!ticket.isWatching(user.username)) {
      change.watch(user.username);
    }
    TicketModel updatedTicket = app().tickets().updateTicket(getRepositoryModel(), ticket.number, change);
    app().tickets().createNotifier().sendMailing(updatedTicket);
    setResponsePage(TicketsPage.class, getPageParameters());
  }
View Full Code Here

    }
    return null;
  }

  protected String getSubject(TicketModel ticket) {
    Change lastChange = ticket.changes.get(ticket.changes.size() - 1);
    boolean newTicket = lastChange.isStatusChange() && ticket.changes.size() == 1;
    String re = newTicket ? "" : "Re: ";
    String subject = MessageFormat.format("{0}[{1}] {2} (#{3,number,0})",
        re, StringUtils.stripDotGit(ticket.repository), ticket.title, ticket.number);
    return subject;
  }
View Full Code Here

        re, StringUtils.stripDotGit(ticket.repository), ticket.title, ticket.number);
    return subject;
  }

  protected String formatLastChange(TicketModel ticket) {
    Change lastChange = ticket.changes.get(ticket.changes.size() - 1);
    UserModel user = getUserModel(lastChange.author);

    // define the fields we do NOT want to see in an email notification
    Set<TicketModel.Field> fieldExclusions = new HashSet<TicketModel.Field>();
    fieldExclusions.addAll(Arrays.asList(Field.watchers, Field.voters));

    StringBuilder sb = new StringBuilder();
    boolean newTicket = lastChange.isStatusChange() && Status.New == lastChange.getStatus();
    boolean isFastForward = true;
    List<RevCommit> commits = null;
    DiffStat diffstat = null;

    String pattern;
    if (lastChange.hasPatchset()) {
      // patchset uploaded
      Patchset patchset = lastChange.patchset;
      String base = "";
      // determine the changed paths
      Repository repo = null;
      try {
        repo = repositoryManager.getRepository(ticket.repository);
        if (patchset.isFF() && (patchset.rev > 1)) {
          // fast-forward update, just show the new data
          isFastForward = true;
          Patchset prev = ticket.getPatchset(patchset.number, patchset.rev - 1);
          base = prev.tip;
        } else {
          // proposal OR non-fast-forward update
          isFastForward = false;
          base = patchset.base;
        }

        diffstat = DiffUtils.getDiffStat(repo, base, patchset.tip);
        commits = JGitUtils.getRevLog(repo, base, patchset.tip);
      } catch (Exception e) {
        Logger.getLogger(getClass()).error("failed to get changed paths", e);
      } finally {
        if (repo != null) {
          repo.close();
        }
      }

      String compareUrl = ticketService.getCompareUrl(ticket, base, patchset.tip);

      if (newTicket) {
        // new proposal
        pattern = "**{0}** is proposing a change.";
        sb.append(MessageFormat.format(pattern, user.getDisplayName()));
        fieldExclusions.add(Field.status);
        fieldExclusions.add(Field.title);
        fieldExclusions.add(Field.body);
      } else {
        // describe the patchset
        if (patchset.isFF()) {
          pattern = "**{0}** added {1} {2} to patchset {3}.";
          sb.append(MessageFormat.format(pattern, user.getDisplayName(), patchset.added, patchset.added == 1 ? "commit" : "commits", patchset.number));
        } else {
          pattern = "**{0}** uploaded patchset {1}. *({2})*";
          sb.append(MessageFormat.format(pattern, user.getDisplayName(), patchset.number, patchset.type.toString().toUpperCase()));
        }
      }
      sb.append(HARD_BRK);

      sb.append(MessageFormat.format("{0} {1}, {2} {3}, <span style=\"color:darkgreen;\">+{4} insertions</span>, <span style=\"color:darkred;\">-{5} deletions</span> from {6}. [compare]({7})",
          commits.size(), commits.size() == 1 ? "commit" : "commits",
          diffstat.paths.size(),
          diffstat.paths.size() == 1 ? "file" : "files",
          diffstat.getInsertions(),
          diffstat.getDeletions(),
          isFastForward ? "previous revision" : "merge base",
          compareUrl));

      // note commit additions on a rebase,if any
      switch (lastChange.patchset.type) {
      case Rebase:
        if (lastChange.patchset.added > 0) {
          sb.append(SOFT_BRK);
          sb.append(MessageFormat.format("{0} {1} added.", lastChange.patchset.added, lastChange.patchset.added == 1 ? "commit" : "commits"));
        }
        break;
      default:
        break;
      }
      sb.append(HARD_BRK);
    } else if (lastChange.isStatusChange()) {
      if (newTicket) {
        fieldExclusions.add(Field.status);
        fieldExclusions.add(Field.title);
        fieldExclusions.add(Field.body);
        pattern = "**{0}** created this ticket.";
        sb.append(MessageFormat.format(pattern, user.getDisplayName()));
      } else if (lastChange.hasField(Field.mergeSha)) {
        // closed by merged
        pattern = "**{0}** closed this ticket by merging {1} to {2}.";

        // identify patchset that closed the ticket
        String merged = ticket.mergeSha;
        for (Patchset patchset : ticket.getPatchsets()) {
          if (patchset.tip.equals(ticket.mergeSha)) {
            merged = patchset.toString();
            break;
          }
        }
        sb.append(MessageFormat.format(pattern, user.getDisplayName(), merged, ticket.mergeTo));
      } else {
        // workflow status change by user
        pattern = "**{0}** changed the status of this ticket to **{1}**.";
        sb.append(MessageFormat.format(pattern, user.getDisplayName(), lastChange.getStatus().toString().toUpperCase()));
      }
      sb.append(HARD_BRK);
    } else if (lastChange.hasReview()) {
      // review
      Review review = lastChange.review;
      pattern = "**{0}** has reviewed patchset {1,number,0} revision {2,number,0}.";
      sb.append(MessageFormat.format(pattern, user.getDisplayName(), review.patchset, review.rev));
      sb.append(HARD_BRK);

      String d = settings.getString(Keys.web.datestampShortFormat, "yyyy-MM-dd");
      String t = settings.getString(Keys.web.timeFormat, "HH:mm");
      DateFormat df = new SimpleDateFormat(d + " " + t);
      List<Change> reviews = ticket.getReviews(ticket.getPatchset(review.patchset, review.rev));
      sb.append("| Date | Reviewer      | Score | Description  |\n");
      sb.append("| :--- | :------------ | :---: | :----------- |\n");
      for (Change change : reviews) {
        String name = change.author;
        UserModel u = userManager.getUserModel(change.author);
        if (u != null) {
          name = u.getDisplayName();
        }
        String score;
        switch (change.review.score) {
        case approved:
          score = MessageFormat.format(addPattern, change.review.score.getValue());
          break;
        case vetoed:
          score = MessageFormat.format(delPattern, Math.abs(change.review.score.getValue()));
          break;
        default:
          score = "" + change.review.score.getValue();
        }
        String date = df.format(change.date);
        sb.append(String.format("| %1$s | %2$s | %3$s | %4$s |\n",
            date, name, score, change.review.score.toString()));
      }
      sb.append(HARD_BRK);
    } else if (lastChange.hasComment()) {
      // comment update
      sb.append(MessageFormat.format("**{0}** commented on this ticket.", user.getDisplayName()));
      sb.append(HARD_BRK);
    } else {
      // general update
      pattern = "**{0}** has updated this ticket.";
      sb.append(MessageFormat.format(pattern, user.getDisplayName()));
      sb.append(HARD_BRK);
    }

    // ticket link
    sb.append(MessageFormat.format("[view ticket {0,number,0}]({1})",
        ticket.number, ticketService.getTicketUrl(ticket)));
    sb.append(HARD_BRK);

    if (newTicket) {
      // ticket title
      sb.append(MessageFormat.format("### {0}", ticket.title));
      sb.append(HARD_BRK);

      // ticket description, on state change
      if (StringUtils.isEmpty(ticket.body)) {
        sb.append("<span style=\"color: #888;\">no description entered</span>");
      } else {
        sb.append(ticket.body);
      }
      sb.append(HARD_BRK);
      sb.append(HR);
    }

    // field changes
    if (lastChange.hasFieldChanges()) {
      Map<Field, String> filtered = new HashMap<Field, String>();
      for (Map.Entry<Field, String> fc : lastChange.fields.entrySet()) {
        if (!fieldExclusions.contains(fc.getKey())) {
          // field is included
          filtered.put(fc.getKey(), fc.getValue());
        }
      }

      // sort by field ordinal
      List<Field> fields = new ArrayList<Field>(filtered.keySet());
      Collections.sort(fields);

      if (filtered.size() > 0) {
        sb.append(HARD_BRK);
        sb.append("| Field Changes               ||\n");
        sb.append("| ------------: | :----------- |\n");
        for (Field field : fields) {
          String value;
          if (filtered.get(field) == null) {
            value = "";
          } else {
            value = filtered.get(field).replace("\r\n", "<br/>").replace("\n", "<br/>").replace("|", "&#124;");
          }
          sb.append(String.format("| **%1$s:** | %2$s |\n", field.name(), value));
        }
        sb.append(HARD_BRK);
      }
    }

    // new comment
    if (lastChange.hasComment()) {
      sb.append(HR);
      sb.append(lastChange.comment.text);
      sb.append(HARD_BRK);
    }

    // insert the patchset details and review instructions
    if (lastChange.hasPatchset() && ticket.isOpen()) {
      if (commits != null && commits.size() > 0) {
        // append the commit list
        String title = isFastForward ? "Commits added to previous patchset revision" : "All commits in patchset";
        sb.append(MessageFormat.format("| {0} |||\n", title));
        sb.append("| SHA | Author | Title |\n");
View Full Code Here

    if (!ArrayUtils.isEmpty(repository.owners)) {
      tos.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("\\s@([A-Za-z0-9-_]+)");
      Matcher m = p.matcher(lastChange.comment.text);
      while (m.find()) {
        String username = m.group();
        ccs.add(username);
View Full Code Here

      @Override
      public void onSubmit(AjaxRequestTarget target, Form<?> form) {
        String txt = markdownEditor.getText();
        if (change == null) {
          // new comment
          Change newComment = new Change(user.username);
          newComment.comment(txt);
          if (!ticket.isWatching(user.username)) {
            newComment.watch(user.username);
          }
          RepositoryModel repository = app().repositories().getRepositoryModel(ticket.repository);
          TicketModel updatedTicket = app().tickets().updateTicket(repository, ticket.number, newComment);
          if (updatedTicket != null) {
            app().tickets().createNotifier().sendMailing(updatedTicket);
View Full Code Here

        }

        TicketModel ticket = app().tickets().getTicket(getRepositoryModel(), ticketId);

        String createdBy = GitBlitWebSession.get().getUsername();
        Change change = new Change(createdBy);

        String title = titleModel.getObject();
        if (StringUtils.isEmpty(title)) {
          return;
        }

        if (!ticket.title.equals(title)) {
          // title change
          change.setField(Field.title, title);
        }

        String description = descriptionEditor.getText();
        if ((StringUtils.isEmpty(ticket.body) && !StringUtils.isEmpty(description))
            || (!StringUtils.isEmpty(ticket.body) && !ticket.body.equals(description))) {
          // description change
          change.setField(Field.body, description);
        }

        Status status = statusModel.getObject();
        if (!ticket.status.equals(status)) {
          // status change
          change.setField(Field.status, status);
        }

        Type type = typeModel.getObject();
        if (!ticket.type.equals(type)) {
          // type change
          change.setField(Field.type, type);
        }

        String topic = topicModel.getObject();
        if ((StringUtils.isEmpty(ticket.topic) && !StringUtils.isEmpty(topic))
            || (!StringUtils.isEmpty(topic) && !topic.equals(ticket.topic))) {
          // topic change
          change.setField(Field.topic, topic);
        }

        TicketResponsible responsible = responsibleModel == null ? null : responsibleModel.getObject();
        if (responsible != null && !responsible.username.equals(ticket.responsible)) {
          // responsible change
          change.setField(Field.responsible, responsible.username);
          if (!StringUtils.isEmpty(responsible.username)) {
            if (!ticket.isWatching(responsible.username)) {
              change.watch(responsible.username);
            }
          }
        }

        TicketMilestone milestone = milestoneModel == null ? null : milestoneModel.getObject();
        if (milestone != null && !milestone.name.equals(ticket.milestone)) {
          // milestone change
          if (NIL.equals(milestone.name)) {
            change.setField(Field.milestone, "");
          } else {
            change.setField(Field.milestone, milestone.name);
          }
        }

        String mergeTo = mergeToModel.getObject();
        if ((StringUtils.isEmpty(ticket.mergeTo) && !StringUtils.isEmpty(mergeTo))
            || (!StringUtils.isEmpty(mergeTo) && !mergeTo.equals(ticket.mergeTo))) {
          // integration branch change
          change.setField(Field.mergeTo, mergeTo);
        }

        if (change.hasFieldChanges()) {
          if (!ticket.isWatching(createdBy)) {
            change.watch(createdBy);
          }
          ticket = app().tickets().updateTicket(getRepositoryModel(), ticket.number, change);
          if (ticket != null) {
            TicketNotifier notifier = app().tickets().createNotifier();
            notifier.sendMailing(ticket);
View Full Code Here

        return null;
      }
    } else {
      if (ticket.isMerged()) {
        // ticket already merged & resolved
        Change mergeChange = null;
        for (Change change : ticket.changes) {
          if (change.isMerge()) {
            mergeChange = change;
            break;
          }
View Full Code Here

   *
   * @param cmd
   * @return a ticket if the creation or update was successful
   */
  private TicketModel processPatchset(PatchsetCommand cmd) {
    Change change = cmd.getChange();

    if (cmd.isNewTicket()) {
      // create the ticket object
      TicketModel ticket = ticketService.createTicket(repository, cmd.getTicketId(), change);
      if (ticket != null) {
View Full Code Here

          }
        }

        String mergeSha = c.getName();
        String mergeTo = Repository.shortenRefName(cmd.getRefName());
        Change change;
        Patchset patchset;
        if (knownPatchset) {
          // identify merged patchset by the patchset tip
          patchset = null;
          for (Patchset ps : ticket.getPatchsets()) {
            if (ps.tip.equals(mergeSha)) {
              patchset = ps;
              break;
            }
          }

          if (patchset == null) {
            // should not happen - unless ticket has been hacked
            sendError("Failed to find the patchset for {0} in ticket {1,number,0}?!",
                mergeSha, ticket.number);
            continue;
          }

          // create a new change
          change = new Change(user.username);
        } else {
          // new patchset pushed by user
          String base = cmd.getOldId().getName();
          patchset = newPatchset(ticket, base, mergeSha);
          PatchsetCommand psCmd = new PatchsetCommand(user.username, patchset);
          psCmd.updateTicket(c, mergeTo, ticket, null);

          // create a ticket patchset ref
          updateRef(psCmd.getPatchsetBranch(), c.getId(), patchset.type);
          RefUpdate ru = updateRef(psCmd.getTicketBranch(), c.getId(), patchset.type);
          updateReflog(ru);

          // create a change from the patchset command
          change = psCmd.getChange();
        }

        // set the common change data about the merge
        change.setField(Field.status, Status.Merged);
        change.setField(Field.mergeSha, mergeSha);
        change.setField(Field.mergeTo, mergeTo);

        if (StringUtils.isEmpty(ticket.responsible)) {
          // unassigned tickets are assigned to the closer
          change.setField(Field.responsible, user.username);
        }

        ticket = ticketService.updateTicket(repository, ticket.number, change);
        if (ticket != null) {
          sendInfo("");
View Full Code Here

TOP

Related Classes of com.gitblit.models.TicketModel.Change

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.