KEMBAR78
feat: Add support for creating autolink references by hoffm · Pull Request #10180 · cli/cli · GitHub
Skip to content

Conversation

hoffm
Copy link
Contributor

@hoffm hoffm commented Jan 5, 2025

Fixes #10119.

Overview

Adds support for gh repo autolink create command. The command requires two positional arguments for the key prefix and URL template, respectively. It provides one custom flag --numeric/-n to specify a non-alphanumeric autolink.

When creation is successful, I took the liberty of adding some information to the output in excess of what's in the spec (see examples below). The output includes the ID of the created autolink and also a representation of the mapping (prefix to URL) it represents. The mapping is intended to be similar to what the github.com UI provides.

Non-201 API responses are reported transparently from the response via HandleHTTPError. The one exception is 404 responses, for which we rewrite the message to report "Must have admin rights to Repository" as specified.

Examples

Help

create go — github-cli 2025-01-05 at 8 34 23 PM jpg

Create

http_test go — github-cli 2025-01-05 at 3 48 51 PM jpg

Create Numeric

http_test go — github-cli 2025-01-05 at 3 50 21 PM jpg

Key Prefix Already Exists

http_test go — github-cli 2025-01-05 at 3 49 25 PM

Non-Admin (404)

http_test go — github-cli 2025-01-05 at 3 54 58 PM jpg

URL Template missing <num>

http_test go — github-cli 2025-01-05 at 3 55 31 PM jpg

URL Template not URL

http_test go — github-cli 2025-01-05 at 3 56 08 PM jpg

Multiple Field Validation Failures

http_test go — github-cli 2025-01-05 at 3 54 13 PM jpg

Software Design Considerations

I've created a new shared package to house the Autolink data model, which needs to be shared between create, list, and future command packages. To maintain the current design, this type needs to be in a new package to avoid import cycles between autolink and the command packages. I'm open to renaming this (or reconsidering the design).

The "shared" package is at heart is also a step towards domain-driven design. If we wanted to go a step further towards DDD, we could think of the REST API as part of a persistence layer that implements an AutolinkClient interface defined in the domain:

type AutolinkClient interface {
    Create(repo ghrepo.Interface, request AutolinkCreateRequest) (*domain.Autolink, error)
    List(repo ghrepo.Interface) ([]domain.Autolink, error)
    // etc
}

Doing this would require quite a different directory and package structure than we have today, so I didn't want to rush into it.

Questions

  1. I edited the the RESTPayload helper in pkg/httpmock/stub.go. This helper was not setting a content type header on the stubbed response, and as a result it was incompatible with HandleHTTPError. My change sets this header to "application/json", which matches the behavior of JSONResponse in the same package. Is that cool?
  2. I noticed that on my personal repos I am able to create autolink references via the API, but the settings page doesn't have a link to the GUI to view them. When I visit the URL that should have this GUI, https://github.com/nytimes/OWNER/REPO/key_links, I get a 404. If this feature is not available on all repos, should that be reflected in the responses provided by this tool, or by the REST API itself?

@hoffm hoffm marked this pull request as ready for review January 5, 2025 21:20
@hoffm hoffm requested a review from a team as a code owner January 5, 2025 21:20
@hoffm hoffm requested a review from williammartin January 5, 2025 21:20
@cliAutomation cliAutomation added the external pull request originating outside of the CLI core team label Jan 5, 2025
@hoffm
Copy link
Contributor Author

hoffm commented Jan 13, 2025

@andyfeller Could you help me get code review on this PR? I've started work on the other issues with the same parent ticket, but I won't be able to finish anything else until we resolve this one.

@williammartin
Copy link
Member

williammartin commented Jan 13, 2025

It's on my ever expanding todo list, sorry! But I'm happy for someone else to give it a review as well.

I'd prefer domain to be called shared to be consistent with other packages around the codebase. To be honest I'd prefer the command to go under a cmd or cobra package and to use the autolink package as the domain package itself, but that's too much of a departure from the current state right now.

@hoffm
Copy link
Contributor Author

hoffm commented Jan 13, 2025

It's on my ever expanding todo list, sorry! But I'm happy for someone else to give it a review as well.

I'd prefer domain to be called shared to be consistent with other packages around the codebase. To be honest I'd prefer the command to go under a cmd or cobra package and to use the autolink package as the domain package itself, but that's too much of a departure from the current state right now.

Sorry to nag, @williammartin! It's truly a reflection of my excitement to keep going, not of any annoyance with you or the other maintainers. :)

Roger that re: "shared".

@jtmcg
Copy link
Contributor

jtmcg commented Jan 15, 2025

