diff --git a/cmd/login/add.go b/cmd/login/add.go index 9a821f28..bcc71659 100644 --- a/cmd/login/add.go +++ b/cmd/login/add.go @@ -16,10 +16,15 @@ import ( // CmdLoginAdd represents to login a gitea server. var CmdLoginAdd = cli.Command{ - Name: "add", - Usage: "Add a Gitea login", - Description: `Add a Gitea login, without args it will create one interactively`, - ArgsUsage: " ", // command does not accept arguments + Name: "add", + Usage: "Add a Gitea login", + Description: `Add a Gitea login, without args it will create one interactively. + +By default tea only stores the token for its own API use. Pass --git-credentials +to also register tea as a git credential helper for the login's URL, so that +'git push' and 'git clone' over HTTPS authenticate silently using the stored +token. Equivalent to running 'tea login helper setup' afterwards.`, + ArgsUsage: " ", // command does not accept arguments Flags: []cli.Flag{ &cli.StringFlag{ Name: "name", @@ -89,9 +94,9 @@ var CmdLoginAdd = cli.Command{ Usage: "Use SSH public key or SSH fingerprint to login (needs a running ssh-agent with ssh key loaded)", }, &cli.BoolFlag{ - Name: "helper", - Aliases: []string{"j"}, - Usage: "Add helper", + Name: "git-credentials", + Aliases: []string{"helper", "j"}, + Usage: "Register tea as a git credential helper for this login's URL, so 'git push' and 'git clone' over HTTPS authenticate silently using the stored token", }, &cli.BoolFlag{ Name: "oauth", @@ -161,6 +166,6 @@ func runLoginAdd(requestCtx context.Context, cmd *cli.Command) error { cmd.Bool("insecure"), sshAgent, !cmd.Bool("no-version-check"), - cmd.Bool("helper"), + cmd.Bool("git-credentials"), ) } diff --git a/cmd/login/helper.go b/cmd/login/helper.go index 67402bf6..f252a24a 100644 --- a/cmd/login/helper.go +++ b/cmd/login/helper.go @@ -19,23 +19,31 @@ import ( // CmdLoginHelper represents to login a gitea helper. var CmdLoginHelper = cli.Command{ - Name: "helper", - Aliases: []string{"git-credential"}, - Usage: "Git helper", - Description: `Git helper`, - Hidden: true, + Name: "helper", + Aliases: []string{"git-credential"}, + Usage: "Act as a git credential helper for stored Gitea logins", + Description: `Speaks git's credential helper protocol so that HTTPS push and clone +operations against your configured Gitea instances authenticate silently +using the tokens tea already stores. + +Typical use is automatic: 'tea login add --git-credentials' (or 'tea login +helper setup' for existing logins) registers '!tea login helper' as a +credential helper in ~/.gitconfig. Git then invokes the 'get' subcommand +when it needs credentials for a configured host.`, Commands: []*cli.Command{ { Name: "store", - Description: "Command drops", Aliases: []string{"erase"}, + Usage: "No-op (git credential protocol store/erase)", + Description: "No-op invoked by git on credential store/erase; tea persists credentials only in its own config", Action: func(requestCtx context.Context, _ *cli.Command) error { return nil }, }, { Name: "setup", - Description: "Setup helper to tea authenticate", + Usage: "Register tea as a git credential helper for every configured login", + Description: "Register tea as a git credential helper in ~/.gitconfig for every configured login", Action: func(requestCtx context.Context, _ *cli.Command) error { logins, err := config.GetLogins() if err != nil { @@ -56,7 +64,8 @@ var CmdLoginHelper = cli.Command{ }, { Name: "get", - Description: "Get token to auth", + Usage: "Return the stored token for a URL (git credential protocol)", + Description: "Return the stored token for a given URL in git's credential helper protocol (called by git, reads request from stdin)", Flags: []cli.Flag{ &cli.StringFlag{ Name: "login", diff --git a/docs/CLI.md b/docs/CLI.md index 246e3dc7..7385a844 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -41,7 +41,7 @@ Add a Gitea login **--client-id**="": OAuth client ID (for use with --oauth) -**--helper, -j**: Add helper +**--git-credentials, --helper, -j**: Register tea as a git credential helper for this login's URL, so 'git push' and 'git clone' over HTTPS authenticate silently using the stored token **--insecure, -i**: Disable TLS verification @@ -87,6 +87,24 @@ Get or Set Default Login **--output, -o**="": Output format. (simple, table, csv, tsv, yaml, json) +### helper, git-credential + +Act as a git credential helper for stored Gitea logins + +#### store, erase + +No-op (git credential protocol store/erase) + +#### setup + +Register tea as a git credential helper for every configured login + +#### get + +Return the stored token for a URL (git credential protocol) + +**--login, -l**="": Use a specific login + ### oauth-refresh Refresh an OAuth token diff --git a/modules/print/pull.go b/modules/print/pull.go index 5e415836..1be458f3 100644 --- a/modules/print/pull.go +++ b/modules/print/pull.go @@ -59,9 +59,12 @@ func PullDetails(pr *gitea.PullRequest, reviews []*gitea.PullReview, ciStatus *g } if pr.State == gitea.StateOpen { - if pr.Mergeable { + switch { + case pr.Mergeable: out += "- No Conflicts\n" - } else { + case pr.Draft: + out += "- Draft (not mergeable until marked ready)\n" + default: out += "- **Conflicting files**\n" } } diff --git a/modules/task/login_create.go b/modules/task/login_create.go index 1db94f8c..2a0e1050 100644 --- a/modules/task/login_create.go +++ b/modules/task/login_create.go @@ -146,6 +146,8 @@ func CreateLogin(ctx stdctx.Context, name, token, user, passwd, otp, scopes, ssh if _, err := SetupHelper(login); err != nil { return err } + } else { + fmt.Println("Tip: pass --git-credentials (or run 'tea login helper setup') to authenticate 'git push' and 'git clone' over HTTPS with this token.") } return nil