src/tools/rust-analyzer/.github/actions/github-release/main.js JAVASCRIPT 145 lines View on github.com → Search inside
1const core = require('@actions/core');2const path = require("path");3const fs = require("fs");4const github = require('@actions/github');5const glob = require('glob');67function sleep(milliseconds) {8  return new Promise(resolve => setTimeout(resolve, milliseconds));9}1011async function runOnce() {12  // Load all our inputs and env vars. Note that `getInput` reads from `INPUT_*`13  const files = core.getInput('files');14  const name = core.getInput('name');15  const token = core.getInput('token');16  const slug = process.env.GITHUB_REPOSITORY;17  const owner = slug.split('/')[0];18  const repo = slug.split('/')[1];19  const sha = process.env.HEAD_SHA;2021  core.info(`files: ${files}`);22  core.info(`name: ${name}`);2324  const options = {25    request: {26      timeout: 30000,27    }28  };29  const octokit = github.getOctokit(token, options);3031  // Delete the previous release since we can't overwrite one. This may happen32  // due to retrying an upload or it may happen because we're doing the dev33  // release.34  const releases = await octokit.paginate("GET /repos/:owner/:repo/releases", { owner, repo });35  for (const release of releases) {36    if (release.tag_name !== name) {37      continue;38    }39    const release_id = release.id;40    core.info(`deleting release ${release_id}`);41    await octokit.rest.repos.deleteRelease({ owner, repo, release_id });42  }4344  // We also need to update the `dev` tag while we're at it on the `dev` branch.45  if (name == 'nightly') {46    try {47      core.info(`updating nightly tag`);48      await octokit.rest.git.updateRef({49        owner,50        repo,51        ref: 'tags/nightly',52        sha,53        force: true,54      });55    } catch (e) {56      core.error(e);57      core.info(`creating nightly tag`);58      await octokit.rest.git.createTag({59        owner,60        repo,61        tag: 'nightly',62        message: 'nightly release',63        object: sha,64        type: 'commit',65      });66    }67  }6869  // Creates an official GitHub release for this `tag`, and if this is `dev`70  // then we know that from the previous block this should be a fresh release.71  core.info(`creating a release`);72  const release = await octokit.rest.repos.createRelease({73    owner,74    repo,75    name,76    tag_name: name,77    target_commitish: sha,78    prerelease: name === 'nightly',79  });80  const release_id = release.data.id;8182  // Upload all the relevant assets for this release as just general blobs.83  for (const file of glob.sync(files)) {84    const size = fs.statSync(file).size;85    const name = path.basename(file);8687    await runWithRetry(async function () {88      // We can't overwrite assets, so remove existing ones from a previous try.89      let assets = await octokit.rest.repos.listReleaseAssets({90        owner,91        repo,92        release_id93      });94      for (const asset of assets.data) {95        if (asset.name === name) {96          core.info(`delete asset ${name}`);97          const asset_id = asset.id;98          await octokit.rest.repos.deleteReleaseAsset({ owner, repo, asset_id });99        }100      }101102      core.info(`upload ${file}`);103      const headers = { 'content-length': size, 'content-type': 'application/octet-stream' };104      const data = fs.createReadStream(file);105      await octokit.rest.repos.uploadReleaseAsset({106        data,107        headers,108        name,109        url: release.data.upload_url,110      });111    });112  }113}114115async function runWithRetry(f) {116  const retries = 10;117  const maxDelay = 4000;118  let delay = 1000;119120  for (let i = 0; i < retries; i++) {121    try {122      await f();123      break;124    } catch (e) {125      if (i === retries - 1)126        throw e;127128      core.error(e);129      const currentDelay = Math.round(Math.random() * delay);130      core.info(`sleeping ${currentDelay} ms`);131      await sleep(currentDelay);132      delay = Math.min(delay * 2, maxDelay);133    }134  }135}136137async function run() {138  await runWithRetry(runOnce);139}140141run().catch(err => {142  core.error(err);143  core.setFailed(err.message);144});

Findings

✓ No findings reported for this file.

Get this view in your editor

Same data, no extra tab — call code_get_file + code_get_findings over MCP from Claude/Cursor/Copilot.