Merge pull request 'feat(issue): add user lookup shortcuts' (#44) from wangyue111/gitlink-cli:feat/issue-user-shortcuts into master

This commit is contained in:
wbtiger 2026-05-27 01:14:31 +08:00
commit 2f8b987c2c
7 changed files with 158 additions and 0 deletions

View File

@ -224,6 +224,12 @@ gitlink-cli issue +batch-close --owner Gitlink --repo forgeplus --from issues.cs
# Add a comment
gitlink-cli issue +comment --owner Gitlink --repo forgeplus -i 123 -b "Fixed"
# List issue assigners
gitlink-cli issue +assigners --owner Gitlink --repo forgeplus
# List issue authors
gitlink-cli issue +authors --owner Gitlink --repo forgeplus
```
### Pull Requests

View File

@ -235,6 +235,12 @@ gitlink-cli issue +batch-close --owner Gitlink --repo forgeplus --from issues.cs
# 添加评论
gitlink-cli issue +comment --owner Gitlink --repo forgeplus -i 123 -b "已修复"
# 列出 Issue 负责人
gitlink-cli issue +assigners --owner Gitlink --repo forgeplus
# 列出 Issue 发布人
gitlink-cli issue +authors --owner Gitlink --repo forgeplus
```
### Pull Request

View File

@ -223,6 +223,48 @@ func Shortcuts() []*common.Shortcut {
return ctx.Output(env)
},
},
{
Name: "assigners",
Description: "List issue assigners",
Flags: []common.Flag{
{Name: "keyword", Short: "k", Usage: "Search keyword"},
},
Run: func(ctx *common.RuntimeContext) error {
if err := ctx.ResolveOwnerRepo(); err != nil {
return err
}
q := url.Values{}
if keyword := ctx.Arg("keyword"); keyword != "" {
q.Set("keyword", keyword)
}
env, err := ctx.CallAPIWithQuery("GET", v1RepoPath(ctx)+"/issue_assigners", q)
if err != nil {
return err
}
return ctx.Output(env)
},
},
{
Name: "authors",
Description: "List issue authors",
Flags: []common.Flag{
{Name: "keyword", Short: "k", Usage: "Search keyword"},
},
Run: func(ctx *common.RuntimeContext) error {
if err := ctx.ResolveOwnerRepo(); err != nil {
return err
}
q := url.Values{}
if keyword := ctx.Arg("keyword"); keyword != "" {
q.Set("keyword", keyword)
}
env, err := ctx.CallAPIWithQuery("GET", v1RepoPath(ctx)+"/issue_authors", q)
if err != nil {
return err
}
return ctx.Output(env)
},
},
}
}

View File

@ -131,6 +131,52 @@ func TestBatchClosePreservesCurrentDescription(t *testing.T) {
assertEqual(t, updatePayload["status_id"], float64(5))
}
func TestIssueAssignersShortcutWithKeyword(t *testing.T) {
server := newIssueTestServer(t, func(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" || r.URL.Path != "/v1/owner/repo/issue_assigners.json" {
t.Fatalf("unexpected request: %s %s", r.Method, r.URL.Path)
}
assertEqual(t, r.URL.Query().Get("keyword"), "alice")
writeJSON(t, w, map[string]interface{}{
"total_count": 1,
"assigners": []map[string]interface{}{
{"id": 7, "name": "Alice", "login": "alice"},
},
})
})
defer server.Close()
err := runIssueShortcut(t, server, "assigners", map[string]string{
"keyword": "alice",
})
if err != nil {
t.Fatalf("assigners shortcut failed: %v", err)
}
}
func TestIssueAuthorsShortcutWithKeyword(t *testing.T) {
server := newIssueTestServer(t, func(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" || r.URL.Path != "/v1/owner/repo/issue_authors.json" {
t.Fatalf("unexpected request: %s %s", r.Method, r.URL.Path)
}
assertEqual(t, r.URL.Query().Get("keyword"), "bob")
writeJSON(t, w, map[string]interface{}{
"total_count": 1,
"authors": []map[string]interface{}{
{"id": 8, "name": "Bob", "login": "bob"},
},
})
})
defer server.Close()
err := runIssueShortcut(t, server, "authors", map[string]string{
"keyword": "bob",
})
if err != nil {
t.Fatalf("authors shortcut failed: %v", err)
}
}
func runIssueShortcut(t *testing.T, server *httptest.Server, name string, args map[string]string) error {
t.Helper()
shortcut := findIssueShortcut(t, name)

View File

@ -27,6 +27,8 @@ metadata:
| `issue +close` | 关闭 Issue | 是 |
| `issue +batch-close` | 批量关闭 Issue支持 `--dry-run` 预览 | 是dry-run 不写入) |
| `issue +comment` | 添加评论 | 是 |
| `issue +assigners` | 查询 Issue 负责人列表 | 否(公开项目) |
| `issue +authors` | 查询 Issue 发布人列表 | 否(公开项目) |
## 使用示例
@ -54,6 +56,12 @@ gitlink-cli issue +batch-close --owner myuser --repo myrepo --from issues.csv
# 添加评论
gitlink-cli issue +comment --number 4 --body "已修复,请验证"
# 查询 Issue 负责人
gitlink-cli issue +assigners --owner Gitlink --repo forgeplus --keyword alice
# 查询 Issue 发布人
gitlink-cli issue +authors --owner Gitlink --repo forgeplus --keyword bob
```
## Raw API 补充

View File

@ -0,0 +1,25 @@
# Issue Assigners
Use `issue +assigners` to list users that can be assigned to Issues in a repository.
This helps users find the assignee ID before creating or updating an Issue.
## Usage
```bash
gitlink-cli issue +assigners --owner Gitlink --repo forgeplus
gitlink-cli issue +assigners --owner Gitlink --repo forgeplus --keyword alice
```
## Options
| Option | Description |
|--------|-------------|
| `--owner` | Repository owner |
| `--repo` | Repository name |
| `--keyword`, `-k` | Optional search keyword |
## API
```http
GET /api/v1/{owner}/{repo}/issue_assigners.json
```

View File

@ -0,0 +1,25 @@
# Issue Authors
Use `issue +authors` to list users who have authored Issues in a repository.
This helps users find author IDs for Issue filtering and reporting workflows.
## Usage
```bash
gitlink-cli issue +authors --owner Gitlink --repo forgeplus
gitlink-cli issue +authors --owner Gitlink --repo forgeplus --keyword bob
```
## Options
| Option | Description |
|--------|-------------|
| `--owner` | Repository owner |
| `--repo` | Repository name |
| `--keyword`, `-k` | Optional search keyword |
## API
```http
GET /api/v1/{owner}/{repo}/issue_authors.json
```