brokeyourbike/ocvalidate-action

View on GitHub
src/prerelease.ts

Summary

Maintainability
A
3 hrs
Test Coverage
import * as semver from 'semver'
import * as core from '@actions/core'
import { Api } from '@octokit/plugin-rest-endpoint-methods/dist-types/types'
import * as utils from './utils'

const OWNER = 'dortania'
const REPO = 'build-repo'

export function getTagName (sha: string): string {
  return `OpenCorePkg-${sha}`
}

export async function findOpenCoreRelease (octokit: Api, sha: string, isRelease: boolean): Promise<utils.IOpenCoreRelease> {
  const release = await octokit.rest.repos.getReleaseByTag({
    owner: OWNER,
    repo: REPO,
    tag: getTagName(sha)
  })

  const assets = await octokit.rest.repos.listReleaseAssets({
    owner: OWNER,
    repo: REPO,
    release_id: release.data.id
  })

  const targetType = utils.getType(isRelease)

  for (const a of assets.data) {
    const r: utils.IOpenCoreRelease = {
      downloadUrl: a.browser_download_url,
      type: getType(a.name),
      version: getVersion(a.name)
    }

    if (!utils.isValidType(r.type)) {
      core.debug(`OpenCore type '${r.type}' is not valid`)
      continue
    }

    if (semver.valid(r.version) === null) {
      core.debug(`OpenCore version '${r.version}' is not valid`)
      continue
    }

    if (targetType === r.type) {
      return r
    }
  }

  throw new Error(`Cannot found OpenCore release matching sha ${sha} and type ${targetType}`)
}

function getType (filename: string): string {
  const matches = filename.match(/-(?<type>\w+).zip$/)
  return matches?.length === 2 ? matches[1] : ''
}

function getVersion (filename: string): string {
  const matches = filename.match(/-(?<version>[0-9.]+)-/)
  return matches?.length === 2 ? matches[1] : ''
}