|
|
|
@ -4,6 +4,7 @@
|
|
|
|
|
|
|
|
|
|
package io.gitea.mylyn.core;
|
|
|
|
|
|
|
|
|
|
import java.time.OffsetDateTime;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Collections;
|
|
|
|
|
import java.util.Comparator;
|
|
|
|
@ -12,10 +13,12 @@ import java.util.List;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
import java.util.regex.Matcher;
|
|
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
|
|
import org.eclipse.core.internal.registry.OffsetTable;
|
|
|
|
|
import org.eclipse.core.runtime.CoreException;
|
|
|
|
|
import org.eclipse.core.runtime.IProgressMonitor;
|
|
|
|
|
import org.eclipse.mylyn.tasks.core.ITaskMapping;
|
|
|
|
|
import org.eclipse.mylyn.tasks.core.RepositoryResponse;
|
|
|
|
|
import org.eclipse.mylyn.tasks.core.RepositoryResponse.ResponseKind;
|
|
|
|
|
import org.eclipse.mylyn.tasks.core.TaskRepository;
|
|
|
|
|
import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
|
|
|
|
|
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
|
|
|
|
@ -26,11 +29,17 @@ import org.eclipse.mylyn.tasks.core.data.TaskData;
|
|
|
|
|
import org.eclipse.mylyn.tasks.core.data.TaskOperation;
|
|
|
|
|
|
|
|
|
|
import io.gitea.ApiException;
|
|
|
|
|
import io.gitea.api.IssueApi;
|
|
|
|
|
import io.gitea.model.Comment;
|
|
|
|
|
import io.gitea.model.CreateIssueCommentOption;
|
|
|
|
|
import io.gitea.model.CreateIssueOption;
|
|
|
|
|
import io.gitea.model.EditIssueOption;
|
|
|
|
|
import io.gitea.model.GiteaDateTimeUtils;
|
|
|
|
|
import io.gitea.model.GiteaPriorityLevel;
|
|
|
|
|
import io.gitea.model.GiteaUser;
|
|
|
|
|
import io.gitea.model.Issue;
|
|
|
|
|
import io.gitea.model.IssueAction;
|
|
|
|
|
import io.gitea.model.IssueLabelsOption;
|
|
|
|
|
import io.gitea.model.IssueState;
|
|
|
|
|
import io.gitea.model.IssueType;
|
|
|
|
|
import io.gitea.model.Label;
|
|
|
|
@ -39,237 +48,289 @@ import io.gitea.model.User;
|
|
|
|
|
import io.gitea.mylyn.core.exceptions.GiteaException;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Handles the issues. It maps the attributes from the Gitea API to real Mylyn
|
|
|
|
|
* issue attributes, downloads the issues for a specific task repository, and
|
|
|
|
|
* creates new issues.
|
|
|
|
|
* Handles the Issue<=>Task management. Downloads issues to tasks for a specific
|
|
|
|
|
* repository, update issue and creates new issues.
|
|
|
|
|
*/
|
|
|
|
|
public class GiteaTaskDataHandler extends AbstractTaskDataHandler {
|
|
|
|
|
|
|
|
|
|
public GiteaTaskDataHandler() {
|
|
|
|
|
}
|
|
|
|
|
public GiteaTaskDataHandler() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public TaskAttributeMapper getAttributeMapper(TaskRepository repository) {
|
|
|
|
|
try {
|
|
|
|
|
return ConnectionManager.get(repository).mapper;
|
|
|
|
|
} catch (CoreException e) {
|
|
|
|
|
throw new Error(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
public TaskAttributeMapper getAttributeMapper(TaskRepository repository) {
|
|
|
|
|
try {
|
|
|
|
|
return ConnectionManager.get(repository).mapper;
|
|
|
|
|
} catch (CoreException e) {
|
|
|
|
|
throw new Error(e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public boolean initializeTaskData(TaskRepository repository, TaskData data, ITaskMapping mapping,
|
|
|
|
|
IProgressMonitor monitor) throws CoreException {
|
|
|
|
|
createDefaultAttributes(data, false);
|
|
|
|
|
/**
|
|
|
|
|
* Initialize Task from local repository.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public boolean initializeTaskData(TaskRepository repository, TaskData data, ITaskMapping mapping,
|
|
|
|
|
IProgressMonitor monitor) throws CoreException {
|
|
|
|
|
createDefaultAttributes(data, false);
|
|
|
|
|
|
|
|
|
|
GiteaConnection connection = ConnectionManager.get(repository);
|
|
|
|
|
TaskAttribute root = data.getRoot();
|
|
|
|
|
GiteaConnection connection = ConnectionManager.get(repository);
|
|
|
|
|
TaskAttribute root = data.getRoot();
|
|
|
|
|
|
|
|
|
|
root.getAttribute(GiteaAttribute.PROJECT.getTaskKey()).setValue(connection.repository.getName());// FIXME: not
|
|
|
|
|
// the project
|
|
|
|
|
root.getAttribute(GiteaAttribute.LABELS.getTaskKey()).setValue("");
|
|
|
|
|
root.getAttribute(GiteaAttribute.STATUS.getTaskKey()).setValue("open");
|
|
|
|
|
root.getAttribute(GiteaAttribute.MILESTONE.getTaskKey()).setValue("");
|
|
|
|
|
root.getAttribute(GiteaAttribute.PROJECT.getTaskKey()).setValue(connection.repository.getName());// FIXME: not
|
|
|
|
|
// the
|
|
|
|
|
// project
|
|
|
|
|
root.getAttribute(GiteaAttribute.LABELS.getTaskKey()).setValue("");
|
|
|
|
|
root.getAttribute(GiteaAttribute.STATUS.getTaskKey()).setValue("open");
|
|
|
|
|
root.getAttribute(GiteaAttribute.MILESTONE.getTaskKey()).setValue("");
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public RepositoryResponse postTaskData(TaskRepository repository, TaskData data, Set<TaskAttribute> attributes,
|
|
|
|
|
IProgressMonitor monitor) throws CoreException {
|
|
|
|
|
/**
|
|
|
|
|
* Send Update to remote issues repository (create issue when required).
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public RepositoryResponse postTaskData(TaskRepository repository, TaskData data, Set<TaskAttribute> attributes,
|
|
|
|
|
IProgressMonitor monitor) throws CoreException {
|
|
|
|
|
|
|
|
|
|
GiteaAttributeMapper attributeMapper = (GiteaAttributeMapper) data.getAttributeMapper();
|
|
|
|
|
GiteaAttributeMapper attributeMapper = (GiteaAttributeMapper) data.getAttributeMapper();
|
|
|
|
|
TaskAttribute root = data.getRoot();
|
|
|
|
|
String taskId = data.getTaskId();
|
|
|
|
|
|
|
|
|
|
TaskAttribute root = data.getRoot();
|
|
|
|
|
String labels = root.getAttribute(GiteaAttribute.LABELS.getTaskKey()).getValue();
|
|
|
|
|
String title = root.getAttribute(GiteaAttribute.TITLE.getTaskKey()).getValue();
|
|
|
|
|
String body = root.getAttribute(GiteaAttribute.BODY.getTaskKey()).getValue();
|
|
|
|
|
// newLabelsList could be null or may content only one 'null' item when no label
|
|
|
|
|
// is defined for the task
|
|
|
|
|
List<Label> newLabelsList = attributeMapper
|
|
|
|
|
.findLabelsByNames(root.getAttribute(GiteaAttribute.LABELS.getTaskKey()).getValue());
|
|
|
|
|
List<Long> newLabelIds = new ArrayList<Long>();
|
|
|
|
|
if (newLabelsList != null)
|
|
|
|
|
newLabelsList.forEach(label -> {
|
|
|
|
|
if (label != null)
|
|
|
|
|
newLabelIds.add(label.getId());
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Long assigneeId = 0L;
|
|
|
|
|
String title = root.getAttribute(GiteaAttribute.TITLE.getTaskKey()).getValue();
|
|
|
|
|
String body = root.getAttribute(GiteaAttribute.BODY.getTaskKey()).getValue();
|
|
|
|
|
|
|
|
|
|
// TODO : confirm gitea behaviour
|
|
|
|
|
// We have to check, if the assignee has changed. The gitea api leaves three
|
|
|
|
|
// posiblities for the assignee ID:
|
|
|
|
|
// 0: leave as it is
|
|
|
|
|
// -1: unassign
|
|
|
|
|
// real id: assign
|
|
|
|
|
// If we didnt do this, Gitea would create a comment everytime we edit the
|
|
|
|
|
// issue and there is still no
|
|
|
|
|
// assignee
|
|
|
|
|
for (TaskAttribute a : attributes) {
|
|
|
|
|
if (a.getId().equals(GiteaAttribute.ASSIGNEE.getTaskKey())) {
|
|
|
|
|
User assignee = attributeMapper
|
|
|
|
|
.findProjectMemberByName(root.getAttribute(GiteaAttribute.ASSIGNEE.getTaskKey()).getValue());
|
|
|
|
|
assigneeId = (assignee == null ? -1 : assignee.getId());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
User assignee = null;
|
|
|
|
|
// Check assignee is still part of team member
|
|
|
|
|
for (TaskAttribute a : attributes) {
|
|
|
|
|
if (a.getId().equals(GiteaAttribute.ASSIGNEE.getTaskKey())) {
|
|
|
|
|
assignee = attributeMapper
|
|
|
|
|
.findProjectMemberByName(root.getAttribute(GiteaAttribute.ASSIGNEE.getTaskKey()).getValue());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Milestone milestone = attributeMapper
|
|
|
|
|
.findMilestoneByName(root.getAttribute(GiteaAttribute.MILESTONE.getTaskKey()).getValue());
|
|
|
|
|
Long milestoneId = (milestone == null ? 0 : milestone.getId());
|
|
|
|
|
Milestone milestone = attributeMapper
|
|
|
|
|
.findMilestoneByName(root.getAttribute(GiteaAttribute.MILESTONE.getTaskKey()).getValue());
|
|
|
|
|
Long milestoneId = (milestone == null ? 0 : milestone.getId());
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* FIXME: Support issue creation GiteaConnection connection =
|
|
|
|
|
* ConnectionManager.get(repository); Gitlea API api = connection.api(); try {
|
|
|
|
|
* monitor.beginTask("Uploading task", IProgressMonitor.UNKNOWN); Issue issue =
|
|
|
|
|
* null; if(data.isNew()) { issue =
|
|
|
|
|
* api.createIssue(connection.repository.getId(), assigneeId, milestoneId,
|
|
|
|
|
* labels, body, title); return new
|
|
|
|
|
* RepositoryResponse(ResponseKind.TASK_CREATED, "" + issue.getIid()); } else {
|
|
|
|
|
* if(root.getAttribute(TaskAttribute.COMMENT_NEW) != null &&
|
|
|
|
|
* !root.getAttribute(TaskAttribute.COMMENT_NEW).getValue().equals("")) {
|
|
|
|
|
* api.createNote(connection.repository.getId(),
|
|
|
|
|
* GiteaConnector.getTicketId(data.getTaskId()),
|
|
|
|
|
* root.getAttribute(TaskAttribute.COMMENT_NEW).getValue()); } String action =
|
|
|
|
|
* root.getAttribute(TaskAttribute.OPERATION).getValue(); issue =
|
|
|
|
|
* api.editIssue(connection.repository.getId(),
|
|
|
|
|
* GiteaConnector.getTicketId(data.getTaskId()), assigneeId, milestoneId,
|
|
|
|
|
* labels, body, title, GiteaAction.find(action).getGiteaIssueAction()); return
|
|
|
|
|
* new RepositoryResponse(ResponseKind.TASK_UPDATED, "" + issue.getIid()); } }
|
|
|
|
|
* catch (IOException e) { throw new
|
|
|
|
|
* GiteaException("Unknown connection error!"); } finally { monitor.done(); }
|
|
|
|
|
*/
|
|
|
|
|
return null;// FIXME:
|
|
|
|
|
}
|
|
|
|
|
GiteaConnection connection = ConnectionManager.get(repository);
|
|
|
|
|
// FIXME:TODO: support due date
|
|
|
|
|
// OffsetDateTime dueDate =
|
|
|
|
|
// OffsetDateTime.GiteaDateTimeUtils.parseDate(root.getAttribute(GiteaAttribute.DUE_DATE.getTaskKey()).getValue());
|
|
|
|
|
|
|
|
|
|
public TaskData downloadTaskData(TaskRepository repository, Long ticketId) throws CoreException {
|
|
|
|
|
try {
|
|
|
|
|
GiteaConnection connection = ConnectionManager.get(repository);
|
|
|
|
|
Issue issue = connection.issueGetIssue(ticketId);
|
|
|
|
|
List<Comment> notes = connection.issueGetComments(issue);
|
|
|
|
|
return createTaskDataFromGiteaIssue(issue, repository, notes);
|
|
|
|
|
} catch (ApiException e) {
|
|
|
|
|
throw new GiteaException("Unknown connection error!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
//monitor.beginTask("Uploading task", IProgressMonitor.UNKNOWN);
|
|
|
|
|
Issue issue = null;
|
|
|
|
|
if (data.isNew()) {
|
|
|
|
|
issue = connection.createIssue(
|
|
|
|
|
new CreateIssueOption().title(title).body(body).assignee(GiteaUser.getName(assignee))
|
|
|
|
|
.closed(false).milestone(milestoneId).labels(newLabelIds));
|
|
|
|
|
// FIXME Additional attributes like due date have to be set after issue creation
|
|
|
|
|
// Always the same caveats about TaskId:
|
|
|
|
|
// - represented by Issue number and not the issue Id which is internal Gitea database id.
|
|
|
|
|
// - Issue number is Long where TaskId is string representing an Integer
|
|
|
|
|
taskId = Integer.toString(issue.getNumber().intValue());
|
|
|
|
|
return new RepositoryResponse(ResponseKind.TASK_CREATED, taskId);
|
|
|
|
|
} else {
|
|
|
|
|
Long issueId = GiteaConnector.getTicketId(taskId);
|
|
|
|
|
issue = connection.issueGetIssue(issueId);
|
|
|
|
|
|
|
|
|
|
public TaskData createTaskDataFromGiteaIssue(Issue issue, TaskRepository repository, List<Comment> notes)
|
|
|
|
|
throws CoreException {
|
|
|
|
|
GiteaConnection connection = ConnectionManager.get(repository);
|
|
|
|
|
TaskData data = new TaskData(connection.mapper, GiteaPluginCore.CONNECTOR_KIND, repository.getUrl(),
|
|
|
|
|
issue.getNumber().toString());
|
|
|
|
|
// A new comment is available
|
|
|
|
|
if (root.getAttribute(TaskAttribute.COMMENT_NEW) != null
|
|
|
|
|
&& !root.getAttribute(TaskAttribute.COMMENT_NEW).getValue().equals("")) {
|
|
|
|
|
|
|
|
|
|
// Labels
|
|
|
|
|
List<String> labelsNames = new ArrayList<String>();
|
|
|
|
|
List<Label> issueLabels = issue.getLabels();
|
|
|
|
|
issueLabels.forEach((label) -> labelsNames.add(label.getName()));
|
|
|
|
|
String labels = StringUtils.join(labelsNames, ", ");
|
|
|
|
|
connection.issueAddComment(issueId, new CreateIssueCommentOption()
|
|
|
|
|
.body(root.getAttribute(TaskAttribute.COMMENT_NEW).getValue()));
|
|
|
|
|
}
|
|
|
|
|
// Update labels if label list has changed
|
|
|
|
|
List<Label>oldLabels = issue.getLabels();
|
|
|
|
|
|
|
|
|
|
if (!issue.getLabels().equals(newLabelsList)) {
|
|
|
|
|
connection.issueReplaceLabels(issueId, new IssueLabelsOption().labels(newLabelIds));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
createDefaultAttributes(data, true);
|
|
|
|
|
// Kept Step by step only for debugging purpose ...
|
|
|
|
|
String action = root.getAttribute(TaskAttribute.OPERATION).getValue();
|
|
|
|
|
String state = issue.getState();
|
|
|
|
|
String newState = IssueAction.getEnum(action).toState(IssueState.getEnum(state)).toString();
|
|
|
|
|
|
|
|
|
|
TaskAttribute root = data.getRoot();
|
|
|
|
|
root.getAttribute(GiteaAttribute.AUTHOR.getTaskKey()).setValue(GiteaUser.getName(issue.getUser()));
|
|
|
|
|
root.getAttribute(GiteaAttribute.CREATED.getTaskKey()).setValue(issue.getCreatedAt().toString());
|
|
|
|
|
root.getAttribute(GiteaAttribute.BODY.getTaskKey()).setValue(issue.getBody() == null ? "" : issue.getBody());
|
|
|
|
|
root.getAttribute(GiteaAttribute.LABELS.getTaskKey()).setValue(labels);
|
|
|
|
|
root.getAttribute(GiteaAttribute.PROJECT.getTaskKey()).setValue(connection.repository.getName()); // FIXME:
|
|
|
|
|
root.getAttribute(GiteaAttribute.STATUS.getTaskKey()).setValue(issue.getState());
|
|
|
|
|
root.getAttribute(GiteaAttribute.TITLE.getTaskKey()).setValue(issue.getTitle());
|
|
|
|
|
// OffsetDateTime dueDate = new OffsetDateTime();
|
|
|
|
|
// FIXME:TODO: Support DueDate
|
|
|
|
|
boolean unsetDueDate = true;
|
|
|
|
|
|
|
|
|
|
root.getAttribute(GiteaAttribute.IID.getTaskKey()).setValue("" + issue.getNumber().toString());
|
|
|
|
|
root.getAttribute(GiteaAttribute.PRIORITY.getTaskKey())
|
|
|
|
|
.setValue(GiteaPriorityLevel.getPriority(labels).toString());
|
|
|
|
|
root.getAttribute(GiteaAttribute.TYPE.getTaskKey()).setValue(getType(labels));
|
|
|
|
|
issue = connection.editIssue(issueId,
|
|
|
|
|
new EditIssueOption().assignee(GiteaUser.getName(assignee)).milestone(milestoneId).body(body)
|
|
|
|
|
.state(newState).title(title)
|
|
|
|
|
// .dueDate(dueDate)
|
|
|
|
|
.unsetDueDate(unsetDueDate));
|
|
|
|
|
return new RepositoryResponse(ResponseKind.TASK_UPDATED, taskId);
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
throw new GiteaException("Unknown connection error!");
|
|
|
|
|
} finally {
|
|
|
|
|
//monitor.done();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (issue.getMilestone() != null) {
|
|
|
|
|
root.getAttribute(GiteaAttribute.MILESTONE.getTaskKey()).setValue(issue.getMilestone().getTitle());
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Get task data including comments from remote issue id.
|
|
|
|
|
*
|
|
|
|
|
* @param repository
|
|
|
|
|
* @param ticketId
|
|
|
|
|
* @return
|
|
|
|
|
* @throws CoreException
|
|
|
|
|
*/
|
|
|
|
|
public TaskData downloadTaskData(TaskRepository repository, Long ticketId) throws CoreException {
|
|
|
|
|
try {
|
|
|
|
|
GiteaConnection connection = ConnectionManager.get(repository);
|
|
|
|
|
Issue issue = connection.issueGetIssue(ticketId);
|
|
|
|
|
List<Comment> notes = connection.issueGetComments(issue);
|
|
|
|
|
return createTaskDataFromGiteaIssue(issue, repository, notes);
|
|
|
|
|
} catch (ApiException e) {
|
|
|
|
|
throw new GiteaException("Unknown connection error!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (issue.getUpdatedAt() != null) {
|
|
|
|
|
root.getAttribute(GiteaAttribute.UPDATED.getTaskKey()).setValue(issue.getUpdatedAt().toString());
|
|
|
|
|
}
|
|
|
|
|
public TaskData createTaskDataFromGiteaIssue(Issue issue, TaskRepository repository, List<Comment> notes)
|
|
|
|
|
throws CoreException {
|
|
|
|
|
GiteaConnection connection = ConnectionManager.get(repository);
|
|
|
|
|
TaskData data = new TaskData(connection.mapper, GiteaPluginCore.CONNECTOR_KIND, repository.getUrl(),
|
|
|
|
|
issue.getNumber().toString());
|
|
|
|
|
|
|
|
|
|
if (IssueState.isClosed(issue.getState())) {
|
|
|
|
|
root.getAttribute(GiteaAttribute.COMPLETED.getTaskKey()).setValue(issue.getUpdatedAt().toString());
|
|
|
|
|
}
|
|
|
|
|
// Labels
|
|
|
|
|
List<String> labelsNames = new ArrayList<String>();
|
|
|
|
|
List<Label> issueLabels = issue.getLabels();
|
|
|
|
|
issueLabels.forEach((label) -> labelsNames.add(label.getName()));
|
|
|
|
|
String labels = StringUtils.join(labelsNames, ", ");
|
|
|
|
|
|
|
|
|
|
// Assignee name is either FulleName either Login either empty
|
|
|
|
|
List<String> assigneesNames = new ArrayList<String>();
|
|
|
|
|
List<User> assignees = issue.getAssignees();
|
|
|
|
|
if (assignees != null) {
|
|
|
|
|
assignees.forEach((assignee) -> assigneesNames.add(GiteaUser.getName(assignee)));
|
|
|
|
|
root.getAttribute(GiteaAttribute.ASSIGNEE.getTaskKey()).setValue(StringUtils.join(assigneesNames, ", "));
|
|
|
|
|
}
|
|
|
|
|
Collections.sort(notes, new Comparator<Comment>() {
|
|
|
|
|
@Override
|
|
|
|
|
public int compare(Comment o1, Comment o2) {
|
|
|
|
|
return o1.getCreatedAt().compareTo(o2.getCreatedAt());
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
createDefaultAttributes(data, true);
|
|
|
|
|
|
|
|
|
|
int i = 0;
|
|
|
|
|
for (Comment note : notes) {
|
|
|
|
|
TaskCommentMapper cmapper = new TaskCommentMapper();
|
|
|
|
|
cmapper.setAuthor(repository.createPerson(GiteaUser.getName(note.getUser())));
|
|
|
|
|
cmapper.setCreationDate(GiteaDateTimeUtils.toDate(note.getCreatedAt()));//FIXME:
|
|
|
|
|
cmapper.setText(note.getBody());
|
|
|
|
|
cmapper.setNumber(++i);
|
|
|
|
|
TaskAttribute attribute = data.getRoot().createAttribute(TaskAttribute.PREFIX_COMMENT + (i + 1));
|
|
|
|
|
cmapper.applyTo(attribute);
|
|
|
|
|
}
|
|
|
|
|
TaskAttribute root = data.getRoot();
|
|
|
|
|
root.getAttribute(GiteaAttribute.AUTHOR.getTaskKey()).setValue(GiteaUser.getName(issue.getUser()));
|
|
|
|
|
root.getAttribute(GiteaAttribute.CREATED.getTaskKey()).setValue(issue.getCreatedAt().toString());
|
|
|
|
|
root.getAttribute(GiteaAttribute.BODY.getTaskKey()).setValue(issue.getBody() == null ? "" : issue.getBody());
|
|
|
|
|
root.getAttribute(GiteaAttribute.LABELS.getTaskKey()).setValue(labels);
|
|
|
|
|
root.getAttribute(GiteaAttribute.PROJECT.getTaskKey()).setValue(connection.repository.getName()); // FIXME:
|
|
|
|
|
root.getAttribute(GiteaAttribute.STATUS.getTaskKey()).setValue(issue.getState());
|
|
|
|
|
root.getAttribute(GiteaAttribute.TITLE.getTaskKey()).setValue(issue.getTitle());
|
|
|
|
|
|
|
|
|
|
GiteaAction[] actions = GiteaAction.getActions(issue);
|
|
|
|
|
for (GiteaAction action : actions) {
|
|
|
|
|
TaskAttribute attribute = data.getRoot().createAttribute(TaskAttribute.PREFIX_OPERATION + action.label);
|
|
|
|
|
TaskOperation.applyTo(attribute, action.label, action.label);
|
|
|
|
|
}
|
|
|
|
|
root.getAttribute(GiteaAttribute.IID.getTaskKey()).setValue("" + issue.getNumber().toString());
|
|
|
|
|
root.getAttribute(GiteaAttribute.PRIORITY.getTaskKey())
|
|
|
|
|
.setValue(GiteaPriorityLevel.getPriority(labels).toString());
|
|
|
|
|
root.getAttribute(GiteaAttribute.TYPE.getTaskKey()).setValue(getType(labels));
|
|
|
|
|
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
if (issue.getMilestone() != null) {
|
|
|
|
|
root.getAttribute(GiteaAttribute.MILESTONE.getTaskKey()).setValue(issue.getMilestone().getTitle());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void createDefaultAttributes(TaskData data, boolean existingTask) {
|
|
|
|
|
createAttribute(data, GiteaAttribute.BODY);
|
|
|
|
|
createAttribute(data, GiteaAttribute.TITLE);
|
|
|
|
|
createAttribute(data, GiteaAttribute.LABELS);
|
|
|
|
|
createAttribute(data, GiteaAttribute.STATUS);
|
|
|
|
|
createAttribute(data, GiteaAttribute.PROJECT);
|
|
|
|
|
if (issue.getUpdatedAt() != null) {
|
|
|
|
|
root.getAttribute(GiteaAttribute.UPDATED.getTaskKey()).setValue(issue.getUpdatedAt().toString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
createAttribute(data, GiteaAttribute.CREATED);
|
|
|
|
|
createAttribute(data, GiteaAttribute.COMPLETED);
|
|
|
|
|
createAttribute(data, GiteaAttribute.UPDATED);
|
|
|
|
|
createAttribute(data, GiteaAttribute.ASSIGNEE);
|
|
|
|
|
createAttribute(data, GiteaAttribute.MILESTONE);
|
|
|
|
|
if (IssueState.isClosed(issue.getState())) {
|
|
|
|
|
root.getAttribute(GiteaAttribute.COMPLETED.getTaskKey()).setValue(issue.getUpdatedAt().toString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
createAttribute(data, GiteaAttribute.IID);
|
|
|
|
|
createAttribute(data, GiteaAttribute.PRIORITY);
|
|
|
|
|
createAttribute(data, GiteaAttribute.TYPE);
|
|
|
|
|
// Assignee name is either FulleName either Login either empty
|
|
|
|
|
List<String> assigneesNames = new ArrayList<String>();
|
|
|
|
|
List<User> assignees = issue.getAssignees();
|
|
|
|
|
if (assignees != null) {
|
|
|
|
|
assignees.forEach((assignee) -> assigneesNames.add(GiteaUser.getName(assignee)));
|
|
|
|
|
root.getAttribute(GiteaAttribute.ASSIGNEE.getTaskKey()).setValue(StringUtils.join(assigneesNames, ", "));
|
|
|
|
|
}
|
|
|
|
|
Collections.sort(notes, new Comparator<Comment>() {
|
|
|
|
|
@Override
|
|
|
|
|
public int compare(Comment o1, Comment o2) {
|
|
|
|
|
return o1.getCreatedAt().compareTo(o2.getCreatedAt());
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
data.getRoot().getAttribute(GiteaAttribute.CREATED.getTaskKey()).setValue("" + (new Date().getTime()));
|
|
|
|
|
int i = 0;
|
|
|
|
|
for (Comment note : notes) {
|
|
|
|
|
TaskCommentMapper cmapper = new TaskCommentMapper();
|
|
|
|
|
cmapper.setAuthor(repository.createPerson(GiteaUser.getName(note.getUser())));
|
|
|
|
|
cmapper.setCreationDate(GiteaDateTimeUtils.toDate(note.getCreatedAt()));// FIXME:
|
|
|
|
|
cmapper.setText(note.getBody());
|
|
|
|
|
cmapper.setNumber(++i);
|
|
|
|
|
TaskAttribute attribute = data.getRoot().createAttribute(TaskAttribute.PREFIX_COMMENT + (i + 1));
|
|
|
|
|
cmapper.applyTo(attribute);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (existingTask) {
|
|
|
|
|
data.getRoot().createAttribute(TaskAttribute.COMMENT_NEW).getMetaData()
|
|
|
|
|
.setType(TaskAttribute.TYPE_LONG_RICH_TEXT).setReadOnly(false);
|
|
|
|
|
GiteaAction[] actions = GiteaAction.getActions(issue);
|
|
|
|
|
for (GiteaAction action : actions) {
|
|
|
|
|
TaskAttribute attribute = data.getRoot().createAttribute(TaskAttribute.PREFIX_OPERATION + action.label);
|
|
|
|
|
TaskOperation.applyTo(attribute, action.label, action.label);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
createAttribute(data, GiteaAttribute.AUTHOR);
|
|
|
|
|
}
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TaskAttribute operation = data.getRoot().createAttribute(TaskAttribute.OPERATION);
|
|
|
|
|
operation.getMetaData().setType(TaskAttribute.TYPE_OPERATION);
|
|
|
|
|
}
|
|
|
|
|
private void createDefaultAttributes(TaskData data, boolean existingTask) {
|
|
|
|
|
createAttribute(data, GiteaAttribute.BODY);
|
|
|
|
|
createAttribute(data, GiteaAttribute.TITLE);
|
|
|
|
|
createAttribute(data, GiteaAttribute.LABELS);
|
|
|
|
|
createAttribute(data, GiteaAttribute.STATUS);
|
|
|
|
|
createAttribute(data, GiteaAttribute.PROJECT);
|
|
|
|
|
|
|
|
|
|
private void createAttribute(TaskData data, GiteaAttribute attribute) {
|
|
|
|
|
TaskAttribute attr = data.getRoot().createAttribute(attribute.getTaskKey());
|
|
|
|
|
TaskAttributeMetaData metaData = attr.getMetaData();
|
|
|
|
|
metaData.setType(attribute.getType());
|
|
|
|
|
metaData.setKind(attribute.getKind());
|
|
|
|
|
metaData.setLabel(attribute.toString());
|
|
|
|
|
metaData.setReadOnly(attribute.isReadOnly());
|
|
|
|
|
}
|
|
|
|
|
createAttribute(data, GiteaAttribute.CREATED);
|
|
|
|
|
createAttribute(data, GiteaAttribute.COMPLETED);
|
|
|
|
|
createAttribute(data, GiteaAttribute.UPDATED);
|
|
|
|
|
createAttribute(data, GiteaAttribute.ASSIGNEE);
|
|
|
|
|
createAttribute(data, GiteaAttribute.MILESTONE);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns the type string for Mylyn. Uses a regular expression to check for
|
|
|
|
|
* types in the given label.
|
|
|
|
|
*
|
|
|
|
|
* @param labels
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
private String getType(String labels) {
|
|
|
|
|
Matcher m = IssueType.PATTERN.matcher(labels);
|
|
|
|
|
if (m.find()) {
|
|
|
|
|
return m.group(1);
|
|
|
|
|
}
|
|
|
|
|
createAttribute(data, GiteaAttribute.IID);
|
|
|
|
|
createAttribute(data, GiteaAttribute.PRIORITY);
|
|
|
|
|
createAttribute(data, GiteaAttribute.TYPE);
|
|
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
data.getRoot().getAttribute(GiteaAttribute.CREATED.getTaskKey()).setValue("" + (new Date().getTime()));
|
|
|
|
|
|
|
|
|
|
if (existingTask) {
|
|
|
|
|
data.getRoot().createAttribute(TaskAttribute.COMMENT_NEW).getMetaData()
|
|
|
|
|
.setType(TaskAttribute.TYPE_LONG_RICH_TEXT).setReadOnly(false);
|
|
|
|
|
|
|
|
|
|
createAttribute(data, GiteaAttribute.AUTHOR);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TaskAttribute operation = data.getRoot().createAttribute(TaskAttribute.OPERATION);
|
|
|
|
|
operation.getMetaData().setType(TaskAttribute.TYPE_OPERATION);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void createAttribute(TaskData data, GiteaAttribute attribute) {
|
|
|
|
|
TaskAttribute attr = data.getRoot().createAttribute(attribute.getTaskKey());
|
|
|
|
|
TaskAttributeMetaData metaData = attr.getMetaData();
|
|
|
|
|
metaData.setType(attribute.getType());
|
|
|
|
|
metaData.setKind(attribute.getKind());
|
|
|
|
|
metaData.setLabel(attribute.toString());
|
|
|
|
|
metaData.setReadOnly(attribute.isReadOnly());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns the type string for Mylyn. Uses a regular expression to check for
|
|
|
|
|
* types in the given label.
|
|
|
|
|
*
|
|
|
|
|
* @param labels
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
private String getType(String labels) {
|
|
|
|
|
Matcher m = IssueType.PATTERN.matcher(labels);
|
|
|
|
|
if (m.find()) {
|
|
|
|
|
return m.group(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|