Back to Codeberg

feat: SSH and GPG key commands #241

forgejo-contrib-forgejo-cli-pulls-241.md

latest27.9 KB
Original Source

forgejo-contrib/forgejo-cli

Watch20

Star402

Fork

You've already forked forgejo-cli

51

CodeIssues 44Pull requests 8Releases 11Packages 2WikiActivity

feat: SSH and GPG key commands #241

Merged

Cyborusmerged 1 commit from LordMZTE/forgejo-cli:key-commands into main 2025-11-27 02:31:03 +01:00

Conversation 2Commits 1Files changed 2 +583 -1

LordMZTE commented 2025-11-23 14:50:18 +01:00

Collaborator

Copy link

This adds support for managing SSH and GPG keys.

This is marked as WIP for now because we first need to wait for a forgejo-api update.
See the comment at the bottom of user.rs for more info.

Closes #234

#Sample Output for SSH

text
$ fj -H codeberg.org user keys list
total keys: 5
 37270 lordmzte@mzte SHA256:VwY0sYXAQHfsbQPS1EURnaFTqqQ5UbvCgHOF0q72xkk
 40624 lordmzte@mzte-deck SHA256:GWA/eVJIhEUJNJB63xm9ssJl61+A6DgRZe/Qpkk41Kg
 42949 lordmzte@zephyarch SHA256:9TZctETMtmKDJTst8OBueyk64mOrW+s+emaB52ylG6E
 63043 lordmzte@mzte-fw SHA256:/3j46causzN6ujVcH3LiSup/2w0+efeU3NXVTMbL/Lw
179508 lordmzte@mzte-ef SHA256:KdSTAMu+YCLRUCDzI2QoXwbkrwzSTWFodBNYbYLMTa8
text
$ fj -H codeberg.org user key view 63043
Title: lordmzte@mzte-fw
Created At: 2025-02-12 19:01:14.0 +01:00:00
Type: user
Fingerprint: SHA256:/3j46causzN6ujVcH3LiSup/2w0+efeU3NXVTMbL/Lw

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO8TPm9SwC+OqZbS+MDiYHpO7RubBfZkmXokwRCUanDz lordmzte@mzte-fw
text
$ fj -H codeberg.org user key delete 42949
successfully deleted key with ID 42949
text
$ fj -H codeberg.org user key add
Guessed key file: /home/lordmzte/.ssh/id_ed25519.pub
Does this look good? [y/N]: y
Guessed title: lordmzte@mzte-ef
Does this look good? [y/N]: y
Key created successfully!

Title: lordmzte@mzte-ef
Created At: 2025-11-23 11:53:00.0 +01:00:00
Type: user
Fingerprint: SHA256:KdSTAMu+YCLRUCDzI2QoXwbkrwzSTWFodBNYbYLMTa8

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICEjc2J3rmKe7+Hs65Rl11s6iebs0z7BMFnHyf64zC2S lordmzte@mzte-ef
text
$ fj -H codeberg.org user key add ~/.ssh/id_ed25519
Error: '/home/lordmzte/.ssh/id_ed25519' looks like a private key or invalid data! If you want to proceed anyways, add --force.

Location:
    src/user.rs:1268:9

#Sample Output for GPG

text
$ fj -H codeberg.org user gpg list
total keys: 1
11884 B64802DC33A64FF6
text
$ fj -H codeberg user gpg view 11884
Key ID: B64802DC33A64FF6
Can Sign: true
Can Encrypt Comms: true
Can Encrypt Storage: true
Can Certify: true
Verified: true

