chromium/tools/crbug/pinpoint.js

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

const process = require('child_process');

class PinpointJob {
  constructor(json) {
    this.user_ = json.created_by;
    this.timestamp_ = new Date(json.create_time.seconds * 1000);
    this.crbug_ = json.job_spec.monorail_issue;
    this.url_ = undefined;
    this.project_ = undefined;

    if (this.crbug_) {
      const project = this.crbug_.project;
      const num = this.crbug_.issue_id;
      this.url_ =
          `https://bugs.chromium.org/p/${project}/issues/detail?id=${num}`;
      this.project_ = project;
    }
  }

  get url() {
    return this.url_;
  }
  get timestamp() {
    return this.timestamp_;
  }
  get project() {
    return this.project_;
  }
};

class Pinpoint {
  constructor() {}

  listJobs(useremail) {
    const args =
        ['pinpoint', 'list-jobs', '--json', '--filter', `user=${useremail}`];
    for (let tries = 0; tries < 3; ++tries) {
      try {
        const stdout = process.execSync(args.join(' ')).toString().trim();
        const json = JSON.parse(stdout);
        if (json) {
          const jobs = json.map(j => new PinpointJob(j));
          return jobs;
        }
      } catch (ex) {
      }
    }
    return [];
  }
};

async function test() {
  const pinpoint = new Pinpoint();
  const jobs = pinpoint.listJobs('[email protected]');
  console.log(jobs.filter(j => j.url)
                  .map(j => `${j.timestamp.toLocaleDateString()},${j.url}`));
}

module.exports = {
  Pinpoint,
};