/**
  * Create pull request task repository
  *
  * @param repo
  * @param username
  * @param password
  * @return task repository
  */
 public static TaskRepository createTaskRepository(
     Repository repo, String username, String password) {
   String url =
       PullRequestConnector.appendPulls(
           GitHub.createGitHubUrl(repo.getOwner().getLogin(), repo.getName()));
   TaskRepository repository = new TaskRepository(KIND, url);
   repository.setProperty(IRepositoryConstants.PROPERTY_LABEL, getRepositoryLabel(repo));
   if (username != null && password != null)
     repository.setCredentials(
         AuthenticationType.REPOSITORY, new AuthenticationCredentials(username, password), true);
   repository.setProperty(
       IRepositoryConstants.PROPERTY_CATEGORY, IRepositoryConstants.CATEGORY_REVIEW);
   return repository;
 }
 /**
  * @see
  *     org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector#getTaskData(org.eclipse.mylyn.tasks.core.TaskRepository,
  *     java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
  */
 public TaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor)
     throws CoreException {
   GistService service = new GistService(createClient(repository));
   try {
     TaskAttributeMapper mapper = dataHandler.getAttributeMapper(repository);
     Gist gist = service.getGist(taskId);
     TaskData data = new TaskData(mapper, getConnectorKind(), repository.getUrl(), gist.getId());
     data.setPartial(false);
     dataHandler.fillTaskData(repository, data, gist);
     if (gist.getComments() > 0)
       dataHandler.fillComments(repository, data, service.getComments(gist.getId()));
     return data;
   } catch (IOException e) {
     throw new CoreException(GitHub.createWrappedStatus(e));
   }
 }
  @Override
  public IStatus performQuery(
      TaskRepository repository,
      IRepositoryQuery query,
      TaskDataCollector collector,
      ISynchronizationSession session,
      IProgressMonitor monitor) {
    IStatus result = Status.OK_STATUS;
    List<String> statuses = QueryUtils.getAttributes(IssueService.FILTER_STATE, query);

    monitor.beginTask(Messages.PullRequestConnector_TaskFetching, statuses.size());
    try {
      RepositoryId repo = getRepository(repository.getRepositoryUrl());

      GitHubClient client = IssueConnector.createClient(repository);
      PullRequestService service = new PullRequestService(client);
      IssueService commentService = new IssueService(client);

      for (String status : statuses) {
        List<PullRequest> pulls = service.getPullRequests(repo, status);

        // collect task data
        for (PullRequest pr : pulls) {
          pr = service.getPullRequest(repo, pr.getNumber());
          PullRequestComposite prComp = new PullRequestComposite();
          prComp.setRequest(pr);
          List<Comment> comments = null;
          if (pr.getComments() > 0)
            comments =
                commentService.getComments(
                    repo.getOwner(), repo.getName(), Integer.toString(pr.getNumber()));
          if (pr.getCommits() > 0) prComp.setCommits(service.getCommits(repo, pr.getNumber()));
          TaskData taskData =
              taskDataHandler.createTaskData(repository, monitor, repo, prComp, comments);
          collector.accept(taskData);
        }
        monitor.worked(1);
      }
    } catch (IOException e) {
      result = GitHub.createWrappedStatus(e);
    }

    monitor.done();
    return result;
  }
  @Override
  public TaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor)
      throws CoreException {
    RepositoryId repo = getRepository(repository.getRepositoryUrl());

    try {
      GitHubClient client = IssueConnector.createClient(repository);
      PullRequestService service = new PullRequestService(client);
      PullRequest pr = service.getPullRequest(repo, Integer.parseInt(taskId));
      PullRequestComposite prComp = new PullRequestComposite();
      prComp.setRequest(pr);
      IssueService commentService = new IssueService(client);
      List<Comment> comments = null;
      if (pr.getComments() > 0)
        comments = commentService.getComments(repo.getOwner(), repo.getName(), taskId);
      if (pr.getCommits() > 0) prComp.setCommits(service.getCommits(repo, pr.getNumber()));
      return taskDataHandler.createTaskData(repository, monitor, repo, prComp, comments);
    } catch (IOException e) {
      throw new CoreException(GitHub.createWrappedStatus(e));
    }
  }
 /**
  * @see
  *     org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector#performQuery(org.eclipse.mylyn.tasks.core.TaskRepository,
  *     org.eclipse.mylyn.tasks.core.IRepositoryQuery,
  *     org.eclipse.mylyn.tasks.core.data.TaskDataCollector,
  *     org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession,
  *     org.eclipse.core.runtime.IProgressMonitor)
  */
 public IStatus performQuery(
     TaskRepository repository,
     IRepositoryQuery query,
     TaskDataCollector collector,
     ISynchronizationSession session,
     IProgressMonitor monitor) {
   IStatus status = Status.OK_STATUS;
   GistService service = new GistService(createClient(repository));
   String user = query.getAttribute(IGistQueryConstants.USER);
   try {
     TaskAttributeMapper mapper = dataHandler.getAttributeMapper(repository);
     for (Gist gist : service.getGists(user)) {
       TaskData data = new TaskData(mapper, getConnectorKind(), repository.getUrl(), gist.getId());
       data.setPartial(true);
       dataHandler.fillTaskData(repository, data, gist);
       collector.accept(data);
     }
   } catch (IOException e) {
     status = GitHub.createWrappedStatus(e);
   }
   return status;
 }
 /**
  * Get repository id from pull request task repository url
  *
  * @param prRepoUrl
  * @return repository id
  */
 public static RepositoryId getRepository(String prRepoUrl) {
   return GitHub.getRepository(stripPulls(prRepoUrl));
 }
 /**
  * Configure client for repository
  *
  * @param client
  * @param repository
  * @return client
  */
 public static GitHubClient configureClient(GitHubClient client, TaskRepository repository) {
   GitHub.addCredentials(client, repository);
   return GitHub.configureClient(client);
 }