xsDNBGH0QpABDADFs5L9c/VWcKIALrQRwD4zue3eEALG8HDlGvbN55QEjnXbjYdFPsdmfP2vJotez2sDDcNwcqraK492XXqe8BOmrrsQLZcP0QwZ0lXpGNlC/TC/Pwyy84IzJrsK0OAaV64oNBNj67KSQ0B36wxIQR7SgmY2bR9W8vn2H8bQ3O+UZjXxq2BZhSY6ViUraRNZStY6xIvAWS8YeRgXgy38F2XLQOJVmSnKeRSAtk0fPJ3FkbEBlvvbYOucVR73PuYhzo0H4ldPTkzoIWy1uJeuu4gKd/JcR21/dEGiCYKeeGYNxl422a2CL3KzM+m6t0HeCILNoK2dH2TJBPx/x7QDklOMyjsaw3TsX17Q3lnHzbQA1iOXSL+77ni25IfPOME16cLj5E9U2Ult6WjmxehKTmmo3CeD2SoSkLI6Ux+pyQBFFjnt1JoKCf+Pw0n+AKlACzEQD12mr9aMY5b1C1KRJDyLKWVBMvswjJr3MBE0KxwS8hQEse+efGNXPJGtnmEmnd8AEQEAAQ==

Subkey 11884:
    Key ID: C9921A9FFFB36629
    Can Sign: true
    Can Encrypt Comms: true
    Can Encrypt Storage: true
    Can Certify: true
    Verified: false

    zsDNBGH0QpABDADkjujCLyljg9tpyDkce7QH009duGt+iDuvhKXRgW6U+40wDlQ+h0kzyciRLekyV94NuHbtvNmfY1Z6G3VPYH6aK+m5Hg3vWqtI+FmUPzZDXQ62UC4ZXWUY85mPhnZ/kEBOY4pnJqwyMEODt62Pk7Wj28JBD0TGBRIvUvL6GmQKmoHhGaF/ZDO5HKRob7h40CtS3139KG7pZwBvMvNJgyaZH51o7ixR4urnLqSWSzyGHnl/prGuCPXA/uvVF/mkMAyZEhX1dNGnHFlTbtG9ImZqFAjCvurfHdpytRSP5ZZENJ8TBzO+i2gcrx0ODFcsb8mPZZsxqsO2oAhj5vXiXvzBF2hYV4Kow0zR+SMbTtlWoSzETAE7ytITNy5ah6RpTj/kt+mCox0ZaFER8scSwyGeaaiWZhL65pFTAMR4EVSQTB8GzYfzn1tg4wJ93jl2EARvb6y+exYCzniiKn7WT0DcljyUZjSVG8MqhmSmAk6T4RQS54F9tcvBpJ7B8Zn6NosAEQEAAQ==
text
$ fj -H codeberg.org user gpg delete 65874
Deleting a GPG key will cause all commits signed by that key to become unverified! Continue? [y/N]: y
Key with ID 65874 deleted successfully.
text
$ fj -H codeberg.org user gpg add test@test
Exporting key...
Fetching verification token...
Signing verification token with key 'test@test'...
gpg: using "test@test" as default secret key for signing
Key successfully added!

Key ID: 5AF56892199B0572
Can Sign: true
Can Encrypt Comms: true
Can Encrypt Storage: true
Can Certify: true
Verified: true

xsDNBGki97YBDADus4vDcc64JCYBfBUgWUHSWchNSgkDH5V8bTx6TvuP0WRJ0rlPNOfQ0XTiXOg7jZyKOu2fKLICrUnQo/J4CRuQoyC6/Va3jxBfdhk/EkwbWfNbkV/mTnjKx/n0cfHCAy2NzOlg9tOWzaZZ57lcijrfC4KAcN73s5naXHilmtE5JXMBDckhAQs7/fto8IhSXUQfA6wA0xrM+RTXSc3QPdJ1aqjUoMAwH9xyBAb2p6+zQMD5BjDz1flSAv9IMyDGGoRr9R6lqFuhTDVr7k/HT3RnZBSvBTmrPnq1JEz+2ZoKoCVHQM4HXDZzb02+Uip/JBBlQudFLIIZL9GLh5ICB79SJPmcNLkKf1Z4XXzQm6xrqR7Iz1TY/krC6vbXNxnALH4X34+VK8piIBAJK0WqGzpK076pFeAWi3lDDdZn4HDqHXCpc5ae5Xe+zXNsvomwVEWTzxk4M+SUScWfKsqo5rH/YQQsVlYYm03eW8UXoX7+HWd0x99gUXrQZ1rfXZeVWMsAEQEAAQ==

