mirror of
https://github.com/ditkrg/todo-to-issue-action.git
synced 2026-01-22 22:06:43 +00:00
commit
b70b9d159e
6
.github/workflows/ci.yml
vendored
6
.github/workflows/ci.yml
vendored
@ -6,8 +6,10 @@ jobs:
|
||||
build:
|
||||
runs-on: "ubuntu-latest"
|
||||
steps:
|
||||
- uses: "actions/checkout@v3"
|
||||
- uses: "actions/setup-python@v4"
|
||||
- uses: "actions/checkout@v4"
|
||||
- uses: "actions/setup-python@v5"
|
||||
with:
|
||||
python-version: '3.12'
|
||||
- name: "Install test dependencies"
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
|
||||
4
.github/workflows/todo.yml
vendored
4
.github/workflows/todo.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
||||
build:
|
||||
runs-on: "ubuntu-latest"
|
||||
steps:
|
||||
- uses: "actions/checkout@v3"
|
||||
- uses: "actions/checkout@v4"
|
||||
- name: "TODO to Issue"
|
||||
uses: "alstr/todo-to-issue-action@master"
|
||||
env:
|
||||
@ -21,5 +21,3 @@ jobs:
|
||||
${{ inputs.MANUAL_COMMIT_REF }}
|
||||
MANUAL_BASE_REF:
|
||||
${{ inputs.MANUAL_BASE_REF }}
|
||||
with:
|
||||
PROJECTS_SECRET: ${{ secrets.PROJECTS_SECRET }}
|
||||
|
||||
@ -6,7 +6,7 @@ RUN pip install --target=/app requests
|
||||
RUN pip install --target=/app -U pip setuptools wheel
|
||||
RUN pip install --target=/app ruamel.yaml
|
||||
|
||||
FROM gcr.io/distroless/python3-debian10
|
||||
FROM gcr.io/distroless/python3-debian12
|
||||
COPY --from=builder /app /app
|
||||
WORKDIR /app
|
||||
ENV PYTHONPATH /app
|
||||
|
||||
425
README.md
425
README.md
@ -1,27 +1,41 @@
|
||||
# TODO to Issue Action
|
||||
# TODO to Issue
|
||||
|
||||
This action will convert newly committed TODO comments to GitHub issues on push.
|
||||
Action to create, update and close issues based on committed TODO comments.
|
||||
|
||||
Optionally, issues can also be closed when the TODOs are removed in a future commit.
|
||||

