forgejo-contrib-forgejo-cli-pulls-261.md
Watch20
Star402
Fork
You've already forked forgejo-cli
CodeIssues 44Pull requests 8Releases 11Packages 2WikiActivity
Merged
Cyborusmerged 18 commits from issue-templates into main 2026-01-14 17:05:54 +01:00
Conversation 7Commits 18Files changed 6 +1441 -104
Cyborus commented 2026-01-10 02:12:28 +01:00
Member
Copy link
Implements #227
For markdown templates, this is relatively easy. For YAML templates, this is accomplished by formatting the template into a Markdown "form", opening the editor on that, and then parsing that form to make the body.
An example of what those forms look like, taken from forgejo's "problem" template:
**NOTE: If your issue is a security concern, please email <[email protected]> ([security.txt](https://forgejo.org/.well-known/security.txt)) instead of opening a public issue.**
- Please speak English, as this is the language all maintainers can speak and write.
- Be civil, and follow the [Forgejo Code of Conduct](https://codeberg.org/forgejo/code-of-conduct).
- Take a moment to [check if a similar problem has already been discussed in the past.](https://codeberg.org/forgejo/forgejo/issues?q=&type=all&labels=78137). Feel free to add your own experience there, if applicable.
- We are currently experimenting with a new workflow to understand your problems and requests. Please try to focus on explaining the problem you are facing, which could be a bug in the code, a moment of confusion, or a missing feature. We'll think about solutions to the problem at a later step. If you want to learn more about the background of our workflow, feel invited to read and participate in [the discussion that led to the current approach](https://codeberg.org/forgejo/discussions/issues/415). We are looking forward to your feedback.
### Does your problem still exist on the latest Forgejo version?
Please try reproducing your problem at https://dev.next.forgejo.org or a local development version of Forgejo.
If you check that your problem is not already addressed by a recent change, this will save all volunteers involved a lot of time.
Must select exactly one option.
- [] Yes, the problem still exists (tested on a next instance)
- [] Yes, the problem still exists (tested locally with the latest development version)
- [] Unknown, I can't try it for some reason (please explain)
### Your usage of Forgejo
Please provide a description of your usage of Forgejo. To better understand your problem, it will be relevant to know in which environment you use Forgejo and if you have performed specific configuration.
<details><summary>Further instructions</summary>
- If you report a bug with a certain functionality, it will be relevant to learn about related configuration ("This is how I configured my identity provider", "This is how my Forgejo Actions runner is set up").
- Please elaborate on your personal relation to Forgejo and user role ("I'm new to Forgejo, but used a comparable product called …", "In my role as a designer, …").
- If you feel that Forgejo needs a change in functionality, please describe in which environment you want to use it, so that we can understand for which audience the complexity needs to appeal to ("We're a group of friends with no technical / professional background and use a personal Forgejo instance to prepare our first libre game").
- If you already explained your usage of Forgejo elsewhere (e.g. in another issue or in a user research repository), you can put a link here.
</details>
Required.
~~~~~ markdown
~~~~~
### Problem description
Please describe your problem as a first-hand experience. Try to focus on the problem. Finding a solution will happen in a next step.
<details><summary>Further instructions</summary>
- Start by explaining what you want to achieve ("I wanted to find an issue to work on").
- Try to include steps that you took and that resulted in the current situation. ("I opened the issue tracker, clicked on …, then …").
- If there were moments of confusion, please describe them. ("There was a button saying … and I was not sure if it would do what I expect").
- If you want to do something and don't know how or if it is possible, explain the goal ("I would like to know if there are issues that meet the following criteria …").
</details>
Required.
~~~~~ markdown
~~~~~
### Potential workarounds
If you found a solution to your problem, even if it is not great, please share your experiences with it.
<details><summary>Further instructions</summary>
- Start by explaining what you tried and how it worked out ("I used X and it gives me the results, but it takes a lot of time to click through the UI").
- What are the major problems with your workaround(s)? ("It takes long to get there", "It looks very ugly")
</details>
~~~~~ markdown
~~~~~
### Forgejo Version
Forgejo version (or commit reference) your instance is running
>
### Other details about your environment (software names and versions)
Please include details to help us understand your problem: browser engine and version (for UI issues), operating system and version running Forgejo, database engine and version, deployment methods and relevant third-party packages (e.g. renderers, identity providers)
Required.
~~~~~ markdown
~~~~~
Adds --template <NAME> and --no-template to fj issue create. If a repo has any templates, --no-template is required to make a blank issue. --template <NAME> uses the file name of the template, not the display name. Template is always used for PRs, if one exists. This matches the web UI.
I made an effort to make the issue bodies we create and the ones the web UI creates match as closely as possible.
Implements #227 For markdown templates, this is relatively easy. For YAML templates, this is accomplished by formatting the template into a Markdown "form", opening the editor on that, and then parsing that form to make the body. An example of what those forms look like, taken from forgejo's "problem" template: markdown **NOTE: If your issue is a security concern, please email \<[email protected]\> ([security.txt](https://forgejo.org/.well-known/security.txt)) instead of opening a public issue.** - Please speak English, as this is the language all maintainers can speak and write. - Be civil, and follow the [Forgejo Code of Conduct](https://codeberg.org/forgejo/code-of-conduct). - Take a moment to [check if a similar problem has already been discussed in the past.](https://codeberg.org/forgejo/forgejo/issues?q=&type=all&labels=78137). Feel free to add your own experience there, if applicable. - We are currently experimenting with a new workflow to understand your problems and requests. Please try to focus on explaining the problem you are facing, which could be a bug in the code, a moment of confusion, or a missing feature. We'll think about solutions to the problem at a later step. If you want to learn more about the background of our workflow, feel invited to read and participate in [the discussion that led to the current approach](https://codeberg.org/forgejo/discussions/issues/415). We are looking forward to your feedback. ### Does your problem still exist on the latest Forgejo version? Please try reproducing your problem at https://dev.next.forgejo.org or a local development version of Forgejo. If you check that your problem is not already addressed by a recent change, this will save all volunteers involved a lot of time. Must select exactly one option. - [] Yes, the problem still exists (tested on a next instance) - [] Yes, the problem still exists (tested locally with the latest development version) - [] Unknown, I can't try it for some reason (please explain) ### Your usage of Forgejo Please provide a description of your usage of Forgejo. To better understand your problem, it will be relevant to know in which environment you use Forgejo and if you have performed specific configuration. \<details\>\<summary\>Further instructions\</summary\> - If you report a bug with a certain functionality, it will be relevant to learn about related configuration ("This is how I configured my identity provider", "This is how my Forgejo Actions runner is set up"). - Please elaborate on your personal relation to Forgejo and user role ("I'm new to Forgejo, but used a comparable product called …", "In my role as a designer, …"). - If you feel that Forgejo needs a change in functionality, please describe in which environment you want to use it, so that we can understand for which audience the complexity needs to appeal to ("We're a group of friends with no technical / professional background and use a personal Forgejo instance to prepare our first libre game"). - If you already explained your usage of Forgejo elsewhere (e.g. in another issue or in a user research repository), you can put a link here. \</details\> Required. ~~~~~markdown~~~~~ ### Problem description Please describe your problem as a first-hand experience. Try to focus on the problem. Finding a solution will happen in a next step. \<details\>\<summary\>Further instructions\</summary\> - Start by explaining what you want to achieve ("I wanted to find an issue to work on"). - Try to include steps that you took and that resulted in the current situation. ("I opened the issue tracker, clicked on …, then …"). - If there were moments of confusion, please describe them. ("There was a button saying … and I was not sure if it would do what I expect"). - If you want to do something and don't know how or if it is possible, explain the goal ("I would like to know if there are issues that meet the following criteria …"). \</details\> Required. ~~~~~markdown~~~~~ ### Potential workarounds If you found a solution to your problem, even if it is not great, please share your experiences with it. \<details\>\<summary\>Further instructions\</summary\> - Start by explaining what you tried and how it worked out ("I used X and it gives me the results, but it takes a lot of time to click through the UI"). - What are the major problems with your workaround(s)? ("It takes long to get there", "It looks very ugly") \</details\> ~~~~~markdown~~~~~ ### Forgejo Version Forgejo version (or commit reference) your instance is running \> ### Other details about your environment (software names and versions) Please include details to help us understand your problem: browser engine and version (for UI issues), operating system and version running Forgejo, database engine and version, deployment methods and relevant third-party packages (e.g. renderers, identity providers) Required. ~~~~~markdown~~~~~ Adds --template \<NAME\> and --no-template to fj issue create. If a repo has *any* templates, --no-template is required to make a blank issue. --template \<NAME\> uses the *file* name of the template, not the display name. Template is always used for PRs, if one exists. This matches the web UI. I made an effort to make the issue bodies we create and the ones the web UI creates match as closely as possible.
Cyborus added 7 commits 2026-01-10 02:12:29 +01:00
feat: support markdown issue templates 8fbacd3cde
feat: yaml-based issue templates f7f6a061b0
feat: report line in issue template form errors 2f11411242
refactor: move issue template code into submodule 5658345bc2
feat: pull request templates 56c9a1b778
refactor: simplify issue/pr template code 5ca7ac7e0f
Merge branch 'main' into issue-templates
All checks were successful
ci/woodpecker/pr/check Pipeline was successful
Cyborus requested review from LordMZTE 2026-01-10 02:13:24 +01:00
Cyborus added this to the v0.4.0 milestone 2026-01-10 02:14:10 +01:00
Cyborus added 1 commit 2026-01-10 18:39:18 +01:00
Merge branch 'main' into issue-templates
All checks were successful
ci/woodpecker/pr/check Pipeline was successful
LordMZTE requested changes 2026-01-10 18:41:53 +01:00
src/issues.rs Outdated
Show resolved Hide resolved
| | | | @ -276,3 +321,1 @@ |
| | | | | let mut body = String::new(); |
| | | | | crate::editor(&mut body, Some("md")).await?; |
| | | | | body |
| | | | | let body = body.or(body_from_file); |
LordMZTE commented 2026-01-10 18:38:29 +01:00
Collaborator
Copy link
We should probably change this whole outer match arm to also handle title being None since issue
templates also allow specifying a title "template" to be edited by the user (title field in the
template/front matter). In this case, we should ideally grab the default title from the template,
let the user edit it, and then use that.
We should probably change this whole outer match arm to also handle title being None since issue templates also allow specifying a title "template" to be edited by the user (title field in the template/front matter). In this case, we should ideally grab the default title from the template, let the user edit it, and then use that.
👍 1
Cyborus commented 2026-01-10 19:29:41 +01:00
Author
Member
Copy link
I like this idea too, I've had similar thoughts, but I'm inclined to do it as a separate PR. I'd want to do the same for non-template issues/PRs, so it seems slightly out of scope here to me.
I like this idea too, I've had similar thoughts, but I'm inclined to do it as a separate PR. I'd want to do the same for non-template issues/PRs, so it seems slightly out of scope here to me.
LordMZTE commented 2026-01-10 19:35:21 +01:00
Collaborator
Copy link
Sure! This sort of fits #244 already, so I think it'd make sense to track this there.
Sure! This sort of fits #244 already, so I think it'd make sense to track this there.
👍 1
Cyborus marked this conversation as resolved
src/issues.rs Outdated
Show resolved Hide resolved
| | | | @ -277,2 +321,2 @@ |
| | | | | crate::editor(&mut body, Some("md")).await?; |
| | | | | body |
| | | | | let body = body.or(body_from_file); |
| | | | | let blank_issues_enabled = api |
LordMZTE commented 2026-01-10 18:38:40 +01:00
Collaborator
Copy link
I think the meaning of this value is well worth a short comment. I had to do some guesswork based on
the code since this also seems undocumented in the swagger API. I hope I got it right:
None: The repo does not use templates.Some(true): The repo uses but does not enforce templates.Some(false): The repo uses and enforces templates.I think the meaning of this value is well worth a short comment. I had to do some guesswork based on the code since this also seems undocumented in the swagger API. I hope I got it right: - None: The repo does not use templates. - Some(true): The repo uses but does not enforce templates. - Some(false): The repo uses and enforces templates.
LordMZTE commented 2026-01-10 18:38:57 +01:00
Collaborator
Copy link
We should probably also support the ref field, which according to the docs may contain a ref field.
We should probably also support the ref field, which according to the docs may contain a ref field.
👍 1
LordMZTE commented 2026-01-10 18:43:24 +01:00
Collaborator
Copy link
The latter comment is meant for line 354, seems it got moved around by the review UI for some reason.
The latter comment is meant for line 354, seems it got moved around by the review UI for some reason.
Cyborus commented 2026-01-10 19:17:25 +01:00
Author
Member
Copy link
We should probably also support the
reffield
Somewhat strangely that doesn't seem to do anything for PRs, but that is a huge relief because that would be a massive pain to include...
Shouldn't be too difficult to include for issues.
> We should probably also support the ref field Somewhat strangely that doesn't seem to do anything for PRs, but that *is* a huge relief because that would be a massive pain to include... Shouldn't be too difficult to include for issues.
Cyborus commented 2026-01-10 19:20:06 +01:00
Author
Member
Copy link
I think the meaning of this value is well worth a short comment. I had to do some guesswork based on the code since this also seems undocumented in the swagger API. I hope I got it right:
None: The repo does not use templates.Some(true): The repo uses but does not enforce templates.Some(false): The repo uses and enforces templates.
Yep, that's correct. It is entirely undocumented, I found that out by experimentation. A comment is a good idea. Mind if I just copy that list verbatim?
> I think the meaning of this value is well worth a short comment. I had to do some guesswork based on the code since this also seems undocumented in the swagger API. I hope I got it right: > > * None: The repo does not use templates. > * Some(true): The repo uses but does not enforce templates. > * Some(false): The repo uses and enforces templates. Yep, that's correct. It is entirely undocumented, I found that out by experimentation. A comment is a good idea. Mind if I just copy that list verbatim?
LordMZTE commented 2026-01-10 19:36:58 +01:00
Collaborator
Copy link
Mind if I just copy that list verbatim?
Sure!
> Mind if I just copy that list verbatim? Sure!
LordMZTE marked this conversation as resolved
Show resolved Hide resolved
| | | | @ -0,0 +12,4 @@ |
| | | | | |
| | | | | impl MarkdownTemplate { |
| | | | | pub fn new(md: &str) -> eyre::Result<Self> { |
| | | | | let md_without_start = md |
LordMZTE commented 2026-01-10 18:39:23 +01:00
Collaborator
Copy link
The docs don't seem clear about this, but is the front matter actually required? It could be
optional in case no labels/other info is added. We should probably either reverse-engineer the
upstream code to find out how it's treated there or just be optimistic and allow it.
The docs don't seem clear about this, but is the front matter actually required? It could be optional in case no labels/other info is added. We should probably either reverse-engineer the upstream code to find out how it's treated there or just be optimistic and allow it.
Cyborus commented 2026-01-10 18:51:32 +01:00
Author
Member
Copy link
Simpler answer: test it! I checked on the repo I've been using to test things out and the web ui was fine with there not being a front matter. Good catch!
Simpler answer: test it! I checked on the repo I've been using to test things out and the web ui was fine with there not being a front matter. Good catch!
LordMZTE commented 2026-01-10 19:03:40 +01:00
Collaborator
Copy link
It actually seems like the comrak parser can also parse the front matter. It might make sense to utilize that.
It actually seems like the comrak parser can also parse the front matter. It might make sense to utilize that.
Cyborus commented 2026-01-10 19:10:57 +01:00
Author
Member
Copy link
I tried to do that, but found it difficult to then also get the raw markdown file back from it. I'd prefer not to just re-render it in case that changes it somehow (i.e. different options enabled/disabled).
I tried to do that, but found it difficult to then also get the raw markdown file back from it. I'd prefer not to just re-render it in case that changes it somehow (i.e. different options enabled/disabled).
👍 1
LordMZTE marked this conversation as resolved
src/issues/template.rs Outdated
Show resolved Hide resolved
| | | | @ -0,0 +34,4 @@ |
| | | | | } |
| | | | | } |
| | | | | |
| | | | | pub async fn get_template_file( |
LordMZTE commented 2026-01-10 18:39:42 +01:00
Collaborator
Copy link
Why not use the /repos/{owner}/{repo}/issue_templates endpoint here instead of dealing with raw
files?
Why not use the /repos/{owner}/{repo}/issue_templates endpoint here instead of dealing with raw files?
Cyborus commented 2026-01-10 18:56:57 +01:00
Author
Member
Copy link
There's isn't a corresponding endpoint for the pull request template, so all the current parsing code would still be needed. I found it simpler to use it for both PRs & issues in that case, rather than duplicating effort.
There's isn't a corresponding endpoint for the pull request template, so all the current parsing code would still be needed. I found it simpler to use it for both PRs & issues in that case, rather than duplicating effort.
👍 1
LordMZTE marked this conversation as resolved
Show resolved Hide resolved
| | | | @ -0,0 +39,4 @@ |
| | | | | api: &Forgejo, |
| | | | | name: &str, |
| | | | | ) -> eyre::Result<(Vec<u8>, bool)> { |
| | | | | const DIRS: [&str; 8] = [ |
LordMZTE commented 2026-01-10 18:39:53 +01:00
Collaborator
Copy link
This doesn't match the search directories in upstream docs.
Seems like .gitlab/{issue_template,ISSUE_TEMPLATE} and {issue_template,ISSUE_TEMPLATE} are
missing whereas docs/* is extra.
This doesn't match the search directories in upstream docs. Seems like .gitlab/{issue_template,ISSUE_TEMPLATE} and {issue_template,ISSUE_TEMPLATE} are missing whereas docs/* is extra.
Cyborus commented 2026-01-10 18:59:19 +01:00
Author
Member
Copy link
That is a link to the v9.0 docs, the current docs match what I wrote.
That is a link to the v9.0 docs, the current docs match what I wrote.
👍 1
LordMZTE marked this conversation as resolved
Show resolved Hide resolved
| | | | @ -0,0 +109,4 @@ |
| | | | | arena, |
| | | | | output, |
| | | | | NodeValue::Raw(format!( |
| | | | | " ~~~~~{info}\n{literal}\n~~~~~ \n\n", |
LordMZTE commented 2026-01-10 18:40:14 +01:00
Collaborator
Copy link
Why the space after before {info}? Is it needed? This is obviously preference, but it caught me as
a little off when looking at it for the first time.
Why the space after before {info}? Is it needed? This is obviously preference, but it caught me as a little off when looking at it for the first time.
Cyborus commented 2026-01-10 18:59:46 +01:00
Author
Member
Copy link
Completely just personal preference! I thought it looked nicer
Completely just personal preference! I thought it looked nicer
👍 1
LordMZTE marked this conversation as resolved
Show resolved Hide resolved
| | | | @ -0,0 +291,4 @@ |
| | | | | require_node!(form_iter, NodeValue::BlockQuote, "expected block quote"); |
| | | | | ensure_at!( |
| | | | | field, |
| | | | | !(validations.required && field.children().next().is_none()), |
LordMZTE commented 2026-01-10 18:40:55 +01:00
Collaborator
Copy link
Why do we use .children().next() here and not .first_child()?
Why do we use .children().next() here and not .first_child()?
Cyborus commented 2026-01-10 19:01:22 +01:00
Author
Member
Copy link
I used .children().next() because I forgot that .first_child() existed 😅
I used .children().next() because I forgot that .first_child() existed 😅
LordMZTE marked this conversation as resolved
src/issues/template/yaml.rs Outdated
Show resolved Hide resolved
| | | | @ -0,0 +320,4 @@ |
| | | | | if validations.is_number { |
| | | | | ensure_at!( |
| | | | | field, |
| | | | | body.trim().parse::<i64>().is_ok() |
LordMZTE commented 2026-01-10 18:41:16 +01:00
Collaborator
Copy link
I find this way of validating a number sort of dubious.
NaN, inf, and -inf are treated as validi64 are treated as invalidWhat forgejo seems to do according to a quick glance at their code is to create an
<input type="number"> in HTML, which limits the input to a
valid floating-point number as defined by the HTML standard.
Notable, this means no NaNs and infs and other shenanigans and also no range checks.
If we actually care about being accurate here (which I'm not entirely sure of either), we should
probably either write a tiny verifier (should be easy enough, considering the linked spec) or just
use the regex library we need now anyways if we're feeling lazy.
I find this way of validating a number sort of dubious. - NaN, inf, and -inf are treated as valid - values outside the i64 are treated as invalid What forgejo seems to do according to a quick glance at their code is to create an \<input type="number"\> in HTML, which limits the input to a valid floating-point number as defined by the HTML standard. Notable, this means no NaNs and infs and other shenanigans and also no range checks. If we actually care about being accurate here (which I'm not entirely sure of either), we should probably either write a tiny verifier (should be easy enough, considering the linked spec) or just use the regex library we need now anyways if we're feeling lazy.
Cyborus commented 2026-01-10 19:23:41 +01:00
Author
Member
Copy link
Oh right, there's numbers beyond i64! heh
I think a regex to match the HTML spec should be relatively simple, and matching it exactly is ideal 👍
Oh right, there's numbers beyond i64! heh I think a regex to match the HTML spec should be relatively simple, and matching it exactly is ideal 👍
Cyborus commented 2026-01-10 20:07:42 +01:00
Author
Member
Copy link
Preview showing the regex working: https://regex101.com/r/oez1CU/1
Preview showing the regex working: https://regex101.com/r/oez1CU/1
Cyborus marked this conversation as resolved
Show resolved Hide resolved
| | | | @ -0,0 +326,4 @@ |
| | | | | ); |
| | | | | } |
| | | | | if let Some(regex_str) = &validations.regex { |
| | | | | let regex = regex::Regex::new(regex_str).wrap_err("invalid regex")?; |
LordMZTE commented 2026-01-10 18:41:28 +01:00
Collaborator
Copy link
This is probably no big deal, but the regex crate isn't completely compatible with the
JavaScript-flavoured regex that upstream uses. We may get some false-positives here with advanced
regular expressions.
This is probably no big deal, but the regex crate isn't completely compatible with the JavaScript-flavoured regex that upstream uses. We may get some false-positives here with advanced regular expressions.
Cyborus commented 2026-01-10 19:03:08 +01:00
Author
Member
Copy link
Is there a regex library that is compatible?
Is there a regex library that is compatible?
LordMZTE commented 2026-01-10 19:07:17 +01:00
Collaborator
Copy link
Not that I'm aware of, but it should be easy enough to search. However, we probably shouldn't use a niche library as Regex is pretty complicated and I think it'd be good to have something that's well-tested. It's probably best to just keep it this way, I just figured I should note this.
Not that I'm aware of, but it should be easy enough to search. However, we probably shouldn't use a niche library as Regex is pretty complicated and I think it'd be good to have something that's well-tested. It's probably best to just keep it this way, I just figured I should note this.
👍 1
Cyborus marked this conversation as resolved
src/issues/template/yaml.rs Outdated
Show resolved Hide resolved
| | | | @ -0,0 +568,4 @@ |
| | | | | parent: &'a comrak::nodes::AstNode<'a>, |
| | | | | md: &str, |
| | | | | ) { |
| | | | | let parsed = comrak::parse_document(arena, md, &*MD_OPTIONS); |
LordMZTE commented 2026-01-10 18:41:50 +01:00
Collaborator
Copy link
Any particular reason we parse and then re-render the document instead of using NodeValue::Raw to
use it unchanged?
Any particular reason we parse and then re-render the document instead of using NodeValue::Raw to use it unchanged?
Cyborus commented 2026-01-10 19:09:02 +01:00
Author
Member
Copy link
I did that as I wanted to be totally sure it parsed the same way before and after the user edits the form.
I had done that before I wrote the validation code; now that I have, I'm pretty sure it wouldn't be a problem. The template item is also parsed in the validation, so there won't be any differences in markdown settings between the template and the form.
... that was kinda confusing. Raw should be fine.
I did that as I wanted to be totally sure it parsed the same way before and after the user edits the form. I had done that before I wrote the validation code; now that I have, I'm pretty sure it wouldn't be a problem. The template item is also parsed in the validation, so there won't be any differences in markdown settings between the template and the form. ... that was kinda confusing. Raw should be fine.
LordMZTE commented 2026-01-10 19:38:40 +01:00
Collaborator
Copy link
Oh yea, that entire problem of the tokens having to match on validation didn't even occur to me an hour ago. Thanks for the explanation!
Oh yea, that entire problem of the tokens having to match on validation didn't even occur to me an hour ago. Thanks for the explanation!
👍 1
Cyborus marked this conversation as resolved
LordMZTE referenced this pull request 2026-01-10 19:36:20 +01:00
Better UI for fj pr create #244
Cyborus added 4 commits 2026-01-10 20:07:07 +01:00
docs: add comment explaining blank_issues_enabled f20e6fa901
chore: use .first_child() instead of .children().next() 093f0efaaa
fix(template): validate numbers using regex e6c9e3caba
fix(template): support markdown templates without front matter
All checks were successful
ci/woodpecker/pr/check Pipeline was successful
Cyborus added 1 commit 2026-01-10 20:13:04 +01:00
feat(template): support ref field
All checks were successful
ci/woodpecker/pr/check Pipeline was successful
LordMZTE requested changes 2026-01-10 21:54:15 +01:00
| | | | @ -0,0 +320,4 @@ |
| | | | | } |
| | | | | if validations.is_number { |
| | | | | let regex_s = r#"^-?[0-9]+(?:\.[0-9]+)?(?:(?:e|E)(?:-|\+)?[0-9]+)?$"#; |
| | | | | let regex = |
LordMZTE commented 2026-01-10 21:54:10 +01:00
Collaborator
Copy link
We should create this regex at the beginning at this function as regex compilation is expensive and we may run this code multiple times.
We should create this regex at the beginning at this function as regex compilation is expensive and we may run this code multiple times.
👍 1
LordMZTE commented 2026-01-12 10:13:15 +01:00
Collaborator
Copy link
On second thought, it'd probably be best to avoid regex compilation entirely if we have no field with number validation. We could lazily initialize the regex the first time we find a field with number validation and then re-use that.
On second thought, it'd probably be best to avoid regex compilation entirely if we have no field with number validation. We could lazily initialize the regex the first time we find a field with number validation and then re-use that.
Cyborus commented 2026-01-12 14:35:32 +01:00
Author
Member
Copy link
I already committed a change that does exactly that, just haven't pushed it yet.
I already committed a change that does exactly that, just haven't pushed it yet.
LordMZTE reviewed 2026-01-10 21:54:57 +01:00
| | | | @ -0,0 +88,4 @@ |
| | | | | body: Option<String>, |
| | | | | template_file: Vec<u8>, |
| | | | | is_yaml: bool, |
| | | | | ) -> eyre::Result<(String, Option<String>, Option<Vec<i64>>)> { |
LordMZTE commented 2026-01-10 21:54:57 +01:00
Collaborator
Copy link
I think the tuple type is getting a bit long here. We should consider extracting it into a struct.
I think the tuple type is getting a bit long here. We should consider extracting it into a struct.
👍 1
Cyborus added 4 commits 2026-01-12 18:05:39 +01:00
refactor: only compile number regex once e2626f122e
refactor: simplify generate_from_template return type... 300490719e
`metadata_from_template` was also renamed to `generate_from_template`
fix(template): use repo_get_issue_templates to check if templates are enabled... 8dca927b6e
Previously it was mistakenly working on the assumption that
`repo_get_issue_config` returned `None` if there were no issue
templates. It now uses `repo_get_issue_templates`, which does act that
way.
feat(issue): templates command...
All checks were successful
ci/woodpecker/pr/check Pipeline was successful
Adds `fj issue templates`, which lists the available issue templates in
a repo.
Cyborus requested review from LordMZTE 2026-01-12 18:06:01 +01:00
LordMZTE commented 2026-01-12 21:03:35 +01:00
Collaborator
Copy link
Testing this template from your test repo on my git instance, I get a giant panic from comrak:
#Command & verbose panic w/ backtrace
$ RUST_BACKTRACE=full ~/dev/forgejo-cli/target/debug/fj issue create test1 --template forgejo-bug-report-ui
thread 'main' (751251) panicked at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/comrak-0.37.0/src/cm.rs:31:9:
The document to format is ill-formed: InvalidChildType { parent: Node { data: RefCell { value: Ast { value: Document, sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 180 } }, internal_offset: 0, content: "**NOTE: If your issue is a security concern, please email <[email protected]> ([security.txt](https://forgejo.org/.well-known/security.txt)) instead of opening a public issue.**\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Strong, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 180 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Text("NOTE: If your issue is a security concern, please email "), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 3 }, end: LineColumn { line: 1, column: 58 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Link(NodeLink { url: "mailto:[email protected]", title: "" }), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 59 }, end: LineColumn { line: 1, column: 80 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Text("[email protected]"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 60 }, end: LineColumn { line: 1, column: 79 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Text(" ("), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 81 }, end: LineColumn { line: 1, column: 82 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Link(NodeLink { url: "https://forgejo.org/.well-known/security.txt", title: "" }), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 83 }, end: LineColumn { line: 1, column: 142 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Text("security.txt"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 84 }, end: LineColumn { line: 1, column: 95 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Text(") instead of opening a public issue."), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 143 }, end: LineColumn { line: 1, column: 178 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }, Node { data: RefCell { value: Ast { value: List(NodeList { list_type: Bullet, marker_offset: 0, padding: 2, start: 1, delimiter: Period, bullet_char: 45, tight: true, is_task_list: false }), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 4, column: 141 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Item(NodeList { list_type: Bullet, marker_offset: 0, padding: 2, start: 1, delimiter: Period, bullet_char: 45, tight: false, is_task_list: false }), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 84 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 3 }, end: LineColumn { line: 1, column: 84 } }, internal_offset: 0, content: "Please speak English, as this is the language all maintainers can speak and write.\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [2] } }, children: [Node { data: RefCell { value: Ast { value: Text("Please speak English, as this is the language all maintainers can speak and write."), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 3 }, end: LineColumn { line: 1, column: 84 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }, Node { data: RefCell { value: Ast { value: Item(NodeList { list_type: Bullet, marker_offset: 0, padding: 2, start: 1, delimiter: Period, bullet_char: 45, tight: false, is_task_list: false }), sourcepos: Sourcepos { start: LineColumn { line: 2, column: 1 }, end: LineColumn { line: 2, column: 102 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 2, column: 3 }, end: LineColumn { line: 2, column: 102 } }, internal_offset: 0, content: "Be as clear and concise as possible. A very verbose report is harder to interpret in a concrete way.\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [2] } }, children: [Node { data: RefCell { value: Ast { value: Text("Be as clear and concise as possible. A very verbose report is harder to interpret in a concrete way."), sourcepos: Sourcepos { start: LineColumn { line: 2, column: 3 }, end: LineColumn { line: 2, column: 102 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }, Node { data: RefCell { value: Ast { value: Item(NodeList { list_type: Bullet, marker_offset: 0, padding: 2, start: 1, delimiter: Period, bullet_char: 45, tight: false, is_task_list: false }), sourcepos: Sourcepos { start: LineColumn { line: 3, column: 1 }, end: LineColumn { line: 3, column: 99 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 3, column: 3 }, end: LineColumn { line: 3, column: 99 } }, internal_offset: 0, content: "Be civil, and follow the [Forgejo Code of Conduct](https://codeberg.org/forgejo/code-of-conduct).\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [2] } }, children: [Node { data: RefCell { value: Ast { value: Text("Be civil, and follow the "), sourcepos: Sourcepos { start: LineColumn { line: 3, column: 3 }, end: LineColumn { line: 3, column: 27 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Link(NodeLink { url: "https://codeberg.org/forgejo/code-of-conduct", title: "" }), sourcepos: Sourcepos { start: LineColumn { line: 3, column: 28 }, end: LineColumn { line: 3, column: 98 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Text("Forgejo Code of Conduct"), sourcepos: Sourcepos { start: LineColumn { line: 3, column: 29 }, end: LineColumn { line: 3, column: 51 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Text("."), sourcepos: Sourcepos { start: LineColumn { line: 3, column: 99 }, end: LineColumn { line: 3, column: 99 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }, Node { data: RefCell { value: Ast { value: Item(NodeList { list_type: Bullet, marker_offset: 0, padding: 2, start: 1, delimiter: Period, bullet_char: 45, tight: false, is_task_list: false }), sourcepos: Sourcepos { start: LineColumn { line: 4, column: 1 }, end: LineColumn { line: 4, column: 141 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 4, column: 3 }, end: LineColumn { line: 4, column: 141 } }, internal_offset: 0, content: "Take a moment to [check that your issue hasn't been reported before](https://codeberg.org/forgejo/forgejo/issues?q=&type=all&labels=78137).\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [2] } }, children: [Node { data: RefCell { value: Ast { value: Text("Take a moment to "), sourcepos: Sourcepos { start: LineColumn { line: 4, column: 3 }, end: LineColumn { line: 4, column: 19 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Link(NodeLink { url: "https://codeberg.org/forgejo/forgejo/issues?q=&type=all&labels=78137", title: "" }), sourcepos: Sourcepos { start: LineColumn { line: 4, column: 20 }, end: LineColumn { line: 4, column: 140 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Text("check that your issue hasn't been reported before"), sourcepos: Sourcepos { start: LineColumn { line: 4, column: 21 }, end: LineColumn { line: 4, column: 69 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Text("."), sourcepos: Sourcepos { start: LineColumn { line: 4, column: 141 }, end: LineColumn { line: 4, column: 141 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }] }, Node { data: RefCell { value: Ast { value: Heading(NodeHeading { level: 3, setext: false }), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Raw("Can you reproduce the bug on the Forgejo test instance?"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 3, column: 58 } }, internal_offset: 0, content: "Please try reproducing your issue at https://dev.next.forgejo.org.\nIt is running the latest development branch and will confirm the problem is not already fixed.\nIf you can reproduce it, provide a URL in the description.\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0, 0, 0] } }, children: [Node { data: RefCell { value: Ast { value: Text("Please try reproducing your issue at https://dev.next.forgejo.org."), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 66 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: SoftBreak, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 67 }, end: LineColumn { line: 1, column: 67 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Text("It is running the latest development branch and will confirm the problem is not already fixed."), sourcepos: Sourcepos { start: LineColumn { line: 2, column: 1 }, end: LineColumn { line: 2, column: 94 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: SoftBreak, sourcepos: Sourcepos { start: LineColumn { line: 2, column: 95 }, end: LineColumn { line: 2, column: 95 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Text("If you can reproduce it, provide a URL in the description."), sourcepos: Sourcepos { start: LineColumn { line: 3, column: 1 }, end: LineColumn { line: 3, column: 58 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Raw("Must select exactly one option.\n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: List(NodeList { list_type: Bullet, marker_offset: 0, padding: 0, start: 0, delimiter: Period, bullet_char: 0, tight: true, is_task_list: false }), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: TaskItem(None), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 37 } }, internal_offset: 0, content: "Yes, I've linked the repository below\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Text("Yes, I've linked the repository below"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 37 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }, Node { data: RefCell { value: Ast { value: TaskItem(None), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 54 } }, internal_offset: 0, content: "No, I've tried it and the problem is not present there\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Text("No, I've tried it and the problem is not present there"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 54 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }, Node { data: RefCell { value: Ast { value: TaskItem(None), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 55 } }, internal_offset: 0, content: "No, I can't try it on the test instance for some reason\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Text("No, I can't try it on the test instance for some reason"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 55 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }] }, Node { data: RefCell { value: Ast { value: Heading(NodeHeading { level: 3, setext: false }), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Raw("Description"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 2, column: 82 } }, internal_offset: 0, content: "Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see above).\nIf you think this is a JavaScript error, include a copy of the JavaScript console.\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0, 0] } }, children: [Node { data: RefCell { value: Ast { value: Text("Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see above)."), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 112 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: SoftBreak, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 113 }, end: LineColumn { line: 1, column: 113 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Text("If you think this is a JavaScript error, include a copy of the JavaScript console."), sourcepos: Sourcepos { start: LineColumn { line: 2, column: 1 }, end: LineColumn { line: 2, column: 82 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Raw("Required.\n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Raw(" ~~~~~markdown\n\n~~~~~ \n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Heading(NodeHeading { level: 3, setext: false }), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Raw("Screenshots"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 57 } }, internal_offset: 0, content: "Please provide at least one screenshot showing the issue.\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Text("Please provide at least one screenshot showing the issue."), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 57 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Raw("Required.\n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Raw(" ~~~~~markdown\n\n~~~~~ \n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Heading(NodeHeading { level: 3, setext: false }), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Raw("Forgejo Version"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 62 } }, internal_offset: 0, content: "Forgejo version (or commit reference) your instance is running\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Text("Forgejo version (or commit reference) your instance is running"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 62 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: BlockQuote, sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Heading(NodeHeading { level: 3, setext: false }), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Raw("Browser Version"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 60 } }, internal_offset: 0, content: "The browser and version that you are using to access Forgejo\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Text("The browser and version that you are using to access Forgejo"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 60 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Raw("Required.\n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: BlockQuote, sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, child: Node { data: RefCell { value: Ast { value: Raw("Required.\n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] } }
stack backtrace:
0: 0x55d38e28e99c - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::h5a7965721e20362f
1: 0x55d38e2ca1df - core::fmt::write::hb2be3bc45c2132e7
2: 0x55d38e2a769d - std::io::Write::write_fmt::hefe7258ac2f8f77a
3: 0x55d38e28b2b3 - std::sys::backtrace::BacktraceLock::print::hf8c144f475d7afb9
4: 0x55d38e2a3099 - std::panicking::default_hook::{{closure}}::h20495c8c5cc77186
5: 0x55d38e2a2f79 - std::panicking::default_hook::h26df0833967641ff
6: 0x55d38e2a3301 - std::panicking::panic_with_hook::h88667df88367c84a
7: 0x55d38e28c34a - std::panicking::panic_handler::{{closure}}::hc49779adfcdeb73f
8: 0x55d38e28b3c9 - std::sys::backtrace::__rust_end_short_backtrace::ha021440587b8be26
9: 0x55d38e29f58d - __rustc[bd3b3f48d2381c32]::rust_begin_unwind
10: 0x55d38d1129d0 - core::panicking::panic_fmt::h4594a04b5e6b3550
11: 0x55d38da88da8 - comrak::cm::format_document::{{closure}}::h6c0b9a1b5525b20e
at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/comrak-0.37.0/src/cm.rs:31:9
12: 0x55d38da9e0b0 - core::result::Result<T,E>::unwrap_or_else::hae962798a965497a
at /build/rustc-1.91.1-src/library/core/src/result.rs:1615:23
13: 0x55d38da88d15 - comrak::cm::format_document::hb176c4a6b49ffba5
at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/comrak-0.37.0/src/cm.rs:30:21
14: 0x55d38d21d49f - fj::issues::template::yaml::YamlTemplate::generate_form::h310fdfb7db78b6da
at /home/lordmzte/dev/forgejo-cli/src/issues/template/yaml.rs:208:9
15: 0x55d38d153b85 - fj::issues::template::generate_from_template::{{closure}}::h2153b6e13a633b9c
at /home/lordmzte/dev/forgejo-cli/src/issues/template.rs:95:37
16: 0x55d38d285751 - fj::issues::create_issue::{{closure}}::he72b7431174da66f
at /home/lordmzte/dev/forgejo-cli/src/issues.rs:362:26
17: 0x55d38d2810e7 - fj::issues::IssueCommand::run::{{closure}}::h52d501e8dc3f2a65
at /home/lordmzte/dev/forgejo-cli/src/issues.rs:225:18
18: 0x55d38d134d55 - fj::Command::run::{{closure}}::hb36980e7d6ba06fe
at /home/lordmzte/dev/forgejo-cli/src/main.rs:67:75
19: 0x55d38d13259a - fj::main::{{closure}}::h6ca1f54d732f04be
at /home/lordmzte/dev/forgejo-cli/src/main.rs:90:63
20: 0x55d38d3aa95d - <core::pin::Pin<P> as core::future::future::Future>::poll::hde28fd56eecb3bd0
at /build/rustc-1.91.1-src/library/core/src/future/future.rs:133:9
21: 0x55d38d363e2d - tokio::runtime::park::CachedParkThread::block_on::{{closure}}::hf13fd64c47695d31
at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/park.rs:284:71
22: 0x55d38d36372f - tokio::task::coop::with_budget::h6990c5ac2a0755da
at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/task/coop/mod.rs:167:5
23: 0x55d38d36372f - tokio::task::coop::budget::h283c7e64cb5029f0
at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/task/coop/mod.rs:133:5
24: 0x55d38d36372f - tokio::runtime::park::CachedParkThread::block_on::h79c6a7f446cebc8f
at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/park.rs:284:31
25: 0x55d38d28dee0 - tokio::runtime::context::blocking::BlockingRegionGuard::block_on::hd67c6d0f0e6148f6
at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/context/blocking.rs:66:14
26: 0x55d38d4484ee - tokio::runtime::scheduler::multi_thread::MultiThread::block_on::{{closure}}::hd07ac831d466189c
at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/scheduler/multi_thread/mod.rs:87:22
27: 0x55d38d52ea9a - tokio::runtime::context::runtime::enter_runtime::he13d99d16a62a4c1
at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/context/runtime.rs:65:16
28: 0x55d38d448381 - tokio::runtime::scheduler::multi_thread::MultiThread::block_on::h00f45af217a8690f
at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/scheduler/multi_thread/mod.rs:86:9
29: 0x55d38d2dbba0 - tokio::runtime::runtime::Runtime::block_on_inner::h53a183f715d3749f
at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/runtime.rs:370:50
30: 0x55d38d2dbec0 - tokio::runtime::runtime::Runtime::block_on::hed4e079a48b4fc71
at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/runtime.rs:340:18
31: 0x55d38d2b919d - fj::main::h0336b7ddcf65c263
at /home/lordmzte/dev/forgejo-cli/src/main.rs:94:7
32: 0x55d38d4d584b - core::ops::function::FnOnce::call_once::h821e1cb1696823f7
at /build/rustc-1.91.1-src/library/core/src/ops/function.rs:250:5
33: 0x55d38d52e3ed - std::sys::backtrace::__rust_begin_short_backtrace::hfa21212b2240d4e1
at /build/rustc-1.91.1-src/library/std/src/sys/backtrace.rs:158:18
34: 0x55d38d3dc0e1 - std::rt::lang_start::{{closure}}::hf58077bdec128660
at /build/rustc-1.91.1-src/library/std/src/rt.rs:206:18
35: 0x55d38e2a0a85 - std::rt::lang_start_internal::he65b8a7486903d75
36: 0x55d38d3dc0c7 - std::rt::lang_start::h1bbe9cf198bc96d1
at /build/rustc-1.91.1-src/library/std/src/rt.rs:205:5
37: 0x55d38d2bd76e - main
38: 0x7fc4aac2a4d8 - __libc_start_call_main
39: 0x7fc4aac2a59b - __libc_start_main_alias_1
40: 0x55d38d112ba5 - _start
41: 0x0 - <unknown>
This happens immediately after running the command, my editor isn't opened.
Testing this template from your test repo on my git instance, I get a giant panic from comrak: <details> <summary>Command & verbose panic w/ backtrace </summary> $ RUST_BACKTRACE=full ~/dev/forgejo-cli/target/debug/fj issue create test1 --template forgejo-bug-report-ui thread 'main' (751251) panicked at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/comrak-0.37.0/src/cm.rs:31:9: The document to format is ill-formed: InvalidChildType { parent: Node { data: RefCell { value: Ast { value: Document, sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 180 } }, internal_offset: 0, content: "**NOTE: If your issue is a security concern, please email \<[email protected]\> ([security.txt](https://forgejo.org/.well-known/security.txt)) instead of opening a public issue.**\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Strong, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 180 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Text("NOTE: If your issue is a security concern, please email "), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 3 }, end: LineColumn { line: 1, column: 58 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Link(NodeLink { url: "mailto:[email protected]", title: "" }), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 59 }, end: LineColumn { line: 1, column: 80 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Text("[email protected]"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 60 }, end: LineColumn { line: 1, column: 79 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Text(" ("), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 81 }, end: LineColumn { line: 1, column: 82 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Link(NodeLink { url: "https://forgejo.org/.well-known/security.txt", title: "" }), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 83 }, end: LineColumn { line: 1, column: 142 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Text("security.txt"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 84 }, end: LineColumn { line: 1, column: 95 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Text(") instead of opening a public issue."), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 143 }, end: LineColumn { line: 1, column: 178 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }, Node { data: RefCell { value: Ast { value: List(NodeList { list_type: Bullet, marker_offset: 0, padding: 2, start: 1, delimiter: Period, bullet_char: 45, tight: true, is_task_list: false }), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 4, column: 141 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Item(NodeList { list_type: Bullet, marker_offset: 0, padding: 2, start: 1, delimiter: Period, bullet_char: 45, tight: false, is_task_list: false }), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 84 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 3 }, end: LineColumn { line: 1, column: 84 } }, internal_offset: 0, content: "Please speak English, as this is the language all maintainers can speak and write.\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [2] } }, children: [Node { data: RefCell { value: Ast { value: Text("Please speak English, as this is the language all maintainers can speak and write."), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 3 }, end: LineColumn { line: 1, column: 84 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }, Node { data: RefCell { value: Ast { value: Item(NodeList { list_type: Bullet, marker_offset: 0, padding: 2, start: 1, delimiter: Period, bullet_char: 45, tight: false, is_task_list: false }), sourcepos: Sourcepos { start: LineColumn { line: 2, column: 1 }, end: LineColumn { line: 2, column: 102 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 2, column: 3 }, end: LineColumn { line: 2, column: 102 } }, internal_offset: 0, content: "Be as clear and concise as possible. A very verbose report is harder to interpret in a concrete way.\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [2] } }, children: [Node { data: RefCell { value: Ast { value: Text("Be as clear and concise as possible. A very verbose report is harder to interpret in a concrete way."), sourcepos: Sourcepos { start: LineColumn { line: 2, column: 3 }, end: LineColumn { line: 2, column: 102 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }, Node { data: RefCell { value: Ast { value: Item(NodeList { list_type: Bullet, marker_offset: 0, padding: 2, start: 1, delimiter: Period, bullet_char: 45, tight: false, is_task_list: false }), sourcepos: Sourcepos { start: LineColumn { line: 3, column: 1 }, end: LineColumn { line: 3, column: 99 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 3, column: 3 }, end: LineColumn { line: 3, column: 99 } }, internal_offset: 0, content: "Be civil, and follow the [Forgejo Code of Conduct](https://codeberg.org/forgejo/code-of-conduct).\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [2] } }, children: [Node { data: RefCell { value: Ast { value: Text("Be civil, and follow the "), sourcepos: Sourcepos { start: LineColumn { line: 3, column: 3 }, end: LineColumn { line: 3, column: 27 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Link(NodeLink { url: "https://codeberg.org/forgejo/code-of-conduct", title: "" }), sourcepos: Sourcepos { start: LineColumn { line: 3, column: 28 }, end: LineColumn { line: 3, column: 98 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Text("Forgejo Code of Conduct"), sourcepos: Sourcepos { start: LineColumn { line: 3, column: 29 }, end: LineColumn { line: 3, column: 51 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Text("."), sourcepos: Sourcepos { start: LineColumn { line: 3, column: 99 }, end: LineColumn { line: 3, column: 99 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }, Node { data: RefCell { value: Ast { value: Item(NodeList { list_type: Bullet, marker_offset: 0, padding: 2, start: 1, delimiter: Period, bullet_char: 45, tight: false, is_task_list: false }), sourcepos: Sourcepos { start: LineColumn { line: 4, column: 1 }, end: LineColumn { line: 4, column: 141 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 4, column: 3 }, end: LineColumn { line: 4, column: 141 } }, internal_offset: 0, content: "Take a moment to [check that your issue hasn't been reported before](https://codeberg.org/forgejo/forgejo/issues?q=&type=all&labels=78137).\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [2] } }, children: [Node { data: RefCell { value: Ast { value: Text("Take a moment to "), sourcepos: Sourcepos { start: LineColumn { line: 4, column: 3 }, end: LineColumn { line: 4, column: 19 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Link(NodeLink { url: "https://codeberg.org/forgejo/forgejo/issues?q=&type=all&labels=78137", title: "" }), sourcepos: Sourcepos { start: LineColumn { line: 4, column: 20 }, end: LineColumn { line: 4, column: 140 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Text("check that your issue hasn't been reported before"), sourcepos: Sourcepos { start: LineColumn { line: 4, column: 21 }, end: LineColumn { line: 4, column: 69 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Text("."), sourcepos: Sourcepos { start: LineColumn { line: 4, column: 141 }, end: LineColumn { line: 4, column: 141 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }] }, Node { data: RefCell { value: Ast { value: Heading(NodeHeading { level: 3, setext: false }), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Raw("Can you reproduce the bug on the Forgejo test instance?"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 3, column: 58 } }, internal_offset: 0, content: "Please try reproducing your issue at https://dev.next.forgejo.org.\nIt is running the latest development branch and will confirm the problem is not already fixed.\nIf you can reproduce it, provide a URL in the description.\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0, 0, 0] } }, children: [Node { data: RefCell { value: Ast { value: Text("Please try reproducing your issue at https://dev.next.forgejo.org."), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 66 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: SoftBreak, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 67 }, end: LineColumn { line: 1, column: 67 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Text("It is running the latest development branch and will confirm the problem is not already fixed."), sourcepos: Sourcepos { start: LineColumn { line: 2, column: 1 }, end: LineColumn { line: 2, column: 94 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: SoftBreak, sourcepos: Sourcepos { start: LineColumn { line: 2, column: 95 }, end: LineColumn { line: 2, column: 95 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Text("If you can reproduce it, provide a URL in the description."), sourcepos: Sourcepos { start: LineColumn { line: 3, column: 1 }, end: LineColumn { line: 3, column: 58 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Raw("Must select exactly one option.\n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: List(NodeList { list_type: Bullet, marker_offset: 0, padding: 0, start: 0, delimiter: Period, bullet_char: 0, tight: true, is_task_list: false }), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: TaskItem(None), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 37 } }, internal_offset: 0, content: "Yes, I've linked the repository below\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Text("Yes, I've linked the repository below"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 37 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }, Node { data: RefCell { value: Ast { value: TaskItem(None), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 54 } }, internal_offset: 0, content: "No, I've tried it and the problem is not present there\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Text("No, I've tried it and the problem is not present there"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 54 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }, Node { data: RefCell { value: Ast { value: TaskItem(None), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 55 } }, internal_offset: 0, content: "No, I can't try it on the test instance for some reason\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Text("No, I can't try it on the test instance for some reason"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 55 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }] }] }, Node { data: RefCell { value: Ast { value: Heading(NodeHeading { level: 3, setext: false }), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Raw("Description"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 2, column: 82 } }, internal_offset: 0, content: "Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see above).\nIf you think this is a JavaScript error, include a copy of the JavaScript console.\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0, 0] } }, children: [Node { data: RefCell { value: Ast { value: Text("Please provide a description of your issue here, with a URL if you were able to reproduce the issue (see above)."), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 112 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: SoftBreak, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 113 }, end: LineColumn { line: 1, column: 113 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Text("If you think this is a JavaScript error, include a copy of the JavaScript console."), sourcepos: Sourcepos { start: LineColumn { line: 2, column: 1 }, end: LineColumn { line: 2, column: 82 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Raw("Required.\n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Raw(" ~~~~~markdown\n\n~~~~~ \n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Heading(NodeHeading { level: 3, setext: false }), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Raw("Screenshots"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 57 } }, internal_offset: 0, content: "Please provide at least one screenshot showing the issue.\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Text("Please provide at least one screenshot showing the issue."), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 57 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Raw("Required.\n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Raw(" ~~~~~markdown\n\n~~~~~ \n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Heading(NodeHeading { level: 3, setext: false }), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Raw("Forgejo Version"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 62 } }, internal_offset: 0, content: "Forgejo version (or commit reference) your instance is running\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Text("Forgejo version (or commit reference) your instance is running"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 62 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: BlockQuote, sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: Heading(NodeHeading { level: 3, setext: false }), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [Node { data: RefCell { value: Ast { value: Raw("Browser Version"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Paragraph, sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 60 } }, internal_offset: 0, content: "The browser and version that you are using to access Forgejo\n", open: false, last_line_blank: false, table_visited: false, line_offsets: [0] } }, children: [Node { data: RefCell { value: Ast { value: Text("The browser and version that you are using to access Forgejo"), sourcepos: Sourcepos { start: LineColumn { line: 1, column: 1 }, end: LineColumn { line: 1, column: 60 } }, internal_offset: 0, content: "", open: false, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, Node { data: RefCell { value: Ast { value: Raw("Required.\n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }, Node { data: RefCell { value: Ast { value: BlockQuote, sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] }] }, child: Node { data: RefCell { value: Ast { value: Raw("Required.\n\n"), sourcepos: Sourcepos { start: LineColumn { line: 0, column: 0 }, end: LineColumn { line: 0, column: 0 } }, internal_offset: 0, content: "", open: true, last_line_blank: false, table_visited: false, line_offsets: [] } }, children: [] } } stack backtrace: 0: 0x55d38e28e99c - \<std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display\>::fmt::h5a7965721e20362f 1: 0x55d38e2ca1df - core::fmt::write::hb2be3bc45c2132e7 2: 0x55d38e2a769d - std::io::Write::write_fmt::hefe7258ac2f8f77a 3: 0x55d38e28b2b3 - std::sys::backtrace::BacktraceLock::print::hf8c144f475d7afb9 4: 0x55d38e2a3099 - std::panicking::default_hook::{{closure}}::h20495c8c5cc77186 5: 0x55d38e2a2f79 - std::panicking::default_hook::h26df0833967641ff 6: 0x55d38e2a3301 - std::panicking::panic_with_hook::h88667df88367c84a 7: 0x55d38e28c34a - std::panicking::panic_handler::{{closure}}::hc49779adfcdeb73f 8: 0x55d38e28b3c9 - std::sys::backtrace:: __rust_end_short_backtrace::ha021440587b8be26 9: 0x55d38e29f58d -__ rustc[bd3b3f48d2381c32]::rust_begin_unwind 10: 0x55d38d1129d0 - core::panicking::panic_fmt::h4594a04b5e6b3550 11: 0x55d38da88da8 - comrak::cm::format_document::{{closure}}::h6c0b9a1b5525b20e at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/comrak-0.37.0/src/cm.rs:31:9 12: 0x55d38da9e0b0 - core::result::Result\<T,E\>::unwrap_or_else::hae962798a965497a at /build/rustc-1.91.1-src/library/core/src/result.rs:1615:23 13: 0x55d38da88d15 - comrak::cm::format_document::hb176c4a6b49ffba5 at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/comrak-0.37.0/src/cm.rs:30:21 14: 0x55d38d21d49f - fj::issues::template::yaml::YamlTemplate::generate_form::h310fdfb7db78b6da at /home/lordmzte/dev/forgejo-cli/src/issues/template/yaml.rs:208:9 15: 0x55d38d153b85 - fj::issues::template::generate_from_template::{{closure}}::h2153b6e13a633b9c at /home/lordmzte/dev/forgejo-cli/src/issues/template.rs:95:37 16: 0x55d38d285751 - fj::issues::create_issue::{{closure}}::he72b7431174da66f at /home/lordmzte/dev/forgejo-cli/src/issues.rs:362:26 17: 0x55d38d2810e7 - fj::issues::IssueCommand::run::{{closure}}::h52d501e8dc3f2a65 at /home/lordmzte/dev/forgejo-cli/src/issues.rs:225:18 18: 0x55d38d134d55 - fj::Command::run::{{closure}}::hb36980e7d6ba06fe at /home/lordmzte/dev/forgejo-cli/src/main.rs:67:75 19: 0x55d38d13259a - fj::main::{{closure}}::h6ca1f54d732f04be at /home/lordmzte/dev/forgejo-cli/src/main.rs:90:63 20: 0x55d38d3aa95d - \<core::pin::Pin\<P\> as core::future::future::Future\>::poll::hde28fd56eecb3bd0 at /build/rustc-1.91.1-src/library/core/src/future/future.rs:133:9 21: 0x55d38d363e2d - tokio::runtime::park::CachedParkThread::block_on::{{closure}}::hf13fd64c47695d31 at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/park.rs:284:71 22: 0x55d38d36372f - tokio::task::coop::with_budget::h6990c5ac2a0755da at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/task/coop/mod.rs:167:5 23: 0x55d38d36372f - tokio::task::coop::budget::h283c7e64cb5029f0 at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/task/coop/mod.rs:133:5 24: 0x55d38d36372f - tokio::runtime::park::CachedParkThread::block_on::h79c6a7f446cebc8f at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/park.rs:284:31 25: 0x55d38d28dee0 - tokio::runtime::context::blocking::BlockingRegionGuard::block_on::hd67c6d0f0e6148f6 at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/context/blocking.rs:66:14 26: 0x55d38d4484ee - tokio::runtime::scheduler::multi_thread::MultiThread::block_on::{{closure}}::hd07ac831d466189c at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/scheduler/multi_thread/mod.rs:87:22 27: 0x55d38d52ea9a - tokio::runtime::context::runtime::enter_runtime::he13d99d16a62a4c1 at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/context/runtime.rs:65:16 28: 0x55d38d448381 - tokio::runtime::scheduler::multi_thread::MultiThread::block_on::h00f45af217a8690f at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/scheduler/multi_thread/mod.rs:86:9 29: 0x55d38d2dbba0 - tokio::runtime::runtime::Runtime::block_on_inner::h53a183f715d3749f at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/runtime.rs:370:50 30: 0x55d38d2dbec0 - tokio::runtime::runtime::Runtime::block_on::hed4e079a48b4fc71 at /home/lordmzte/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.44.1/src/runtime/runtime.rs:340:18 31: 0x55d38d2b919d - fj::main::h0336b7ddcf65c263 at /home/lordmzte/dev/forgejo-cli/src/main.rs:94:7 32: 0x55d38d4d584b - core::ops::function::FnOnce::call_once::h821e1cb1696823f7 at /build/rustc-1.91.1-src/library/core/src/ops/function.rs:250:5 33: 0x55d38d52e3ed - std::sys::backtrace:: __rust_begin_short_backtrace::hfa21212b2240d4e1 at /build/rustc-1.91.1-src/library/std/src/sys/backtrace.rs:158:18 34: 0x55d38d3dc0e1 - std::rt::lang_start::{{closure}}::hf58077bdec128660 at /build/rustc-1.91.1-src/library/std/src/rt.rs:206:18 35: 0x55d38e2a0a85 - std::rt::lang_start_internal::he65b8a7486903d75 36: 0x55d38d3dc0c7 - std::rt::lang_start::h1bbe9cf198bc96d1 at /build/rustc-1.91.1-src/library/std/src/rt.rs:205:5 37: 0x55d38d2bd76e - main 38: 0x7fc4aac2a4d8 -__ libc_start_call_main 39: 0x7fc4aac2a59b - __libc_start_main_alias_1 40: 0x55d38d112ba5 - _start 41: 0x0 - \<unknown\> </details> This happens immediately after running the command, my editor isn't opened.
Cyborus added 1 commit 2026-01-12 21:04:58 +01:00
Merge branch 'main' into issue-templates
All checks were successful
ci/woodpecker/pr/check Pipeline was successful
Cyborus commented 2026-01-12 22:01:28 +01:00
Author
Member
Copy link
It seems comrak isn't allowing a Raw node to be a child of the root Document node. I hadn't come across this because it only runs that validation in debug mode, and I've been running in release mode. I suspect it's an oversight, it's not that they specifically disallow it, but rather that there isn't a special case to allow it. I'll make a PR on comrak for that. This won't be an issue for users since they'll also be running a --release build.
It seems comrak isn't allowing a Raw node to be a child of the root Document node. I hadn't come across this because it only runs that validation in debug mode, and I've been running in release mode. I suspect it's an oversight, it's not that they specifically disallow it, but rather that there isn't a special case *to* allow it. I'll make a PR on comrak for that. This won't be an issue for users since they'll also be running a --release build.
Cyborus merged commit 75ad6c4c7c into main 2026-01-14 17:05:54 +01:00
Cyborus deleted branch issue-templates 2026-01-14 17:05:55 +01:00
Cyborus referenced this pull request from a commit 2026-01-14 17:05:55 +01:00 Merge pull request 'feat: issue & pr templates' (#261) from issue-templates into main
Cyborus referenced this pull request 2026-02-20 21:16:12 +01:00 Update Rust crate comrak to 0.50.0 #305
mrwsl commented 2026-05-05 07:52:41 +02:00
First-time contributor
Copy link
The title says mentions issues and PRs but I only see the --no-template option for issues. Is this an oversight or did I miss something?
The title says mentions issues and PRs but I only see the --no-template option for issues. Is this an oversight or did I miss something?
Cyborus commented 2026-05-05 17:36:09 +02:00
Author
Member
Copy link
yes, PRs don't have a --no-template option. This is for parity with the web UI, which also does not allow ignoring the PR template. Technically though it can still be skipped by setting the --body flag, useful for i.e. scripts.
If possible, could you take questions like this to the matrix chat in the future?
yes, PRs don't have a --no-template option. This is for parity with the web UI, which also does not allow ignoring the PR template. Technically though it can still be skipped by setting the --body flag, useful for i.e. scripts. If possible, could you take questions like this to the matrix chat in the future?
👍 1
Sign in to join this conversation.
Reviewers
No reviewers
Labels
Clear labels[ Kind/Breaking Breaking change that won't be backward compatible
](#)[ Kind/Bug Something is not working
](#)[ Kind/Design Discussion about UI/UX design
](#)[ Kind/Documentation Documentation changes
](#)[ Kind/Enhancement Improve existing functionality
](#)[ Kind/Feature New functionality
](#)[ Kind/Security This is security issue
](#)[ Kind/Testing Issue or pull request related to testing
](#)[ Kind/Upstream This is an issue with upstream software (Forgejo) that is probably not our fault
](#)
[ Priority
Critical The priority is critical
](#)[ Priority
High The priority is high
](#)[ Priority
Low The priority is low
](#)[ Priority
Medium The priority is medium
](#)
[ Reviewed
Confirmed Issue has been confirmed
](#)[ Reviewed
Duplicate This issue or pull request already exists
](#)[ Reviewed
Invalid Invalid issue
](#)[ Reviewed
Won't Fix This issue won't be fixed
](#)
[ Status
Abandoned Somebody has started to work on this but abandoned work
](#)[ Status
Blocked Something is blocking this issue or pull request
](#)[ Status
Need More Info Feedback is required to reproduce issue or to continue work
](#)
[ Suspicious
](#)
No labels Kind/Breaking Kind/Bug Kind/Design Kind/Documentation Kind/Enhancement Kind/Feature Kind/Security Kind/Testing Kind/Upstream [ Priority
Critical ](/forgejo-contrib/forgejo-cli/pulls?labels=173012) [ Priority
High ](/forgejo-contrib/forgejo-cli/pulls?labels=173013) [ Priority
Low ](/forgejo-contrib/forgejo-cli/pulls?labels=173015) [ Priority
Medium ](/forgejo-contrib/forgejo-cli/pulls?labels=173014) [ Reviewed
Confirmed ](/forgejo-contrib/forgejo-cli/pulls?labels=173007) [ Reviewed
Duplicate ](/forgejo-contrib/forgejo-cli/pulls?labels=173005) [ Reviewed
Invalid ](/forgejo-contrib/forgejo-cli/pulls?labels=173006) [ Reviewed
Won't Fix ](/forgejo-contrib/forgejo-cli/pulls?labels=173008) [ Status
Abandoned ](/forgejo-contrib/forgejo-cli/pulls?labels=173011) [ Status
Blocked ](/forgejo-contrib/forgejo-cli/pulls?labels=173010) [ Status
Need More Info ](/forgejo-contrib/forgejo-cli/pulls?labels=173009) Suspicious
Milestone
Clear milestone
No items
No milestone v0.4.0
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
Notifications Subscribe
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
forgejo-contrib/forgejo-cli!261
WritePreview
Loading…
Add table
| Rows | | | Columns | |
CancelOK
Add a link
Url Description Hint: With a URL in your clipboard, you can paste directly into the editor to create a link.
CancelOK
CancelSave
Reference in a new issue
Repository
forgejo-contrib/forgejo-cli
Title
Body
Create issue
No description provided.
Delete branch "issue-templates"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
No Yes