Subkey 65916:
    Key ID: 1131B27377353B4B
    Can Sign: true
    Can Encrypt Comms: true
    Can Encrypt Storage: true
    Can Certify: true
    Verified: false

    zsDNBGki97YBDADIMDihvM0UK2YhQu2Gu/KrPvGpZnijA2ibGL4iFcO9/CckVsFj129fisg7yVZwNfoXSyGJjOgTGtoL1df+TwjCrCTkD2iz2s9OAA/70b1CrzsTTYp9yp/TwuIzHesDoGXSmOERVbjQyP20ha3VeLF1IbCPj0zt9beGLseWRWSWUC7buutwx7tVqQN9Te5HVOk4by2NPbJgNZj1BjhpYrC9P2bG/qVGr/Rz1MESKvv17RWn7PVEMPxqPh/5VbELX4oTRU4AUFC+N3Y/HAeqG0+G1Gk98pfk1gB6EppmlfPFVVoW//8Z9CC5eWRMEZHqEqrNhGr1WuooSqYjMWvYBrI/6qSTTK6KGSOcuLaD24K4ihkLmWzvS6gXDZC0eitToMQw0OkFgubKBdtrJbIEryOSL4HYCC1tME57xvL+aB78mDAJtBXE3aee0pTLpOdcK+X+07way6fUk4Rl70/ySkmHvDWP81e0I2iFMtXY+bhLqpXWUyWBTA7RdMApVIpuqSEAEQEAAQ==

