Merge pull request 'improve help/docs' (#102) from improve-help into main

Reviewed-on: https://codeberg.org/Cyborus/forgejo-cli/pulls/102
This commit is contained in:
Cyborus 2024-08-04 15:17:45 +00:00
commit da982e0873
6 changed files with 105 additions and 21 deletions

View file

@ -3,10 +3,15 @@ use eyre::OptionExt;
#[derive(Subcommand, Clone, Debug)] #[derive(Subcommand, Clone, Debug)]
pub enum AuthCommand { pub enum AuthCommand {
/// Log in to an instance.
///
/// Opens an auth page in your browser
Login, Login,
Logout { /// Deletes login info for an instance
host: String, Logout { host: String },
}, /// Add an application token for an instance
///
/// Use this if `fj auth login` doesn't work
AddKey { AddKey {
/// The domain name of the forgejo instance. /// The domain name of the forgejo instance.
host: String, host: String,
@ -15,6 +20,7 @@ pub enum AuthCommand {
/// The key to add. If not present, the key will be read in from stdin. /// The key to add. If not present, the key will be read in from stdin.
key: Option<String>, key: Option<String>,
}, },
/// List all instances you're currently logged into
List, List,
} }

View file

@ -11,6 +11,7 @@ use crate::repo::{RepoArg, RepoInfo, RepoName};
#[derive(Args, Clone, Debug)] #[derive(Args, Clone, Debug)]
pub struct IssueCommand { pub struct IssueCommand {
/// The local git remote that points to the repo to operate on.
#[clap(long, short = 'R')] #[clap(long, short = 'R')]
remote: Option<String>, remote: Option<String>,
#[clap(subcommand)] #[clap(subcommand)]
@ -19,29 +20,38 @@ pub struct IssueCommand {
#[derive(Subcommand, Clone, Debug)] #[derive(Subcommand, Clone, Debug)]
pub enum IssueSubcommand { pub enum IssueSubcommand {
/// Create a new issue on a repo
Create { Create {
title: String, title: String,
#[clap(long)] #[clap(long)]
body: Option<String>, body: Option<String>,
#[clap(long, short)] #[clap(long, short, id = "[HOST/]OWNER/REPO")]
repo: Option<RepoArg>, repo: Option<RepoArg>,
}, },
/// Edit an issue
Edit { Edit {
#[clap(id = "[REPO#]ID")]
issue: IssueId, issue: IssueId,
#[clap(subcommand)] #[clap(subcommand)]
command: EditCommand, command: EditCommand,
}, },
/// Add a comment on an issue
Comment { Comment {
#[clap(id = "[REPO#]ID")]
issue: IssueId, issue: IssueId,
body: Option<String>, body: Option<String>,
}, },
/// Close an issue
Close { Close {
#[clap(id = "[REPO#]ID")]
issue: IssueId, issue: IssueId,
/// A comment to leave on the issue before closing it
#[clap(long, short)] #[clap(long, short)]
with_msg: Option<Option<String>>, with_msg: Option<Option<String>>,
}, },
/// Search for an issue in a repo
Search { Search {
#[clap(long, short)] #[clap(long, short, id = "[HOST/]OWNER/REPO")]
repo: Option<RepoArg>, repo: Option<RepoArg>,
query: Option<String>, query: Option<String>,
#[clap(long, short)] #[clap(long, short)]
@ -53,12 +63,16 @@ pub enum IssueSubcommand {
#[clap(long, short)] #[clap(long, short)]
state: Option<State>, state: Option<State>,
}, },
/// View an issue's info
View { View {
#[clap(id = "[REPO#]ID")]
id: IssueId, id: IssueId,
#[clap(subcommand)] #[clap(subcommand)]
command: Option<ViewCommand>, command: Option<ViewCommand>,
}, },
/// Open an issue in your browser
Browse { Browse {
#[clap(id = "[REPO#]ID")]
id: IssueId, id: IssueId,
}, },
} }
@ -130,12 +144,11 @@ impl From<State> for forgejo_api::structs::IssueListIssuesQueryState {
#[derive(Subcommand, Clone, Debug)] #[derive(Subcommand, Clone, Debug)]
pub enum EditCommand { pub enum EditCommand {
Title { /// Edit an issue's title
new_title: Option<String>, Title { new_title: Option<String> },
}, /// Edit an issue's text content
Body { Body { new_body: Option<String> },
new_body: Option<String>, /// Edit a comment on an issue
},
Comment { Comment {
idx: usize, idx: usize,
new_body: Option<String>, new_body: Option<String>,
@ -144,8 +157,11 @@ pub enum EditCommand {
#[derive(Subcommand, Clone, Debug)] #[derive(Subcommand, Clone, Debug)]
pub enum ViewCommand { pub enum ViewCommand {
/// View an issue's title and body. The default
Body, Body,
/// View a specific
Comment { idx: usize }, Comment { idx: usize },
/// List every comment
Comments, Comments,
} }

View file

@ -18,7 +18,7 @@ use crate::{
#[derive(Args, Clone, Debug)] #[derive(Args, Clone, Debug)]
pub struct PrCommand { pub struct PrCommand {
/// The git remote to operate on. /// The local git remote that points to the repo to operate on.
#[clap(long, short = 'R')] #[clap(long, short = 'R')]
remote: Option<String>, remote: Option<String>,
#[clap(subcommand)] #[clap(subcommand)]
@ -60,12 +60,13 @@ pub enum PrSubcommand {
#[clap(long)] #[clap(long)]
body: Option<String>, body: Option<String>,
/// The repo to create this issue on /// The repo to create this issue on
#[clap(long, short)] #[clap(long, short, id = "[HOST/]OWNER/REPO")]
repo: Option<RepoArg>, repo: Option<RepoArg>,
}, },
/// View the contents of a pull request /// View the contents of a pull request
View { View {
/// The pull request to view. /// The pull request to view.
#[clap(id = "[REPO#]ID")]
id: Option<IssueId>, id: Option<IssueId>,
#[clap(subcommand)] #[clap(subcommand)]
command: Option<ViewCommand>, command: Option<ViewCommand>,
@ -73,6 +74,7 @@ pub enum PrSubcommand {
/// View the mergability and CI status of a pull request /// View the mergability and CI status of a pull request
Status { Status {
/// The pull request to view. /// The pull request to view.
#[clap(id = "[REPO#]ID")]
id: Option<IssueId>, id: Option<IssueId>,
}, },
/// Checkout a pull request in a new branch /// Checkout a pull request in a new branch
@ -80,6 +82,7 @@ pub enum PrSubcommand {
/// The pull request to check out. /// The pull request to check out.
/// ///
/// Prefix with ^ to get a pull request from the parent repo. /// Prefix with ^ to get a pull request from the parent repo.
#[clap(id = "ID")]
pr: PrNumber, pr: PrNumber,
/// The name to give the newly created branch. /// The name to give the newly created branch.
/// ///
@ -90,6 +93,7 @@ pub enum PrSubcommand {
/// Add a comment on a pull request /// Add a comment on a pull request
Comment { Comment {
/// The pull request to comment on. /// The pull request to comment on.
#[clap(id = "[REPO#]ID")]
pr: Option<IssueId>, pr: Option<IssueId>,
/// The text content of the comment. /// The text content of the comment.
/// ///
@ -99,6 +103,7 @@ pub enum PrSubcommand {
/// Edit the contents of a pull request /// Edit the contents of a pull request
Edit { Edit {
/// The pull request to edit. /// The pull request to edit.
#[clap(id = "[REPO#]ID")]
pr: Option<IssueId>, pr: Option<IssueId>,
#[clap(subcommand)] #[clap(subcommand)]
command: EditCommand, command: EditCommand,
@ -106,6 +111,7 @@ pub enum PrSubcommand {
/// Close a pull request, without merging. /// Close a pull request, without merging.
Close { Close {
/// The pull request to close. /// The pull request to close.
#[clap(id = "[REPO#]ID")]
pr: Option<IssueId>, pr: Option<IssueId>,
/// A comment to add before closing. /// A comment to add before closing.
/// ///
@ -116,6 +122,7 @@ pub enum PrSubcommand {
/// Merge a pull request /// Merge a pull request
Merge { Merge {
/// The pull request to merge. /// The pull request to merge.
#[clap(id = "[REPO#]ID")]
pr: Option<IssueId>, pr: Option<IssueId>,
/// The merge style to use. /// The merge style to use.
#[clap(long, short = 'M')] #[clap(long, short = 'M')]
@ -133,6 +140,7 @@ pub enum PrSubcommand {
/// Open a pull request in your browser /// Open a pull request in your browser
Browse { Browse {
/// The pull request to open in your browser. /// The pull request to open in your browser.
#[clap(id = "[REPO#]ID")]
id: Option<IssueId>, id: Option<IssueId>,
}, },
} }

View file

@ -14,9 +14,11 @@ use crate::{
#[derive(Args, Clone, Debug)] #[derive(Args, Clone, Debug)]
pub struct ReleaseCommand { pub struct ReleaseCommand {
/// The local git remote that points to the repo to operate on.
#[clap(long, short = 'R')] #[clap(long, short = 'R')]
remote: Option<String>, remote: Option<String>,
#[clap(long, short)] /// The name of the repository to operate on.
#[clap(long, short, id = "[HOST/]OWNER/REPO")]
repo: Option<RepoArg>, repo: Option<RepoArg>,
#[clap(subcommand)] #[clap(subcommand)]
command: ReleaseSubcommand, command: ReleaseSubcommand,
@ -24,6 +26,7 @@ pub struct ReleaseCommand {
#[derive(Subcommand, Clone, Debug)] #[derive(Subcommand, Clone, Debug)]
pub enum ReleaseSubcommand { pub enum ReleaseSubcommand {
/// Create a new release
Create { Create {
name: String, name: String,
#[clap(long, short = 'T')] #[clap(long, short = 'T')]
@ -56,6 +59,7 @@ pub enum ReleaseSubcommand {
#[clap(long, short)] #[clap(long, short)]
prerelease: bool, prerelease: bool,
}, },
/// Edit a release's info
Edit { Edit {
name: String, name: String,
#[clap(long, short = 'n')] #[clap(long, short = 'n')]
@ -73,40 +77,45 @@ pub enum ReleaseSubcommand {
#[clap(long, short)] #[clap(long, short)]
prerelease: Option<bool>, prerelease: Option<bool>,
}, },
/// Delete a release
Delete { Delete {
name: String, name: String,
#[clap(long, short = 't')] #[clap(long, short = 't')]
by_tag: bool, by_tag: bool,
}, },
/// List all the releases on a repo
List { List {
#[clap(long, short = 'p')] #[clap(long, short = 'p')]
include_prerelease: bool, include_prerelease: bool,
#[clap(long, short = 'd')] #[clap(long, short = 'd')]
include_draft: bool, include_draft: bool,
}, },
/// View a release's info
View { View {
name: String, name: String,
#[clap(long, short = 't')] #[clap(long, short = 't')]
by_tag: bool, by_tag: bool,
}, },
Browse { /// Open a release in your browser
name: Option<String>, Browse { name: Option<String> },
}, /// Commands on a release's attached files
#[clap(subcommand)] #[clap(subcommand)]
Asset(AssetCommand), Asset(AssetCommand),
} }
#[derive(Subcommand, Clone, Debug)] #[derive(Subcommand, Clone, Debug)]
pub enum AssetCommand { pub enum AssetCommand {
/// Create a new attachment on a release
Create { Create {
release: String, release: String,
path: std::path::PathBuf, path: std::path::PathBuf,
name: Option<String>, name: Option<String>,
}, },
Delete { /// Remove an attachment from a release
release: String, Delete { release: String, asset: String },
asset: String, /// Download an attached file
}, ///
/// Use `source.zip` or `source.tar.gz` to download the repo archive
Download { Download {
release: String, release: String,
asset: String, asset: String,

View file

@ -288,6 +288,7 @@ impl std::fmt::Display for RepoArgError {
#[derive(Subcommand, Clone, Debug)] #[derive(Subcommand, Clone, Debug)]
pub enum RepoCommand { pub enum RepoCommand {
/// Creates a new repository
Create { Create {
repo: String, repo: String,
@ -304,32 +305,48 @@ pub enum RepoCommand {
#[clap(long, short)] #[clap(long, short)]
push: bool, push: bool,
}, },
/// Fork a repository onto your account
Fork { Fork {
#[clap(id = "[HOST/]OWNER/REPO")]
repo: RepoArg, repo: RepoArg,
#[clap(long)] #[clap(long)]
name: Option<String>, name: Option<String>,
#[clap(long, short = 'R')] #[clap(long, short = 'R')]
remote: Option<String>, remote: Option<String>,
}, },
/// View a repo's info
View { View {
#[clap(id = "[HOST/]OWNER/REPO")]
name: Option<RepoArg>, name: Option<RepoArg>,
#[clap(long, short = 'R')] #[clap(long, short = 'R')]
remote: Option<String>, remote: Option<String>,
}, },
/// Clone a repo's code locally
Clone { Clone {
#[clap(id = "[HOST/]OWNER/REPO")]
repo: RepoArg, repo: RepoArg,
path: Option<PathBuf>, path: Option<PathBuf>,
}, },
/// Add a star to a repo
Star { Star {
#[clap(id = "[HOST/]OWNER/REPO")]
repo: RepoArg, repo: RepoArg,
}, },
/// Take away a star from a repo
Unstar { Unstar {
#[clap(id = "[HOST/]OWNER/REPO")]
repo: RepoArg, repo: RepoArg,
}, },
/// Delete a repository
///
/// This cannot be undone!
Delete { Delete {
#[clap(id = "[HOST/]OWNER/REPO")]
repo: RepoArg, repo: RepoArg,
}, },
/// Open a repository's page in your browser
Browse { Browse {
#[clap(id = "[HOST/]OWNER/REPO")]
name: Option<RepoArg>, name: Option<RepoArg>,
#[clap(long, short = 'R')] #[clap(long, short = 'R')]
remote: Option<String>, remote: Option<String>,

View file

@ -6,6 +6,7 @@ use crate::{repo::RepoInfo, SpecialRender};
#[derive(Args, Clone, Debug)] #[derive(Args, Clone, Debug)]
pub struct UserCommand { pub struct UserCommand {
/// The local git remote that points to the repo to operate on.
#[clap(long, short = 'R')] #[clap(long, short = 'R')]
remote: Option<String>, remote: Option<String>,
#[clap(subcommand)] #[clap(subcommand)]
@ -14,46 +15,66 @@ pub struct UserCommand {
#[derive(Subcommand, Clone, Debug)] #[derive(Subcommand, Clone, Debug)]
pub enum UserSubcommand { pub enum UserSubcommand {
/// Search for a user by username
Search { Search {
/// The name to search for /// The name to search for
query: String, query: String,
#[clap(long, short)] #[clap(long, short)]
page: Option<usize>, page: Option<usize>,
}, },
/// View a user's profile page
View { View {
/// The name of the user to view /// The name of the user to view
///
/// Omit to view your own page
user: Option<String>, user: Option<String>,
}, },
/// Open a user's profile page in your browser
Browse { Browse {
/// The name of the user to open in your browser /// The name of the user to open in your browser
///
/// Omit to view your own page
user: Option<String>, user: Option<String>,
}, },
/// Follow a user
Follow { Follow {
/// The name of the user to follow /// The name of the user to follow
user: String, user: String,
}, },
/// Unfollow a user
Unfollow { Unfollow {
/// The name of the user to follow /// The name of the user to follow
user: String, user: String,
}, },
/// List everyone a user's follows
Following { Following {
/// The name of the user whose follows to list /// The name of the user whose follows to list
///
/// Omit to view your own follows
user: Option<String>, user: Option<String>,
}, },
/// List a user's followers
Followers { Followers {
/// The name of the user whose followers to list /// The name of the user whose followers to list
///
/// Omit to view your own followers
user: Option<String>, user: Option<String>,
}, },
/// Block a user
Block { Block {
/// The name of the user to block /// The name of the user to block
user: String, user: String,
}, },
/// Unblock a user
Unblock { Unblock {
/// The name of the user to unblock /// The name of the user to unblock
user: String, user: String,
}, },
/// List a user's repositories
Repos { Repos {
/// The name of the user whose repos to list /// The name of the user whose repos to list
///
/// Omit to view your own repos.
user: Option<String>, user: Option<String>,
/// List starred repos instead of owned repos /// List starred repos instead of owned repos
#[clap(long)] #[clap(long)]
@ -62,14 +83,21 @@ pub enum UserSubcommand {
#[clap(long)] #[clap(long)]
sort: Option<RepoSortOrder>, sort: Option<RepoSortOrder>,
}, },
/// List the organizations a user is a member of
Orgs { Orgs {
/// The name of the user to view org membership of /// The name of the user to view org membership of
///
/// Omit to view your own orgs.
user: Option<String>, user: Option<String>,
}, },
/// List a user's recent activity
Activity { Activity {
/// The name of the user to view the activity of /// The name of the user to view the activity of
///
/// Omit to view your own activity.
user: Option<String>, user: Option<String>,
}, },
/// Edit your user settings
#[clap(subcommand)] #[clap(subcommand)]
Edit(EditCommand), Edit(EditCommand),
} }