|
||||
|
||||
Action supports:
|
||||
Features:
|
||||
|
||||
* Multiple, customizable comments identifiers (FIXME, etc.),
|
||||
* Configurable auto-labeling,
|
||||
* Assignees,
|
||||
* Milestones,
|
||||
* Projects (classic).
|
||||
* Multiple, customisable comment identifiers (`FIXME`, etc.)
|
||||
* Configurable auto-labeling
|
||||
* Assignees
|
||||
* Milestones
|
||||
* Projects
|
||||
|
||||
`todo-to-issue` works with almost any programming language.
|
||||
|
||||
## What's New
|
||||
|
||||
v5 is the biggest release yet:
|
||||
|
||||
* TODO reference handling
|
||||
* Issue URL insertion
|
||||
* Update and comment on existing issues
|
||||
* Support for v2 projects
|
||||
* Assign milestones by name
|
||||
* Improved issue formatting
|
||||
* Link issues to PRs
|
||||
|
||||
See [Upgrading](#upgrading) for breaking changes.
|
||||
|
||||
## Usage
|
||||
|
||||
Simply add a comment starting with TODO (or any other comment identifiers configured), followed by a colon and/or space.
|
||||
Simply add a line or block comment starting with TODO (or any other comment identifiers configured), followed by a colon and/or space.
|
||||
|
||||
Here's an example for Python creating an issue named after the TODO _description_:
|
||||
|
||||
```python
|
||||
def hello_world():
|
||||
def hello_world():
|
||||
# TODO Come up with a more imaginative greeting
|
||||
print('Hello world!')
|
||||
```
|
||||
@ -29,27 +43,39 @@ Here's an example for Python creating an issue named after the TODO _description
|
||||
_Multiline_ TODOs are supported, with additional lines inserted into the issue body:
|
||||
|
||||
```python
|
||||
def hello_world():
|
||||
def hello_world():
|
||||
# TODO: Come up with a more imaginative greeting
|
||||
# Everyone uses hello world and it's boring.
|
||||
print('Hello world!')
|
||||
```
|
||||
|
||||
As per the [Google Style Guide](https://google.github.io/styleguide/cppguide.html#TODO_Comments), you can provide a
|
||||
_reference_ after the TODO identifier. This will be included in the issue title for searchability.
|
||||
As per the [Google Style Guide](https://google.github.io/styleguide/cppguide.html#TODO_Comments), you can provide a _reference_ after the TODO identifier:
|
||||
|
||||
```python
|
||||
def hello_world():
|
||||
# TODO(alstr) Come up with a more imaginative greeting
|
||||
# Everyone uses hello world and it's boring.
|
||||
print('Hello world!')
|
||||
def hello_world():
|
||||
# TODO(@alstr): Come up with a more imaginative greeting
|
||||
# This will assign the issue to alstr.
|
||||
print('Hello world!')
|
||||
|
||||
# TODO(!urgent): This is wrong
|
||||
# This will add an 'urgent' label.
|
||||
assert 1 + 1 == 3
|
||||
|
||||
# TODO(#99): We need error handling here
|
||||
# This will add the comment to the existing issue 99.
|
||||
greeting_time = datetime.fromisoformat(date_string)
|
||||
|
||||
# TODO(language): Localise this string
|
||||
# This will prepend the reference to the issue title
|
||||
dialogue = "TODO or not TODO, that is the question."
|
||||
```
|
||||
|
||||
Don't include parentheses within the reference itself.
|
||||
Only one reference can be provided. Should you wish to further configure the issue, you can do so via
|
||||
[TODO Options](#todo-options).
|
||||
|
||||
## TODO Options
|
||||
|
||||
A range of options can also be provided to apply to the new issue.
|
||||
A range of options can also be provided to apply to the issue, in addition to any reference supplied.
|
||||
|
||||
Options follow the `name: value` syntax.
|
||||
Unless otherwise specified, options should be on their own line, below the initial TODO declaration and 'body'.
|
||||
@ -59,8 +85,8 @@ Unless otherwise specified, options should be on their own line, below the initi
|
||||
Comma-separated list of usernames to assign to the issue:
|
||||
|
||||
```python
|
||||
def hello_world():
|
||||
# TODO(alstr): Come up with a more imaginative greeting
|
||||
def hello_world():
|
||||
# TODO: Come up with a more imaginative greeting
|
||||
# Everyone uses hello world and it's boring.
|
||||
# assignees: alstr, bouteillerAlan, hbjydev
|
||||
print('Hello world!')
|
||||
@ -71,8 +97,8 @@ Comma-separated list of usernames to assign to the issue:
|
||||
Comma-separated list of labels to add to the issue:
|
||||
|
||||
```python
|
||||
def hello_world():
|
||||
# TODO(alstr): Come up with a more imaginative greeting
|
||||
def hello_world():
|
||||
# TODO: Come up with a more imaginative greeting
|
||||
# Everyone uses hello world and it's boring.
|
||||
# labels: enhancement, help wanted
|
||||
print('Hello world!')
|
||||
@ -80,57 +106,19 @@ Comma-separated list of labels to add to the issue:
|
||||
|
||||
If any of the labels do not already exist, they will be created.
|
||||
|
||||
The `todo` label is automatically added to issues to help the action efficiently retrieve them in the future.
|
||||
|
||||
### Milestone
|
||||
|
||||
Milestone `ID` to assign to the issue:
|
||||
Milestone name to assign to the issue:
|
||||
|
||||
```python
|
||||
def hello_world():
|
||||
# TODO(alstr): Come up with a more imaginative greeting
|
||||
def hello_world():
|
||||
# TODO: Come up with a more imaginative greeting
|
||||
# Everyone uses hello world and it's boring.
|
||||
# milestone: 1
|
||||
# milestone: v3.0
|
||||
print('Hello world!')
|
||||
```
|
||||
|
||||
Only a single milestone can be specified and it must already exist.
|
||||
|
||||
### Projects
|
||||
|
||||
_Please note, the action currently only supports classic user and organisation projects, and not 'new' projects._
|
||||
|
||||
With some additional setup, you can assign the created issues a status (column) within user or organisation projects.
|
||||
|
||||
By default, the action cannot access your projects. To enable it, you must:
|
||||
|
||||
* [Create a Personal Access Token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token),
|
||||
* [Create an encrypted secret in your repo settings](https://docs.github.com/en/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository),
|
||||
with the value set to the Personal Access Token,
|
||||
* Assign the secret in the workflow file like `PROJECTS_SECRET: ${{ secrets.PROJECTS_SECRET }}`. _Do not enter the raw
|
||||
secret_.
|
||||
|
||||
Projects are identified by their `full project name and issue status` (column) reference with
|
||||
the `<user or org name>/project name/status name` syntax.
|
||||
|
||||
* To assign to a _user project_, use the `user projects:` option.
|
||||
* To assign to an _organisation project_, use `org projects:` option.
|
||||
|
||||
```python
|
||||
def hello_world():
|
||||
# TODO Come up with a more imaginative greeting
|
||||
# Everyone uses hello world and it's boring.
|
||||
# user projects: alstr/Test User Project/To Do
|
||||
# org projects: alstrorg/Test Org Project/To Do
|
||||
print('Hello world!')
|
||||
```
|
||||
|
||||
You can assign issues to multiple projects separating them with commas,
|
||||
i.e. `user projects: alstr/Test User Project 1/To Do, alstr/Test User Project 2/Tasks`.
|
||||
|
||||
You can also specify `default projects` in the same way by defining `USER_PROJECTS` or `ORG_PROJECTS` in your workflow
|
||||
file.
|
||||
These will be applied automatically to every issue, but will be overrode by any specified within the TODO.
|
||||
Only a single milestone can be specified. If the milestone does not exist, it will be created.
|
||||
|
||||
## Supported Languages
|
||||
|
||||
@ -189,19 +177,16 @@ These will be applied automatically to every issue, but will be overrode by any
|
||||
- XML
|
||||
- YAML
|
||||
|
||||
New languages can easily be added to the `syntax.json` file, used by the action to identify TODO comments.
|
||||
New languages can easily be added to the `syntax.json` file used by the action to identify TODO comments.
|
||||
|
||||
When adding languages, follow the structure of existing entries, and use the language name defined by GitHub
|
||||
in [`languages.yml`](https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml).
|
||||
|
||||
Of course, PRs adding new languages are welcome and appreciated. Please add a test for your language in order for your
|
||||
PR to be accepted. See [Contributing](#contributing--issues).
|
||||
PRs adding new languages are welcome and appreciated. See [Contributing](#contributing--issues).
|
||||
|
||||
## Setup
|
||||
|
||||
On your repo go to `Settings -> Actions (General) -> Workflow permissions` and enable "Read and write permissions".
|
||||
In the repo where you want the action to run, go to `Settings -> Actions (General) -> Workflow permissions` and enable
|
||||
"Read and write permissions".
|
||||
|
||||
Create a `workflow.yml` file in your `.github/workflows` directory like:
|
||||
Next, create a `workflow.yml` file in your `.github/workflows` directory:
|
||||
|
||||
```yml
|
||||
name: "Run TODO to Issue"
|
||||
@ -210,42 +195,19 @@ jobs:
|
||||
build:
|
||||
runs-on: "ubuntu-latest"
|
||||
steps:
|
||||
- uses: "actions/checkout@v3"
|
||||
- uses: "actions/checkout@v4"
|
||||
- name: "TODO to Issue"
|
||||
uses: "alstr/todo-to-issue-action@v4"
|
||||
uses: "alstr/todo-to-issue-action@v5"
|
||||
```
|
||||
|
||||
See [Github's workflow syntax](https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions) for
|
||||
further details on this file.
|
||||
### URL Insertion
|
||||
|
||||
The workflow file takes the following optional inputs:
|
||||
The action can insert the URL for a created issue back into the associated TODO.
|
||||
|
||||
| Parameter | Required | Description |
|
||||
|-----------------|----------|------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| REPO | False | The path to the repository where the action will be used, e.g., 'alstr/my-repo' (automatically set) |
|
||||
| BEFORE | False | The SHA of the last pushed commit (automatically set) |
|
||||
| COMMITS | False | An array of commit objects describing the pushed commits |
|
||||
| DIFF_URL | False | The URL to use to get the diff (automatically set) |
|
||||
| SHA | False | The SHA of the latest commit (automatically set) |
|
||||
| TOKEN | False | The GitHub access token to allow us to retrieve, create and update issues (automatically set) |
|
||||
| LABEL | False | The label that will be used to identify TODO comments (deprecated) |
|
||||
| COMMENT_MARKER | False | The marker used to signify a line comment in your code (deprecated) |
|
||||
| CLOSE_ISSUES | False | Optional input that specifies whether to attempt to close an issue when a TODO is removed |
|
||||
| AUTO_P | False | For multiline TODOs, format each line as a new paragraph when creating the issue |
|
||||
| PROJECTS_SECRET | False | Encrypted secret corresponding to your personal access token (do not enter the actual secret) |
|
||||
| USER_PROJECTS | False | Default user projects |
|
||||
| ORG_PROJECTS | False | Default organization projects |
|
||||
| IGNORE | False | A collection of comma-delimited regular expressions that match files that should be ignored when searching for TODOs |
|
||||
| AUTO_ASSIGN | False | Automatically assign new issues to the user who triggered the action |
|
||||
| ACTOR | False | The username of the person who triggered the action |
|
||||
| ISSUE_TEMPLATE | False | The template used to format new issues, e.g. `TODO title: {{ title }}\nBody: {{ body }}\nLink: {{ url }}\nCode:\n{{ snippet }}` |
|
||||
| IDENTIFIERS | False | List of custom identifier dictionaries of the form `[{"name": "TODO", "labels": [todo]}]` |
|
||||
| GITHUB_URL | False | Base URL of GitHub API |
|
||||
| ESCAPE | False | Escape all special Markdown characters |
|
||||
| LANGUAGES | False | A collection of comma-delimited URLs or local paths starting from the current working directory of the action for custom languages |
|
||||
| NO_STANDARD | False | Exclude loading the default 'syntax.json' and 'language.yml' files from the repository |
|
||||
This allows for tighter integration between issues and TODOs, enables updating issues by editing TODOs, and improves the
|
||||
accuracy of the action when closing TODOs.
|
||||
|
||||
These can be specified using `with` parameter in the workflow file, as below:
|
||||
A new feature in v5, it is disabled by default. To enable URL insertion, some extra config is required:
|
||||
|
||||
```yml
|
||||
name: "Run TODO to Issue"
|
||||
@ -254,33 +216,62 @@ jobs:
|
||||
build:
|
||||
runs-on: "ubuntu-latest"
|
||||
steps:
|
||||
- uses: "actions/checkout@v3"
|
||||
- uses: "actions/checkout@v4"
|
||||
- name: "TODO to Issue"
|
||||
uses: "alstr/todo-to-issue-action@v4"
|
||||
uses: "alstr/todo-to-issue-action@v5"
|
||||
with:
|
||||
AUTO_ASSIGN: true
|
||||
INSERT_ISSUE_URLS: "true"
|
||||
- name: Set Git user
|
||||
run: |
|
||||
git config --global user.name "github-actions[bot]"
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
- name: Commit and Push Changes
|
||||
run: |
|
||||
git add .
|
||||
git commit -m "Automatically added GitHub issue links to TODOs"
|
||||
git push origin main
|
||||
```
|
||||
|
||||
### Considerations
|
||||
You will probably also want to use the setting `CLOSE_ISSUES: "true"`, to allow issues to be closed when a TODO is
|
||||
removed.
|
||||
|
||||
- TODOs are found by analysing the difference between the new commit and its previous one (i.e., the diff). That means
|
||||
that if this action is implemented during development, any existing TODOs will not be detected. For them to be
|
||||
detected, you would have to remove them, commit, put them back, and commit again,
|
||||
or [run the action manually](#running-the-action-manually).
|
||||
- Should you change the TODO text, this will currently create a new issue.
|
||||
- Closing TODOs is still somewhat experimental.
|
||||
Please note, URL insertion works best with line comments, as it has to insert a line into the file. If using block
|
||||
comments, you should put the start and end tags on their own lines. This may be improved in the future.
|
||||
|
||||
## Custom Languages
|
||||
This feature is not perfect. Please make sure you're comfortable with that before enabling.
|
||||
|
||||
If you want to add or overwrite language detections that are not currently supported, you can add them manually using the `LANGUAGES` input.
|
||||
### Projects
|
||||
|
||||
Just create a file that contains an array with languages, each having the following properties:
|
||||
You can configure the action to add newly created issues to a specified v2 project (i.e., not a classic project).
|
||||
|
||||
| Property | Type | Description |
|
||||
|------------|----------|----------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| language | string | The unique name of the language |
|
||||
| extensions | string[] | A list of file extensions for the custom language |
|
||||
| markers | object[] | A list of objects (see example below) to declare the comment markers. Make sure to escape all special Markdown characters with a double backslash. |
|
||||
The action does not have sufficient permissions by default, so you will need to create a new Personal Access Token with
|
||||
the `repo` and `project` scopes.
|
||||
|
||||
Then, in your repo, go to `Settings -> Secrets and variables (Actions) -> Secrets`, and enter the value as a new
|
||||
repository secret with the name `PROJECTS_SECRET`.
|
||||
|
||||
Finally, add the following to the workflow file, under `with`:
|
||||
```
|
||||
PROJECT: "user/alstr/test"
|
||||
PROJECTS_SECRET: "${{ secrets.PROJECTS_SECRET }}"
|
||||
```
|
||||
|
||||
Where `PROJECT` is a string of the form `account_type/owner/project_name`. Valid values for `account_type` are `user` or `organization`.
|
||||
|
||||
All newly created issues will then be automatically added to the specified project.
|
||||
|
||||
### Custom Languages
|
||||
|
||||
If you want to add language definitions that are not currently supported, or overwrite existing ones, you can do so
|
||||
using the `LANGUAGES` input.
|
||||
|
||||
Just create a file that contains an array of languages, each with the following properties:
|
||||
|
||||
| Property | Description |
|
||||
|------------|----------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| language | The unique name of the language |
|
||||
| extensions | A list of file extensions for the custom language |
|
||||
| markers | A list of objects (see example below) to declare the comment markers. Make sure to escape all special Markdown characters with a double backslash. |
|
||||
|
||||
For example, here is a language declaration file for Java:
|
||||
|
||||
@ -307,41 +298,113 @@ For example, here is a language declaration file for Java:
|
||||
}
|
||||
]
|
||||
```
|
||||
Next, add the file to the `LANGUAGES` property in your workflow YAML file. Please note that if multiple paths are provided, the last path specified will take precedence over any previous ones:
|
||||
|
||||
Next, add the file to the `LANGUAGES` property in your workflow file.
|
||||
|
||||
**Using a Local File:**
|
||||
|
||||
```yaml
|
||||
name: "Run TODO to Issue"
|
||||
on: [ "push" ]
|
||||
jobs:
|
||||
build:
|
||||
runs-on: "ubuntu-latest"
|
||||
steps:
|
||||
- uses: "actions/checkout@v3"
|
||||
- name: "TODO to Issue"
|
||||
uses: "alstr/todo-to-issue-action@v4"
|
||||
with:
|
||||
LANGUAGES: "path/to/my/file.json"
|
||||
```
|
||||
`LANGUAGES: "path/to/my/file.json"`
|
||||
|
||||
**Using a File from HTTP(s):**
|
||||
**Using a Remote File:**
|
||||
|
||||
```yaml
|
||||
name: "Run TODO to Issue"
|
||||
on: [ "push" ]
|
||||
jobs:
|
||||
build:
|
||||
runs-on: "ubuntu-latest"
|
||||
steps:
|
||||
- uses: "actions/checkout@v3"
|
||||
- name: "TODO to Issue"
|
||||
uses: "alstr/todo-to-issue-action@v4"
|
||||
with:
|
||||
LANGUAGES: "http://myserver.com/path/to/my/file.json"
|
||||
```
|
||||
`LANGUAGES: "https://myserver.com/path/to/my/file.json"`
|
||||
|
||||
This will configure the action to use your custom language file for detecting TODO comments.
|
||||
Multiple paths can be provided by entering a comma-delimited string.
|
||||
|
||||
### All Settings
|
||||
|
||||
The workflow file takes the following optional inputs, specified under the `with` parameter:
|
||||
|
||||
#### AUTO_ASSIGN
|
||||
|
||||
Automatically assign new issues to the user who triggered the action.
|
||||
|
||||
Default: `False`
|
||||
|
||||
#### AUTO_P
|
||||
|
||||
For multiline TODOs, format each line as a new paragraph when creating the issue.
|
||||
|
||||
Default: `True`
|
||||
|
||||
#### CLOSE_ISSUES
|
||||
|
||||
Whether to close an issue when a TODO is removed. If enabling this, also enabling `INSERT_ISSUE_URLS` is recommended
|
||||
for improved accuracy.
|
||||
|
||||
Default: `False`
|
||||
|
||||
#### ESCAPE
|
||||
|
||||
Escape all special Markdown characters.
|
||||
|
||||
Default: `True`
|
||||
|
||||
#### GITHUB_URL
|
||||
|
||||
Base URL of GitHub API. In most cases you will not need to change this.
|
||||
|
||||
Default: `${{ github.api_url }}`
|
||||
|
||||
#### IDENTIFIERS
|
||||
|
||||
List of custom identifier dictionaries. Use this to add support for `FIXME` and other identifiers, and assign default
|
||||
labels.
|
||||
|
||||
Default: `[{"name": "TODO", "labels": []}]`
|
||||
|
||||
#### INSERT_ISSUE_URLS
|
||||
|
||||
Whether to insert the URL for a new issue back into the associated TODO.
|
||||
|
||||
See [URL Insertion](#url-insertion).
|
||||
|
||||
Default: `False`
|
||||
|
||||
#### IGNORE
|
||||
|
||||
A collection of comma-delimited regular expressions that match files that should be ignored when searching for TODOs.
|
||||
|
||||
#### ISSUE_TEMPLATE
|
||||
|
||||
Custom template used to format new issues. This is a string that accepts Markdown, linebreaks and the following
|
||||
placeholders:
|
||||
|
||||
* `{{ title }}`: issue title
|
||||
* `{{ body }}`: issue body
|
||||
* `{{ url }}`: URL to the line
|
||||
* `{{ snippet }}`: code snippet of the relevant section
|
||||
|
||||
If not specified the standard template is used, containing the issue body (if a multiline TODO), URL and snippet.
|
||||
|
||||
#### LANGUAGES
|
||||
|
||||
A collection of comma-delimited URLs or local paths (starting from the current working directory of the action)
|
||||
for custom languages.
|
||||
|
||||
See [Custom Languages](#custom-languages).
|
||||
|
||||
#### NO_STANDARD
|
||||
|
||||
Exclude loading the default `syntax.json` and `languages.yml` files.
|
||||
|
||||
Default: `False`
|
||||
|
||||
#### PROJECT
|
||||
|
||||
A string specifying a v2 project where issues should be added.
|
||||
|
||||
Use the format `account_type/owner/project_name`. Valid values for `account_type` are `user` or `organization`.
|
||||
|
||||
See [Projects](#projects).
|
||||
|
||||
#### PROJECTS_SECRET
|
||||
|
||||
A Personal Access Token with the `repo` and `project` scopes, required for enabling support for projects.
|
||||
|
||||
It should be of the form `${{ secrets.PROJECTS_SECRET }}`. Do not enter actual secret.
|
||||
|
||||
See [Projects](#projects).
|
||||
|
||||
## Running the action manually
|
||||
|
||||
@ -365,44 +428,57 @@ jobs:
|
||||
build:
|
||||
runs-on: "ubuntu-latest"
|
||||
steps:
|
||||
- uses: "actions/checkout@v3"
|
||||
- uses: "actions/checkout@v4"
|
||||
- name: "TODO to Issue"
|
||||
uses: "alstr/todo-to-issue-action@master"
|
||||
uses: "alstr/todo-to-issue-action@v5"
|
||||
env:
|
||||
MANUAL_COMMIT_REF: ${{ inputs.MANUAL_COMMIT_REF }}
|
||||
MANUAL_BASE_REF: ${{ inputs.MANUAL_BASE_REF }}
|
||||
```
|
||||
|
||||
Head to the Actions section of your repo, select the workflow and then 'Run workflow'.
|
||||
Head to the actions section of your repo, select the workflow and then 'Run workflow'.
|
||||
|
||||
You can run the workflow for a single commit by entering the commit SHA in the first box. In this case, the action will
|
||||
compare the commit to the one directly before it.
|
||||
|
||||
You can also compare a broader range of commits. For that, also enter the 'from'/base commit SHA in the second box.
|
||||
You can also compare a broader range of commits. For that, also enter the 'from' or base commit SHA in the second box.
|
||||
|
||||
## Upgrading
|
||||
|
||||
If upgrading from v4 to v5, please note the following:
|
||||
|
||||
* Milestones are now specified by name, not ID.
|
||||
* Support for classic projects has been removed, together with the `user_projects:` and `org_projects:` options,
|
||||
and `USER_PROJECTS` and `ORG_PROJECTS` workflow settings.
|
||||
* The `todo` label is no longer set on created issues.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### No issues have been created
|
||||
|
||||
- Make sure your file language is in `syntax.json`.
|
||||
- The action will not recognise existing TODOs that have already been pushed, unless
|
||||
you [run the action manually](#running-the-action-manually).
|
||||
- If a similar TODO appears in the diff as both an addition and deletion, it is assumed to have been moved, so is
|
||||
ignored.
|
||||
- If your workflow is executed but no issue is generated, check your repo permissions by navigating
|
||||
to `Settings -> Actions (General) -> Workflow permissions` and enable "Read and write permissions".
|
||||
- TODOs are found by analysing the difference between the new commit and its previous one (i.e., the diff). This means
|
||||
that if this action is implemented during development, any existing TODOs will not be detected. For them to be
|
||||
detected, you would have to re-commit them, or [run the action manually](#running-the-action-manually).
|
||||
- If your workflow is executed but no issue is generated, check your repo permissions by navigating to
|
||||
`Settings -> Actions (General) -> Workflow permissions` and enable "Read and write permissions".
|
||||
|
||||
### Multiple issues have been created
|
||||
|
||||
Issues are created whenever the action runs and finds a newly added TODO in the diff. Rebasing may cause a TODO to show
|
||||
up in a diff multiple times. This is an acknowledged issue, but you may have some luck by adjusting your workflow file.
|
||||
Issues are created whenever the action runs and finds a newly added TODO in the diff. This can lead to duplicate
|
||||
issues if a diff is processed multiple times.
|
||||
|
||||
Enabling [URL Insertion](#url-insertion) can help with the detection of existing issues.
|
||||
|
||||
## Contributing & Issues
|
||||
|
||||
If you do encounter any problems, please file an issue or submit a PR. Everyone is welcome and encouraged to contribute.
|
||||
If encounter any problems, please file an issue or submit a PR. Everyone is welcome and encouraged to contribute.
|
||||
|
||||
**If submitting a request to add a new language, please ensure you add the appropriate tests covering your language. In
|
||||
the interests of stability, PRs without tests cannot be considered.**
|
||||
**If submitting a request to add a new language, please ensure you add the appropriate tests covering your language.
|
||||
In the interests of stability, PRs without tests cannot be considered.**
|
||||
|
||||
When adding languages, follow the structure of existing entries, and use the language name defined by
|
||||
[GitHub's `languages.yml`](https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml) file.
|
||||
|
||||
## Running tests locally
|
||||
|
||||
@ -423,15 +499,10 @@ run:
|
||||
|
||||
## Thanks
|
||||
|
||||
The action was developed for the GitHub Hackathon. Whilst every effort is made to ensure it works, it comes with no
|
||||
guarantee.
|
||||
The action was originally developed for the GitHub Hackathon in 2020. Whilst every effort is made to ensure it works,
|
||||
it comes with no guarantee.
|
||||
|
||||
Thanks to Jacob Tomlinson
|
||||
for [his handy overview of GitHub Actions](https://www.jacobtomlinson.co.uk/posts/2019/creating-github-actions-in-python/).
|
||||
Thanks to GitHub's [linguist repo](https://github.com/github/linguist/) for the [`languages.yml`](https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml) file used by the app to look up file extensions
|
||||
and determine the correct highlighting to apply to code snippets.
|
||||
|
||||
Thanks to GitHub's [linguist repo](https://github.com/github/linguist/) for
|
||||
the [`languages.yml`](https://raw.githubusercontent.com/github/linguist/master/lib/linguist/languages.yml) file used by
|
||||
the app to look up file extensions and determine the correct highlighting to apply to code snippets.
|
||||
|
||||
Thanks to all those who have [contributed](https://github.com/alstr/todo-to-issue-action/graphs/contributors) to the
|
||||
further development of this action.
|
||||
Thanks to all those who have [contributed](https://github.com/alstr/todo-to-issue-action/graphs/contributors) to the further development of this action.
|
||||
30
action.yml
30
action.yml
@ -17,7 +17,7 @@ inputs:
|
||||
required: false
|
||||
default: '${{ github.event.before || github.base_ref }}'
|
||||
COMMITS:
|
||||
description: 'An array of commit objects describing the pushed commits'
|
||||
description: 'An array of commit objects describing the pushed commits (automatically set)'
|
||||
required: false
|
||||
default: '${{ toJSON(github.event.commits) }}'
|
||||
DIFF_URL:
|
||||
@ -32,29 +32,20 @@ inputs:
|
||||
description: 'The GitHub access token to allow us to retrieve, create and update issues (automatically set)'
|
||||
required: false
|
||||
default: ${{ github.token }}
|
||||
LABEL:
|
||||
description: 'The label that will be used to identify TODO comments (deprecated)'
|
||||
required: false
|
||||
COMMENT_MARKER:
|
||||
description: 'The marker used to signify a line comment in your code (deprecated)'
|
||||
required: false
|
||||
CLOSE_ISSUES:
|
||||
description: 'Optional input that specifies whether to attempt to close an issue when a TODO is removed'
|
||||
description: 'Optional input specifying whether to attempt to close an issue when a TODO is removed'
|
||||
required: false
|
||||
default: true
|
||||
AUTO_P:
|
||||
description: 'For multiline TODOs, format each line as a new paragraph when creating the issue'
|
||||
required: false
|
||||
default: true
|
||||
PROJECT:
|
||||
description: "User or organization project to link issues to, format 'project_type/owner/project_name'"
|
||||
required: false
|
||||
PROJECTS_SECRET:
|
||||
description: 'Encrypted secret corresponding to your personal access token (do not enter the actual secret)'
|
||||
required: false
|
||||
USER_PROJECTS:
|
||||
description: 'Default user projects'
|
||||
required: false
|
||||
ORG_PROJECTS:
|
||||
description: 'Default organisation projects'
|
||||
required: false
|
||||
IGNORE:
|
||||
description: 'A collection of comma-delimited regular expression that matches files that should be ignored when searching for TODOs'
|
||||
required: false
|
||||
@ -63,7 +54,7 @@ inputs:
|
||||
required: false
|
||||
default: false
|
||||
ACTOR:
|
||||
description: 'The username of the person who triggered the action'
|
||||
description: 'The username of the person who triggered the action (automatically set)'
|
||||
required: false
|
||||
default: '${{ github.actor }}'
|
||||
ISSUE_TEMPLATE:
|
||||
@ -81,10 +72,13 @@ inputs:
|
||||
required: false
|
||||
default: true
|
||||
LANGUAGES:
|
||||
description: 'A collection of comma-delimited URLs or local paths starting from the current working directory of the action for custom languages'
|
||||
description: 'A collection of comma-delimited URLs or local paths for custom language files'
|
||||
required: false
|
||||
default: ''
|
||||
NO_STANDARD:
|
||||
description: 'Exclude loading the default ''syntax.json'' and ''language.yml'' files from the repository'
|
||||
description: "Exclude loading the default 'syntax.json' and 'languages.yml' files from the repository"
|
||||
required: false
|
||||
default: false
|
||||
INSERT_ISSUE_URLS:
|
||||
description: 'Whether the action should insert the URL for a newly-created issue into the associated TODO comment'
|
||||
required: false
|
||||
default: false
|
||||
BIN
diagram.png
Normal file
BIN
diagram.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 301 KiB |
@ -1,15 +1,3 @@
|
||||
attrs==22.1.0
|
||||
certifi==2022.12.07
|
||||
charset-normalizer==2.0.7
|
||||
exceptiongroup==1.0.0
|
||||
idna==3.3
|
||||
iniconfig==1.1.1
|
||||
packaging==21.3
|
||||
pluggy==1.0.0
|
||||
pyparsing==3.0.9
|
||||
pytest==7.2.0
|
||||
requests==2.31.0
|
||||
ruamel.yaml==0.17.17
|
||||
ruamel.yaml.clib==0.2.6
|
||||
tomli==2.0.1
|
||||
urllib3==1.26.7
|
||||
requests==2.32.3
|
||||
ruamel.yaml==0.18.6
|
||||
pytest==8.3.3
|
||||
@ -2,18 +2,18 @@ diff --git a/tests/ExampleFile.java b/tests/ExampleFile.java
|
||||
index d340f6a..29b54da 100644
|
||||
--- a/tests/ExampleFile.java
|
||||
+++ b/tests/ExampleFile.java
|
||||
@@ -1,13 +1,5 @@
|
||||
package com.mydomain.myapp;
|
||||
|
||||
public class JavaTests {
|
||||
- // TODO: Some Java
|
||||
- // # Some title
|
||||
- // <SomeTag>
|
||||
|
||||
- /*
|
||||
- TODO: Definitely some Java
|
||||
- # Another title
|
||||
- <AnotherTag>
|
||||
- */
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
+package com.mydomain.myapp;
|
||||
+
|
||||
+public class JavaTests {
|
||||
+ // TODO: Some Java
|
||||
+ // # Some title
|
||||
+ // <SomeTag>
|
||||
+
|
||||
+ /*
|
||||
+ TODO: Definitely some Java
|
||||
+ # Another title
|
||||
+ <AnotherTag>
|
||||
+ */
|
||||
+}
|
||||
\ No newline at end of file
|
||||
@ -245,7 +245,7 @@ class EscapeMarkdownTest(unittest.TestCase):
|
||||
self.assertEqual(issue.body[1], '\\<AnotherTag\\>')
|
||||
|
||||
|
||||
class customLanguageTest(unittest.TestCase):
|
||||
class CustomLanguageTest(unittest.TestCase):
|
||||
def test_custom_lang_load(self):
|
||||
os.environ['INPUT_LANGUAGES'] = 'tests/custom_languages.json'
|
||||
parser = TodoParser()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user