This adds support for managing SSH and GPG keys. This is marked as WIP for now because we first need to wait for a forgejo-api update. See the comment at the bottom of user.rs for more info. Closes #234 <details> <summary>Sample Output for SSH</summary> $ fj -H codeberg.org user keys list total keys: 5 37270 lordmzte@mzte SHA256:VwY0sYXAQHfsbQPS1EURnaFTqqQ5UbvCgHOF0q72xkk 40624 lordmzte@mzte-deck SHA256:GWA/eVJIhEUJNJB63xm9ssJl61+A6DgRZe/Qpkk41Kg 42949 lordmzte@zephyarch SHA256:9TZctETMtmKDJTst8OBueyk64mOrW+s+emaB52ylG6E 63043 lordmzte@mzte-fw SHA256:/3j46causzN6ujVcH3LiSup/2w0+efeU3NXVTMbL/Lw 179508 lordmzte@mzte-ef SHA256:KdSTAMu+YCLRUCDzI2QoXwbkrwzSTWFodBNYbYLMTa8 $ fj -H codeberg.org user key view 63043 Title: lordmzte@mzte-fw Created At: 2025-02-12 19:01:14.0 +01:00:00 Type: user Fingerprint: SHA256:/3j46causzN6ujVcH3LiSup/2w0+efeU3NXVTMbL/Lw ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO8TPm9SwC+OqZbS+MDiYHpO7RubBfZkmXokwRCUanDz lordmzte@mzte-fw $ fj -H codeberg.org user key delete 42949 successfully deleted key with ID 42949 $ fj -H codeberg.org user key add Guessed key file: /home/lordmzte/.ssh/id_ed25519.pub Does this look good? [y/N]: y Guessed title: lordmzte@mzte-ef Does this look good? [y/N]: y Key created successfully! Title: lordmzte@mzte-ef Created At: 2025-11-23 11:53:00.0 +01:00:00 Type: user Fingerprint: SHA256:KdSTAMu+YCLRUCDzI2QoXwbkrwzSTWFodBNYbYLMTa8 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICEjc2J3rmKe7+Hs65Rl11s6iebs0z7BMFnHyf64zC2S lordmzte@mzte-ef $ fj -H codeberg.org user key add ~/.ssh/id_ed25519 Error: '/home/lordmzte/.ssh/id_ed25519' looks like a private key or invalid data! If you want to proceed anyways, add --force. Location: src/user.rs:1268:9 </details> <details> <summary>Sample Output for GPG</summary> $ fj -H codeberg.org user gpg list total keys: 1 11884 B64802DC33A64FF6 $ fj -H codeberg user gpg view 11884 Key ID: B64802DC33A64FF6 Can Sign: true Can Encrypt Comms: true Can Encrypt Storage: true Can Certify: true Verified: true xsDNBGH0QpABDADFs5L9c/VWcKIALrQRwD4zue3eEALG8HDlGvbN55QEjnXbjYdFPsdmfP2vJotez2sDDcNwcqraK492XXqe8BOmrrsQLZcP0QwZ0lXpGNlC/TC/Pwyy84IzJrsK0OAaV64oNBNj67KSQ0B36wxIQR7SgmY2bR9W8vn2H8bQ3O+UZjXxq2BZhSY6ViUraRNZStY6xIvAWS8YeRgXgy38F2XLQOJVmSnKeRSAtk0fPJ3FkbEBlvvbYOucVR73PuYhzo0H4ldPTkzoIWy1uJeuu4gKd/JcR21/dEGiCYKeeGYNxl422a2CL3KzM+m6t0HeCILNoK2dH2TJBPx/x7QDklOMyjsaw3TsX17Q3lnHzbQA1iOXSL+77ni25IfPOME16cLj5E9U2Ult6WjmxehKTmmo3CeD2SoSkLI6Ux+pyQBFFjnt1JoKCf+Pw0n+AKlACzEQD12mr9aMY5b1C1KRJDyLKWVBMvswjJr3MBE0KxwS8hQEse+efGNXPJGtnmEmnd8AEQEAAQ== Subkey 11884: Key ID: C9921A9FFFB36629 Can Sign: true Can Encrypt Comms: true Can Encrypt Storage: true Can Certify: true Verified: false zsDNBGH0QpABDADkjujCLyljg9tpyDkce7QH009duGt+iDuvhKXRgW6U+40wDlQ+h0kzyciRLekyV94NuHbtvNmfY1Z6G3VPYH6aK+m5Hg3vWqtI+FmUPzZDXQ62UC4ZXWUY85mPhnZ/kEBOY4pnJqwyMEODt62Pk7Wj28JBD0TGBRIvUvL6GmQKmoHhGaF/ZDO5HKRob7h40CtS3139KG7pZwBvMvNJgyaZH51o7ixR4urnLqSWSzyGHnl/prGuCPXA/uvVF/mkMAyZEhX1dNGnHFlTbtG9ImZqFAjCvurfHdpytRSP5ZZENJ8TBzO+i2gcrx0ODFcsb8mPZZsxqsO2oAhj5vXiXvzBF2hYV4Kow0zR+SMbTtlWoSzETAE7ytITNy5ah6RpTj/kt+mCox0ZaFER8scSwyGeaaiWZhL65pFTAMR4EVSQTB8GzYfzn1tg4wJ93jl2EARvb6y+exYCzniiKn7WT0DcljyUZjSVG8MqhmSmAk6T4RQS54F9tcvBpJ7B8Zn6NosAEQEAAQ== $ fj -H codeberg.org user gpg delete 65874 Deleting a GPG key will cause all commits signed by that key to become unverified! Continue? [y/N]: y Key with ID 65874 deleted successfully. $ fj -H codeberg.org user gpg add test@test Exporting key... Fetching verification token... Signing verification token with key 'test@test'... gpg: using "test@test" as default secret key for signing Key successfully added! Key ID: 5AF56892199B0572 Can Sign: true Can Encrypt Comms: true Can Encrypt Storage: true Can Certify: true Verified: true xsDNBGki97YBDADus4vDcc64JCYBfBUgWUHSWchNSgkDH5V8bTx6TvuP0WRJ0rlPNOfQ0XTiXOg7jZyKOu2fKLICrUnQo/J4CRuQoyC6/Va3jxBfdhk/EkwbWfNbkV/mTnjKx/n0cfHCAy2NzOlg9tOWzaZZ57lcijrfC4KAcN73s5naXHilmtE5JXMBDckhAQs7/fto8IhSXUQfA6wA0xrM+RTXSc3QPdJ1aqjUoMAwH9xyBAb2p6+zQMD5BjDz1flSAv9IMyDGGoRr9R6lqFuhTDVr7k/HT3RnZBSvBTmrPnq1JEz+2ZoKoCVHQM4HXDZzb02+Uip/JBBlQudFLIIZL9GLh5ICB79SJPmcNLkKf1Z4XXzQm6xrqR7Iz1TY/krC6vbXNxnALH4X34+VK8piIBAJK0WqGzpK076pFeAWi3lDDdZn4HDqHXCpc5ae5Xe+zXNsvomwVEWTzxk4M+SUScWfKsqo5rH/YQQsVlYYm03eW8UXoX7+HWd0x99gUXrQZ1rfXZeVWMsAEQEAAQ== Subkey 65916: Key ID: 1131B27377353B4B Can Sign: true Can Encrypt Comms: true Can Encrypt Storage: true Can Certify: true Verified: false zsDNBGki97YBDADIMDihvM0UK2YhQu2Gu/KrPvGpZnijA2ibGL4iFcO9/CckVsFj129fisg7yVZwNfoXSyGJjOgTGtoL1df+TwjCrCTkD2iz2s9OAA/70b1CrzsTTYp9yp/TwuIzHesDoGXSmOERVbjQyP20ha3VeLF1IbCPj0zt9beGLseWRWSWUC7buutwx7tVqQN9Te5HVOk4by2NPbJgNZj1BjhpYrC9P2bG/qVGr/Rz1MESKvv17RWn7PVEMPxqPh/5VbELX4oTRU4AUFC+N3Y/HAeqG0+G1Gk98pfk1gB6EppmlfPFVVoW//8Z9CC5eWRMEZHqEqrNhGr1WuooSqYjMWvYBrI/6qSTTK6KGSOcuLaD24K4ihkLmWzvS6gXDZC0eitToMQw0OkFgubKBdtrJbIEryOSL4HYCC1tME57xvL+aB78mDAJtBXE3aee0pTLpOdcK+X+07way6fUk4Rl70/ySkmHvDWP81e0I2iFMtXY+bhLqpXWUyWBTA7RdMApVIpuqSEAEQEAAQ== </details>