Given I reviewed #10124 I'm happy to give this a look, @williammartin and @hoffm. I also have a few other priorities ahead of this right now, so we'll see who gets to it first 🙂

@hoffm
Copy link
Contributor Author

hoffm commented Jan 27, 2025

Hey team. It looks like I'll have some bandwidth to work on this project this week. If it's possible to get a review here, I'd appreciate it!

@andyfeller
Copy link
Member

Hey team. It looks like I'll have some bandwidth to work on this project this week. If it's possible to get a review here, I'd appreciate it!

@hoffm : apologies for the delay on this; I'm going to review this today.

I'll note there are a few minor format things that I might just make to the branch to avoid some of the back and forth; nothing major.

- simplified and wrapped `gh repo autolink create` and `gh repo autolink` long help usage docs
- simplified success message, brought into alignment with other commands
@andyfeller
Copy link
Member

Hey team. It looks like I'll have some bandwidth to work on this project this week. If it's possible to get a review here, I'd appreciate it!

@hoffm : apologies for the delay on this; I'm going to review this today.

I'll note there are a few minor format things that I might just make to the branch to avoid some of the back and forth; nothing major.

@hoffm : I finished testing and pushing up 7c31d1a for some minor changes and think this is in a good place. Let me explain my changes:

  1. Some of the long help usage content in gh repo autolink create felt like it should be in the commandset help doc; specifically that admin role is required to use any of the commands
  2. The really long help usage lines needed to be broken into digestible blocks
  3. I know I originally drafted the AC regarding --numeric flag with that language, but in retrospect something @williammartin said made me think that changing that language a little was worthwhile
  4. I discovered a minor test assertion mix up of actual vs expected
  5. I brought the success message more in line with other messages in gh

Again, thank you for your time supporting gh and patience as we deal with a bit of chaos at the moment! 🙇

Side note: I know the following error comes from the REST API but I don't like it 😜 🤷

$ ~/.../cli/cli/bin/gh repo autolink create
Cannot create autolink: keyPrefix and urlTemplate arguments are both required

Usage:  gh repo autolink create <keyPrefix> <urlTemplate> [flags]

Flags:
  -n, --numeric   Mark autolink as numeric
  
