azコマンドで今作業しているAzure DevOpsのReposをブラウザでシュッと開く

ターミナルでCLIを使って複数のリポジトリを操作することを普段から行なっています。

対象のリポジトリがGitHubの場合は `gh browse` でシュッとCLIからブラウザへ切り替えて対象リポジトリを操作することができますが、Azure DevOpsでもそれをちょっとした工夫でできるようにしました。


## 課題
Azure DevOpsのReposをターミナルのCLIからブラウザでシュッと開きたい。

https://x.com/morihaya55/status/1777330303356575965

## 前提（環境）

以下の環境で行なっています。

- MacOS: Sonoma 14.4
- awk: 20200816
- zsh: 5.9
- azure-cliは以下
```json
{
  "azure-cli": "2.58.0",
  "azure-cli-core": "2.58.0",
  "azure-cli-telemetry": "1.1.0",
  "extensions": {
    "account": "0.2.5",
    "azure-devops": "1.0.0"
  }
}
``` 

## 対策

以下のようなローカルコマンドを用意する。（[2024年にオライリーから本が出ると話題](https://www.publickey1.jp/blog/24/352awk_25.html)の`awk`を使用しています）

```bash
#!/bin/zsh

git config --get remote.origin.url | awk -F/ '{cmd="az repos show --open --org=https://dev.azure.com/"$5 " --project="$6 " --repository="$7}END{print cmd;system(cmd)}'
```

上記をPATHの通った `~/bin/` などへ適当な名前で配置しておくことで、簡単にターミナルで操作中のAzure DevOps Reposのリポジトリをブラウザから開けるようになりました！

私の場合は以下のようにローカルのコマンドを用意しています。azroは"AZure Repos Open"の略です。

```
$ vim ~/bin/azro
-> 上記のコマンドを貼り付け
$ chmod +x ~/bin/azro
-> 権限付与
$ azro
-> 動作確認、ブラウザ起動！
```

## 解説

簡単にコマンド解説です。

azコマンドにはもともと `az repos show --open` でブラウザを開く機能が用意されています。

> --open                     : Open the repository page in your web browser.

```bash
$ az repos show --help
This command is from the following extension: azure-devops

Command
    az repos show : Get the details of a Git repository.

Arguments
    --repository -r [Required] : Name or ID of the repository.
    --detect                   : Automatically detect organization.  Allowed values: false, true.
    --open                     : Open the repository page in your web browser.
    --org --organization       : Azure DevOps organization URL. You can configure the default
                                 organization using az devops configure -d organization=ORG_URL.
                                 Required if not configured as default or picked up via git config.
                                 Example: https://dev.azure.com/MyOrganizationName/.
    --project -p               : Name or ID of the project. You can configure the default project
                                 using az devops configure -d project=NAME_OR_ID. Required if not
                                 configured as default or picked up via git config.
```

`az repos show`コマンドに対しては以下の3パラメータを渡します。
- --org
- --project
- --repository

:::note info
`az repos show`コマンドの必須パラメタは`--repository`のみで、`--project`と`--org`はgit configureまたはdevops configureから取得するとhelpに記述がありますが、省略したところエラー

> Page not found.  Operation returned a 404 status code.

となったため敢えて指定しています。（これは私の環境が良く無いだけかもしれません...)

参考としてdevops configureは以下の様に設定します。
```
az devops configure --defaults organization=https://dev.azure.com/MyOrganization project=MyProject
```
:::



3つのパラメタに必要な情報を `git config --get remote.origin.url` から `awk` で刻んで取得しています。

具体的に`git config --get remote.origin.url`からは
> ssh//git@ssh.dev.azure.com/v3/MyOrganization/Project/Repository

のような結果がリターンされます。

これを`awk`を利用し `-F/` で'/'を区切り文字として指定し、文字列`az repos show`も整形しつつ`system`でコマンドを実行しました。


```awk
awk -F/ '{
  # 変数cmdにコマンドを組み立てる
  cmd="az repos show --open --org=https://dev.azure.com/"$5 " --project="$6 " --repository="$7
  }
  END{
    # 実行されるコマンドを一応printで表示
    print cmd;
    # 組み立てたコマンドを実行
    system(cmd)
}'
```


## 謝辞

上記は @raki からいただいた私のPostに対する以下の返信を参考に実現できました。サンキュー！！

https://x.com/raki/status/1777351235324252430

## その他

今回は簡単なローカルコマンドで実現しました。
一方 @raki の返信でコメントもありましたが、以下のFeature Requestが実装されれば`az repos show`のオプションで簡単に開ける様になるかもしれません。

https://github.com/Azure/azure-devops-cli-extension/issues/1397