Cyborus commented 2025-11-23 23:49:40 +01:00

Member

Copy link

Merged !242, you should be good to rebase for the updated verification endpoint now

Merged !242, you should be good to rebase for the updated verification endpoint now

LordMZTE force-pushed key-commands from a296cb2f9d

All checks were successful

ci/woodpecker/pr/check Pipeline was successful

Details

to 8c45b51a2d

All checks were successful

ci/woodpecker/pr/check Pipeline was successful

Details

2025-11-24 09:46:41 +01:00 Compare

LordMZTE changed title from ** WIP: feat: SSH and GPG key commands ** to feat: SSH and GPG key commands 2025-11-24 09:47:23 +01:00

Cyborus requested changes 2025-11-25 20:06:52 +01:00 Dismissed

src/main.rs Outdated

Show resolved Hide resolved

| | | | @ -105,6 +105,30 @@ async fn readline(msg: &str) -> eyre::Result<String> { | | | | | | .await? | | | | | | } | | | | | | | | | | | | async fn prompt_bool(msg: &str, default_answer: bool) -> eyre::Result<bool> { |

Cyborus commented 2025-11-25 18:35:40 +01:00

Member

Copy link

I've been wondering if more interactivity should be added, in addition to taking CLI args. I'd ideally want some solution that makes it automatic, based on the Args fields, and only enabled with an --interactive/-I flag.

You don't need to worry about of that right now, just larger scale thoughts I'm having. This works fine for this :)