$ ~/.../cli/cli/bin/gh repo autolink create ABC "http://example.com"
HTTP 422: Validation Failed (https://api.github.com/repos/tinyfists/gh-nonsense/autolinks)
url_template is missing a <num> token


$ ~/.../cli/cli/bin/gh repo autolink create ABC "http://example.com?q=<num>"
✓ Created repository autolink 7160931 on tinyfists/gh-nonsense


$ ~/.../cli/cli/bin/gh repo autolink list                                   

Showing 1 autolink reference in tinyfists/gh-nonsense

ID       KEY PREFIX  URL TEMPLATE                ALPHANUMERIC
7160931  ABC         http://example.com?q=<num>  true

Copy link
Member

@andyfeller andyfeller left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@andyfeller andyfeller enabled auto-merge January 27, 2025 23:00
@andyfeller andyfeller merged commit b0cd1fb into cli:trunk Jan 27, 2025
@hoffm
Copy link
Contributor Author

hoffm commented Jan 28, 2025

@andyfeller Your changes all make sense to me. I'll take account of these patterns in future work. Thanks!

tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Feb 4, 2025
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [cli/cli](https://github.com/cli/cli) | minor | `v2.65.0` -> `v2.66.1` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>cli/cli (cli/cli)</summary>

### [`v2.66.1`](https://github.com/cli/cli/releases/tag/v2.66.1): GitHub CLI 2.66.1

[Compare Source](cli/cli@v2.66.0...v2.66.1)

#### Hotfix: `gh pr view` fails with provided URL

This addresses a regression in `gh pr view` was reported in [#&#8203;10352](cli/cli#10352). This regression was due to a change in `v2.66.0` that no longer allowed `gh pr` subcommands to execute properly outside of a git repo.

#### What's Changed

-   Hotfix: `gh pr view` fails with provided URL by [@&#8203;jtmcg](https://github.com/jtmcg) in cli/cli#10354

**Full Changelog**: cli/cli@v2.66.0...v2.66.1

### [`v2.66.0`](https://github.com/cli/cli/releases/tag/v2.66.0): GitHub CLI 2.66.0

[Compare Source](cli/cli@v2.65.0...v2.66.0)

#### `gh pr view` and `gh pr status` now respect common triangular workflow configurations

Previously, `gh pr view` and `gh pr status` would fail for pull request's (MR) open in triangular workflows. This was due to `gh` being unable to identify the MR's corresponding remote and branch refs on GitHub.

Now, `gh pr view` and `gh pr status` should successfully identify the MR's refs when the following common git configurations are used:

-   [`branch.<branchName>.pushremote`](https://git-scm.com/docs/git-config#Documentation/git-config.txt-branchltnamegtpushRemote) is set
-   [`remote.pushDefault`](https://git-scm.com/docs/git-config#Documentation/git-config.txt-remotepushDefault) is set

Branch specific configuration, the former, supersedes repo specific configuration, the latter.

Additionally, if the [`@{push}` revision syntax](https://git-scm.com/docs/gitrevisions#Documentation/gitrevisions.txt-emltbranchnamegtpushemegemmasterpushemempushem) for git resolves for a branch, `gh pr view` and `gh pr status` should work regardless of additional config settings.

For more information, see

-   cli/cli#9363
-   cli/cli#9364
-   cli/cli#9365
-   cli/cli#9374

#### `gh secret list`, `gh secret set`, and `gh secret delete` now require repository selection when multiple `git` remotes are present

Previously, `gh secret list`, `gh secret set`, and `gh secret delete` would determine which remote to target for interacting with GitHub Actions secrets.  Remotes marked as default using `gh repo set-default` or through other `gh` commands had higher priority when figuring out which repository to interact with.  This could have unexpected outcomes when using `gh secret` commands with forked repositories as the upstream repository would generally be selected.

Now, `gh secret` commands require users to disambiguate which repository should be the target if multiple remotes are present and the `-R, --repo` flag is not provided.

For more information, see cli/cli#4688

#### Extension update notices now notify once every 24 hours per extension and can be disabled

Previously, the GitHub CLI would notify users about newer versions every time an extension was executed.  This did not match GitHub CLI notices, which only notified users once every 24 hours and could be disabled through an environment variable.

Now, extension update notices will behave similar to GitHub CLI notices.  To disable extension update notices, set the `GH_NO_EXTENSION_UPDATE_NOTIFIER` environment variable.

For more information, see cli/cli#9925

#### What's Changed

##### ✨ Features

-   Draft for discussing testing around extension update checking behavior by [@&#8203;andyfeller](https://github.com/andyfeller) in cli/cli#9985
-   Make extension update check non-blocking by [@&#8203;andyfeller](https://github.com/andyfeller) in cli/cli#10239
-   Ensure extension update notices only notify once within 24 hours, provide ability to disable all extension update notices by [@&#8203;andyfeller](https://github.com/andyfeller) in cli/cli#9934
-   feat: make the extension upgrade fancier by [@&#8203;nobe4](https://github.com/nobe4) in cli/cli#10194
-   fix: padded display by [@&#8203;nobe4](https://github.com/nobe4) in cli/cli#10216
-   Update `gh attestation` attestation bundle fetching logic by [@&#8203;malancas](https://github.com/malancas) in cli/cli#10185
-   Require repo disambiguation for secret commands by [@&#8203;williammartin](https://github.com/williammartin) in cli/cli#10209
-   show error message for rerun workflow older than a month ago by [@&#8203;iamrajhans](https://github.com/iamrajhans) in cli/cli#10227
-   Update `gh attestation verify` table output by [@&#8203;malancas](https://github.com/malancas) in cli/cli#10104
-   Enable MSI building for Windows arm64 by [@&#8203;dennisameling](https://github.com/dennisameling) in cli/cli#10297
-   feat: Add support for creating autolink references by [@&#8203;hoffm](https://github.com/hoffm) in cli/cli#10180
-   Find MRs using `@{push}` by [@&#8203;Frederick888](https://github.com/Frederick888) in cli/cli#9208
-   feat: Add support for viewing autolink references by [@&#8203;hoffm](https://github.com/hoffm) in cli/cli#10324
-   Update `gh attestation` bundle fetching logic by [@&#8203;malancas](https://github.com/malancas) in cli/cli#10339

##### 🐛 Fixes

-   gh gist delete: prompt for gist id by [@&#8203;danochoa](https://github.com/danochoa) in cli/cli#10154
-   Better handling for waiting for codespaces to become ready by [@&#8203;cmbrose](https://github.com/cmbrose) in cli/cli#10198
-   Fix: `gh gist view` and `gh gist edit` prompts with no TTY by [@&#8203;mateusmarquezini](https://github.com/mateusmarquezini) in cli/cli#10048
-   Remove naked return values from `ReadBranchConfig` and `prSelectorForCurrentBranch` by [@&#8203;jtmcg](https://github.com/jtmcg) in cli/cli#10197
-   Add job to deployment workflow to validate the tag name for a given release by [@&#8203;jtmcg](https://github.com/jtmcg) in cli/cli#10121
-   \[gh run list] Stop progress indicator on failure from `--workflow` flag by [@&#8203;iamazeem](https://github.com/iamazeem) in cli/cli#10323
-   Update deployment.yml by [@&#8203;andyfeller](https://github.com/andyfeller) in cli/cli#10340

##### 📚 Docs & Chores

-   Add affected version heading to bug report issue form by [@&#8203;BagToad](https://github.com/BagToad) in cli/cli#10269
-   chore: fix some comments by [@&#8203;petercover](https://github.com/petercover) in cli/cli#10296
-   Update triage.md to reflect FR experiment outcome by [@&#8203;jtmcg](https://github.com/jtmcg) in cli/cli#10196
-   Clear up --with-token fine grained PAT usage by [@&#8203;williammartin](https://github.com/williammartin) in cli/cli#10186
-   Correct help documentation around template use in `gh issue create` by [@&#8203;andyfeller](https://github.com/andyfeller) in cli/cli#10208
-   chore: fix some function names in comment by [@&#8203;zhuhaicity](https://github.com/zhuhaicity) in cli/cli#10225
-   Tiny typo fix by [@&#8203;robmorgan](https://github.com/robmorgan) in cli/cli#10265
-   add install instructions for Manjaro Linux by [@&#8203;AMS21](https://github.com/AMS21) in cli/cli#10236
-   Update test to be compatible with latest Glamour v0.8.0 by [@&#8203;ottok](https://github.com/ottok) in cli/cli#10151
-   Add more `gh attestation verify` integration tests by [@&#8203;malancas](https://github.com/malancas) in cli/cli#10102

##### :dependabot: Dependencies

-   Bump github.com/mattn/go-colorable from 0.1.13 to 0.1.14 by [@&#8203;dependabot](https://github.com/dependabot) in cli/cli#10215
-   Bump github.com/sigstore/protobuf-specs from 0.3.2 to 0.3.3 by [@&#8203;dependabot](https://github.com/dependabot) in cli/cli#10214
-   Bump github.com/gabriel-vasile/mimetype from 1.4.7 to 1.4.8 by [@&#8203;dependabot](https://github.com/dependabot) in cli/cli#10184
-   Bump google.golang.org/protobuf from 1.36.2 to 1.36.3 by [@&#8203;dependabot](https://github.com/dependabot) in cli/cli#10250
-   Bump golangci-linter and address failures to prepare for Go 1.24 strictness by [@&#8203;mikelolasagasti](https://github.com/mikelolasagasti) in cli/cli#10279
-   Bump github.com/google/go-containerregistry from 0.20.2 to 0.20.3 by [@&#8203;dependabot](https://github.com/dependabot) in cli/cli#10257
-   Bump actions/attest-build-provenance from 2.1.0 to 2.2.0 by [@&#8203;dependabot](https://github.com/dependabot) in cli/cli#10300
-   Bump google.golang.org/protobuf from 1.36.3 to 1.36.4 by [@&#8203;dependabot](https://github.com/dependabot) in cli/cli#10306
-   Upgrade sigstore-go to v0.7.0: fixes [#&#8203;10114](cli/cli#10114) formatting issue by [@&#8203;codysoyland](https://github.com/codysoyland) in cli/cli#10309
-   Bump github.com/in-toto/attestation from 1.1.0 to 1.1.1 by [@&#8203;dependabot](https://github.com/dependabot) in cli/cli#10319

#### New Contributors

Big thank you to our many new *and* longtime contributors making this release happen!! ❤️ ✨

-   [@&#8203;zhuhaicity](https://github.com/zhuhaicity) made their first contribution in cli/cli#10225
-   [@&#8203;danochoa](https://github.com/danochoa) made their first contribution in cli/cli#10154
-   [@&#8203;robmorgan](https://github.com/robmorgan) made their first contribution in cli/cli#10265
-   [@&#8203;iamrajhans](https://github.com/iamrajhans) made their first contribution in cli/cli#10227
-   [@&#8203;AMS21](https://github.com/AMS21) made their first contribution in cli/cli#10236
-   [@&#8203;petercover](https://github.com/petercover) made their first contribution in cli/cli#10296
-   [@&#8203;ottok](https://github.com/ottok) made their first contribution in cli/cli#10151
-   [@&#8203;dennisameling](https://github.com/dennisameling) made their first contribution in cli/cli#10297
-   [@&#8203;iamazeem](https://github.com/iamazeem) made their first contribution in cli/cli#10323
-   [@&#8203;Frederick888](https://github.com/Frederick888) made their first contribution in cli/cli#9208

**Full Changelog**: cli/cli@v2.65.0...v2.66.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNDMuMCIsInVwZGF0ZWRJblZlciI6IjM5LjE0Ni40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

external pull request originating outside of the CLI core team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add support for gh repo autolink create

5 participants