current_branch.js 3.0 KB
Newer Older
F
Fatih Acet 已提交
1 2 3
const vscode = require('vscode');
const moment = require('moment');
const gitLabService = require('../gitlab_service');
T
Tomas Vik 已提交
4
const { ErrorItem } = require('./items/error_item');
5
const { getCurrentWorkspaceFolder } = require('../services/workspace_service');
T
Tomas Vik 已提交
6
const { handleError, logError } = require('../log');
T
Tomas Vik 已提交
7 8 9
const { MrItem } = require('./items/mr_item');
const { IssueItem } = require('./items/issue_item');
const { ExternalUrlItem } = require('./items/external_url_item');
F
Fatih Acet 已提交
10 11 12

class DataProvider {
  constructor() {
T
Tomas Vik 已提交
13 14
    this.eventEmitter = new vscode.EventEmitter();
    this.onDidChangeTreeData = this.eventEmitter.event;
F
Fatih Acet 已提交
15 16 17 18
    this.project = null;
    this.mr = null;
  }

19
  async fetchPipeline(workspaceFolder) {
T
Tomas Vik 已提交
20 21 22 23 24 25 26
    let pipeline;
    try {
      pipeline = await gitLabService.fetchLastPipelineForCurrentBranch(workspaceFolder);
    } catch (e) {
      logError(e);
      return new ErrorItem('Fetching pipeline failed');
    }
F
Fatih Acet 已提交
27

T
Tomas Vik 已提交
28
    if (!pipeline) {
T
Tomas Vik 已提交
29
      return new vscode.TreeItem('No pipeline found');
F
Fatih Acet 已提交
30
    }
T
Tomas Vik 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
    const statusText = pipeline.status === 'success' ? 'passed' : pipeline.status;
    const actions = {
      running: 'Started',
      pending: 'Created',
      success: 'Finished',
      failed: 'Failed',
      canceled: 'Canceled',
      skipped: 'Skipped',
    };
    const timeAgo = moment(pipeline.updated_at).fromNow();
    const actionText = actions[pipeline.status] || '';

    const message = `Pipeline #${pipeline.id} ${statusText} · ${actionText} ${timeAgo}`;
    const url = `${this.project.web_url}/pipelines/${pipeline.id}`;

    return new ExternalUrlItem(message, url);
F
Fatih Acet 已提交
47 48
  }

49
  async fetchMR(workspaceFolder) {
T
Tomas Vik 已提交
50 51 52 53 54 55 56
    let mr;
    try {
      mr = await gitLabService.fetchOpenMergeRequestForCurrentBranch(workspaceFolder);
    } catch (e) {
      logError(e);
      return new ErrorItem('Fetching MR failed');
    }
T
Tomas Vik 已提交
57 58 59
    if (mr) {
      this.mr = mr;
      return new MrItem(this.mr, this.project);
F
Fatih Acet 已提交
60
    }
T
Tomas Vik 已提交
61
    return new vscode.TreeItem('No merge request found');
F
Fatih Acet 已提交
62 63
  }

64
  async fetchClosingIssue(workspaceFolder) {
T
Tomas Vik 已提交
65 66
    if (this.mr) {
      const issues = await gitLabService.fetchMRIssues(this.mr.iid, workspaceFolder);
F
Fatih Acet 已提交
67

T
Tomas Vik 已提交
68 69
      if (issues.length) {
        return issues.map(issue => new IssueItem(issue, this.project));
F
Fatih Acet 已提交
70 71
      }
    }
T
Tomas Vik 已提交
72
    return [new vscode.TreeItem('No closing issue found')];
F
Fatih Acet 已提交
73 74
  }

T
Tomas Vik 已提交
75 76
  async getChildren(item) {
    if (item) return item.getChildren();
T
Tomas Vik 已提交
77
    try {
78
      const workspaceFolder = await getCurrentWorkspaceFolder();
T
Tomas Vik 已提交
79
      this.project = await gitLabService.fetchCurrentProject(workspaceFolder);
T
Tomas Vik 已提交
80 81 82 83
      const pipelineItem = await this.fetchPipeline(workspaceFolder);
      const mrItem = await this.fetchMR(workspaceFolder);
      const closingIssuesItems = await this.fetchClosingIssue(workspaceFolder);
      return [pipelineItem, mrItem, ...closingIssuesItems];
T
Tomas Vik 已提交
84
    } catch (e) {
85
      handleError(e);
T
Tomas Vik 已提交
86
      return [new ErrorItem()];
T
Tomas Vik 已提交
87
    }
F
Fatih Acet 已提交
88 89
  }

90
  // eslint-disable-next-line class-methods-use-this
F
Fatih Acet 已提交
91 92 93 94 95
  getTreeItem(item) {
    return item;
  }

  refresh() {
T
Tomas Vik 已提交
96
    this.eventEmitter.fire();
F
Fatih Acet 已提交
97 98 99 100
  }
}

exports.DataProvider = DataProvider;