I've been wondering if more interactivity should be added, in addition to taking CLI args. I'd ideally want some solution that makes it automatic, based on the Args fields, and only enabled with an --interactive/-I flag. You don't need to worry about of that right now, just larger scale thoughts I'm having. This works fine for this :)

LordMZTE marked this conversation as resolved

src/user.rs Outdated

Show resolved Hide resolved

| | | | @ -171,0 +198,4 @@ | | | | | | }, | | | | | | | | | | | | /// Add an SSH key | | | | | | Add { |

Cyborus commented 2025-11-25 19:36:23 +01:00

Member

Copy link

I feel upload is a more fitting name for this.

I feel upload is a more fitting name for this.

LordMZTE marked this conversation as resolved

src/user.rs Outdated

Show resolved Hide resolved

| | | | @ -171,0 +244,4 @@ | | | | | | /// Adds a new GPG key from your local keyring. | | | | | | /// This command requiresgpgto be installed. | | | | | | Add { | | | | | | /// The key to add. This can be anything the GPG CLI recognizes such as an EMail associated |

Cyborus commented 2025-11-25 19:38:37 +01:00

Member

Copy link

Is EMail intentional? I would guess not, since you wrote emails just a few lines later. Either way I think it'd be good to make them consistent.

Is EMail intentional? I would guess not, since you wrote emails just a few lines later. Either way I think it'd be good to make them consistent.

LordMZTE commented 2025-11-26 10:39:10 +01:00

Author

Collaborator

Copy link

Which one would you prefer? I've never really been certain about what the canonical capitalization of "email" is.

Which one would you prefer? I've never really been certain about what the canonical capitalization of "email" is.

Cyborus commented 2025-11-26 15:13:24 +01:00

Member

Copy link

I'll go with "email", since it wasn't as surprising to see. It's what I see most frequently

I'll go with "email", since it wasn't as surprising to see. It's what I see most frequently

LordMZTE marked this conversation as resolved

src/user.rs Outdated

Show resolved Hide resolved

| | | | @ -1001,0 +1122,4 @@ | | | | | | } = *crate::special_render(); | | | | | | | | | | | | let (forgejo_api::structs::PublicKeyListHeaders { x_total_count }, keys) = | | | | | | api.user_current_list_keys(Default::default()).await?; |

Cyborus commented 2025-11-25 18:42:57 +01:00

Member

Copy link

This should either:

  • have .all() right before the .await, i.e.
rust
api.user_current_list_keys(Default::default()).all().await?;

As it is currently it would only get the first 30 keys, which I would imagine is enough for most people, but best not to rely on that. .all() gets all of them.
or...

  • take a --page option, which is given to .page(...), and print the current page alongside the total count.

I prefer option 1. I doubt most people would have enough keys added to their account for it to matter.

This should either: - have .all() right before the .await, i.e. rust api.user_current_list_keys(Default::default()).all().await?; As it is currently it would only get the first 30 keys, which I *would* imagine is enough for most people, but best not to rely on that. .all() gets all of them. **or...** - take a --page option, which is given to .page(...), and print the current page alongside the total count. I prefer option 1. I doubt most people would have enough keys added to their account for it to matter.

LordMZTE marked this conversation as resolved

src/user.rs Outdated

Show resolved Hide resolved

| | | | @ -1001,0 +1272,4 @@ | | | | | | // | | | | | | // Public keys are one-line and start with "ssh-", so we check for that. | | | | | | let trimmed = content.trim(); | | | | | | if !force && (!trimmed.starts_with("ssh-") || trimmed.contains('\n')) { |

