mirror of
https://github.com/codecov/codecov-action.git
synced 2025-12-09 12:26:24 +00:00
Compare commits
7 Commits
v4.0.2
...
working-di
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7648985a72 | ||
|
|
ec4c4ecb5a | ||
|
|
ffd79df3ec | ||
|
|
a5c8752567 | ||
|
|
428cd7ca3d | ||
|
|
035df630e7 | ||
|
|
33f1d301f6 |
@@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"env": {
|
|
||||||
"browser": true,
|
|
||||||
"commonjs": true,
|
|
||||||
"es2021": true
|
|
||||||
},
|
|
||||||
"extends": [
|
|
||||||
"google",
|
|
||||||
"eslint:recommended",
|
|
||||||
"plugin:@typescript-eslint/recommended"
|
|
||||||
],
|
|
||||||
"parser": "@typescript-eslint/parser",
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaVersion": 12
|
|
||||||
},
|
|
||||||
"plugins": [
|
|
||||||
"@typescript-eslint"
|
|
||||||
],
|
|
||||||
"rules": {
|
|
||||||
"linebreak-style": 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
12
.github/dependabot.yml
vendored
12
.github/dependabot.yml
vendored
@@ -1,12 +0,0 @@
|
|||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: npm
|
|
||||||
directory: /
|
|
||||||
schedule:
|
|
||||||
interval: daily
|
|
||||||
open-pull-requests-limit: 10
|
|
||||||
- package-ecosystem: github-actions
|
|
||||||
directory: /
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
open-pull-requests-limit: 10
|
|
||||||
69
.github/workflows/codeql-analysis.yml
vendored
69
.github/workflows/codeql-analysis.yml
vendored
@@ -1,69 +0,0 @@
|
|||||||
|
|
||||||
#
|
|
||||||
# You may wish to alter this file to override the set of languages analyzed,
|
|
||||||
# or to provide custom queries or build logic.
|
|
||||||
#
|
|
||||||
# ******** NOTE ********
|
|
||||||
# We have attempted to detect the languages in your repository. Please check
|
|
||||||
# the `language` matrix defined below to confirm you have the correct set of
|
|
||||||
# supported CodeQL languages.
|
|
||||||
#
|
|
||||||
name: "CodeQL"
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
pull_request:
|
|
||||||
# The branches below must be a subset of the branches above
|
|
||||||
branches: [ master ]
|
|
||||||
schedule:
|
|
||||||
- cron: '24 6 * * 5'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
analyze:
|
|
||||||
name: Analyze
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
actions: read
|
|
||||||
contents: read
|
|
||||||
security-events: write
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
language: [ 'javascript' ]
|
|
||||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
|
||||||
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v4.1.1
|
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
|
||||||
- name: Initialize CodeQL
|
|
||||||
uses: github/codeql-action/init@v3.24.3
|
|
||||||
with:
|
|
||||||
languages: ${{ matrix.language }}
|
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
|
||||||
# By default, queries listed here will override any specified in a config file.
|
|
||||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
|
||||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
|
||||||
|
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
|
||||||
- name: Autobuild
|
|
||||||
uses: github/codeql-action/autobuild@v3.24.3
|
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
|
||||||
# 📚 https://git.io/JvXDl
|
|
||||||
|
|
||||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
|
||||||
# and modify them (or add more) to build your code if your project
|
|
||||||
# uses a compiled language
|
|
||||||
|
|
||||||
#- run: |
|
|
||||||
# make bootstrap
|
|
||||||
# make release
|
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
|
||||||
uses: github/codeql-action/analyze@v3.24.3
|
|
||||||
14
.github/workflows/enforce-license-compliance.yml
vendored
14
.github/workflows/enforce-license-compliance.yml
vendored
@@ -1,14 +0,0 @@
|
|||||||
name: Enforce License Compliance
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches: [main, master]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
enforce-license-compliance:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: 'Enforce License Compliance'
|
|
||||||
uses: getsentry/action-enforce-license-compliance@57ba820387a1a9315a46115ee276b2968da51f3d # main
|
|
||||||
with:
|
|
||||||
fossa_api_key: ${{ secrets.FOSSA_API_KEY }}
|
|
||||||
50
.github/workflows/main.yml
vendored
50
.github/workflows/main.yml
vendored
@@ -2,43 +2,37 @@ name: Workflow for Codecov Action
|
|||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
jobs:
|
jobs:
|
||||||
run:
|
run:
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os: [macos-latest, windows-latest, ubuntu-latest, macos-latest-xlarge]
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4.1.1
|
uses: actions/checkout@master
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm install
|
run: npm install
|
||||||
- name: Lint
|
|
||||||
run: npm run lint
|
|
||||||
- name: Run tests and collect coverage
|
- name: Run tests and collect coverage
|
||||||
run: npm run test
|
run: yarn run test-all
|
||||||
- name: Upload coverage to Codecov (script)
|
- name: Upload coverage to Codecov
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
files: ./coverage/script/coverage-final.json
|
fail_ci_if_error: true
|
||||||
flags: script,${{ matrix.os }}
|
|
||||||
name: codecov-script
|
|
||||||
verbose: true
|
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
|
||||||
- name: Upload coverage to Codecov (demo)
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
files: ./coverage/calculator/coverage-final.json,./coverage/coverage-test/coverage-final.json
|
|
||||||
file: ./coverage/coverage-final.json
|
file: ./coverage/coverage-final.json
|
||||||
flags: demo,${{ matrix.os }}
|
files: ./coverage/calculator/coverage-final.json,./coverage/index/coverage-final.json
|
||||||
name: codecov-demo
|
flags: unittest
|
||||||
verbose: true
|
name: codecov-1
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
- name: Upload coverage to Codecov (verbose)
|
||||||
- name: Upload coverage to Codecov (version)
|
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
files: ./coverage/calculator/coverage-final.json,./coverage/coverage-test/coverage-final.json
|
fail_ci_if_error: true
|
||||||
file: ./coverage/coverage-final.json
|
file: ./coverage/coverage-final.json
|
||||||
flags: version,${{ matrix.os }}
|
files: ./coverage/calculator/coverage-final.json,./coverage/index/coverage-final.json
|
||||||
name: codecov-version
|
flags: unittest
|
||||||
version: v0.2.0
|
name: codecov-1
|
||||||
verbose: true
|
verbose: true
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
- name: Upload coverage to Codecov (working_dir)
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
fail_ci_if_error: true
|
||||||
|
files: ./coverage/calculator/coverage-final.json,./coverage/index/coverage-final.json
|
||||||
|
file: ./coverage/coverage-final.json
|
||||||
|
flags: unittest
|
||||||
|
name: codecov-1
|
||||||
|
working-directory: src/
|
||||||
|
|||||||
61
.github/workflows/scorecards-analysis.yml
vendored
61
.github/workflows/scorecards-analysis.yml
vendored
@@ -1,61 +0,0 @@
|
|||||||
name: Scorecards supply-chain security
|
|
||||||
on:
|
|
||||||
# Only the default branch is supported.
|
|
||||||
branch_protection_rule:
|
|
||||||
schedule:
|
|
||||||
- cron: '43 20 * * 1'
|
|
||||||
push:
|
|
||||||
branches: [ master ]
|
|
||||||
|
|
||||||
# Declare default permissions as read only.
|
|
||||||
permissions: read-all
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
analysis:
|
|
||||||
name: Scorecards analysis
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
# Needed to upload the results to code-scanning dashboard.
|
|
||||||
security-events: write
|
|
||||||
# Used to receive a badge. (Upcoming feature)
|
|
||||||
id-token: write
|
|
||||||
actions: read
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: "Checkout code"
|
|
||||||
uses: actions/checkout@v4.1.1 # v3.0.0
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
|
|
||||||
- name: "Run analysis"
|
|
||||||
uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1
|
|
||||||
with:
|
|
||||||
results_file: results.sarif
|
|
||||||
results_format: sarif
|
|
||||||
# (Optional) Read-only PAT token. Uncomment the `repo_token` line below if:
|
|
||||||
# - you want to enable the Branch-Protection check on a *public* repository, or
|
|
||||||
# - you are installing Scorecards on a *private* repository
|
|
||||||
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat.
|
|
||||||
# repo_token: ${{ secrets.SCORECARD_READ_TOKEN }}
|
|
||||||
|
|
||||||
# Publish the results for public repositories to enable scorecard badges. For more details, see
|
|
||||||
# https://github.com/ossf/scorecard-action#publishing-results.
|
|
||||||
# For private repositories, `publish_results` will automatically be set to `false`, regardless
|
|
||||||
# of the value entered here.
|
|
||||||
publish_results: true
|
|
||||||
|
|
||||||
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
|
|
||||||
# format to the repository Actions tab.
|
|
||||||
- name: "Upload artifact"
|
|
||||||
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
|
|
||||||
with:
|
|
||||||
name: SARIF file
|
|
||||||
path: results.sarif
|
|
||||||
retention-days: 5
|
|
||||||
|
|
||||||
# Upload the results to GitHub's code scanning dashboard.
|
|
||||||
- name: "Upload to code-scanning"
|
|
||||||
uses: github/codeql-action/upload-sarif@v3.24.3 # v1.0.26
|
|
||||||
with:
|
|
||||||
sarif_file: results.sarif
|
|
||||||
287
CHANGELOG.md
287
CHANGELOG.md
@@ -1,292 +1,19 @@
|
|||||||
## 4.0.0-beta.2
|
### 1.1.1
|
||||||
### Fixes
|
|
||||||
- #1085 not adding -n if empty to do-upload command
|
|
||||||
|
|
||||||
## 4.0.0-beta.1
|
#### Fixes
|
||||||
|
|
||||||
`v4` represents a move from the [universal uploader](https://github.com/codecov/uploader) to the [Codecov CLI](https://github.com/codecov/codecov-cli). Although this will unlock new features for our users, the CLI is not yet at feature parity with the universal uploader.
|
|
||||||
|
|
||||||
### Breaking Changes
|
|
||||||
- No current support for `aarch64` and `alpine` architectures.
|
|
||||||
- Tokenless uploading is unsuported
|
|
||||||
- Various arguments to the Action have been removed
|
|
||||||
|
|
||||||
## 3.1.4
|
|
||||||
### Fixes
|
|
||||||
- #967 Fix typo in README.md
|
|
||||||
- #971 fix: add back in working dir
|
|
||||||
- #969 fix: CLI option names for uploader
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
- #970 build(deps-dev): bump @types/node from 18.15.12 to 18.16.3
|
|
||||||
- #979 build(deps-dev): bump @types/node from 20.1.0 to 20.1.2
|
|
||||||
- #981 build(deps-dev): bump @types/node from 20.1.2 to 20.1.4
|
|
||||||
|
|
||||||
## 3.1.3
|
|
||||||
### Fixes
|
|
||||||
- #960 fix: allow for aarch64 build
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
- #957 build(deps-dev): bump jest-junit from 15.0.0 to 16.0.0
|
|
||||||
- #958 build(deps): bump openpgp from 5.7.0 to 5.8.0
|
|
||||||
- #959 build(deps-dev): bump @types/node from 18.15.10 to 18.15.12
|
|
||||||
|
|
||||||
## 3.1.2
|
|
||||||
### Fixes
|
|
||||||
- #718 Update README.md
|
|
||||||
- #851 Remove unsupported path_to_write_report argument
|
|
||||||
- #898 codeql-analysis.yml
|
|
||||||
- #901 Update README to contain correct information - inputs and negate feature
|
|
||||||
- #955 fix: add in all the extra arguments for uploader
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
- #819 build(deps): bump openpgp from 5.4.0 to 5.5.0
|
|
||||||
- #835 build(deps): bump node-fetch from 3.2.4 to 3.2.10
|
|
||||||
- #840 build(deps): bump ossf/scorecard-action from 1.1.1 to 2.0.4
|
|
||||||
- #841 build(deps): bump @actions/core from 1.9.1 to 1.10.0
|
|
||||||
- #843 build(deps): bump @actions/github from 5.0.3 to 5.1.1
|
|
||||||
- #869 build(deps): bump node-fetch from 3.2.10 to 3.3.0
|
|
||||||
- #872 build(deps-dev): bump jest-junit from 13.2.0 to 15.0.0
|
|
||||||
- #879 build(deps): bump decode-uri-component from 0.2.0 to 0.2.2
|
|
||||||
- #889 build(deps): bump ossf/scorecard-action from 1.1.1 to 2.1.2
|
|
||||||
- #895 build(deps): bump json5 from 2.2.1 to 2.2.3
|
|
||||||
- #896 build(deps): bump actions/upload-artifact from 3.1.0 to 3.1.2
|
|
||||||
- #900 build(deps-dev): bump @vercel/ncc from 0.34.0 to 0.36.1
|
|
||||||
- #905 build(deps-dev): bump typescript from 4.7.4 to 4.9.5
|
|
||||||
- #911 build(deps-dev): bump @types/node from 16.11.40 to 18.13.0
|
|
||||||
- #922 build(deps-dev): bump @types/node from 18.13.0 to 18.14.0
|
|
||||||
- #924 build(deps): bump openpgp from 5.5.0 to 5.7.0
|
|
||||||
- #927 build(deps-dev): bump @types/node from 18.14.0 to 18.14.2
|
|
||||||
- #933 build(deps-dev): bump @types/node from 18.14.2 to 18.14.6
|
|
||||||
- #937 build(deps-dev): bump @types/node from 18.14.6 to 18.15.0
|
|
||||||
- #938 build(deps): bump node-fetch from 3.3.0 to 3.3.1
|
|
||||||
- #945 build(deps-dev): bump @types/node from 18.15.0 to 18.15.5
|
|
||||||
- #946 build(deps-dev): bump @types/node from 18.15.5 to 18.15.6
|
|
||||||
- #947 build(deps-dev): bump @types/node from 18.15.6 to 18.15.10
|
|
||||||
- #951 build(deps): bump ossf/scorecard-action from 2.1.2 to 2.1.3
|
|
||||||
|
|
||||||
## 3.1.1
|
|
||||||
### Fixes
|
|
||||||
- #661 Update deprecation warning
|
|
||||||
- #593 Create codeql-analysis.yml
|
|
||||||
- #712 README: fix typo
|
|
||||||
- #725 fix: Remove a blank row
|
|
||||||
- #726 Update README.md with correct badge version
|
|
||||||
- #633 Create scorecards-analysis.yml
|
|
||||||
- #747 fix: add more verbosity to validation
|
|
||||||
- #750 Regenerate scorecards-analysis.yml
|
|
||||||
- #774 Switch to v3
|
|
||||||
- #783 Fix network entry in table
|
|
||||||
- #791 Trim arguments after splitting them
|
|
||||||
- #769 Plumb failCi into verification function.
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
- #713 build(deps-dev): bump typescript from 4.6.3 to 4.6.4
|
|
||||||
- #714 build(deps): bump node-fetch from 3.2.3 to 3.2.4
|
|
||||||
- #724 build(deps): bump github/codeql-action from 1 to 2
|
|
||||||
- #717 build(deps-dev): bump @types/jest from 27.4.1 to 27.5.0
|
|
||||||
- #729 build(deps-dev): bump @types/node from 17.0.25 to 17.0.33
|
|
||||||
- #734 build(deps-dev): downgrade @types/node to 16.11.35
|
|
||||||
- #723 build(deps): bump actions/checkout from 2 to 3
|
|
||||||
- #733 build(deps): bump @actions/github from 5.0.1 to 5.0.3
|
|
||||||
- #732 build(deps): bump @actions/core from 1.6.0 to 1.8.2
|
|
||||||
- #737 build(deps-dev): bump @types/node from 16.11.35 to 16.11.36
|
|
||||||
- #749 build(deps): bump ossf/scorecard-action from 1.0.1 to 1.1.0
|
|
||||||
- #755 build(deps-dev): bump typescript from 4.6.4 to 4.7.3
|
|
||||||
- #759 build(deps-dev): bump @types/node from 16.11.36 to 16.11.39
|
|
||||||
- #762 build(deps-dev): bump @types/node from 16.11.39 to 16.11.40
|
|
||||||
- #746 build(deps-dev): bump @vercel/ncc from 0.33.4 to 0.34.0
|
|
||||||
- #757 build(deps): bump ossf/scorecard-action from 1.1.0 to 1.1.1
|
|
||||||
- #760 build(deps): bump openpgp from 5.2.1 to 5.3.0
|
|
||||||
- #748 build(deps): bump actions/upload-artifact from 2.3.1 to 3.1.0
|
|
||||||
- #766 build(deps-dev): bump typescript from 4.7.3 to 4.7.4
|
|
||||||
- #799 build(deps): bump openpgp from 5.3.0 to 5.4.0
|
|
||||||
- #798 build(deps): bump @actions/core from 1.8.2 to 1.9.1
|
|
||||||
|
|
||||||
## 3.1.0
|
|
||||||
### Features
|
|
||||||
- #699 Incorporate `xcode` arguments for the Codecov uploader
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
- #694 build(deps-dev): bump @vercel/ncc from 0.33.3 to 0.33.4
|
|
||||||
- #696 build(deps-dev): bump @types/node from 17.0.23 to 17.0.25
|
|
||||||
- #698 build(deps-dev): bump jest-junit from 13.0.0 to 13.2.0
|
|
||||||
|
|
||||||
## 3.0.0
|
|
||||||
### Breaking Changes
|
|
||||||
- #689 Bump to node16 and small fixes
|
|
||||||
|
|
||||||
### Features
|
|
||||||
- #688 Incorporate `gcov` arguments for the Codecov uploader
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
- #548 build(deps-dev): bump jest-junit from 12.2.0 to 13.0.0
|
|
||||||
- #603 [Snyk] Upgrade @actions/core from 1.5.0 to 1.6.0
|
|
||||||
- #628 build(deps): bump node-fetch from 2.6.1 to 3.1.1
|
|
||||||
- #634 build(deps): bump node-fetch from 3.1.1 to 3.2.0
|
|
||||||
- #636 build(deps): bump openpgp from 5.0.1 to 5.1.0
|
|
||||||
- #652 build(deps-dev): bump @vercel/ncc from 0.30.0 to 0.33.3
|
|
||||||
- #653 build(deps-dev): bump @types/node from 16.11.21 to 17.0.18
|
|
||||||
- #659 build(deps-dev): bump @types/jest from 27.4.0 to 27.4.1
|
|
||||||
- #667 build(deps): bump actions/checkout from 2 to 3
|
|
||||||
- #673 build(deps): bump node-fetch from 3.2.0 to 3.2.3
|
|
||||||
- #683 build(deps): bump minimist from 1.2.5 to 1.2.6
|
|
||||||
- #685 build(deps): bump @actions/github from 5.0.0 to 5.0.1
|
|
||||||
- #681 build(deps-dev): bump @types/node from 17.0.18 to 17.0.23
|
|
||||||
- #682 build(deps-dev): bump typescript from 4.5.5 to 4.6.3
|
|
||||||
- #676 build(deps): bump @actions/exec from 1.1.0 to 1.1.1
|
|
||||||
- #675 build(deps): bump openpgp from 5.1.0 to 5.2.1
|
|
||||||
|
|
||||||
## 2.1.0
|
|
||||||
### Features
|
|
||||||
- #515 Allow specifying version of Codecov uploader
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
- #499 build(deps-dev): bump @vercel/ncc from 0.29.0 to 0.30.0
|
|
||||||
- #508 build(deps): bump openpgp from 5.0.0-5 to 5.0.0
|
|
||||||
- #514 build(deps-dev): bump @types/node from 16.6.0 to 16.9.0
|
|
||||||
|
|
||||||
## 2.0.3
|
|
||||||
### Fixes
|
|
||||||
- #464 Fix wrong link in the readme
|
|
||||||
- #485 fix: Add override OS and linux default to platform
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
- #447 build(deps): bump openpgp from 5.0.0-4 to 5.0.0-5
|
|
||||||
- #458 build(deps-dev): bump eslint from 7.31.0 to 7.32.0
|
|
||||||
- #465 build(deps-dev): bump @typescript-eslint/eslint-plugin from 4.28.4 to 4.29.1
|
|
||||||
- #466 build(deps-dev): bump @typescript-eslint/parser from 4.28.4 to 4.29.1
|
|
||||||
- #468 build(deps-dev): bump @types/jest from 26.0.24 to 27.0.0
|
|
||||||
- #470 build(deps-dev): bump @types/node from 16.4.0 to 16.6.0
|
|
||||||
- #472 build(deps): bump path-parse from 1.0.6 to 1.0.7
|
|
||||||
- #473 build(deps-dev): bump @types/jest from 27.0.0 to 27.0.1
|
|
||||||
- #478 build(deps-dev): bump @typescript-eslint/parser from 4.29.1 to 4.29.2
|
|
||||||
- #479 build(deps-dev): bump @typescript-eslint/eslint-plugin from 4.29.1 to 4.29.2
|
|
||||||
- #481 build(deps-dev): bump @types/node from 16.6.0 to 16.6.2
|
|
||||||
- #483 build(deps-dev): bump @vercel/ncc from 0.29.0 to 0.29.2
|
|
||||||
- #484 build(deps): bump @actions/core from 1.4.0 to 1.5.0
|
|
||||||
|
|
||||||
## 2.0.2
|
|
||||||
### Fixes
|
|
||||||
- Underlying uploader fixes issues with tokens not being sent properly for users seeing
|
|
||||||
`Error!: Error: Error uploading to https://codecov.io: Error: Error uploading to Codecov: Error: Not Found`
|
|
||||||
- #440 fix: Validation ordering
|
|
||||||
|
|
||||||
## 2.0.1
|
|
||||||
### Fixes
|
|
||||||
- #424 fix: Issue in building all deep dependencies
|
|
||||||
|
|
||||||
## 2.0.0
|
|
||||||
On February 1, 2022, the `v1` uploader will be full sunset and no longer function. This is due
|
|
||||||
to the deprecation of the underlying bash uploader. This version uses the new [uploader](https://github.com/codecov/uploader).
|
|
||||||
|
|
||||||
The `v2` Action downloads, verifies, and runs the Codecov binary.
|
|
||||||
|
|
||||||
### Breaking Changes
|
|
||||||
- Multiple fields have not been transferred from the bash uploader or have been deprecated. Notably
|
|
||||||
many of the `functionalities` and `gcov_` arguments have been removed. Please check the documentation
|
|
||||||
for the full list.
|
|
||||||
|
|
||||||
### Features
|
|
||||||
- `dry-run` argument allows Codecov flow without uploading reports to Codecov
|
|
||||||
- (Enterprise only) `slug` allows specifying the repository slug manually
|
|
||||||
- (Enterprise only) `url` allows changing the upload host
|
|
||||||
|
|
||||||
## 1.5.2
|
|
||||||
### Fixes
|
|
||||||
- # fix: Import version properly as string not object
|
|
||||||
|
|
||||||
## 1.5.1
|
|
||||||
### Fixes
|
|
||||||
- #320 doc: add github actions badge
|
|
||||||
- #336 Update bash uploader to 1.0.3
|
|
||||||
- #339 fix: Add action version
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
- #302 Bump @typescript-eslint/eslint-plugin from 4.22.0 to 4.22.1
|
|
||||||
- #303 Bump @typescript-eslint/parser from 4.22.0 to 4.22.1
|
|
||||||
- #304 Bump ts-jest from 26.5.5 to 26.5.6
|
|
||||||
- #309 Bump lodash from 4.17.19 to 4.17.21
|
|
||||||
- #310 Bump hosted-git-info from 2.8.8 to 2.8.9
|
|
||||||
- #311 Bump @actions/github from 4.0.0 to 5.0.0
|
|
||||||
- #314 Bump eslint from 7.25.0 to 7.27.0
|
|
||||||
- #315 Bump @actions/core from 1.2.7 to 1.3.0
|
|
||||||
- #316 Bump @typescript-eslint/parser from 4.22.1 to 4.25.0
|
|
||||||
- #317 Bump @typescript-eslint/eslint-plugin from 4.22.1 to 4.25.0
|
|
||||||
- #319 Bump jest-junit from 12.0.0 to 12.1.0
|
|
||||||
- #321 Bump typescript from 4.2.4 to 4.3.2
|
|
||||||
- #323 Bump ws from 7.3.1 to 7.4.6
|
|
||||||
- #331 Bump eslint from 7.27.0 to 7.28.0
|
|
||||||
- #332 Bump @actions/exec from 1.0.4 to 1.1.0
|
|
||||||
- #333 Bump @typescript-eslint/parser from 4.25.0 to 4.26.1
|
|
||||||
- #334 Bump @typescript-eslint/eslint-plugin from 4.25.0 to 4.26.1
|
|
||||||
- #335 Bump @actions/core from 1.3.0 to 1.4.0
|
|
||||||
- #337 Bump glob-parent from 5.1.1 to 5.1.2
|
|
||||||
|
|
||||||
## 1.5.0
|
|
||||||
### Features
|
|
||||||
- #299 Pull Codecov bash script into the action
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
- #271 Bump typescript from 4.2.3 to 4.2.4
|
|
||||||
- #277 Bump @typescript-eslint/eslint-plugin from 4.16.1 to 4.22.0
|
|
||||||
- #278 Bump @typescript-eslint/parser from 4.20.0 to 4.22.0
|
|
||||||
- #279 Bump @actions/core from 1.2.6 to 1.2.7
|
|
||||||
- #292 Bump ts-jest from 26.5.3 to 26.5.5
|
|
||||||
- #293 Bump eslint from 7.21.0 to 7.25.0
|
|
||||||
- #297 Bump @types/jest from 26.0.20 to 26.0.23
|
|
||||||
- #298 Upgrade to GitHub-native Dependabot
|
|
||||||
|
|
||||||
## 1.4.1
|
|
||||||
### Fixes
|
|
||||||
- #287 Update VERSION regex to restrict on digits and dot and move checksums into script
|
|
||||||
|
|
||||||
## 1.4.0
|
|
||||||
### Features
|
|
||||||
- #282 Add checksum verification of bash script
|
|
||||||
|
|
||||||
## 1.3.2
|
|
||||||
### Fixes
|
|
||||||
- #264 Overwrites pr number for pull_request_target events
|
|
||||||
|
|
||||||
## 1.3.1
|
|
||||||
### Fixes
|
|
||||||
- #253 Add `network_filter` to action manifest
|
|
||||||
|
|
||||||
## 1.3.0
|
|
||||||
### Features
|
|
||||||
- #252 Add "network_filter" input
|
|
||||||
|
|
||||||
## 1.2.2
|
|
||||||
### Fixes
|
|
||||||
- #241 pass root_dir using proper bash arg
|
|
||||||
- #244 Overwrite the commit on pull_request* events
|
|
||||||
|
|
||||||
## 1.2.1
|
|
||||||
### Fixes
|
|
||||||
- #196 Add parameters to the action.yml
|
|
||||||
|
|
||||||
## 1.2.0
|
|
||||||
### Features
|
|
||||||
- #193 Add all the bash params
|
|
||||||
|
|
||||||
### Fixes
|
|
||||||
- #193 Fixes issue with working-directory
|
|
||||||
|
|
||||||
## 1.1.1
|
|
||||||
### Fixes
|
|
||||||
- #184 Add automations ensure proper builds and deployments
|
- #184 Add automations ensure proper builds and deployments
|
||||||
- #184 Fixes verbose flag
|
- #184 Fixes verbose flag
|
||||||
|
|
||||||
## 1.1.0
|
### 1.1.0
|
||||||
### Features
|
|
||||||
|
#### Features
|
||||||
- #110 Add "working-directory:" input
|
- #110 Add "working-directory:" input
|
||||||
- #174 Support Xcode specificed parameters
|
- #174 Support Xcode specificed parameters
|
||||||
|
|
||||||
### Fixes
|
#### Fixes
|
||||||
- #172 File is saved as text
|
- #172 File is saved as text
|
||||||
|
|
||||||
### Dependencies and Misc
|
#### Dependencies and Misc
|
||||||
- #166 Bump requestretry from 4.1.1 to 4.1.2
|
- #166 Bump requestretry from 4.1.1 to 4.1.2
|
||||||
- #169 Bump typescript from 4.0.5 to 4.1.2
|
- #169 Bump typescript from 4.0.5 to 4.1.2
|
||||||
- #178 Bump @types/jest from 26.0.15 to 26.0.19
|
- #178 Bump @types/jest from 26.0.15 to 26.0.19
|
||||||
|
|||||||
8
Makefile
8
Makefile
@@ -1,7 +1,7 @@
|
|||||||
deploy:
|
deploy:
|
||||||
$(eval VERSION := $(shell cat package.json | grep '"version": ' | cut -d\" -f4))
|
$(eval VERSION := $(shell cat package.json | grep '"version": ' | cut -d\" -f4))
|
||||||
git tag -d v4
|
git tag -d v1
|
||||||
git push origin :v4
|
git push origin :v1
|
||||||
git tag v4
|
git tag v1
|
||||||
git tag v$(VERSION) -s -m ""
|
git tag v$(VERSION) -m ""
|
||||||
git push origin --tags
|
git push origin --tags
|
||||||
|
|||||||
119
README.md
119
README.md
@@ -1,107 +1,53 @@
|
|||||||
# Codecov GitHub Action
|
# Codecov GitHub Action
|
||||||
|
|
||||||
[](https://github.com/marketplace/actions/codecov)
|
[](https://github.com/marketplace/actions/codecov)
|
||||||
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fcodecov%2Fcodecov-action?ref=badge_shield)
|
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fcodecov%2Fcodecov-action?ref=badge_shield)
|
||||||
[](https://github.com/codecov/codecov-action/actions/workflows/main.yml)
|
|
||||||
### Easily upload coverage reports to Codecov from GitHub Actions
|
### Easily upload coverage reports to Codecov from GitHub Actions
|
||||||
|
|
||||||
## v4 Release
|
>The latest release of this Action adds support for tokenless uploads from GitHub Actions!
|
||||||
`v4` of the Codecov GitHub Action will use the [Codecov CLI](https://github.com/codecov/codecov-cli) to upload coverage reports to Codecov.
|
|
||||||
|
|
||||||
### Breaking Changes
|
|
||||||
- Tokenless uploading is unsupported. However, PRs made from forks to the upstream public repos will support tokenless (e.g. contributors to OS projects do not need the upstream repo's Codecov token)
|
|
||||||
- Various arguments to the Action have been removed
|
|
||||||
|
|
||||||
### Dependabot
|
|
||||||
- For repositories using `Dependabot`, users will need to ensure that it has access to the Codecov token for PRs from Dependabot to upload coverage. To do this, please add your `CODECOV_TOKEN` as a Dependabot Secret. For more information, see ["Configuring access to private registries for Dependabot."](https://docs.github.com/en/code-security/dependabot/working-with-dependabot/configuring-access-to-private-registries-for-dependabot#storing-credentials-for-dependabot-to-use)
|
|
||||||
|
|
||||||
`v3` versions and below will not have access to CLI features (e.g. global upload token, ATS).
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
To integrate Codecov with your Actions pipeline, specify the name of this repository with a tag number (`@v4` is recommended) as a `step` within your `workflow.yml` file.
|
To integrate Codecov with your Actions pipeline, specify the name of this repository with a tag number (`@v1` is recommended) as a `step` within your `workflow.yml` file.
|
||||||
|
|
||||||
This Action also requires you to [provide an upload token](https://docs.codecov.io/docs/frequently-asked-questions#section-where-is-the-repository-upload-token-found-) from [codecov.io](https://www.codecov.io) (tip: in order to avoid exposing your token, [store it](https://docs.codecov.com/docs/adding-the-codecov-token#github-actions) as a `secret`).
|
If you have a *private repository*, this Action also requires you to [provide an upload token](https://docs.codecov.io/docs/frequently-asked-questions#section-where-is-the-repository-upload-token-found-) from [codecov.io](https://www.codecov.io) (tip: in order to avoid exposing your token, store it as a `secret`). Optionally, you can choose to include up to four additional inputs to customize the upload context. **For public repositories, no token is needed**
|
||||||
|
|
||||||
Currently, the Action will identify linux, macos, and windows runners. However, the Action may misidentify other architectures. The OS can be specified as
|
|
||||||
- alpine
|
|
||||||
- alpine-arm64
|
|
||||||
- linux
|
|
||||||
- linux-arm64
|
|
||||||
- macos
|
|
||||||
- windows
|
|
||||||
|
|
||||||
Inside your `.github/workflows/workflow.yml` file:
|
Inside your `.github/workflows/workflow.yml` file:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@master
|
- uses: actions/checkout@master
|
||||||
- uses: codecov/codecov-action@v4
|
- uses: codecov/codecov-action@v1
|
||||||
with:
|
with:
|
||||||
fail_ci_if_error: true # optional (default = false)
|
token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos
|
||||||
|
file: ./coverage.xml # optional
|
||||||
files: ./coverage1.xml,./coverage2.xml # optional
|
files: ./coverage1.xml,./coverage2.xml # optional
|
||||||
flags: unittests # optional
|
flags: unittests # optional
|
||||||
name: codecov-umbrella # optional
|
name: codecov-umbrella # optional
|
||||||
token: ${{ secrets.CODECOV_TOKEN }} # required
|
|
||||||
verbose: true # optional (default = false)
|
|
||||||
```
|
|
||||||
|
|
||||||
The Codecov token can also be passed in via environment variables:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@master
|
|
||||||
- uses: codecov/codecov-action@v4
|
|
||||||
with:
|
|
||||||
fail_ci_if_error: true # optional (default = false)
|
fail_ci_if_error: true # optional (default = false)
|
||||||
files: ./coverage1.xml,./coverage2.xml # optional
|
|
||||||
flags: unittests # optional
|
|
||||||
name: codecov-umbrella # optional
|
|
||||||
verbose: true # optional (default = false)
|
verbose: true # optional (default = false)
|
||||||
env:
|
|
||||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
||||||
```
|
```
|
||||||
> [!NOTE]
|
>**Note**: This assumes that you've set your Codecov token inside *Settings > Secrets* as `CODECOV_TOKEN`. If not, you can [get an upload token](https://docs.codecov.io/docs/frequently-asked-questions#section-where-is-the-repository-upload-token-found-) for your specific repo on [codecov.io](https://www.codecov.io). Keep in mind that secrets are *not* available to forks of repositories.
|
||||||
> This assumes that you've set your Codecov token inside *Settings > Secrets* as `CODECOV_TOKEN`. If not, you can [get an upload token](https://docs.codecov.io/docs/frequently-asked-questions#section-where-is-the-repository-upload-token-found-) for your specific repo on [codecov.io](https://www.codecov.io). Keep in mind that secrets are *not* available to forks of repositories.
|
|
||||||
|
|
||||||
## Arguments
|
## Arguments
|
||||||
|
|
||||||
Codecov's Action supports inputs from the user. These inputs, along with their descriptions and usage contexts, are listed in the table below:
|
Codecov's Action currently supports five inputs from the user: `token`, `file`, `flags`,`name`, and `fail_ci_if_error`. These inputs, along with their descriptions and usage contexts, are listed in the table below:
|
||||||
|
|
||||||
| Input | Description | Required |
|
| Input | Description | Usage |
|
||||||
| :--- | :--- | :---: |
|
| :---: | :---: | :---: |
|
||||||
| `token` | Repository Codecov token. Used to authorize report uploads | *Required
|
| `token` | Used to authorize coverage report uploads | *Required for private repos* |
|
||||||
| `codecov_yml_path` | Specify the path to the Codecov YML | Optional
|
| `file` | Path to the coverage report(s) | Optional
|
||||||
| `commit_parent` | Override to specify the parent commit SHA | Optional
|
| `files` | Comma-separated paths to the coverage report(s) | Optional
|
||||||
| `directory` | Directory to search for coverage reports. | Optional
|
| `directory` | Directory to search for coverage reports. | Optional
|
||||||
| `disable_search` | Disable search for coverage files. This is helpful when specifying what files you want to upload with the --file option. | Optional
|
| `flags` | Flag the upload to group coverage metrics (unittests, uitests, etc.). Multiple flags are separated by a comma (ui,chrome) | Optional
|
||||||
| `disable_file_fixes` | Disable file fixes to ignore common lines from coverage (e.g. blank lines or empty brackets) | Optional
|
| `env_vars` | Environment variables to tag the upload with. Multiple env variables can be separated with commas (e.g. `OS,PYTHON`) | Optional
|
||||||
| `dry_run` | Don't upload files to Codecov | Optional
|
| `name` | Custom defined name for the upload | Optional
|
||||||
| `env_vars` | Environment variables to tag the upload with (e.g. PYTHON \| OS,PYTHON) | Optional
|
| `fail_ci_if_error` | Specify if CI pipeline should fail when Codecov runs into errors during upload. *Defaults to **false*** | Optional
|
||||||
| `exclude` | Folders to exclude from search | Optional
|
| `path_to_write_report` | Write upload file to path before uploading | Optional
|
||||||
| `fail_ci_if_error` | Specify whether or not CI build should fail if Codecov runs into an error during upload | Optional
|
|
||||||
| `file` | Path to coverage file to upload | Optional
|
|
||||||
| `files` | Comma-separated list of files to upload | Optional
|
|
||||||
| `flags` | Flag upload to group coverage metrics (e.g. unittests \| integration \| ui,chrome) | Optional
|
|
||||||
| `handle_no_reports_found` | Raise no exceptions when no coverage reports found | Optional
|
|
||||||
| `job_code` | The job code | Optional
|
|
||||||
| `name` | User defined upload name. Visible in Codecov UI | Optional
|
|
||||||
| `os` | Override the assumed OS. Options are linux \| macos \| windows \| . | Optional
|
|
||||||
| `override_branch` | Specify the branch name | Optional
|
|
||||||
| `override_build` | Specify the build number | Optional
|
|
||||||
| `override_build_url` | The URL of the build where this is running | Optional
|
|
||||||
| `override_commit` | Specify the commit SHA | Optional
|
|
||||||
| `override_pr` | Specify the pull request number | Optional
|
|
||||||
| `plugin` | plugins to run. Options: xcode, gcov, pycoverage. The default behavior runs them all. | Optional
|
|
||||||
| `plugins` | Comma-separated list of plugins for use during upload. | Optional
|
|
||||||
| `report_code` | The code of the report. If unsure, do not include | Optional
|
|
||||||
| `root_dir` | Used when not in git/hg project to identify project root directory | Optional
|
|
||||||
| `slug` | Specify the slug manually (Enterprise use) | Optional
|
|
||||||
| `url` | Specify the base url to upload (Enterprise use) | Optional
|
|
||||||
| `use_legacy_upload_endpoint` | Use the legacy upload endpoint | Optional
|
|
||||||
| `verbose` | Specify whether the Codecov output should be verbose | Optional
|
| `verbose` | Specify whether the Codecov output should be verbose | Optional
|
||||||
| `version` | Specify which version of the Codecov CLI should be used. Defaults to `latest` | Optional
|
| `working-directory` | Directory in which to execute `codecov.sh` | Optional
|
||||||
| `working-directory` | Directory in which to execute codecov.sh | Optional
|
| `xcode_derived_data` | Custom Derived Data Path for Coverage.profdata and gcov processing | Optional
|
||||||
|
| `xcode_package` | Specify packages to build coverage. Uploader will only build these packages. This can significantly reduces time to build coverage reports. -J 'MyAppName' Will match "MyAppName" and "MyAppNameTests" -J '^ExampleApp$' Will match only "ExampleApp" not "ExampleAppTests" | Optional
|
||||||
|
|
||||||
### Example `workflow.yml` with Codecov Action
|
### Example `workflow.yml` with Codecov Action
|
||||||
|
|
||||||
@@ -116,28 +62,30 @@ jobs:
|
|||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
env:
|
env:
|
||||||
OS: ${{ matrix.os }}
|
OS: ${{ matrix.os }}
|
||||||
PYTHON: '3.10'
|
PYTHON: '3.7'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@master
|
- uses: actions/checkout@master
|
||||||
- name: Setup Python
|
- name: Setup Python
|
||||||
uses: actions/setup-python@master
|
uses: actions/setup-python@master
|
||||||
with:
|
with:
|
||||||
python-version: 3.10
|
python-version: 3.7
|
||||||
- name: Generate coverage report
|
- name: Generate coverage report
|
||||||
run: |
|
run: |
|
||||||
pip install pytest
|
pip install pytest
|
||||||
pip install pytest-cov
|
pip install pytest-cov
|
||||||
pytest --cov=./ --cov-report=xml
|
pytest --cov=./ --cov-report=xml
|
||||||
- name: Upload coverage to Codecov
|
- name: Upload coverage to Codecov
|
||||||
uses: codecov/codecov-action@v4
|
uses: codecov/codecov-action@v1
|
||||||
with:
|
with:
|
||||||
directory: ./coverage/reports/
|
|
||||||
env_vars: OS,PYTHON
|
|
||||||
fail_ci_if_error: true
|
|
||||||
files: ./coverage1.xml,./coverage2.xml,!./cache
|
|
||||||
flags: unittests
|
|
||||||
name: codecov-umbrella
|
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
file: ./coverage.xml
|
||||||
|
files: ./coverage1.xml,./coverage2.xml
|
||||||
|
directory: ./coverage/reports/
|
||||||
|
flags: unittests
|
||||||
|
env_vars: OS,PYTHON
|
||||||
|
name: codecov-umbrella
|
||||||
|
fail_ci_if_error: true
|
||||||
|
path_to_write_report: ./coverage/codecov_report.txt
|
||||||
verbose: true
|
verbose: true
|
||||||
```
|
```
|
||||||
## Contributing
|
## Contributing
|
||||||
@@ -148,4 +96,5 @@ Contributions are welcome! Check out the [Contribution Guide](CONTRIBUTING.md).
|
|||||||
|
|
||||||
The code in this project is released under the [MIT License](LICENSE).
|
The code in this project is released under the [MIT License](LICENSE).
|
||||||
|
|
||||||
|
|
||||||
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fcodecov%2Fcodecov-action?ref=badge_large)
|
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fcodecov%2Fcodecov-action?ref=badge_large)
|
||||||
|
|||||||
91
action.yml
91
action.yml
@@ -2,35 +2,11 @@ name: 'Codecov'
|
|||||||
description: 'GitHub Action that uploads coverage reports for your repository to codecov.io'
|
description: 'GitHub Action that uploads coverage reports for your repository to codecov.io'
|
||||||
author: 'Ibrahim Ali <@ibrahim0814> & Thomas Hu <@thomasrockhu> | Codecov'
|
author: 'Ibrahim Ali <@ibrahim0814> & Thomas Hu <@thomasrockhu> | Codecov'
|
||||||
inputs:
|
inputs:
|
||||||
|
name:
|
||||||
|
description: 'User defined upload name. Visible in Codecov UI'
|
||||||
|
required: false
|
||||||
token:
|
token:
|
||||||
description: 'Repository Codecov token. Used to authorize report uploads'
|
description: 'Repository upload token - get it from codecov.io. Required only for private repositories'
|
||||||
required: false
|
|
||||||
codecov_yml_path:
|
|
||||||
description: 'Specify the path to the Codecov YML'
|
|
||||||
required: false
|
|
||||||
commit_parent:
|
|
||||||
description: 'Override to specify the parent commit SHA'
|
|
||||||
required: false
|
|
||||||
directory:
|
|
||||||
description: 'Directory to search for coverage reports.'
|
|
||||||
required: false
|
|
||||||
disable_search:
|
|
||||||
description: 'Disable search for coverage files. This is helpful when specifying what files you want to upload with the --file option.'
|
|
||||||
required: false
|
|
||||||
disable_file_fixes:
|
|
||||||
description: 'Disable file fixes to ignore common lines from coverage (e.g. blank lines or empty brackets)'
|
|
||||||
required: false
|
|
||||||
dry_run:
|
|
||||||
description: "Don't upload files to Codecov"
|
|
||||||
required: false
|
|
||||||
env_vars:
|
|
||||||
description: 'Environment variables to tag the upload with (e.g. PYTHON | OS,PYTHON)'
|
|
||||||
required: false
|
|
||||||
exclude:
|
|
||||||
description: 'Folders to exclude from search'
|
|
||||||
required: false
|
|
||||||
fail_ci_if_error:
|
|
||||||
description: 'Specify whether or not CI build should fail if Codecov runs into an error during upload'
|
|
||||||
required: false
|
required: false
|
||||||
file:
|
file:
|
||||||
description: 'Path to coverage file to upload'
|
description: 'Path to coverage file to upload'
|
||||||
@@ -38,63 +14,24 @@ inputs:
|
|||||||
files:
|
files:
|
||||||
description: 'Comma-separated list of files to upload'
|
description: 'Comma-separated list of files to upload'
|
||||||
required: false
|
required: false
|
||||||
|
directory:
|
||||||
|
description: 'Directory to search for coverage reports.'
|
||||||
|
required: false
|
||||||
flags:
|
flags:
|
||||||
description: 'Flag upload to group coverage metrics (e.g. unittests | integration | ui,chrome)'
|
description: 'Flag upload to group coverage metrics (e.g. unittests | integration | ui,chrome)'
|
||||||
required: false
|
required: false
|
||||||
handle_no_reports_found:
|
path_to_write_report:
|
||||||
description: 'Raise no exceptions when no coverage reports found'
|
description: 'Write upload file to path before uploading'
|
||||||
required: false
|
required: false
|
||||||
job_code:
|
env_vars:
|
||||||
description: 'The job code'
|
description: 'Environment variables to tag the upload with (e.g. PYTHON | OS,PYTHON)'
|
||||||
required: false
|
required: false
|
||||||
name:
|
fail_ci_if_error:
|
||||||
description: 'User defined upload name. Visible in Codecov UI'
|
description: 'Specify whether or not CI build should fail if Codecov runs into an error during upload'
|
||||||
required: false
|
|
||||||
os:
|
|
||||||
description: 'Override the assumed OS. Options are linux | macos | windows.'
|
|
||||||
required: false
|
|
||||||
override_branch:
|
|
||||||
description: 'Specify the branch name'
|
|
||||||
required: false
|
|
||||||
override_build:
|
|
||||||
description: 'Specify the build number'
|
|
||||||
required: false
|
|
||||||
override_build_url:
|
|
||||||
description: 'The URL of the build where this is running'
|
|
||||||
required: false
|
|
||||||
override_commit:
|
|
||||||
description: 'Specify the commit SHA'
|
|
||||||
required: false
|
|
||||||
override_pr:
|
|
||||||
description: 'Specify the pull request number'
|
|
||||||
required: false
|
|
||||||
plugin:
|
|
||||||
description: 'plugins to run. Options: xcode, gcov, pycoverage. The default behavior runs them all.'
|
|
||||||
required: false
|
|
||||||
plugins:
|
|
||||||
description: 'Comma-separated list of plugins for use during upload.'
|
|
||||||
required: false
|
|
||||||
report_code:
|
|
||||||
description: 'The code of the report. If unsure, do not include'
|
|
||||||
required: false
|
|
||||||
root_dir:
|
|
||||||
description: 'Used when not in git/hg project to identify project root directory'
|
|
||||||
required: false
|
|
||||||
slug:
|
|
||||||
description: 'Specify the slug manually (Enterprise use)'
|
|
||||||
required: false
|
|
||||||
url:
|
|
||||||
description: 'Specify the base url to upload (Enterprise use)'
|
|
||||||
required: false
|
|
||||||
use_legacy_upload_endpoint:
|
|
||||||
description: 'Use the legacy upload endpoint'
|
|
||||||
required: false
|
required: false
|
||||||
verbose:
|
verbose:
|
||||||
description: 'Specify whether the Codecov output should be verbose'
|
description: 'Specify whether the Codecov output should be verbose'
|
||||||
required: false
|
required: false
|
||||||
version:
|
|
||||||
description: 'Specify which version of the Codecov CLI should be used. Defaults to `latest`'
|
|
||||||
required: false
|
|
||||||
working-directory:
|
working-directory:
|
||||||
description: 'Directory in which to execute codecov.sh'
|
description: 'Directory in which to execute codecov.sh'
|
||||||
required: false
|
required: false
|
||||||
@@ -102,5 +39,5 @@ branding:
|
|||||||
color: 'red'
|
color: 'red'
|
||||||
icon: 'umbrella'
|
icon: 'umbrella'
|
||||||
runs:
|
runs:
|
||||||
using: 'node20'
|
using: 'node12'
|
||||||
main: 'dist/index.js'
|
main: 'dist/index.js'
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
import Coverage from './coverage';
|
|
||||||
|
|
||||||
test('test uncovered if', () => {
|
|
||||||
const coverageObj = new Coverage();
|
|
||||||
expect(coverageObj.uncovered_if()).toEqual(false);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('fully covered', () => {
|
|
||||||
const coverageObj = new Coverage();
|
|
||||||
expect(coverageObj.fully_covered()).toEqual(true);
|
|
||||||
});
|
|
||||||
453
dist/37.index.js
vendored
453
dist/37.index.js
vendored
@@ -1,453 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
exports.id = 37;
|
|
||||||
exports.ids = [37];
|
|
||||||
exports.modules = {
|
|
||||||
|
|
||||||
/***/ 4037:
|
|
||||||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
||||||
|
|
||||||
__webpack_require__.r(__webpack_exports__);
|
|
||||||
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
||||||
/* harmony export */ "toFormData": () => (/* binding */ toFormData)
|
|
||||||
/* harmony export */ });
|
|
||||||
/* harmony import */ var fetch_blob_from_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2777);
|
|
||||||
/* harmony import */ var formdata_polyfill_esm_min_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8010);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let s = 0;
|
|
||||||
const S = {
|
|
||||||
START_BOUNDARY: s++,
|
|
||||||
HEADER_FIELD_START: s++,
|
|
||||||
HEADER_FIELD: s++,
|
|
||||||
HEADER_VALUE_START: s++,
|
|
||||||
HEADER_VALUE: s++,
|
|
||||||
HEADER_VALUE_ALMOST_DONE: s++,
|
|
||||||
HEADERS_ALMOST_DONE: s++,
|
|
||||||
PART_DATA_START: s++,
|
|
||||||
PART_DATA: s++,
|
|
||||||
END: s++
|
|
||||||
};
|
|
||||||
|
|
||||||
let f = 1;
|
|
||||||
const F = {
|
|
||||||
PART_BOUNDARY: f,
|
|
||||||
LAST_BOUNDARY: f *= 2
|
|
||||||
};
|
|
||||||
|
|
||||||
const LF = 10;
|
|
||||||
const CR = 13;
|
|
||||||
const SPACE = 32;
|
|
||||||
const HYPHEN = 45;
|
|
||||||
const COLON = 58;
|
|
||||||
const A = 97;
|
|
||||||
const Z = 122;
|
|
||||||
|
|
||||||
const lower = c => c | 0x20;
|
|
||||||
|
|
||||||
const noop = () => {};
|
|
||||||
|
|
||||||
class MultipartParser {
|
|
||||||
/**
|
|
||||||
* @param {string} boundary
|
|
||||||
*/
|
|
||||||
constructor(boundary) {
|
|
||||||
this.index = 0;
|
|
||||||
this.flags = 0;
|
|
||||||
|
|
||||||
this.onHeaderEnd = noop;
|
|
||||||
this.onHeaderField = noop;
|
|
||||||
this.onHeadersEnd = noop;
|
|
||||||
this.onHeaderValue = noop;
|
|
||||||
this.onPartBegin = noop;
|
|
||||||
this.onPartData = noop;
|
|
||||||
this.onPartEnd = noop;
|
|
||||||
|
|
||||||
this.boundaryChars = {};
|
|
||||||
|
|
||||||
boundary = '\r\n--' + boundary;
|
|
||||||
const ui8a = new Uint8Array(boundary.length);
|
|
||||||
for (let i = 0; i < boundary.length; i++) {
|
|
||||||
ui8a[i] = boundary.charCodeAt(i);
|
|
||||||
this.boundaryChars[ui8a[i]] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.boundary = ui8a;
|
|
||||||
this.lookbehind = new Uint8Array(this.boundary.length + 8);
|
|
||||||
this.state = S.START_BOUNDARY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Uint8Array} data
|
|
||||||
*/
|
|
||||||
write(data) {
|
|
||||||
let i = 0;
|
|
||||||
const length_ = data.length;
|
|
||||||
let previousIndex = this.index;
|
|
||||||
let {lookbehind, boundary, boundaryChars, index, state, flags} = this;
|
|
||||||
const boundaryLength = this.boundary.length;
|
|
||||||
const boundaryEnd = boundaryLength - 1;
|
|
||||||
const bufferLength = data.length;
|
|
||||||
let c;
|
|
||||||
let cl;
|
|
||||||
|
|
||||||
const mark = name => {
|
|
||||||
this[name + 'Mark'] = i;
|
|
||||||
};
|
|
||||||
|
|
||||||
const clear = name => {
|
|
||||||
delete this[name + 'Mark'];
|
|
||||||
};
|
|
||||||
|
|
||||||
const callback = (callbackSymbol, start, end, ui8a) => {
|
|
||||||
if (start === undefined || start !== end) {
|
|
||||||
this[callbackSymbol](ui8a && ui8a.subarray(start, end));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const dataCallback = (name, clear) => {
|
|
||||||
const markSymbol = name + 'Mark';
|
|
||||||
if (!(markSymbol in this)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (clear) {
|
|
||||||
callback(name, this[markSymbol], i, data);
|
|
||||||
delete this[markSymbol];
|
|
||||||
} else {
|
|
||||||
callback(name, this[markSymbol], data.length, data);
|
|
||||||
this[markSymbol] = 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
for (i = 0; i < length_; i++) {
|
|
||||||
c = data[i];
|
|
||||||
|
|
||||||
switch (state) {
|
|
||||||
case S.START_BOUNDARY:
|
|
||||||
if (index === boundary.length - 2) {
|
|
||||||
if (c === HYPHEN) {
|
|
||||||
flags |= F.LAST_BOUNDARY;
|
|
||||||
} else if (c !== CR) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
index++;
|
|
||||||
break;
|
|
||||||
} else if (index - 1 === boundary.length - 2) {
|
|
||||||
if (flags & F.LAST_BOUNDARY && c === HYPHEN) {
|
|
||||||
state = S.END;
|
|
||||||
flags = 0;
|
|
||||||
} else if (!(flags & F.LAST_BOUNDARY) && c === LF) {
|
|
||||||
index = 0;
|
|
||||||
callback('onPartBegin');
|
|
||||||
state = S.HEADER_FIELD_START;
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c !== boundary[index + 2]) {
|
|
||||||
index = -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c === boundary[index + 2]) {
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case S.HEADER_FIELD_START:
|
|
||||||
state = S.HEADER_FIELD;
|
|
||||||
mark('onHeaderField');
|
|
||||||
index = 0;
|
|
||||||
// falls through
|
|
||||||
case S.HEADER_FIELD:
|
|
||||||
if (c === CR) {
|
|
||||||
clear('onHeaderField');
|
|
||||||
state = S.HEADERS_ALMOST_DONE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
index++;
|
|
||||||
if (c === HYPHEN) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c === COLON) {
|
|
||||||
if (index === 1) {
|
|
||||||
// empty header field
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dataCallback('onHeaderField', true);
|
|
||||||
state = S.HEADER_VALUE_START;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
cl = lower(c);
|
|
||||||
if (cl < A || cl > Z) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case S.HEADER_VALUE_START:
|
|
||||||
if (c === SPACE) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mark('onHeaderValue');
|
|
||||||
state = S.HEADER_VALUE;
|
|
||||||
// falls through
|
|
||||||
case S.HEADER_VALUE:
|
|
||||||
if (c === CR) {
|
|
||||||
dataCallback('onHeaderValue', true);
|
|
||||||
callback('onHeaderEnd');
|
|
||||||
state = S.HEADER_VALUE_ALMOST_DONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case S.HEADER_VALUE_ALMOST_DONE:
|
|
||||||
if (c !== LF) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
state = S.HEADER_FIELD_START;
|
|
||||||
break;
|
|
||||||
case S.HEADERS_ALMOST_DONE:
|
|
||||||
if (c !== LF) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
callback('onHeadersEnd');
|
|
||||||
state = S.PART_DATA_START;
|
|
||||||
break;
|
|
||||||
case S.PART_DATA_START:
|
|
||||||
state = S.PART_DATA;
|
|
||||||
mark('onPartData');
|
|
||||||
// falls through
|
|
||||||
case S.PART_DATA:
|
|
||||||
previousIndex = index;
|
|
||||||
|
|
||||||
if (index === 0) {
|
|
||||||
// boyer-moore derrived algorithm to safely skip non-boundary data
|
|
||||||
i += boundaryEnd;
|
|
||||||
while (i < bufferLength && !(data[i] in boundaryChars)) {
|
|
||||||
i += boundaryLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
i -= boundaryEnd;
|
|
||||||
c = data[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index < boundary.length) {
|
|
||||||
if (boundary[index] === c) {
|
|
||||||
if (index === 0) {
|
|
||||||
dataCallback('onPartData', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
index++;
|
|
||||||
} else {
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
} else if (index === boundary.length) {
|
|
||||||
index++;
|
|
||||||
if (c === CR) {
|
|
||||||
// CR = part boundary
|
|
||||||
flags |= F.PART_BOUNDARY;
|
|
||||||
} else if (c === HYPHEN) {
|
|
||||||
// HYPHEN = end boundary
|
|
||||||
flags |= F.LAST_BOUNDARY;
|
|
||||||
} else {
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
} else if (index - 1 === boundary.length) {
|
|
||||||
if (flags & F.PART_BOUNDARY) {
|
|
||||||
index = 0;
|
|
||||||
if (c === LF) {
|
|
||||||
// unset the PART_BOUNDARY flag
|
|
||||||
flags &= ~F.PART_BOUNDARY;
|
|
||||||
callback('onPartEnd');
|
|
||||||
callback('onPartBegin');
|
|
||||||
state = S.HEADER_FIELD_START;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (flags & F.LAST_BOUNDARY) {
|
|
||||||
if (c === HYPHEN) {
|
|
||||||
callback('onPartEnd');
|
|
||||||
state = S.END;
|
|
||||||
flags = 0;
|
|
||||||
} else {
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index > 0) {
|
|
||||||
// when matching a possible boundary, keep a lookbehind reference
|
|
||||||
// in case it turns out to be a false lead
|
|
||||||
lookbehind[index - 1] = c;
|
|
||||||
} else if (previousIndex > 0) {
|
|
||||||
// if our boundary turned out to be rubbish, the captured lookbehind
|
|
||||||
// belongs to partData
|
|
||||||
const _lookbehind = new Uint8Array(lookbehind.buffer, lookbehind.byteOffset, lookbehind.byteLength);
|
|
||||||
callback('onPartData', 0, previousIndex, _lookbehind);
|
|
||||||
previousIndex = 0;
|
|
||||||
mark('onPartData');
|
|
||||||
|
|
||||||
// reconsider the current character even so it interrupted the sequence
|
|
||||||
// it could be the beginning of a new sequence
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case S.END:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new Error(`Unexpected state entered: ${state}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dataCallback('onHeaderField');
|
|
||||||
dataCallback('onHeaderValue');
|
|
||||||
dataCallback('onPartData');
|
|
||||||
|
|
||||||
// Update properties for the next call
|
|
||||||
this.index = index;
|
|
||||||
this.state = state;
|
|
||||||
this.flags = flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
end() {
|
|
||||||
if ((this.state === S.HEADER_FIELD_START && this.index === 0) ||
|
|
||||||
(this.state === S.PART_DATA && this.index === this.boundary.length)) {
|
|
||||||
this.onPartEnd();
|
|
||||||
} else if (this.state !== S.END) {
|
|
||||||
throw new Error('MultipartParser.end(): stream ended unexpectedly');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _fileName(headerValue) {
|
|
||||||
// matches either a quoted-string or a token (RFC 2616 section 19.5.1)
|
|
||||||
const m = headerValue.match(/\bfilename=("(.*?)"|([^()<>@,;:\\"/[\]?={}\s\t]+))($|;\s)/i);
|
|
||||||
if (!m) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const match = m[2] || m[3] || '';
|
|
||||||
let filename = match.slice(match.lastIndexOf('\\') + 1);
|
|
||||||
filename = filename.replace(/%22/g, '"');
|
|
||||||
filename = filename.replace(/&#(\d{4});/g, (m, code) => {
|
|
||||||
return String.fromCharCode(code);
|
|
||||||
});
|
|
||||||
return filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function toFormData(Body, ct) {
|
|
||||||
if (!/multipart/i.test(ct)) {
|
|
||||||
throw new TypeError('Failed to fetch');
|
|
||||||
}
|
|
||||||
|
|
||||||
const m = ct.match(/boundary=(?:"([^"]+)"|([^;]+))/i);
|
|
||||||
|
|
||||||
if (!m) {
|
|
||||||
throw new TypeError('no or bad content-type header, no multipart boundary');
|
|
||||||
}
|
|
||||||
|
|
||||||
const parser = new MultipartParser(m[1] || m[2]);
|
|
||||||
|
|
||||||
let headerField;
|
|
||||||
let headerValue;
|
|
||||||
let entryValue;
|
|
||||||
let entryName;
|
|
||||||
let contentType;
|
|
||||||
let filename;
|
|
||||||
const entryChunks = [];
|
|
||||||
const formData = new formdata_polyfill_esm_min_js__WEBPACK_IMPORTED_MODULE_1__/* .FormData */ .Ct();
|
|
||||||
|
|
||||||
const onPartData = ui8a => {
|
|
||||||
entryValue += decoder.decode(ui8a, {stream: true});
|
|
||||||
};
|
|
||||||
|
|
||||||
const appendToFile = ui8a => {
|
|
||||||
entryChunks.push(ui8a);
|
|
||||||
};
|
|
||||||
|
|
||||||
const appendFileToFormData = () => {
|
|
||||||
const file = new fetch_blob_from_js__WEBPACK_IMPORTED_MODULE_0__/* .File */ .$B(entryChunks, filename, {type: contentType});
|
|
||||||
formData.append(entryName, file);
|
|
||||||
};
|
|
||||||
|
|
||||||
const appendEntryToFormData = () => {
|
|
||||||
formData.append(entryName, entryValue);
|
|
||||||
};
|
|
||||||
|
|
||||||
const decoder = new TextDecoder('utf-8');
|
|
||||||
decoder.decode();
|
|
||||||
|
|
||||||
parser.onPartBegin = function () {
|
|
||||||
parser.onPartData = onPartData;
|
|
||||||
parser.onPartEnd = appendEntryToFormData;
|
|
||||||
|
|
||||||
headerField = '';
|
|
||||||
headerValue = '';
|
|
||||||
entryValue = '';
|
|
||||||
entryName = '';
|
|
||||||
contentType = '';
|
|
||||||
filename = null;
|
|
||||||
entryChunks.length = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
parser.onHeaderField = function (ui8a) {
|
|
||||||
headerField += decoder.decode(ui8a, {stream: true});
|
|
||||||
};
|
|
||||||
|
|
||||||
parser.onHeaderValue = function (ui8a) {
|
|
||||||
headerValue += decoder.decode(ui8a, {stream: true});
|
|
||||||
};
|
|
||||||
|
|
||||||
parser.onHeaderEnd = function () {
|
|
||||||
headerValue += decoder.decode();
|
|
||||||
headerField = headerField.toLowerCase();
|
|
||||||
|
|
||||||
if (headerField === 'content-disposition') {
|
|
||||||
// matches either a quoted-string or a token (RFC 2616 section 19.5.1)
|
|
||||||
const m = headerValue.match(/\bname=("([^"]*)"|([^()<>@,;:\\"/[\]?={}\s\t]+))/i);
|
|
||||||
|
|
||||||
if (m) {
|
|
||||||
entryName = m[2] || m[3] || '';
|
|
||||||
}
|
|
||||||
|
|
||||||
filename = _fileName(headerValue);
|
|
||||||
|
|
||||||
if (filename) {
|
|
||||||
parser.onPartData = appendToFile;
|
|
||||||
parser.onPartEnd = appendFileToFormData;
|
|
||||||
}
|
|
||||||
} else if (headerField === 'content-type') {
|
|
||||||
contentType = headerValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
headerValue = '';
|
|
||||||
headerField = '';
|
|
||||||
};
|
|
||||||
|
|
||||||
for await (const chunk of Body) {
|
|
||||||
parser.write(chunk);
|
|
||||||
}
|
|
||||||
|
|
||||||
parser.end();
|
|
||||||
|
|
||||||
return formData;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***/ })
|
|
||||||
|
|
||||||
};
|
|
||||||
;
|
|
||||||
//# sourceMappingURL=37.index.js.map
|
|
||||||
1
dist/37.index.js.map
vendored
1
dist/37.index.js.map
vendored
File diff suppressed because one or more lines are too long
453
dist/629.index.js
vendored
453
dist/629.index.js
vendored
@@ -1,453 +0,0 @@
|
|||||||
exports.id = 629;
|
|
||||||
exports.ids = [629];
|
|
||||||
exports.modules = {
|
|
||||||
|
|
||||||
/***/ 6629:
|
|
||||||
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
__webpack_require__.r(__webpack_exports__);
|
|
||||||
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
||||||
/* harmony export */ "toFormData": () => (/* binding */ toFormData)
|
|
||||||
/* harmony export */ });
|
|
||||||
/* harmony import */ var fetch_blob_from_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4818);
|
|
||||||
/* harmony import */ var formdata_polyfill_esm_min_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1402);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let s = 0;
|
|
||||||
const S = {
|
|
||||||
START_BOUNDARY: s++,
|
|
||||||
HEADER_FIELD_START: s++,
|
|
||||||
HEADER_FIELD: s++,
|
|
||||||
HEADER_VALUE_START: s++,
|
|
||||||
HEADER_VALUE: s++,
|
|
||||||
HEADER_VALUE_ALMOST_DONE: s++,
|
|
||||||
HEADERS_ALMOST_DONE: s++,
|
|
||||||
PART_DATA_START: s++,
|
|
||||||
PART_DATA: s++,
|
|
||||||
END: s++
|
|
||||||
};
|
|
||||||
|
|
||||||
let f = 1;
|
|
||||||
const F = {
|
|
||||||
PART_BOUNDARY: f,
|
|
||||||
LAST_BOUNDARY: f *= 2
|
|
||||||
};
|
|
||||||
|
|
||||||
const LF = 10;
|
|
||||||
const CR = 13;
|
|
||||||
const SPACE = 32;
|
|
||||||
const HYPHEN = 45;
|
|
||||||
const COLON = 58;
|
|
||||||
const A = 97;
|
|
||||||
const Z = 122;
|
|
||||||
|
|
||||||
const lower = c => c | 0x20;
|
|
||||||
|
|
||||||
const noop = () => {};
|
|
||||||
|
|
||||||
class MultipartParser {
|
|
||||||
/**
|
|
||||||
* @param {string} boundary
|
|
||||||
*/
|
|
||||||
constructor(boundary) {
|
|
||||||
this.index = 0;
|
|
||||||
this.flags = 0;
|
|
||||||
|
|
||||||
this.onHeaderEnd = noop;
|
|
||||||
this.onHeaderField = noop;
|
|
||||||
this.onHeadersEnd = noop;
|
|
||||||
this.onHeaderValue = noop;
|
|
||||||
this.onPartBegin = noop;
|
|
||||||
this.onPartData = noop;
|
|
||||||
this.onPartEnd = noop;
|
|
||||||
|
|
||||||
this.boundaryChars = {};
|
|
||||||
|
|
||||||
boundary = '\r\n--' + boundary;
|
|
||||||
const ui8a = new Uint8Array(boundary.length);
|
|
||||||
for (let i = 0; i < boundary.length; i++) {
|
|
||||||
ui8a[i] = boundary.charCodeAt(i);
|
|
||||||
this.boundaryChars[ui8a[i]] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.boundary = ui8a;
|
|
||||||
this.lookbehind = new Uint8Array(this.boundary.length + 8);
|
|
||||||
this.state = S.START_BOUNDARY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Uint8Array} data
|
|
||||||
*/
|
|
||||||
write(data) {
|
|
||||||
let i = 0;
|
|
||||||
const length_ = data.length;
|
|
||||||
let previousIndex = this.index;
|
|
||||||
let {lookbehind, boundary, boundaryChars, index, state, flags} = this;
|
|
||||||
const boundaryLength = this.boundary.length;
|
|
||||||
const boundaryEnd = boundaryLength - 1;
|
|
||||||
const bufferLength = data.length;
|
|
||||||
let c;
|
|
||||||
let cl;
|
|
||||||
|
|
||||||
const mark = name => {
|
|
||||||
this[name + 'Mark'] = i;
|
|
||||||
};
|
|
||||||
|
|
||||||
const clear = name => {
|
|
||||||
delete this[name + 'Mark'];
|
|
||||||
};
|
|
||||||
|
|
||||||
const callback = (callbackSymbol, start, end, ui8a) => {
|
|
||||||
if (start === undefined || start !== end) {
|
|
||||||
this[callbackSymbol](ui8a && ui8a.subarray(start, end));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const dataCallback = (name, clear) => {
|
|
||||||
const markSymbol = name + 'Mark';
|
|
||||||
if (!(markSymbol in this)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (clear) {
|
|
||||||
callback(name, this[markSymbol], i, data);
|
|
||||||
delete this[markSymbol];
|
|
||||||
} else {
|
|
||||||
callback(name, this[markSymbol], data.length, data);
|
|
||||||
this[markSymbol] = 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
for (i = 0; i < length_; i++) {
|
|
||||||
c = data[i];
|
|
||||||
|
|
||||||
switch (state) {
|
|
||||||
case S.START_BOUNDARY:
|
|
||||||
if (index === boundary.length - 2) {
|
|
||||||
if (c === HYPHEN) {
|
|
||||||
flags |= F.LAST_BOUNDARY;
|
|
||||||
} else if (c !== CR) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
index++;
|
|
||||||
break;
|
|
||||||
} else if (index - 1 === boundary.length - 2) {
|
|
||||||
if (flags & F.LAST_BOUNDARY && c === HYPHEN) {
|
|
||||||
state = S.END;
|
|
||||||
flags = 0;
|
|
||||||
} else if (!(flags & F.LAST_BOUNDARY) && c === LF) {
|
|
||||||
index = 0;
|
|
||||||
callback('onPartBegin');
|
|
||||||
state = S.HEADER_FIELD_START;
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c !== boundary[index + 2]) {
|
|
||||||
index = -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c === boundary[index + 2]) {
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case S.HEADER_FIELD_START:
|
|
||||||
state = S.HEADER_FIELD;
|
|
||||||
mark('onHeaderField');
|
|
||||||
index = 0;
|
|
||||||
// falls through
|
|
||||||
case S.HEADER_FIELD:
|
|
||||||
if (c === CR) {
|
|
||||||
clear('onHeaderField');
|
|
||||||
state = S.HEADERS_ALMOST_DONE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
index++;
|
|
||||||
if (c === HYPHEN) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c === COLON) {
|
|
||||||
if (index === 1) {
|
|
||||||
// empty header field
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dataCallback('onHeaderField', true);
|
|
||||||
state = S.HEADER_VALUE_START;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
cl = lower(c);
|
|
||||||
if (cl < A || cl > Z) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case S.HEADER_VALUE_START:
|
|
||||||
if (c === SPACE) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mark('onHeaderValue');
|
|
||||||
state = S.HEADER_VALUE;
|
|
||||||
// falls through
|
|
||||||
case S.HEADER_VALUE:
|
|
||||||
if (c === CR) {
|
|
||||||
dataCallback('onHeaderValue', true);
|
|
||||||
callback('onHeaderEnd');
|
|
||||||
state = S.HEADER_VALUE_ALMOST_DONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case S.HEADER_VALUE_ALMOST_DONE:
|
|
||||||
if (c !== LF) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
state = S.HEADER_FIELD_START;
|
|
||||||
break;
|
|
||||||
case S.HEADERS_ALMOST_DONE:
|
|
||||||
if (c !== LF) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
callback('onHeadersEnd');
|
|
||||||
state = S.PART_DATA_START;
|
|
||||||
break;
|
|
||||||
case S.PART_DATA_START:
|
|
||||||
state = S.PART_DATA;
|
|
||||||
mark('onPartData');
|
|
||||||
// falls through
|
|
||||||
case S.PART_DATA:
|
|
||||||
previousIndex = index;
|
|
||||||
|
|
||||||
if (index === 0) {
|
|
||||||
// boyer-moore derrived algorithm to safely skip non-boundary data
|
|
||||||
i += boundaryEnd;
|
|
||||||
while (i < bufferLength && !(data[i] in boundaryChars)) {
|
|
||||||
i += boundaryLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
i -= boundaryEnd;
|
|
||||||
c = data[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index < boundary.length) {
|
|
||||||
if (boundary[index] === c) {
|
|
||||||
if (index === 0) {
|
|
||||||
dataCallback('onPartData', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
index++;
|
|
||||||
} else {
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
} else if (index === boundary.length) {
|
|
||||||
index++;
|
|
||||||
if (c === CR) {
|
|
||||||
// CR = part boundary
|
|
||||||
flags |= F.PART_BOUNDARY;
|
|
||||||
} else if (c === HYPHEN) {
|
|
||||||
// HYPHEN = end boundary
|
|
||||||
flags |= F.LAST_BOUNDARY;
|
|
||||||
} else {
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
} else if (index - 1 === boundary.length) {
|
|
||||||
if (flags & F.PART_BOUNDARY) {
|
|
||||||
index = 0;
|
|
||||||
if (c === LF) {
|
|
||||||
// unset the PART_BOUNDARY flag
|
|
||||||
flags &= ~F.PART_BOUNDARY;
|
|
||||||
callback('onPartEnd');
|
|
||||||
callback('onPartBegin');
|
|
||||||
state = S.HEADER_FIELD_START;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (flags & F.LAST_BOUNDARY) {
|
|
||||||
if (c === HYPHEN) {
|
|
||||||
callback('onPartEnd');
|
|
||||||
state = S.END;
|
|
||||||
flags = 0;
|
|
||||||
} else {
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index > 0) {
|
|
||||||
// when matching a possible boundary, keep a lookbehind reference
|
|
||||||
// in case it turns out to be a false lead
|
|
||||||
lookbehind[index - 1] = c;
|
|
||||||
} else if (previousIndex > 0) {
|
|
||||||
// if our boundary turned out to be rubbish, the captured lookbehind
|
|
||||||
// belongs to partData
|
|
||||||
const _lookbehind = new Uint8Array(lookbehind.buffer, lookbehind.byteOffset, lookbehind.byteLength);
|
|
||||||
callback('onPartData', 0, previousIndex, _lookbehind);
|
|
||||||
previousIndex = 0;
|
|
||||||
mark('onPartData');
|
|
||||||
|
|
||||||
// reconsider the current character even so it interrupted the sequence
|
|
||||||
// it could be the beginning of a new sequence
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case S.END:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new Error(`Unexpected state entered: ${state}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dataCallback('onHeaderField');
|
|
||||||
dataCallback('onHeaderValue');
|
|
||||||
dataCallback('onPartData');
|
|
||||||
|
|
||||||
// Update properties for the next call
|
|
||||||
this.index = index;
|
|
||||||
this.state = state;
|
|
||||||
this.flags = flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
end() {
|
|
||||||
if ((this.state === S.HEADER_FIELD_START && this.index === 0) ||
|
|
||||||
(this.state === S.PART_DATA && this.index === this.boundary.length)) {
|
|
||||||
this.onPartEnd();
|
|
||||||
} else if (this.state !== S.END) {
|
|
||||||
throw new Error('MultipartParser.end(): stream ended unexpectedly');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _fileName(headerValue) {
|
|
||||||
// matches either a quoted-string or a token (RFC 2616 section 19.5.1)
|
|
||||||
const m = headerValue.match(/\bfilename=("(.*?)"|([^()<>@,;:\\"/[\]?={}\s\t]+))($|;\s)/i);
|
|
||||||
if (!m) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const match = m[2] || m[3] || '';
|
|
||||||
let filename = match.slice(match.lastIndexOf('\\') + 1);
|
|
||||||
filename = filename.replace(/%22/g, '"');
|
|
||||||
filename = filename.replace(/&#(\d{4});/g, (m, code) => {
|
|
||||||
return String.fromCharCode(code);
|
|
||||||
});
|
|
||||||
return filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function toFormData(Body, ct) {
|
|
||||||
if (!/multipart/i.test(ct)) {
|
|
||||||
throw new TypeError('Failed to fetch');
|
|
||||||
}
|
|
||||||
|
|
||||||
const m = ct.match(/boundary=(?:"([^"]+)"|([^;]+))/i);
|
|
||||||
|
|
||||||
if (!m) {
|
|
||||||
throw new TypeError('no or bad content-type header, no multipart boundary');
|
|
||||||
}
|
|
||||||
|
|
||||||
const parser = new MultipartParser(m[1] || m[2]);
|
|
||||||
|
|
||||||
let headerField;
|
|
||||||
let headerValue;
|
|
||||||
let entryValue;
|
|
||||||
let entryName;
|
|
||||||
let contentType;
|
|
||||||
let filename;
|
|
||||||
const entryChunks = [];
|
|
||||||
const formData = new formdata_polyfill_esm_min_js__WEBPACK_IMPORTED_MODULE_1__/* .FormData */ .Ct();
|
|
||||||
|
|
||||||
const onPartData = ui8a => {
|
|
||||||
entryValue += decoder.decode(ui8a, {stream: true});
|
|
||||||
};
|
|
||||||
|
|
||||||
const appendToFile = ui8a => {
|
|
||||||
entryChunks.push(ui8a);
|
|
||||||
};
|
|
||||||
|
|
||||||
const appendFileToFormData = () => {
|
|
||||||
const file = new fetch_blob_from_js__WEBPACK_IMPORTED_MODULE_0__/* .File */ .$B(entryChunks, filename, {type: contentType});
|
|
||||||
formData.append(entryName, file);
|
|
||||||
};
|
|
||||||
|
|
||||||
const appendEntryToFormData = () => {
|
|
||||||
formData.append(entryName, entryValue);
|
|
||||||
};
|
|
||||||
|
|
||||||
const decoder = new TextDecoder('utf-8');
|
|
||||||
decoder.decode();
|
|
||||||
|
|
||||||
parser.onPartBegin = function () {
|
|
||||||
parser.onPartData = onPartData;
|
|
||||||
parser.onPartEnd = appendEntryToFormData;
|
|
||||||
|
|
||||||
headerField = '';
|
|
||||||
headerValue = '';
|
|
||||||
entryValue = '';
|
|
||||||
entryName = '';
|
|
||||||
contentType = '';
|
|
||||||
filename = null;
|
|
||||||
entryChunks.length = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
parser.onHeaderField = function (ui8a) {
|
|
||||||
headerField += decoder.decode(ui8a, {stream: true});
|
|
||||||
};
|
|
||||||
|
|
||||||
parser.onHeaderValue = function (ui8a) {
|
|
||||||
headerValue += decoder.decode(ui8a, {stream: true});
|
|
||||||
};
|
|
||||||
|
|
||||||
parser.onHeaderEnd = function () {
|
|
||||||
headerValue += decoder.decode();
|
|
||||||
headerField = headerField.toLowerCase();
|
|
||||||
|
|
||||||
if (headerField === 'content-disposition') {
|
|
||||||
// matches either a quoted-string or a token (RFC 2616 section 19.5.1)
|
|
||||||
const m = headerValue.match(/\bname=("([^"]*)"|([^()<>@,;:\\"/[\]?={}\s\t]+))/i);
|
|
||||||
|
|
||||||
if (m) {
|
|
||||||
entryName = m[2] || m[3] || '';
|
|
||||||
}
|
|
||||||
|
|
||||||
filename = _fileName(headerValue);
|
|
||||||
|
|
||||||
if (filename) {
|
|
||||||
parser.onPartData = appendToFile;
|
|
||||||
parser.onPartEnd = appendFileToFormData;
|
|
||||||
}
|
|
||||||
} else if (headerField === 'content-type') {
|
|
||||||
contentType = headerValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
headerValue = '';
|
|
||||||
headerField = '';
|
|
||||||
};
|
|
||||||
|
|
||||||
for await (const chunk of Body) {
|
|
||||||
parser.write(chunk);
|
|
||||||
}
|
|
||||||
|
|
||||||
parser.end();
|
|
||||||
|
|
||||||
return formData;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***/ })
|
|
||||||
|
|
||||||
};
|
|
||||||
;
|
|
||||||
//# sourceMappingURL=629.index.js.map
|
|
||||||
1
dist/629.index.js.map
vendored
1
dist/629.index.js.map
vendored
File diff suppressed because one or more lines are too long
85985
dist/index.js
vendored
Executable file → Normal file
85985
dist/index.js
vendored
Executable file → Normal file
File diff suppressed because one or more lines are too long
1
dist/index.js.map
vendored
1
dist/index.js.map
vendored
File diff suppressed because one or more lines are too long
52
dist/pgp_keys.asc
vendored
52
dist/pgp_keys.asc
vendored
@@ -1,52 +0,0 @@
|
|||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
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
|
|
||||||
=ch7z
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
||||||
1
dist/sourcemap-register.js
vendored
1
dist/sourcemap-register.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,9 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
set -e
|
npm i --package-lock-only
|
||||||
|
|
||||||
npm install
|
|
||||||
npm run lint
|
|
||||||
npm run build
|
npm run build
|
||||||
git add dist/
|
|
||||||
git add package-lock.json
|
git add package-lock.json
|
||||||
|
git add dist/index.js
|
||||||
|
|||||||
192
index.js
Normal file
192
index.js
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
const core = require("@actions/core");
|
||||||
|
const exec = require("@actions/exec");
|
||||||
|
const fs = require("fs");
|
||||||
|
const request = require('requestretry');
|
||||||
|
|
||||||
|
try {
|
||||||
|
const isTrue = arg => {
|
||||||
|
const lowerVar = arg.toLowerCase();
|
||||||
|
|
||||||
|
return (
|
||||||
|
arg === "yes" ||
|
||||||
|
arg === "y" ||
|
||||||
|
arg === "true" ||
|
||||||
|
arg === "t" ||
|
||||||
|
arg === "1"
|
||||||
|
) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const name = core.getInput("name");
|
||||||
|
const token = core.getInput("token");
|
||||||
|
const flags = core.getInput("flags");
|
||||||
|
const file = core.getInput("file");
|
||||||
|
const files = core.getInput("files");
|
||||||
|
const env_vars = core.getInput("env_vars");
|
||||||
|
const dir = core.getInput("directory");
|
||||||
|
const write_path = core.getInput("path_to_write_report");
|
||||||
|
const working_dir = core.getInput("working-directory");
|
||||||
|
const xcode_derived_data = core.getInput("xcode_derived_data");
|
||||||
|
const xcode_package = core.getInput("xcode_package");
|
||||||
|
|
||||||
|
const fail_ci = isTrue(core.getInput("fail_ci_if_error"));
|
||||||
|
const verbose = isTrue(core.getInput("verbose"));
|
||||||
|
|
||||||
|
request({
|
||||||
|
json: false,
|
||||||
|
maxAttempts: 10,
|
||||||
|
timeout: 3000,
|
||||||
|
url: "https://codecov.io/bash"
|
||||||
|
}, (error, response, body) => {
|
||||||
|
try {
|
||||||
|
if (error && fail_ci) {
|
||||||
|
throw error;
|
||||||
|
} else if (error) {
|
||||||
|
core.warning(`Codecov warning: ${error.message}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.writeFile("codecov.sh", body, err => {
|
||||||
|
if (err && fail_ci) {
|
||||||
|
throw err;
|
||||||
|
} else if (err) {
|
||||||
|
core.warning(`Codecov warning: ${err.message}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
let output = "";
|
||||||
|
let execError = "";
|
||||||
|
const options = {};
|
||||||
|
options.listeners = {
|
||||||
|
stdout: data => {
|
||||||
|
output += data.toString();
|
||||||
|
},
|
||||||
|
stderr: data => {
|
||||||
|
execError += data.toString();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
options.env = Object.assign(process.env, {
|
||||||
|
GITHUB_ACTION: process.env.GITHUB_ACTION,
|
||||||
|
GITHUB_RUN_ID: process.env.GITHUB_RUN_ID,
|
||||||
|
GITHUB_REF: process.env.GITHUB_REF,
|
||||||
|
GITHUB_REPOSITORY: process.env.GITHUB_REPOSITORY,
|
||||||
|
GITHUB_SHA: process.env.GITHUB_SHA,
|
||||||
|
GITHUB_HEAD_REF: process.env.GITHUB_HEAD_REF || ''
|
||||||
|
});
|
||||||
|
|
||||||
|
if(token){
|
||||||
|
options.env.CODECOV_TOKEN = token
|
||||||
|
}
|
||||||
|
|
||||||
|
const env_vars_arg = []
|
||||||
|
for (let env_var of env_vars.split(",")) {
|
||||||
|
let env_var_clean = env_var.trim();
|
||||||
|
if (env_var_clean) {
|
||||||
|
options.env[env_var_clean] = process.env[env_var_clean];
|
||||||
|
env_vars_arg.push(env_var_clean)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const execArgs = ["codecov.sh"];
|
||||||
|
execArgs.push("-Q", "github-action");
|
||||||
|
|
||||||
|
if (file) {
|
||||||
|
execArgs.push(
|
||||||
|
"-f", `${file}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (files) {
|
||||||
|
files.split(',').forEach(f => {
|
||||||
|
execArgs.push(
|
||||||
|
"-f", `${f}`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dir) {
|
||||||
|
execArgs.push(
|
||||||
|
"-s", `${dir}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
execArgs.push(
|
||||||
|
"-n", `${name}`,
|
||||||
|
"-F", `${flags}`
|
||||||
|
);
|
||||||
|
|
||||||
|
if (fail_ci) {
|
||||||
|
execArgs.push(
|
||||||
|
"-Z"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (env_vars_arg.length) {
|
||||||
|
execArgs.push(
|
||||||
|
"-e", env_vars_arg.join(",")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (write_path) {
|
||||||
|
execArgs.push(
|
||||||
|
"-q", `${write_path}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose) {
|
||||||
|
execArgs.push(
|
||||||
|
"-v"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (working_dir) {
|
||||||
|
options.cwd = working_dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xcode_derived_data) {
|
||||||
|
execArgs.push(
|
||||||
|
"-D", `${xcode_derived_data}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xcode_package) {
|
||||||
|
execArgs.push(
|
||||||
|
"-J", `${xcode_package}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
exec.exec("bash", execArgs, options)
|
||||||
|
.catch(err => {
|
||||||
|
if (fail_ci) {
|
||||||
|
core.setFailed(
|
||||||
|
`Codecov failed with the following error: ${err.message}`
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
core.warning(`Codecov warning: ${err.message}`);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
unlinkFile();
|
||||||
|
});
|
||||||
|
|
||||||
|
const unlinkFile = () => {
|
||||||
|
fs.unlink("codecov.sh", err => {
|
||||||
|
if (err && fail_ci) {
|
||||||
|
throw err;
|
||||||
|
} else if (err) {
|
||||||
|
core.warning(`Codecov warning: ${err.message}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
core.setFailed(
|
||||||
|
`Codecov failed with the following error: ${error.message}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
if (fail_ci) {
|
||||||
|
core.setFailed(`Codecov failed with the following error: ${error.message}`);
|
||||||
|
} else {
|
||||||
|
core.warning(`Codecov warning: ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
preset: 'ts-jest',
|
preset: 'ts-jest',
|
||||||
testEnvironment: 'node',
|
testEnvironment: 'node',
|
||||||
};
|
}
|
||||||
|
|||||||
12217
package-lock.json
generated
12217
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
45
package.json
45
package.json
@@ -1,44 +1,39 @@
|
|||||||
{
|
{
|
||||||
"name": "codecov-action",
|
"name": "codecov-action",
|
||||||
"version": "4.0.2",
|
"version": "1.1.1",
|
||||||
"description": "Upload coverage reports to Codecov from GitHub Actions",
|
"description": "Upload coverage reports to Codecov from GitHub Actions",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "ncc build src/index.ts --source-map",
|
"test": "jest --coverage",
|
||||||
"lint": "eslint src/**/*.ts",
|
"test-calculator": "jest --testPathPattern=src/calculator/ --coverage --coverageDirectory=coverage/calculator",
|
||||||
"test": "npm run test-script && npm run test-calculator && npm run test-coverage",
|
"test-index": "jest --testPathPattern=src/index --coverage --coverageDirectory=coverage/index",
|
||||||
"test-calculator": "jest --testPathPattern=demo/calculator/ --coverage --coverageDirectory=coverage/calculator",
|
"test-all": "yarn run test && yarn run test-calculator && yarn run test-index",
|
||||||
"test-coverage": "jest --testPathPattern=demo/coverage-test/ --coverage --coverageDirectory=coverage/coverage-test",
|
"build": "ncc build index.js"
|
||||||
"test-script": "jest --testPathPattern=src/ --coverage --coverageDirectory=coverage/script"
|
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://github.com/codecov/codecov-action.git"
|
"url": "git+https://github.com/codecov/codecov-action.git"
|
||||||
},
|
},
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "Codecov",
|
"author": "Ibrahim Ali",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/codecov/codecov-action/issues"
|
"url": "https://github.com/codecov/codecov-action/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/codecov/codecov-action#readme",
|
"homepage": "https://github.com/codecov/codecov-action#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.10.1",
|
"@actions/core": "^1.2.6",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^1.0.4",
|
||||||
"@actions/github": "^6.0.0",
|
"@types/jest": "^26.0.19",
|
||||||
"gpg": "^0.6.0",
|
"@zeit/ncc": "^0.22.3",
|
||||||
"undici": "5.28.2"
|
"fs": "0.0.1-security",
|
||||||
|
"jest": "^26.6.3",
|
||||||
|
"jest-junit": "^12.0.0",
|
||||||
|
"request": "^2.88.2",
|
||||||
|
"requestretry": "^4.1.2",
|
||||||
|
"ts-jest": "^26.4.4",
|
||||||
|
"typescript": "^4.1.3",
|
||||||
|
"yarn": "^1.22.10"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {}
|
||||||
"@types/jest": "^29.5.12",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
|
||||||
"@typescript-eslint/parser": "^6.21.0",
|
|
||||||
"@vercel/ncc": "^0.38.1",
|
|
||||||
"eslint": "^8.56.0",
|
|
||||||
"eslint-config-google": "^0.14.0",
|
|
||||||
"jest": "^29.7.0",
|
|
||||||
"jest-junit": "^16.0.0",
|
|
||||||
"ts-jest": "^29.1.2",
|
|
||||||
"typescript": "^5.3.3"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,256 +0,0 @@
|
|||||||
import * as github from '@actions/github';
|
|
||||||
|
|
||||||
import {
|
|
||||||
buildCommitExec,
|
|
||||||
buildGeneralExec,
|
|
||||||
buildReportExec,
|
|
||||||
buildUploadExec,
|
|
||||||
} from './buildExec';
|
|
||||||
|
|
||||||
|
|
||||||
const context = github.context;
|
|
||||||
|
|
||||||
test('general args', () => {
|
|
||||||
const envs = {
|
|
||||||
codecov_yml_path: 'dev/codecov.yml',
|
|
||||||
url: 'https://codecov.enterprise.com',
|
|
||||||
verbose: 't',
|
|
||||||
};
|
|
||||||
for (const env of Object.keys(envs)) {
|
|
||||||
process.env['INPUT_' + env.toUpperCase()] = envs[env];
|
|
||||||
}
|
|
||||||
|
|
||||||
const {args, verbose} = buildGeneralExec();
|
|
||||||
|
|
||||||
expect(args).toEqual(
|
|
||||||
expect.arrayContaining([
|
|
||||||
'--codecov-yml-path',
|
|
||||||
'dev/codecov.yml',
|
|
||||||
'--enterprise-url',
|
|
||||||
'https://codecov.enterprise.com',
|
|
||||||
'-v',
|
|
||||||
]));
|
|
||||||
expect(verbose).toBeTruthy();
|
|
||||||
for (const env of Object.keys(envs)) {
|
|
||||||
delete process.env['INPUT_' + env.toUpperCase()];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
test('upload args using context', () => {
|
|
||||||
const expectedArgs = [];
|
|
||||||
const {uploadExecArgs, uploadCommand} = buildUploadExec();
|
|
||||||
if (context.eventName == 'pull_request') {
|
|
||||||
expectedArgs.push('-C', `${context.payload.pull_request.head.sha}`);
|
|
||||||
}
|
|
||||||
if (context.eventName == 'pull_request_target') {
|
|
||||||
expectedArgs.push('-P', `${context.payload.number}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
expect(uploadExecArgs).toEqual(expectedArgs);
|
|
||||||
expect(uploadCommand).toEqual('do-upload');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('upload args', () => {
|
|
||||||
const envs = {
|
|
||||||
'codecov_yml_path': 'dev/codecov.yml',
|
|
||||||
'commit_parent': 'fakeparentcommit',
|
|
||||||
'directory': 'coverage/',
|
|
||||||
'disable_file_fixes': 'true',
|
|
||||||
'disable_search': 'true',
|
|
||||||
'dry_run': 'true',
|
|
||||||
'env_vars': 'OS,PYTHON',
|
|
||||||
'exclude': 'node_modules/',
|
|
||||||
'fail_ci_if_error': 'true',
|
|
||||||
'file': 'coverage.xml',
|
|
||||||
'files': 'dir1/coverage.xml,dir2/coverage.xml',
|
|
||||||
'flags': 'test,test2',
|
|
||||||
'handle_no_reports_found': 'true',
|
|
||||||
'job_code': '32',
|
|
||||||
'name': 'codecov',
|
|
||||||
'os': 'macos',
|
|
||||||
'override_branch': 'thomasrockhu/test',
|
|
||||||
'override_build': '1',
|
|
||||||
'override_build_url': 'https://example.com/build/2',
|
|
||||||
'override_commit': '9caabca5474b49de74ef5667deabaf74cdacc244',
|
|
||||||
'override_pr': '2',
|
|
||||||
'plugin': 'xcode',
|
|
||||||
'plugins': 'pycoverage,compress-pycoverage',
|
|
||||||
'report_code': 'testCode',
|
|
||||||
'root_dir': 'root/',
|
|
||||||
'slug': 'fakeOwner/fakeRepo',
|
|
||||||
'token': 'd3859757-ab80-4664-924d-aef22fa7557b',
|
|
||||||
'url': 'https://enterprise.example.com',
|
|
||||||
'use_legacy_upload_endpoint': 'true',
|
|
||||||
'verbose': 'true',
|
|
||||||
'version': '0.1.2',
|
|
||||||
'working-directory': 'src',
|
|
||||||
};
|
|
||||||
for (const env of Object.keys(envs)) {
|
|
||||||
process.env['INPUT_' + env.toUpperCase()] = envs[env];
|
|
||||||
}
|
|
||||||
|
|
||||||
const {uploadExecArgs, uploadCommand} = buildUploadExec();
|
|
||||||
const expectedArgs = [
|
|
||||||
'--disable-file-fixes',
|
|
||||||
'--disable-search',
|
|
||||||
'-d',
|
|
||||||
'-e',
|
|
||||||
'OS,PYTHON',
|
|
||||||
'--exclude',
|
|
||||||
'node_modules/',
|
|
||||||
'-Z',
|
|
||||||
'-f',
|
|
||||||
'coverage.xml',
|
|
||||||
'-f',
|
|
||||||
'dir1/coverage.xml',
|
|
||||||
'-f',
|
|
||||||
'dir2/coverage.xml',
|
|
||||||
'-F',
|
|
||||||
'test',
|
|
||||||
'-F',
|
|
||||||
'test2',
|
|
||||||
'--handle-no-reports-found',
|
|
||||||
'--job-code',
|
|
||||||
'32',
|
|
||||||
'-n',
|
|
||||||
'codecov',
|
|
||||||
'-B',
|
|
||||||
'thomasrockhu/test',
|
|
||||||
'-b',
|
|
||||||
'1',
|
|
||||||
'--build-url',
|
|
||||||
'https://example.com/build/2',
|
|
||||||
'-C',
|
|
||||||
'9caabca5474b49de74ef5667deabaf74cdacc244',
|
|
||||||
'-P',
|
|
||||||
'2',
|
|
||||||
'--plugin',
|
|
||||||
'xcode',
|
|
||||||
'--plugin',
|
|
||||||
'pycoverage',
|
|
||||||
'--plugin',
|
|
||||||
'compress-pycoverage',
|
|
||||||
'--report-code',
|
|
||||||
'testCode',
|
|
||||||
'--network-root-folder',
|
|
||||||
'root/',
|
|
||||||
'-s',
|
|
||||||
'coverage/',
|
|
||||||
'-r',
|
|
||||||
'fakeOwner/fakeRepo',
|
|
||||||
'--legacy',
|
|
||||||
];
|
|
||||||
|
|
||||||
expect(uploadExecArgs).toEqual(expectedArgs);
|
|
||||||
expect(uploadCommand).toEqual('do-upload');
|
|
||||||
for (const env of Object.keys(envs)) {
|
|
||||||
delete process.env['INPUT_' + env.toUpperCase()];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
test('report args', () => {
|
|
||||||
const envs = {
|
|
||||||
override_commit: '9caabca5474b49de74ef5667deabaf74cdacc244',
|
|
||||||
override_pr: 'fakePR',
|
|
||||||
slug: 'fakeOwner/fakeRepo',
|
|
||||||
token: 'd3859757-ab80-4664-924d-aef22fa7557b',
|
|
||||||
fail_ci_if_error: 'true',
|
|
||||||
};
|
|
||||||
for (const env of Object.keys(envs)) {
|
|
||||||
process.env['INPUT_' + env.toUpperCase()] = envs[env];
|
|
||||||
}
|
|
||||||
|
|
||||||
const {reportExecArgs, reportCommand} = buildReportExec();
|
|
||||||
|
|
||||||
const expectedArgs = [
|
|
||||||
'-C',
|
|
||||||
'9caabca5474b49de74ef5667deabaf74cdacc244',
|
|
||||||
'-P',
|
|
||||||
'fakePR',
|
|
||||||
'--slug',
|
|
||||||
'fakeOwner/fakeRepo',
|
|
||||||
'-Z',
|
|
||||||
];
|
|
||||||
|
|
||||||
expect(reportExecArgs).toEqual(expectedArgs);
|
|
||||||
expect(reportCommand).toEqual('create-report');
|
|
||||||
for (const env of Object.keys(envs)) {
|
|
||||||
delete process.env['INPUT_' + env.toUpperCase()];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
test('report args using context', () => {
|
|
||||||
const envs = {
|
|
||||||
token: 'd3859757-ab80-4664-924d-aef22fa7557b',
|
|
||||||
};
|
|
||||||
for (const env of Object.keys(envs)) {
|
|
||||||
process.env['INPUT_' + env.toUpperCase()] = envs[env];
|
|
||||||
}
|
|
||||||
const expectedArgs : string[] = [];
|
|
||||||
if (context.eventName == 'pull_request') {
|
|
||||||
expectedArgs.push('-C', `${context.payload.pull_request.head.sha}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const {reportExecArgs, reportCommand} = buildReportExec();
|
|
||||||
|
|
||||||
expect(reportExecArgs).toEqual(expectedArgs);
|
|
||||||
expect(reportCommand).toEqual('create-report');
|
|
||||||
for (const env of Object.keys(envs)) {
|
|
||||||
delete process.env['INPUT_' + env.toUpperCase()];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
test('commit args', () => {
|
|
||||||
const envs = {
|
|
||||||
commit_parent: '83231650328f11695dfb754ca0f540516f188d27',
|
|
||||||
override_branch: 'thomasrockhu/test',
|
|
||||||
override_commit: '9caabca5474b49de74ef5667deabaf74cdacc244',
|
|
||||||
override_pr: '2',
|
|
||||||
slug: 'fakeOwner/fakeRepo',
|
|
||||||
token: 'd3859757-ab80-4664-924d-aef22fa7557b',
|
|
||||||
fail_ci_if_error: 'true',
|
|
||||||
};
|
|
||||||
for (const env of Object.keys(envs)) {
|
|
||||||
process.env['INPUT_' + env.toUpperCase()] = envs[env];
|
|
||||||
}
|
|
||||||
|
|
||||||
const {commitExecArgs, commitCommand} = buildCommitExec();
|
|
||||||
const expectedArgs = [
|
|
||||||
'--parent-sha',
|
|
||||||
'83231650328f11695dfb754ca0f540516f188d27',
|
|
||||||
'-B',
|
|
||||||
'thomasrockhu/test',
|
|
||||||
'-C',
|
|
||||||
'9caabca5474b49de74ef5667deabaf74cdacc244',
|
|
||||||
'--pr',
|
|
||||||
'2',
|
|
||||||
'--slug',
|
|
||||||
'fakeOwner/fakeRepo',
|
|
||||||
'-Z',
|
|
||||||
];
|
|
||||||
|
|
||||||
expect(commitExecArgs).toEqual(expectedArgs);
|
|
||||||
expect(commitCommand).toEqual('create-commit');
|
|
||||||
for (const env of Object.keys(envs)) {
|
|
||||||
delete process.env['INPUT_' + env.toUpperCase()];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
test('commit args using context', () => {
|
|
||||||
const expectedArgs :string[] = [];
|
|
||||||
|
|
||||||
const {commitExecArgs, commitCommand} = buildCommitExec();
|
|
||||||
if (context.eventName == 'pull_request') {
|
|
||||||
expectedArgs.push('-C', `${context.payload.pull_request.head.sha}`);
|
|
||||||
}
|
|
||||||
if (context.eventName == 'pull_request_target') {
|
|
||||||
expectedArgs.push('-P', `${context.payload.number}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
expect(commitExecArgs).toEqual(expectedArgs);
|
|
||||||
expect(commitCommand).toEqual('create-commit');
|
|
||||||
});
|
|
||||||
321
src/buildExec.ts
321
src/buildExec.ts
@@ -1,321 +0,0 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
||||||
|
|
||||||
import * as core from '@actions/core';
|
|
||||||
import * as github from '@actions/github';
|
|
||||||
|
|
||||||
|
|
||||||
const context = github.context;
|
|
||||||
|
|
||||||
const isTrue = (variable) => {
|
|
||||||
const lowercase = variable.toLowerCase();
|
|
||||||
return (
|
|
||||||
lowercase === '1' ||
|
|
||||||
lowercase === 't' ||
|
|
||||||
lowercase === 'true' ||
|
|
||||||
lowercase === 'y' ||
|
|
||||||
lowercase === 'yes'
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const buildCommitExec = () => {
|
|
||||||
const commitParent = core.getInput('commit_parent');
|
|
||||||
const overrideBranch = core.getInput('override_branch');
|
|
||||||
const overrideCommit = core.getInput('override_commit');
|
|
||||||
const overridePr = core.getInput('override_pr');
|
|
||||||
const slug = core.getInput('slug');
|
|
||||||
const token = core.getInput('token');
|
|
||||||
const failCi = isTrue(core.getInput('fail_ci_if_error'));
|
|
||||||
const workingDir = core.getInput('working-directory');
|
|
||||||
|
|
||||||
const commitCommand = 'create-commit';
|
|
||||||
const commitExecArgs = [];
|
|
||||||
|
|
||||||
const commitOptions:any = {};
|
|
||||||
commitOptions.env = Object.assign(process.env, {
|
|
||||||
GITHUB_ACTION: process.env.GITHUB_ACTION,
|
|
||||||
GITHUB_RUN_ID: process.env.GITHUB_RUN_ID,
|
|
||||||
GITHUB_REF: process.env.GITHUB_REF,
|
|
||||||
GITHUB_REPOSITORY: process.env.GITHUB_REPOSITORY,
|
|
||||||
GITHUB_SHA: process.env.GITHUB_SHA,
|
|
||||||
GITHUB_HEAD_REF: process.env.GITHUB_HEAD_REF || '',
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
if (token) {
|
|
||||||
commitOptions.env.CODECOV_TOKEN = token;
|
|
||||||
}
|
|
||||||
if (commitParent) {
|
|
||||||
commitExecArgs.push('--parent-sha', `${commitParent}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overrideBranch) {
|
|
||||||
commitExecArgs.push('-B', `${overrideBranch}`);
|
|
||||||
}
|
|
||||||
if (overrideCommit) {
|
|
||||||
commitExecArgs.push('-C', `${overrideCommit}`);
|
|
||||||
} else if (
|
|
||||||
`${context.eventName}` == 'pull_request' ||
|
|
||||||
`${context.eventName}` == 'pull_request_target'
|
|
||||||
) {
|
|
||||||
commitExecArgs.push('-C', `${context.payload.pull_request.head.sha}`);
|
|
||||||
}
|
|
||||||
if (overridePr) {
|
|
||||||
commitExecArgs.push('--pr', `${overridePr}`);
|
|
||||||
} else if (
|
|
||||||
`${context.eventName}` == 'pull_request_target'
|
|
||||||
) {
|
|
||||||
commitExecArgs.push('--pr', `${context.payload.number}`);
|
|
||||||
}
|
|
||||||
if (slug) {
|
|
||||||
commitExecArgs.push('--slug', `${slug}`);
|
|
||||||
}
|
|
||||||
if (failCi) {
|
|
||||||
commitExecArgs.push('-Z');
|
|
||||||
}
|
|
||||||
if (workingDir) {
|
|
||||||
commitOptions.cwd = workingDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return {commitExecArgs, commitOptions, commitCommand};
|
|
||||||
};
|
|
||||||
|
|
||||||
const buildGeneralExec = () => {
|
|
||||||
const codecovYmlPath = core.getInput('codecov_yml_path');
|
|
||||||
const url = core.getInput('url');
|
|
||||||
const verbose = isTrue(core.getInput('verbose'));
|
|
||||||
const args = [];
|
|
||||||
|
|
||||||
if (codecovYmlPath) {
|
|
||||||
args.push('--codecov-yml-path', `${codecovYmlPath}`);
|
|
||||||
}
|
|
||||||
if (url) {
|
|
||||||
args.push('--enterprise-url', `${url}`);
|
|
||||||
}
|
|
||||||
if (verbose) {
|
|
||||||
args.push('-v');
|
|
||||||
}
|
|
||||||
return {args, verbose};
|
|
||||||
};
|
|
||||||
|
|
||||||
const buildReportExec = () => {
|
|
||||||
const overrideCommit = core.getInput('override_commit');
|
|
||||||
const overridePr = core.getInput('override_pr');
|
|
||||||
const slug = core.getInput('slug');
|
|
||||||
const token = core.getInput('token');
|
|
||||||
const failCi = isTrue(core.getInput('fail_ci_if_error'));
|
|
||||||
const workingDir = core.getInput('working-directory');
|
|
||||||
|
|
||||||
|
|
||||||
const reportCommand = 'create-report';
|
|
||||||
const reportExecArgs = [];
|
|
||||||
|
|
||||||
const reportOptions:any = {};
|
|
||||||
reportOptions.env = Object.assign(process.env, {
|
|
||||||
GITHUB_ACTION: process.env.GITHUB_ACTION,
|
|
||||||
GITHUB_RUN_ID: process.env.GITHUB_RUN_ID,
|
|
||||||
GITHUB_REF: process.env.GITHUB_REF,
|
|
||||||
GITHUB_REPOSITORY: process.env.GITHUB_REPOSITORY,
|
|
||||||
GITHUB_SHA: process.env.GITHUB_SHA,
|
|
||||||
GITHUB_HEAD_REF: process.env.GITHUB_HEAD_REF || '',
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
if (token) {
|
|
||||||
reportOptions.env.CODECOV_TOKEN = token;
|
|
||||||
}
|
|
||||||
if (overrideCommit) {
|
|
||||||
reportExecArgs.push('-C', `${overrideCommit}`);
|
|
||||||
} else if (
|
|
||||||
`${context.eventName}` == 'pull_request' ||
|
|
||||||
`${context.eventName}` == 'pull_request_target'
|
|
||||||
) {
|
|
||||||
reportExecArgs.push('-C', `${context.payload.pull_request.head.sha}`);
|
|
||||||
}
|
|
||||||
if (overridePr) {
|
|
||||||
reportExecArgs.push('-P', `${overridePr}`);
|
|
||||||
} else if (
|
|
||||||
`${context.eventName}` == 'pull_request_target'
|
|
||||||
) {
|
|
||||||
reportExecArgs.push('-P', `${context.payload.number}`);
|
|
||||||
}
|
|
||||||
if (slug) {
|
|
||||||
reportExecArgs.push('--slug', `${slug}`);
|
|
||||||
}
|
|
||||||
if (failCi) {
|
|
||||||
reportExecArgs.push('-Z');
|
|
||||||
}
|
|
||||||
if (workingDir) {
|
|
||||||
reportOptions.cwd = workingDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {reportExecArgs, reportOptions, reportCommand};
|
|
||||||
};
|
|
||||||
|
|
||||||
const buildUploadExec = () => {
|
|
||||||
const disableFileFixes = isTrue(core.getInput('disable_file_fixes'));
|
|
||||||
const disableSearch = isTrue(core.getInput('disable_search'));
|
|
||||||
const dryRun = isTrue(core.getInput('dry_run'));
|
|
||||||
const envVars = core.getInput('env_vars');
|
|
||||||
const exclude = core.getInput('exclude');
|
|
||||||
const failCi = isTrue(core.getInput('fail_ci_if_error'));
|
|
||||||
const file = core.getInput('file');
|
|
||||||
const files = core.getInput('files');
|
|
||||||
const flags = core.getInput('flags');
|
|
||||||
const handleNoReportsFound = isTrue(core.getInput('handle_no_reports_found'));
|
|
||||||
const jobCode = core.getInput('job_code');
|
|
||||||
const name = core.getInput('name');
|
|
||||||
const os = core.getInput('os');
|
|
||||||
const overrideBranch = core.getInput('override_branch');
|
|
||||||
const overrideBuild = core.getInput('override_build');
|
|
||||||
const overrideBuildUrl = core.getInput('override_build_url');
|
|
||||||
const overrideCommit = core.getInput('override_commit');
|
|
||||||
const overridePr = core.getInput('override_pr');
|
|
||||||
const plugin = core.getInput('plugin');
|
|
||||||
const plugins = core.getInput('plugins');
|
|
||||||
const reportCode = core.getInput('report_code');
|
|
||||||
const rootDir = core.getInput('root_dir');
|
|
||||||
const searchDir = core.getInput('directory');
|
|
||||||
const slug = core.getInput('slug');
|
|
||||||
const token = core.getInput('token');
|
|
||||||
let uploaderVersion = core.getInput('version');
|
|
||||||
const useLegacyUploadEndpoint = isTrue(
|
|
||||||
core.getInput('use_legacy_upload_endpoint'),
|
|
||||||
);
|
|
||||||
const workingDir = core.getInput('working-directory');
|
|
||||||
|
|
||||||
const uploadExecArgs = [];
|
|
||||||
const uploadCommand = 'do-upload';
|
|
||||||
const uploadOptions:any = {};
|
|
||||||
uploadOptions.env = Object.assign(process.env, {
|
|
||||||
GITHUB_ACTION: process.env.GITHUB_ACTION,
|
|
||||||
GITHUB_RUN_ID: process.env.GITHUB_RUN_ID,
|
|
||||||
GITHUB_REF: process.env.GITHUB_REF,
|
|
||||||
GITHUB_REPOSITORY: process.env.GITHUB_REPOSITORY,
|
|
||||||
GITHUB_SHA: process.env.GITHUB_SHA,
|
|
||||||
GITHUB_HEAD_REF: process.env.GITHUB_HEAD_REF || '',
|
|
||||||
});
|
|
||||||
|
|
||||||
const envVarsArg = [];
|
|
||||||
for (const envVar of envVars.split(',')) {
|
|
||||||
const envVarClean = envVar.trim();
|
|
||||||
if (envVarClean) {
|
|
||||||
uploadOptions.env[envVarClean] = process.env[envVarClean];
|
|
||||||
envVarsArg.push(envVarClean);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (token) {
|
|
||||||
uploadOptions.env.CODECOV_TOKEN = token;
|
|
||||||
}
|
|
||||||
if (disableFileFixes) {
|
|
||||||
uploadExecArgs.push('--disable-file-fixes');
|
|
||||||
}
|
|
||||||
if (disableSearch) {
|
|
||||||
uploadExecArgs.push('--disable-search');
|
|
||||||
}
|
|
||||||
if (dryRun) {
|
|
||||||
uploadExecArgs.push('-d');
|
|
||||||
}
|
|
||||||
if (envVarsArg.length) {
|
|
||||||
uploadExecArgs.push('-e', envVarsArg.join(','));
|
|
||||||
}
|
|
||||||
if (exclude) {
|
|
||||||
uploadExecArgs.push('--exclude', `${exclude}`);
|
|
||||||
}
|
|
||||||
if (failCi) {
|
|
||||||
uploadExecArgs.push('-Z');
|
|
||||||
}
|
|
||||||
if (file) {
|
|
||||||
uploadExecArgs.push('-f', `${file}`);
|
|
||||||
}
|
|
||||||
if (files) {
|
|
||||||
files.split(',').map((f) => f.trim()).forEach((f) => {
|
|
||||||
uploadExecArgs.push('-f', `${f}`);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (flags) {
|
|
||||||
flags.split(',').map((f) => f.trim()).forEach((f) => {
|
|
||||||
uploadExecArgs.push('-F', `${f}`);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (handleNoReportsFound) {
|
|
||||||
uploadExecArgs.push('--handle-no-reports-found');
|
|
||||||
}
|
|
||||||
if (jobCode) {
|
|
||||||
uploadExecArgs.push('--job-code', `${jobCode}`);
|
|
||||||
}
|
|
||||||
if (name) {
|
|
||||||
uploadExecArgs.push('-n', `${name}`);
|
|
||||||
}
|
|
||||||
if (overrideBranch) {
|
|
||||||
uploadExecArgs.push('-B', `${overrideBranch}`);
|
|
||||||
}
|
|
||||||
if (overrideBuild) {
|
|
||||||
uploadExecArgs.push('-b', `${overrideBuild}`);
|
|
||||||
}
|
|
||||||
if (overrideBuildUrl) {
|
|
||||||
uploadExecArgs.push('--build-url', `${overrideBuildUrl}`);
|
|
||||||
}
|
|
||||||
if (overrideCommit) {
|
|
||||||
uploadExecArgs.push('-C', `${overrideCommit}`);
|
|
||||||
} else if (
|
|
||||||
`${context.eventName}` == 'pull_request' ||
|
|
||||||
`${context.eventName}` == 'pull_request_target'
|
|
||||||
) {
|
|
||||||
uploadExecArgs.push('-C', `${context.payload.pull_request.head.sha}`);
|
|
||||||
}
|
|
||||||
if (overridePr) {
|
|
||||||
uploadExecArgs.push('-P', `${overridePr}`);
|
|
||||||
} else if (
|
|
||||||
`${context.eventName}` == 'pull_request_target'
|
|
||||||
) {
|
|
||||||
uploadExecArgs.push('-P', `${context.payload.number}`);
|
|
||||||
}
|
|
||||||
if (plugin) {
|
|
||||||
uploadExecArgs.push('--plugin', `${plugin}`);
|
|
||||||
}
|
|
||||||
if (plugins) {
|
|
||||||
plugins.split(',').map((p) => p.trim()).forEach((p) => {
|
|
||||||
uploadExecArgs.push('--plugin', `${p}`);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (reportCode) {
|
|
||||||
uploadExecArgs.push('--report-code', `${reportCode}`);
|
|
||||||
}
|
|
||||||
if (rootDir) {
|
|
||||||
uploadExecArgs.push('--network-root-folder', `${rootDir}`);
|
|
||||||
}
|
|
||||||
if (searchDir) {
|
|
||||||
uploadExecArgs.push('-s', `${searchDir}`);
|
|
||||||
}
|
|
||||||
if (slug) {
|
|
||||||
uploadExecArgs.push('-r', `${slug}`);
|
|
||||||
}
|
|
||||||
if (workingDir) {
|
|
||||||
uploadOptions.cwd = workingDir;
|
|
||||||
}
|
|
||||||
if (uploaderVersion == '') {
|
|
||||||
uploaderVersion = 'latest';
|
|
||||||
}
|
|
||||||
if (useLegacyUploadEndpoint) {
|
|
||||||
uploadExecArgs.push('--legacy');
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
uploadExecArgs,
|
|
||||||
uploadOptions,
|
|
||||||
failCi,
|
|
||||||
os,
|
|
||||||
uploaderVersion,
|
|
||||||
uploadCommand,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
export {
|
|
||||||
buildCommitExec,
|
|
||||||
buildGeneralExec,
|
|
||||||
buildReportExec,
|
|
||||||
buildUploadExec,
|
|
||||||
};
|
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
import Calculator from './calculator';
|
import Calculator from './calculator'
|
||||||
|
|
||||||
test('adds 2 + 3 to equal 5', () => {
|
test('adds 2 + 3 to equal 5', () => {
|
||||||
const calc = new Calculator();
|
const calc = new Calculator()
|
||||||
expect(calc.add(2, 3)).toBe(5);
|
expect(calc.add(2, 3)).toBe(5);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('subtracts 2 - 3 to equal -1', () => {
|
test('subtracts 2 - 3 to equal -1', () => {
|
||||||
const calc = new Calculator();
|
const calc = new Calculator()
|
||||||
expect(calc.subtract(2, 3)).toBe(-1);
|
expect(calc.subtract(2, 3)).toBe(-1);
|
||||||
});
|
});
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
import {
|
|
||||||
getBaseUrl,
|
|
||||||
getPlatform,
|
|
||||||
isValidPlatform,
|
|
||||||
isWindows,
|
|
||||||
PLATFORMS,
|
|
||||||
getCommand,
|
|
||||||
} from './helpers';
|
|
||||||
|
|
||||||
let OLDOS = process.env.RUNNER_OS;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
jest.resetModules();
|
|
||||||
OLDOS = process.env.RUNNER_OS;
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(() => {
|
|
||||||
process.env.RUNNER_OS = OLDOS;
|
|
||||||
});
|
|
||||||
|
|
||||||
test('getPlatform', () => {
|
|
||||||
expect(getPlatform('linux')).toBe('linux');
|
|
||||||
expect(getPlatform('windows')).toBe('windows');
|
|
||||||
|
|
||||||
const defaultPlatform =
|
|
||||||
process.env.RUNNER_OS ? process.env.RUNNER_OS.toLowerCase() : 'linux';
|
|
||||||
expect(getPlatform('fakeos')).toBe(defaultPlatform);
|
|
||||||
expect(getPlatform()).toBe(defaultPlatform);
|
|
||||||
|
|
||||||
process.env.RUNNER_OS = 'macos';
|
|
||||||
expect(getPlatform('fakeos')).toBe('macos');
|
|
||||||
expect(getPlatform()).toBe('macos');
|
|
||||||
|
|
||||||
process.env.RUNNER_OS = 'alsofakeos';
|
|
||||||
expect(getPlatform()).toBe('linux');
|
|
||||||
expect(getPlatform('fakeos')).toBe('linux');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('getBaseUrl', () => {
|
|
||||||
expect(PLATFORMS.map((platform) => {
|
|
||||||
return getBaseUrl(platform, 'latest');
|
|
||||||
})).toEqual([
|
|
||||||
'https://cli.codecov.io/latest/linux/codecov',
|
|
||||||
'https://cli.codecov.io/latest/macos/codecov',
|
|
||||||
'https://cli.codecov.io/latest/windows/codecov.exe',
|
|
||||||
'https://cli.codecov.io/latest/alpine/codecov',
|
|
||||||
'https://cli.codecov.io/latest/linux-arm64/codecov',
|
|
||||||
'https://cli.codecov.io/latest/alpine-arm64/codecov',
|
|
||||||
]);
|
|
||||||
|
|
||||||
expect(PLATFORMS.map((platform) => {
|
|
||||||
return getBaseUrl(platform, 'v0.1.0_8880');
|
|
||||||
})).toEqual([
|
|
||||||
'https://cli.codecov.io/v0.1.0_8880/linux/codecov',
|
|
||||||
'https://cli.codecov.io/v0.1.0_8880/macos/codecov',
|
|
||||||
'https://cli.codecov.io/v0.1.0_8880/windows/codecov.exe',
|
|
||||||
'https://cli.codecov.io/v0.1.0_8880/alpine/codecov',
|
|
||||||
'https://cli.codecov.io/v0.1.0_8880/linux-arm64/codecov',
|
|
||||||
'https://cli.codecov.io/v0.1.0_8880/alpine-arm64/codecov',
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('isWindows', () => {
|
|
||||||
expect(PLATFORMS.map((platform) => {
|
|
||||||
return isWindows(platform);
|
|
||||||
})).toEqual([false, false, true, false, false, false]);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('isValidPlatform', () => {
|
|
||||||
expect(PLATFORMS.map((platform) => {
|
|
||||||
return isValidPlatform(platform);
|
|
||||||
})).toEqual([true, true, true, true, true, true]);
|
|
||||||
|
|
||||||
expect(isValidPlatform('fakeos')).toBeFalsy();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('getCommand', () => {
|
|
||||||
expect(getCommand('path', ['-v', '-x'], 'do-upload'))
|
|
||||||
.toEqual(['path', '-v', '-x', 'do-upload']);
|
|
||||||
});
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
import * as core from '@actions/core';
|
|
||||||
|
|
||||||
const PLATFORMS = [
|
|
||||||
'linux',
|
|
||||||
'macos',
|
|
||||||
'windows',
|
|
||||||
'alpine',
|
|
||||||
'linux-arm64',
|
|
||||||
'alpine-arm64',
|
|
||||||
];
|
|
||||||
|
|
||||||
const setFailure = (message: string, failCi: boolean): void => {
|
|
||||||
failCi ? core.setFailed(message) : core.warning(message);
|
|
||||||
if (failCi) {
|
|
||||||
process.exit();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const getUploaderName = (platform: string): string => {
|
|
||||||
if (isWindows(platform)) {
|
|
||||||
return 'codecov.exe';
|
|
||||||
} else {
|
|
||||||
return 'codecov';
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const isValidPlatform = (platform: string): boolean => {
|
|
||||||
return PLATFORMS.includes(platform);
|
|
||||||
};
|
|
||||||
|
|
||||||
const isWindows = (platform: string): boolean => {
|
|
||||||
return platform === 'windows';
|
|
||||||
};
|
|
||||||
|
|
||||||
const getPlatform = (os?: string): string => {
|
|
||||||
if (isValidPlatform(os)) {
|
|
||||||
core.info(`==> ${os} OS provided`);
|
|
||||||
return os;
|
|
||||||
}
|
|
||||||
|
|
||||||
const platform = process.env.RUNNER_OS?.toLowerCase();
|
|
||||||
if (isValidPlatform(platform)) {
|
|
||||||
core.info(`==> ${platform} OS detected`);
|
|
||||||
return platform;
|
|
||||||
}
|
|
||||||
|
|
||||||
core.info(
|
|
||||||
'==> Could not detect OS or provided OS is invalid. Defaulting to linux',
|
|
||||||
);
|
|
||||||
return 'linux';
|
|
||||||
};
|
|
||||||
|
|
||||||
const getBaseUrl = (platform: string, version: string): string => {
|
|
||||||
return `https://cli.codecov.io/${version}/${platform}/${getUploaderName(platform)}`;
|
|
||||||
};
|
|
||||||
|
|
||||||
const getCommand = (
|
|
||||||
filename: string,
|
|
||||||
generalArgs:string[],
|
|
||||||
command: string,
|
|
||||||
): string[] => {
|
|
||||||
const fullCommand = [filename, ...generalArgs, command];
|
|
||||||
core.info(`==> Running command '${fullCommand.join(' ')}'`);
|
|
||||||
return fullCommand;
|
|
||||||
};
|
|
||||||
|
|
||||||
export {
|
|
||||||
PLATFORMS,
|
|
||||||
getBaseUrl,
|
|
||||||
getPlatform,
|
|
||||||
getUploaderName,
|
|
||||||
isValidPlatform,
|
|
||||||
isWindows,
|
|
||||||
setFailure,
|
|
||||||
getCommand,
|
|
||||||
};
|
|
||||||
120
src/index.ts
120
src/index.ts
@@ -1,120 +0,0 @@
|
|||||||
import * as fs from 'fs';
|
|
||||||
import * as https from 'https';
|
|
||||||
import * as path from 'path';
|
|
||||||
|
|
||||||
import * as exec from '@actions/exec';
|
|
||||||
|
|
||||||
import {
|
|
||||||
buildCommitExec,
|
|
||||||
buildGeneralExec,
|
|
||||||
buildReportExec,
|
|
||||||
buildUploadExec,
|
|
||||||
} from './buildExec';
|
|
||||||
import {
|
|
||||||
getBaseUrl,
|
|
||||||
getPlatform,
|
|
||||||
getUploaderName,
|
|
||||||
setFailure,
|
|
||||||
getCommand,
|
|
||||||
} from './helpers';
|
|
||||||
|
|
||||||
import verify from './validate';
|
|
||||||
import versionInfo from './version';
|
|
||||||
|
|
||||||
let failCi;
|
|
||||||
|
|
||||||
try {
|
|
||||||
const {commitExecArgs, commitOptions, commitCommand} = buildCommitExec();
|
|
||||||
const {reportExecArgs, reportOptions, reportCommand} = buildReportExec();
|
|
||||||
const {
|
|
||||||
uploadExecArgs,
|
|
||||||
uploadOptions,
|
|
||||||
failCi,
|
|
||||||
os,
|
|
||||||
uploaderVersion,
|
|
||||||
uploadCommand,
|
|
||||||
} = buildUploadExec();
|
|
||||||
const {args, verbose} = buildGeneralExec();
|
|
||||||
|
|
||||||
const platform = getPlatform(os);
|
|
||||||
|
|
||||||
const filename = path.join( __dirname, getUploaderName(platform));
|
|
||||||
https.get(getBaseUrl(platform, uploaderVersion), (res) => {
|
|
||||||
// Image will be stored at this path
|
|
||||||
const filePath = fs.createWriteStream(filename);
|
|
||||||
res.pipe(filePath);
|
|
||||||
filePath
|
|
||||||
.on('error', (err) => {
|
|
||||||
setFailure(
|
|
||||||
`Codecov: Failed to write uploader binary: ${err.message}`,
|
|
||||||
true,
|
|
||||||
);
|
|
||||||
}).on('finish', async () => {
|
|
||||||
filePath.close();
|
|
||||||
|
|
||||||
await verify(filename, platform, uploaderVersion, verbose, failCi);
|
|
||||||
await versionInfo(platform, uploaderVersion);
|
|
||||||
await fs.chmodSync(filename, '777');
|
|
||||||
|
|
||||||
const unlink = () => {
|
|
||||||
fs.unlink(filename, (err) => {
|
|
||||||
if (err) {
|
|
||||||
setFailure(
|
|
||||||
`Codecov: Could not unlink uploader: ${err.message}`,
|
|
||||||
failCi,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
const doUpload = async () => {
|
|
||||||
await exec.exec(getCommand(filename, args, uploadCommand).join(' '),
|
|
||||||
uploadExecArgs,
|
|
||||||
uploadOptions)
|
|
||||||
.catch((err) => {
|
|
||||||
setFailure(
|
|
||||||
`Codecov:
|
|
||||||
Failed to properly upload report: ${err.message}`,
|
|
||||||
failCi,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
const createReport = async () => {
|
|
||||||
await exec.exec(
|
|
||||||
getCommand(filename, args, reportCommand).join(' '),
|
|
||||||
reportExecArgs,
|
|
||||||
reportOptions)
|
|
||||||
.then(async (exitCode) => {
|
|
||||||
if (exitCode == 0) {
|
|
||||||
await doUpload();
|
|
||||||
}
|
|
||||||
}).catch((err) => {
|
|
||||||
setFailure(
|
|
||||||
`Codecov:
|
|
||||||
Failed to properly create report: ${err.message}`,
|
|
||||||
failCi,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
await exec.exec(
|
|
||||||
getCommand(
|
|
||||||
filename,
|
|
||||||
args,
|
|
||||||
commitCommand,
|
|
||||||
).join(' '),
|
|
||||||
commitExecArgs, commitOptions)
|
|
||||||
.then(async (exitCode) => {
|
|
||||||
if (exitCode == 0) {
|
|
||||||
await createReport();
|
|
||||||
}
|
|
||||||
unlink();
|
|
||||||
}).catch((err) => {
|
|
||||||
setFailure(
|
|
||||||
`Codecov: Failed to properly create commit: ${err.message}`,
|
|
||||||
failCi,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} catch (err) {
|
|
||||||
setFailure(`Codecov: Encountered an unexpected error ${err.message}`, failCi);
|
|
||||||
}
|
|
||||||
11
src/index/index.test.ts
Normal file
11
src/index/index.test.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import Index from "./index";
|
||||||
|
|
||||||
|
test('test uncovered if', () => {
|
||||||
|
const indexObj = new Index();
|
||||||
|
expect(indexObj.uncovered_if()).toEqual(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('fully covered', () => {
|
||||||
|
const indexObj = new Index();
|
||||||
|
expect(indexObj.fully_covered()).toEqual(true);
|
||||||
|
});
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
export default class Coverage {
|
export default class Index {
|
||||||
|
|
||||||
//This function is tested and part of it is uncovered
|
//This function is tested and part of it is uncovered
|
||||||
uncovered_if = (a = true) => {
|
uncovered_if = (a = true) => {
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
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
|
|
||||||
=ch7z
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
||||||
113
src/validate.ts
113
src/validate.ts
@@ -1,113 +0,0 @@
|
|||||||
import * as crypto from 'crypto';
|
|
||||||
import * as fs from 'fs';
|
|
||||||
import * as gpg from 'gpg';
|
|
||||||
import * as path from 'path';
|
|
||||||
|
|
||||||
import * as core from '@actions/core';
|
|
||||||
import {request} from 'undici';
|
|
||||||
|
|
||||||
import {
|
|
||||||
getBaseUrl,
|
|
||||||
getUploaderName,
|
|
||||||
setFailure,
|
|
||||||
} from './helpers';
|
|
||||||
|
|
||||||
const verify = async (
|
|
||||||
filename: string,
|
|
||||||
platform: string,
|
|
||||||
version: string,
|
|
||||||
verbose: boolean,
|
|
||||||
failCi: boolean,
|
|
||||||
): Promise<void> => {
|
|
||||||
try {
|
|
||||||
const uploaderName = getUploaderName(platform);
|
|
||||||
|
|
||||||
// Get SHASUM and SHASUM signature files
|
|
||||||
console.log(`${getBaseUrl(platform, version)}.SHA256SUM`);
|
|
||||||
const shasumRes = await request(
|
|
||||||
`${getBaseUrl(platform, version)}.SHA256SUM`,
|
|
||||||
);
|
|
||||||
const shasum = await shasumRes.body.text();
|
|
||||||
if (verbose) {
|
|
||||||
console.log(`Received SHA256SUM ${shasum}`);
|
|
||||||
}
|
|
||||||
await fs.writeFileSync(
|
|
||||||
path.join(__dirname, `${uploaderName}.SHA256SUM`),
|
|
||||||
shasum,
|
|
||||||
);
|
|
||||||
|
|
||||||
const shaSigRes = await request(
|
|
||||||
`${getBaseUrl(platform, version)}.SHA256SUM.sig`,
|
|
||||||
);
|
|
||||||
const shaSig = await shaSigRes.body.text();
|
|
||||||
if (verbose) {
|
|
||||||
console.log(`Received SHA256SUM signature ${shaSig}`);
|
|
||||||
}
|
|
||||||
await fs.writeFileSync(
|
|
||||||
path.join(__dirname, `${uploaderName}.SHA256SUM.sig`),
|
|
||||||
shaSig,
|
|
||||||
);
|
|
||||||
|
|
||||||
const validateSha = async () => {
|
|
||||||
const calculateHash = async (filename: string) => {
|
|
||||||
const stream = fs.createReadStream(filename);
|
|
||||||
const uploaderSha = crypto.createHash(`sha256`);
|
|
||||||
stream.pipe(uploaderSha);
|
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
stream.on('end', () => resolve(
|
|
||||||
`${uploaderSha.digest('hex')} ${uploaderName}`,
|
|
||||||
));
|
|
||||||
stream.on('error', reject);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const hash = await calculateHash(
|
|
||||||
path.join(__dirname, `${uploaderName}`),
|
|
||||||
);
|
|
||||||
if (hash === shasum) {
|
|
||||||
core.info(`==> Uploader SHASUM verified (${hash})`);
|
|
||||||
} else {
|
|
||||||
setFailure(
|
|
||||||
'Codecov: Uploader shasum does not match -- ' +
|
|
||||||
`uploader hash: ${hash}, public hash: ${shasum}`,
|
|
||||||
failCi,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const verifySignature = () => {
|
|
||||||
gpg.call('', [
|
|
||||||
'--logger-fd',
|
|
||||||
'1',
|
|
||||||
'--verify',
|
|
||||||
path.join(__dirname, `${uploaderName}.SHA256SUM.sig`),
|
|
||||||
path.join(__dirname, `${uploaderName}.SHA256SUM`),
|
|
||||||
], async (err, verifyResult) => {
|
|
||||||
if (err) {
|
|
||||||
setFailure('Codecov: Error importing pgp key', failCi);
|
|
||||||
}
|
|
||||||
core.info(verifyResult);
|
|
||||||
await validateSha();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// Import gpg key
|
|
||||||
gpg.call('', [
|
|
||||||
'--logger-fd',
|
|
||||||
'1',
|
|
||||||
'--no-default-keyring',
|
|
||||||
'--import',
|
|
||||||
path.join(__dirname, 'pgp_keys.asc'),
|
|
||||||
], async (err, importResult) => {
|
|
||||||
if (err) {
|
|
||||||
setFailure('Codecov: Error importing pgp key', failCi);
|
|
||||||
}
|
|
||||||
core.info(importResult);
|
|
||||||
verifySignature();
|
|
||||||
});
|
|
||||||
} catch (err) {
|
|
||||||
setFailure(`Codecov: Error validating uploader: ${err.message}`, failCi);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
export default verify;
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
import * as core from '@actions/core';
|
|
||||||
import {request} from 'undici';
|
|
||||||
|
|
||||||
const versionInfo = async (
|
|
||||||
platform: string,
|
|
||||||
version?: string,
|
|
||||||
): Promise<void> => {
|
|
||||||
if (version) {
|
|
||||||
core.info(`==> Running version ${version}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const metadataRes = await request(`https://cli.codecov.io/${platform}/latest`, {
|
|
||||||
headers: {'Accept': 'application/json'},
|
|
||||||
});
|
|
||||||
const metadata = await metadataRes.body.json();
|
|
||||||
core.info(`==> Running version ${metadata['version']}`);
|
|
||||||
} catch (err) {
|
|
||||||
core.info(`Could not pull latest version information: ${err}`);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
export default versionInfo;
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"esModuleInterop": true,
|
|
||||||
"moduleResolution": "node",
|
|
||||||
"outDir": "dist/",
|
|
||||||
"resolveJsonModule": true,
|
|
||||||
"rootDir": ".",
|
|
||||||
"sourceMap": true,
|
|
||||||
"target": "es2015"
|
|
||||||
},
|
|
||||||
"include": [
|
|
||||||
"src/**/*.ts"
|
|
||||||
],
|
|
||||||
"exclude": [
|
|
||||||
"src/**/*.test.ts"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user