fix(api): resolve :owner/:repo and --var placeholders in single calls #254
Loading…
Reference in New Issue
No description provided.
Delete Branch "luwanzhou/gitlink-cli:fix/api-owner-repo-placeholders"
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?
问题描述
gitlink-cli api <METHOD> <PATH>在单次调用时,会把<PATH>原样发送给服务端,不会替换 REST 风格的:owner/:repo占位符。gitlink-cli api GET /:owner/:repo/commits时,字面量:owner、:repo被直接拼进请求 URL,服务端返回 404 / 资源不存在。Example(api POST /:owner/:repo/issues)就是跑不通的;:owner/:repo写法(如api GET /:owner/:repo/commits)全部失效;--batch-file批处理模式({{var}}模板)中,单次调用无法复用,体验割裂。问题复现步骤
安装并登录:
gitlink-cli auth login执行单次 api 调用(任意有效仓库):
实际请求被发往
.../api/:owner/:repo/commits.json(字面:owner未替换),返回 404 / 资源不存在;而非预期的提交列表。根本原因
cmd/api/api.go的runAPI()(单次调用路径)直接使用原始参数,没有任何占位符解析:占位符替换逻辑只实现在
runAPIBatch()的renderTemplate()({{var}}模板)里,单次调用完全没有走任何解析;而:owner/:repo这种 REST 风格占位符在单次/批处理两条路径里都没有被处理。修复方案
在
cmd/api/api.go新增resolveAPIPath(),让单次调用按以下顺序处理路径,并在runAPI()中调用:{{var}}模板渲染:若提供--var key=value,复用与批处理模式相同的parseBatchVars+renderTemplate渲染{{key}},缺失变量时报错(与批处理语义一致)。:owner/:repo占位符替换:当路径包含:owner/:repo时,使用与所有 shortcut 一致的internal/context.ResolveOwnerRepo(--owner/--repo → git remote origin)解析仓库归属并替换;无法解析时给出明确错误提示。/自动补全」。实现要点:
:owner/:repo用正则:owner\b/:repo\b,\b词边界避免误伤:owner_id等更长 token;ReplaceAllLiteralString替换,避免 owner/repo 名中的$被当作正则替换引用;parseBatchVars/renderTemplate(cmd/api/batch.go)与internal/context.ResolveOwnerRepo,无新增依赖;--var的调用(如api GET /users/me)行为完全不变。合并请求描述
本 PR 修复
gitlink-cli api单次调用不替换:owner/:repo占位符的问题,并顺带让单次调用支持--var的{{var}}模板渲染,使单次调用与批处理模式在占位符能力上保持一致;同时修正了命令自带的、原本无法运行的帮助示例。相关Issue
关联Issue编号:#144171
变更内容
1. 修复
:owner/:repo占位符未替换(cmd/api/api.go)resolveAPIPath():{{var}}渲染 →:owner/:repo解析替换 → 前导/补全。apiOwnerPlaceholder/apiRepoPlaceholder正则(\b边界)。runAPI()改为调用resolveAPIPath()。2. 增强:单次调用支持
--var模板--var key=value渲染路径中的{{key}},与批处理模式语义统一。3. 文档:更新命令
Exampleapi GET /:owner/:repo/commits --owner Gitlink --repo gitlink-cliapi GET /v1/{{owner}}/gitlink-cli/issues --var owner=Gitlink4. 测试(
cmd/api/api_test.go):owner/:repo解析替换、单次调用{{var}}渲染、缺失模板变量报错。5. 变更说明(
doc/changes/api-path-placeholders.md)测试与验证
go build ./...、go vet ./...、go test ./...、gofmt -s全部通过。api GET /:owner/:repo/commits --owner Gitlink --repo gitlink-cli→ 正常返回提交列表(不再发送字面:owner)。api GET /v1/{{owner}}/gitlink-cli --var owner=Gitlink→ 正常返回仓库详情。gitlink-cli api <METHOD> <PATH> 单次调用此前直接发送原始路径,不替换 REST 风格的 :owner/:repo 占位符——导致该命令自身的 Example (api POST /:owner/:repo/issues)以及依赖该写法的 Skill/文档无法使用。 - 新增 resolveAPIPath:先按 --var 渲染 {{var}} 模板(复用批处理模板引擎), 再用 context.ResolveOwnerRepo(--owner/--repo → git remote,与所有 shortcut 一致)替换 :owner/:repo,最后补全前导 /。 - :owner/:repo 正则用 \b 边界避免误伤 :owner_id;ReplaceAllLiteralString 避免 owner/repo 中的 $ 被当作正则替换引用。 - 不含占位符且无 --var 的调用行为不变。 - 更新命令 Example;新增单元测试(占位符解析、单次 --var 渲染、缺失变量报错)。 修复 Issue: api 命令单次调用不替换 :owner/:repo 占位符。