Cyborus commented 2025-11-25 18:55:34 +01:00

Member

Copy link

I'd like to avoid reading a private key at all by requiring the file have the .pub extension. As little contact with private keys as possible!

I'd like to avoid reading a private key at all by requiring the file have the .pub extension. As little contact with private keys as possible!

LordMZTE marked this conversation as resolved

src/user.rs Outdated

Show resolved Hide resolved

| | | | @ -1001,0 +1276,4 @@ | | | | | | bail!( | | | | | | concat!( | | | | | | "'{}' looks like a private key or invalid data!", | | | | | | " If you want to proceed anyways, add --force." |

Cyborus commented 2025-11-25 18:57:04 +01:00

Member

Copy link

Is there ever any reason to force it through?

Is there ever any reason to force it through?

LordMZTE commented 2025-11-26 10:40:34 +01:00

Author

Collaborator

Copy link

Not sure, I just generally believe that software shouldn't ever try to be smarter than the user. There might exist an edge case which we couldn't possibly anticipate, so I like having these escape hatches.

Not sure, I just generally believe that software shouldn't ever try to be smarter than the user. There might exist an edge case which we couldn't possibly anticipate, so I like having these escape hatches.

Cyborus commented 2025-11-26 15:37:34 +01:00

Member

Copy link

Dug around on the server-side validation and, yeah, looks like there are such edge cases (apparently you can base64 encode your public keys? had no idea!)

--force can stay!

Dug around on the server-side validation and, yeah, looks like there are such edge cases (apparently you can base64 encode your public keys? had no idea!) --force can stay!

LordMZTE marked this conversation as resolved

src/user.rs Outdated

Show resolved Hide resolved

| | | | @ -1001,0 +1322,4 @@ | | | | | | } = *crate::special_render(); | | | | | | | | | | | | let (forgejo_api::structs::GpgKeyListHeaders { x_total_count }, keys) = | | | | | | api.user_current_list_gpg_keys().await?; |

Cyborus commented 2025-11-25 18:58:22 +01:00

Member

Copy link

Same thing with .all() or .page() as above.

Same thing with .all() or .page() as above.

LordMZTE marked this conversation as resolved

src/user.rs Outdated

Show resolved Hide resolved

| | | | @ -1001,0 +1450,4 @@ | | | | | | .output() | | | | | | .await?; | | | | | | | | | | | | if !key_output.status.success() { |

Cyborus commented 2025-11-25 20:00:40 +01:00

Member

Copy link

eyre::ensure can be used here instead (likewise in other similar places)

eyre::ensure can be used here instead (likewise in other similar places)

LordMZTE marked this conversation as resolved

LordMZTE force-pushed key-commands from 8c45b51a2d

All checks were successful

ci/woodpecker/pr/check Pipeline was successful

Details

to a4c92f26b7

All checks were successful

ci/woodpecker/pr/check Pipeline was successful

Details

2025-11-26 22:20:19 +01:00 Compare

LordMZTE requested review from Cyborus 2025-11-26 22:25:14 +01:00

Cyborus approved these changes 2025-11-27 02:30:53 +01:00

Cyborus left a comment

Copy link

Excellent, thank you! :D

Excellent, thank you! :D

Cyborus merged commit 3f25bed845 into main 2025-11-27 02:31:03 +01:00

Cyborus referenced this pull request from a commit 2025-11-27 02:31:05 +01:00 Merge pull request 'feat: SSH and GPG key commands' (#241) from LordMZTE/forgejo-cli:key-commands into main

LordMZTE deleted branch key-commands 2025-11-27 22:45:10 +01:00

Cyborus added this to the v0.4.0 milestone 2025-12-01 17:02:29 +01:00

Sign in to join this conversation.

Reviewers

No reviewers

Cyborus

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

2 participants

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!241

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 "LordMZTE/forgejo-cli:key-commands"

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