function buildTable()

in all_missing_uplifts.js [200:347]


function buildTable() {
  return getVersion(getOption("channel")).then((full_version) => {
    let version = getMajor(full_version);
    let versionEnd = version;
    if (getOption("channel") == "beta") {
      versionEnd += 1;
    } else if (getOption("channel") == "release") {
      versionEnd += 2;
    }

    let query =
      "https://bugzilla.mozilla.org/rest/bug?f1=cf_crash_signature&o1=isnotempty&";
    let fieldNum = 2;

    query += "j" + fieldNum + "=AND&f" + fieldNum + "=OP&";
    fieldNum++;

    query +=
      "f" +
      fieldNum +
      "=cf_status_firefox" +
      version +
      "&o" +
      fieldNum +
      "=notequals&v" +
      fieldNum +
      "=fixed&";
    fieldNum++;
    query +=
      "f" +
      fieldNum +
      "=cf_status_firefox" +
      version +
      "&o" +
      fieldNum +
      "=notequals&v" +
      fieldNum +
      "=verified&";
    fieldNum++;
    query +=
      "f" +
      fieldNum +
      "=cf_status_firefox" +
      version +
      "&o" +
      fieldNum +
      "=notequals&v" +
      fieldNum +
      "=unaffected&";
    fieldNum++;
    if (!getOption("wontfix")) {
      query +=
        "f" +
        fieldNum +
        "=cf_status_firefox" +
        version +
        "&o" +
        fieldNum +
        "=notequals&v" +
        fieldNum +
        "=wontfix&";
      fieldNum++;
    }

    query += "f" + fieldNum + "=CP&";
    fieldNum++;

    query += "j" + fieldNum + "=OR&f" + fieldNum + "=OP&";
    fieldNum++;

    for (v = version + 1; v <= versionEnd; v++) {
      query += "j" + fieldNum + "=OR&f" + fieldNum + "=OP&";
      fieldNum++;
      query +=
        "f" +
        fieldNum +
        "=cf_status_firefox" +
        v +
        "&o" +
        fieldNum +
        "=equals&v" +
        fieldNum +
        "=verified&";
      fieldNum++;
      query +=
        "f" +
        fieldNum +
        "=cf_status_firefox" +
        v +
        "&o" +
        fieldNum +
        "=equals&v" +
        fieldNum +
        "=fixed&";
      fieldNum++;
      query += "f" + fieldNum + "=CP&";
      fieldNum++;
    }
    query += "f" + fieldNum + "=CP&";
    fieldNum++;

    query += "include_fields=id,last_change_time,cf_crash_signature";
    for (v = version; v <= versionEnd; v++) {
      query += ",cf_status_firefox" + v;
    }

    return fetchWithRetry(query)
      .then((response) => response.json())
      .then((data) => data["bugs"])
      .then((bugs) =>
        Promise.all(
          bugs.map((bug) => {
            let signatures = bug["cf_crash_signature"]
              .split(/\s*]\s*/)
              .map((signature) => signature.substring(2).trim());
            signatures = signatures.filter((signature) => signature != "");

            let count = 0;

            return Promise.all(
              signatures.map((signature) =>
                fetchWithRetry(
                  "https://crash-stats.mozilla.org/api/SuperSearch/?version=" +
                    full_version +
                    "&signature=%3D" +
                    encodeURIComponent(signature) +
                    "&product=Firefox&_results_number=0&_facets_size=0"
                )
                  .then((response) => response.json())
                  .then((result) => {
                    count += result["total"];
                  })
              )
            ).then(() => {
              bug["signatures"] = signatures;
              bug["crashes_count"] = count;
              return bug;
            });
          })
        )
      )
      .then((bugs) => bugs.filter((bug) => bug["crashes_count"] > 0))
      .then((bugs) =>
        bugs.sort((a, b) => b["crashes_count"] - a["crashes_count"])
      )
      .then((bugs) => bugs.forEach((bug) => addRow(bug, version)));
  });
}