diff --git a/README.md b/README.md index d1d5499e..2c39f82c 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ If the file does not exist the action exits silently. #### Inputs - `token` - `GITHUB_TOKEN` or a `repo` scoped [PAT](https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line). Defaults to `GITHUB_TOKEN`. +- `issue-number` - The issue number of an existing issue to update - `title` (**required**) - The title of the issue - `content-filepath` (**required**) - The file path to the issue content - `labels` - A comma separated list of labels @@ -33,6 +34,10 @@ If the file does not exist the action exits silently. - `project` - The name of the project for which a card should be created (Requires `project-column-name`) - `project-column` - The name of the project column under which a card should be created +#### Outputs + +- `issue-number` - The number of the created issue + ## Actions that pair with this action - [Link Checker](https://github.com/peter-evans/link-checker) - An action for link checking repository Markdown and HTML files diff --git a/action.yml b/action.yml index 0bdccd9e..7fa8b53c 100644 --- a/action.yml +++ b/action.yml @@ -4,6 +4,8 @@ inputs: token: description: 'The GitHub authentication token' default: ${{ github.token }} + issue-number: + description: 'The issue number of an existing issue to update' title: description: 'The title of the issue.' required: true @@ -17,6 +19,9 @@ inputs: description: 'The name of the project for which a card should be created.' project-column: description: 'The name of the project column under which a card should be created.' +outputs: + issue-number: + description: 'The number of the created issue.' runs: using: 'node12' main: 'dist/index.js' diff --git a/dist/src/create_issue_from_file.py b/dist/ciff/create_issue_from_file.py similarity index 56% rename from dist/src/create_issue_from_file.py rename to dist/ciff/create_issue_from_file.py index b583d64c..0c529884 100755 --- a/dist/src/create_issue_from_file.py +++ b/dist/ciff/create_issue_from_file.py @@ -2,7 +2,7 @@ ''' Create Issue From File ''' import os from pathlib import Path -from github import Github +from github import Github, GithubException # Fetch required environment variables github_token = os.environ['GITHUB_TOKEN'] @@ -11,11 +11,44 @@ issue_content_path = os.environ['CIFF_CONTENT_FILEPATH'] # Fetch optional environment variables +issue_number = os.environ.get('CIFF_ISSUE_NUMBER') issue_labels = os.environ.get('CIFF_LABELS') issue_assignees = os.environ.get('CIFF_ASSIGNEES') project_name = os.environ.get('CIFF_PROJECT_NAME') project_column_name = os.environ.get('CIFF_PROJECT_COLUMN_NAME') + +def create_project_card(github_repo, project_name, project_column_name, issue): + # Locate the project by name + project = None + for project_item in github_repo.get_projects("all"): + if project_item.name == project_name: + project = project_item + break + + if not project: + print("::error::Project not found. Unable to create project card.") + return + + # Locate the column by name + column = None + for column_item in project.get_columns(): + if column_item.name == project_column_name: + column = column_item + break + + if not column: + print("::error::Project column not found. Unable to create project card.") + return + + # Create a project card for the pull request + column.create_card(content_id=issue.id, content_type="Issue") + print( + "Added issue #%d to project '%s' under column '%s'" + % (issue.number, project.name, column.name) + ) + + # If the file does not exist there is no issue to create if not Path(issue_content_path).is_file(): print("File not found") @@ -28,9 +61,19 @@ # Fetch the repository object g = Github(github_token) repo = g.get_repo(github_repository) -# Create the issue -issue = repo.create_issue(issue_title, issue_content) -print("Created issue %d" % (issue.number)) + +if issue_number is not None: + # Update an existing issue + issue = repo.get_issue(int(issue_number)) + issue.edit(title=issue_title, body=issue_content) + print("Updated issue %d" % (issue.number)) +else: + # Create an issue + issue = repo.create_issue(title=issue_title, body=issue_content) + print("Created issue %d" % (issue.number)) + +# Set the step output +os.system(f"echo ::set-output name=issue-number::{issue.number}") if issue_labels is not None: # Split the labels input into a list @@ -50,30 +93,17 @@ print("Assigning issue to assignees") issue.edit(assignees=assignees_list) +# Create a project card for the pull request if project_name is not None and project_column_name is not None: - # Locate the project by name - project = None - for project_item in repo.get_projects("all"): - if project_item.name == project_name: - project = project_item - break - - if not project: - print("Project not found") - exit(0) - - # Locate the column by name - column = None - for column_item in project.get_columns(): - if column_item.name == project_column_name: - column = column_item - break - - if not column: - print("Project column not found") - exit(0) - - # Add the issue to the project - card = column.create_card(content_id=issue.id, content_type="Issue") - print("Added issue %d to project \"%s\" under column \"%s\"" \ - % (issue.number, project.name, column.name)) \ No newline at end of file + try: + create_project_card( + repo, project_name, project_column_name, issue + ) + except GithubException as e: + # Likely caused by "Project already has the associated issue." + if e.status == 422: + print( + "Create project card failed - {}".format( + e.data["errors"][0]["message"] + ) + ) diff --git a/dist/ciff/requirements.txt b/dist/ciff/requirements.txt new file mode 100644 index 00000000..a6ad034e --- /dev/null +++ b/dist/ciff/requirements.txt @@ -0,0 +1,3 @@ +setuptools==46.1.3 +wheel==0.34.2 +PyGithub==1.47 diff --git a/dist/index.js b/dist/index.js index 4baf5d73..aa23636f 100644 --- a/dist/index.js +++ b/dist/index.js @@ -34,7 +34,7 @@ module.exports = /******/ // the startup function /******/ function startup() { /******/ // Load entry module and return exports -/******/ return __webpack_require__(104); +/******/ return __webpack_require__(676); /******/ }; /******/ /******/ // run startup @@ -973,21 +973,6 @@ module.exports = util.assign( module.exports = require("tls"); -/***/ }), - -/***/ 58: -/***/ (function(module, __unusedexports, __webpack_require__) { - -// Unique ID creation requires a high quality random # generator. In node.js -// this is pretty straight-forward - we use the crypto API. - -var crypto = __webpack_require__(417); - -module.exports = function nodeRNG() { - return crypto.randomBytes(16); -}; - - /***/ }), /***/ 87: @@ -998,72 +983,6 @@ module.exports = require("os"); /***/ }), /***/ 104: -/***/ (function(__unusedmodule, __unusedexports, __webpack_require__) { - -const { inspect } = __webpack_require__(669); -const core = __webpack_require__(470); -const exec = __webpack_require__(986); -const setupPython = __webpack_require__(139); - -async function run() { - try { - // Allows ncc to find assets to be included in the distribution - const src = __webpack_require__.ab + "src"; - core.debug(`src: ${src}`); - - // Setup Python from the tool cache - setupPython("3.8.x", "x64"); - - // Install requirements - await exec.exec("pip", [ - "install", - "--requirement", - `${src}/requirements.txt`, - "--no-index", - `--find-links=${__dirname}/vendor` - ]); - - // Fetch action inputs - const inputs = { - token: core.getInput("token"), - title: core.getInput("title"), - contentFilepath: core.getInput("content-filepath"), - labels: core.getInput("labels"), - assignees: core.getInput("assignees"), - project: core.getInput("project"), - projectColumn: core.getInput("project-column") - }; - core.debug(`Inputs: ${inspect(inputs)}`); - - // Set environment variables from inputs. - if (inputs.token) process.env.GITHUB_TOKEN = inputs.token; - if (inputs.title) process.env.CIFF_TITLE = inputs.title; - if (inputs.contentFilepath) process.env.CIFF_CONTENT_FILEPATH = inputs.contentFilepath; - if (inputs.labels) process.env.CIFF_LABELS = inputs.labels; - if (inputs.assignees) process.env.CIFF_ASSIGNEES = inputs.assignees; - if (inputs.project) process.env.CIFF_PROJECT_NAME = inputs.project; - if (inputs.projectColumn) process.env.CIFF_PROJECT_COLUMN_NAME = inputs.projectColumn; - - // Execute python script - await exec.exec("python", [`${src}/create_issue_from_file.py`]); - } catch (error) { - core.setFailed(error.message); - } -} - -run(); - - -/***/ }), - -/***/ 129: -/***/ (function(module) { - -module.exports = require("child_process"); - -/***/ }), - -/***/ 139: /***/ (function(module, __unusedexports, __webpack_require__) { const core = __webpack_require__(470); @@ -1120,6 +1039,28 @@ let setupPython = function(versionSpec, arch) { module.exports = setupPython; +/***/ }), + +/***/ 129: +/***/ (function(module) { + +module.exports = require("child_process"); + +/***/ }), + +/***/ 139: +/***/ (function(module, __unusedexports, __webpack_require__) { + +// Unique ID creation requires a high quality random # generator. In node.js +// this is pretty straight-forward - we use the crypto API. + +var crypto = __webpack_require__(417); + +module.exports = function nodeRNG() { + return crypto.randomBytes(16); +}; + + /***/ }), /***/ 141: @@ -1375,6 +1316,43 @@ if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { exports.debug = debug; // for test +/***/ }), + +/***/ 160: +/***/ (function(module, __unusedexports, __webpack_require__) { + +"use strict"; + +const fs = __webpack_require__(747); + +let isDocker; + +function hasDockerEnv() { + try { + fs.statSync('/.dockerenv'); + return true; + } catch (_) { + return false; + } +} + +function hasDockerCGroup() { + try { + return fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker'); + } catch (_) { + return false; + } +} + +module.exports = () => { + if (isDocker === undefined) { + isDocker = hasDockerEnv() || hasDockerCGroup(); + } + + return isDocker; +}; + + /***/ }), /***/ 211: @@ -4227,6 +4205,84 @@ function isUnixExecutable(stats) { } //# sourceMappingURL=io-util.js.map +/***/ }), + +/***/ 676: +/***/ (function(__unusedmodule, __unusedexports, __webpack_require__) { + +const { inspect } = __webpack_require__(669); +const isDocker = __webpack_require__(160); +const core = __webpack_require__(470); +const exec = __webpack_require__(986); +const setupPython = __webpack_require__(104); + +async function run() { + try { + // Allows ncc to find assets to be included in the distribution + const ciff = __webpack_require__.ab + "ciff"; + core.debug(`ciff: ${ciff}`); + + // Determine how to access python and pip + const { pip, python } = (function() { + if (isDocker()) { + core.info("Running inside a Docker container"); + // Python 3 assumed to be installed and on the PATH + return { + pip: "pip3", + python: "python3" + }; + } else { + // Setup Python from the tool cache + setupPython("3.x", "x64"); + return { + pip: "pip", + python: "python" + }; + } + })(); + + // Install requirements + await exec.exec(pip, [ + "install", + "--requirement", + `${ciff}/requirements.txt`, + "--no-index", + `--find-links=${__dirname}/vendor` + ]); + + // Fetch action inputs + const inputs = { + token: core.getInput("token"), + issueNumber: core.getInput("issue-number"), + title: core.getInput("title"), + contentFilepath: core.getInput("content-filepath"), + labels: core.getInput("labels"), + assignees: core.getInput("assignees"), + project: core.getInput("project"), + projectColumn: core.getInput("project-column") + }; + core.debug(`Inputs: ${inspect(inputs)}`); + + // Set environment variables from inputs. + if (inputs.token) process.env.GITHUB_TOKEN = inputs.token; + if (inputs.issueNumber) process.env.CIFF_ISSUE_NUMBER = inputs.issueNumber; + if (inputs.title) process.env.CIFF_TITLE = inputs.title; + if (inputs.contentFilepath) process.env.CIFF_CONTENT_FILEPATH = inputs.contentFilepath; + if (inputs.labels) process.env.CIFF_LABELS = inputs.labels; + if (inputs.assignees) process.env.CIFF_ASSIGNEES = inputs.assignees; + if (inputs.project) process.env.CIFF_PROJECT_NAME = inputs.project; + if (inputs.projectColumn) process.env.CIFF_PROJECT_COLUMN_NAME = inputs.projectColumn; + + // Execute create issue from file + await exec.exec(python, [`${ciff}/create_issue_from_file.py`]); + } catch (error) { + core.setFailed(error.message); + } +} + +run(); + + /***/ }), /***/ 722: @@ -4659,7 +4715,7 @@ module.exports = require("zlib"); /***/ 826: /***/ (function(module, __unusedexports, __webpack_require__) { -var rng = __webpack_require__(58); +var rng = __webpack_require__(139); var bytesToUuid = __webpack_require__(722); function v4(options, buf, offset) { diff --git a/dist/src/requirements.txt b/dist/src/requirements.txt deleted file mode 100644 index 4359e250..00000000 --- a/dist/src/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -PyGithub==1.47 diff --git a/dist/src/setup-python.js b/dist/src/setup-python.js deleted file mode 100644 index d93a55aa..00000000 --- a/dist/src/setup-python.js +++ /dev/null @@ -1,52 +0,0 @@ -const core = require("@actions/core"); -const tc = require("@actions/tool-cache"); -const path = require("path"); -const semver = require("semver"); - -/** - * Setup for Python from the GitHub Actions tool cache - * Converted from https://github.com/actions/setup-python - * - * @param {string} versionSpec version of Python - * @param {string} arch architecture (x64|x32) - */ -let setupPython = function(versionSpec, arch) { - return new Promise((resolve, reject) => { - const IS_WINDOWS = process.platform === "win32"; - - // Find the version of Python we want in the tool cache - const installDir = tc.find("Python", versionSpec, arch); - core.debug(`installDir: ${installDir}`); - - // Set paths - core.exportVariable("pythonLocation", installDir); - core.addPath(installDir); - if (IS_WINDOWS) { - core.addPath(path.join(installDir, "Scripts")); - } else { - core.addPath(path.join(installDir, "bin")); - } - - if (IS_WINDOWS) { - // Add --user directory - // `installDir` from tool cache should look like $AGENT_TOOLSDIRECTORY/Python//x64/ - // So if `findLocalTool` succeeded above, we must have a conformant `installDir` - const version = path.basename(path.dirname(installDir)); - const major = semver.major(version); - const minor = semver.minor(version); - - const userScriptsDir = path.join( - process.env["APPDATA"] || "", - "Python", - `Python${major}${minor}`, - "Scripts" - ); - core.addPath(userScriptsDir); - } - // On Linux and macOS, pip will create the --user directory and add it to PATH as needed. - - resolve(); - }); -}; - -module.exports = setupPython; diff --git a/dist/vendor/Deprecated-1.2.7.tar.gz b/dist/vendor/Deprecated-1.2.9.tar.gz similarity index 59% rename from dist/vendor/Deprecated-1.2.7.tar.gz rename to dist/vendor/Deprecated-1.2.9.tar.gz index 6966c531..7ee02cea 100644 Binary files a/dist/vendor/Deprecated-1.2.7.tar.gz and b/dist/vendor/Deprecated-1.2.9.tar.gz differ diff --git a/dist/vendor/certifi-2019.11.28.tar.gz b/dist/vendor/certifi-2019.11.28.tar.gz deleted file mode 100644 index 278a8e87..00000000 Binary files a/dist/vendor/certifi-2019.11.28.tar.gz and /dev/null differ diff --git a/dist/vendor/certifi-2020.4.5.1.tar.gz b/dist/vendor/certifi-2020.4.5.1.tar.gz new file mode 100644 index 00000000..11408d47 Binary files /dev/null and b/dist/vendor/certifi-2020.4.5.1.tar.gz differ diff --git a/dist/vendor/setuptools-46.1.3.zip b/dist/vendor/setuptools-46.1.3.zip new file mode 100644 index 00000000..82fd9569 Binary files /dev/null and b/dist/vendor/setuptools-46.1.3.zip differ diff --git a/dist/vendor/urllib3-1.25.8.tar.gz b/dist/vendor/urllib3-1.25.8.tar.gz deleted file mode 100644 index 8f35a38f..00000000 Binary files a/dist/vendor/urllib3-1.25.8.tar.gz and /dev/null differ diff --git a/dist/vendor/urllib3-1.25.9.tar.gz b/dist/vendor/urllib3-1.25.9.tar.gz new file mode 100644 index 00000000..b20c9135 Binary files /dev/null and b/dist/vendor/urllib3-1.25.9.tar.gz differ diff --git a/dist/vendor/wheel-0.34.2.tar.gz b/dist/vendor/wheel-0.34.2.tar.gz new file mode 100644 index 00000000..d31f4fb0 Binary files /dev/null and b/dist/vendor/wheel-0.34.2.tar.gz differ diff --git a/package-lock.json b/package-lock.json index c5169324..108de670 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,11 @@ "integrity": "sha512-Qq3bMuonkcnV/96jhy9SQYdh39NXHxNMJ1O31ZFzWG9n52fR2DLtgrNzhj/ahlEjnBziMLGVWDbaS9sf03/fEw==", "dev": true }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==" + }, "qs": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", diff --git a/package.json b/package.json index 0018402e..b0bb306a 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "main": "index.js", "scripts": { "clean": "rm -rf dist", - "build": "ncc build index.js -o dist", - "vendor-deps": "pip download -r src/requirements.txt --no-binary=:all: -d dist/vendor", + "build": "ncc build src/index.js -o dist", + "vendor-deps": "pip download -r src/ciff/requirements.txt --no-binary=:all: -d dist/vendor", "package": "npm run build && npm run vendor-deps" }, "repository": { @@ -23,7 +23,8 @@ "dependencies": { "@actions/core": "^1.1.1", "@actions/exec": "^1.0.1", - "@actions/tool-cache": "^1.1.2" + "@actions/tool-cache": "^1.1.2", + "is-docker": "^2.0.0" }, "devDependencies": { "@zeit/ncc": "0.22.1" diff --git a/src/create_issue_from_file.py b/src/ciff/create_issue_from_file.py similarity index 56% rename from src/create_issue_from_file.py rename to src/ciff/create_issue_from_file.py index b583d64c..0c529884 100755 --- a/src/create_issue_from_file.py +++ b/src/ciff/create_issue_from_file.py @@ -2,7 +2,7 @@ ''' Create Issue From File ''' import os from pathlib import Path -from github import Github +from github import Github, GithubException # Fetch required environment variables github_token = os.environ['GITHUB_TOKEN'] @@ -11,11 +11,44 @@ issue_content_path = os.environ['CIFF_CONTENT_FILEPATH'] # Fetch optional environment variables +issue_number = os.environ.get('CIFF_ISSUE_NUMBER') issue_labels = os.environ.get('CIFF_LABELS') issue_assignees = os.environ.get('CIFF_ASSIGNEES') project_name = os.environ.get('CIFF_PROJECT_NAME') project_column_name = os.environ.get('CIFF_PROJECT_COLUMN_NAME') + +def create_project_card(github_repo, project_name, project_column_name, issue): + # Locate the project by name + project = None + for project_item in github_repo.get_projects("all"): + if project_item.name == project_name: + project = project_item + break + + if not project: + print("::error::Project not found. Unable to create project card.") + return + + # Locate the column by name + column = None + for column_item in project.get_columns(): + if column_item.name == project_column_name: + column = column_item + break + + if not column: + print("::error::Project column not found. Unable to create project card.") + return + + # Create a project card for the pull request + column.create_card(content_id=issue.id, content_type="Issue") + print( + "Added issue #%d to project '%s' under column '%s'" + % (issue.number, project.name, column.name) + ) + + # If the file does not exist there is no issue to create if not Path(issue_content_path).is_file(): print("File not found") @@ -28,9 +61,19 @@ # Fetch the repository object g = Github(github_token) repo = g.get_repo(github_repository) -# Create the issue -issue = repo.create_issue(issue_title, issue_content) -print("Created issue %d" % (issue.number)) + +if issue_number is not None: + # Update an existing issue + issue = repo.get_issue(int(issue_number)) + issue.edit(title=issue_title, body=issue_content) + print("Updated issue %d" % (issue.number)) +else: + # Create an issue + issue = repo.create_issue(title=issue_title, body=issue_content) + print("Created issue %d" % (issue.number)) + +# Set the step output +os.system(f"echo ::set-output name=issue-number::{issue.number}") if issue_labels is not None: # Split the labels input into a list @@ -50,30 +93,17 @@ print("Assigning issue to assignees") issue.edit(assignees=assignees_list) +# Create a project card for the pull request if project_name is not None and project_column_name is not None: - # Locate the project by name - project = None - for project_item in repo.get_projects("all"): - if project_item.name == project_name: - project = project_item - break - - if not project: - print("Project not found") - exit(0) - - # Locate the column by name - column = None - for column_item in project.get_columns(): - if column_item.name == project_column_name: - column = column_item - break - - if not column: - print("Project column not found") - exit(0) - - # Add the issue to the project - card = column.create_card(content_id=issue.id, content_type="Issue") - print("Added issue %d to project \"%s\" under column \"%s\"" \ - % (issue.number, project.name, column.name)) \ No newline at end of file + try: + create_project_card( + repo, project_name, project_column_name, issue + ) + except GithubException as e: + # Likely caused by "Project already has the associated issue." + if e.status == 422: + print( + "Create project card failed - {}".format( + e.data["errors"][0]["message"] + ) + ) diff --git a/src/ciff/requirements.txt b/src/ciff/requirements.txt new file mode 100644 index 00000000..a6ad034e --- /dev/null +++ b/src/ciff/requirements.txt @@ -0,0 +1,3 @@ +setuptools==46.1.3 +wheel==0.34.2 +PyGithub==1.47 diff --git a/index.js b/src/index.js similarity index 59% rename from index.js rename to src/index.js index 1ccce68b..6d9a1c26 100644 --- a/index.js +++ b/src/index.js @@ -1,22 +1,39 @@ const { inspect } = require("util"); +const isDocker = require("is-docker"); const core = require("@actions/core"); const exec = require("@actions/exec"); -const setupPython = require("./src/setup-python"); +const setupPython = require("./setup-python"); async function run() { try { // Allows ncc to find assets to be included in the distribution - const src = __dirname + "/src"; - core.debug(`src: ${src}`); + const ciff = __dirname + "/ciff"; + core.debug(`ciff: ${ciff}`); - // Setup Python from the tool cache - setupPython("3.8.x", "x64"); + // Determine how to access python and pip + const { pip, python } = (function() { + if (isDocker()) { + core.info("Running inside a Docker container"); + // Python 3 assumed to be installed and on the PATH + return { + pip: "pip3", + python: "python3" + }; + } else { + // Setup Python from the tool cache + setupPython("3.x", "x64"); + return { + pip: "pip", + python: "python" + }; + } + })(); // Install requirements - await exec.exec("pip", [ + await exec.exec(pip, [ "install", "--requirement", - `${src}/requirements.txt`, + `${ciff}/requirements.txt`, "--no-index", `--find-links=${__dirname}/vendor` ]); @@ -24,6 +41,7 @@ async function run() { // Fetch action inputs const inputs = { token: core.getInput("token"), + issueNumber: core.getInput("issue-number"), title: core.getInput("title"), contentFilepath: core.getInput("content-filepath"), labels: core.getInput("labels"), @@ -35,6 +53,7 @@ async function run() { // Set environment variables from inputs. if (inputs.token) process.env.GITHUB_TOKEN = inputs.token; + if (inputs.issueNumber) process.env.CIFF_ISSUE_NUMBER = inputs.issueNumber; if (inputs.title) process.env.CIFF_TITLE = inputs.title; if (inputs.contentFilepath) process.env.CIFF_CONTENT_FILEPATH = inputs.contentFilepath; if (inputs.labels) process.env.CIFF_LABELS = inputs.labels; @@ -42,8 +61,8 @@ async function run() { if (inputs.project) process.env.CIFF_PROJECT_NAME = inputs.project; if (inputs.projectColumn) process.env.CIFF_PROJECT_COLUMN_NAME = inputs.projectColumn; - // Execute python script - await exec.exec("python", [`${src}/create_issue_from_file.py`]); + // Execute create issue from file + await exec.exec(python, [`${ciff}/create_issue_from_file.py`]); } catch (error) { core.setFailed(error.message); } diff --git a/src/requirements.txt b/src/requirements.txt deleted file mode 100644 index 4359e250..00000000 --- a/src/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -PyGithub==1.47