repos
repos カテゴリの 16 個の API 操作をカバーします。
| メソッド | パス | 説明 |
|---|---|---|
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/repos | プロジェクトのリポジトリ一覧(runlot repo list) |
| POST | /v1/orgs/{orgSlug}/projects/{projectName}/repos | リポジトリを作成します(runlot repo create) |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName} | 単一のリポジトリ |
| PATCH | /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName} | 名前、可視性、またはデフォルトブランチを変更します(runlot repo rename|visibility) |
| DELETE | /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName} | リポジトリを削除します(runlot repo delete) |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}/ref-updates | Ref 履歴(runlot repo history) |
| GET | /v1/me/ssh-keys | 自分の SSH 公開鍵(runlot key list) |
| POST | /v1/me/ssh-keys | SSH 公開鍵を登録します(runlot key add) |
| DELETE | /v1/me/ssh-keys/{keyId} | SSH 公開鍵を削除します(runlot key rm) |
| GET | /v1/me/tokens | 自分のアクセストークン(runlot token list) |
| POST | /v1/me/tokens | アクセストークンを発行します(runlot token create) |
| DELETE | /v1/me/tokens/{tokenId} | アクセストークンを失効させます(runlot token revoke) |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}/refs | ブランチとタグ(ダッシュボード閲覧) |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}/tree | 単一のディレクトリ(ダッシュボード閲覧) |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}/blob | 単一のファイル(ダッシュボード閲覧) |
| GET | /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}/commits | コミットログ(ダッシュボード閲覧) |
GET /v1/orgs/{orgSlug}/projects/{projectName}/repos
viewer 以上が必要です。
リポジトリはプロジェクトに属します(docs/git-hosting.md §19)。認可は組織のロールに由来します — プロジェクト自体にはロールがありません — が、名前の一意性と一覧はプロジェクト単位です。1 つのプロジェクトは複数のリポジトリ(アプリ、API、インフラ)を持つことができます。
operationId listRepos
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 200 | リポジトリ一覧 | object |
| 403 | — | — |
| 404 | — | — |
POST /v1/orgs/{orgSlug}/projects/{projectName}/repos
member 以上が必要です。repo.create として監査記録されます。
ディスク上には何も作成しません(docs/git-hosting.md §10)。行を1つ挿入するだけで、node-gitが初回アクセス時にリポジトリディレクトリを作成します。そのため、gitノードがダウンしていてもこの呼び出しは成功します。
operationId createRepo
リクエストボディ: application/json ・ object
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 201 | 作成されたリポジトリ | Repo |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 409 | このプロジェクトには同じ名前のリポジトリが既に存在します(repo_exists) | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}
単一のリポジトリ
operationId getRepo
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 200 | リポジトリ | Repo |
| 403 | — | — |
| 404 | — | — |
PATCH /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}
管理者権限が必要です。repo.updateとして監査されます。
名前の変更はディスクに影響しません(§7.1 — パスに名前は含まれません)。プッシュの実行中に名前が変更されても、そのプッシュは中断されません。
operationId updateRepo
リクエストボディ: application/json ・ object
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 204 | 変更済み | — |
| 400 | — | — |
| 403 | — | — |
| 404 | — | — |
| 409 | その名前のリポジトリは既に存在します(repo_exists) | Error |
DELETE /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}
管理者権限が必要です。repo.deleteとして監査されます。
これはソフトデリートです(§7.4)。URLからは即座に消えますが、ディスク上のコピーは保持期間の経過後に削除されます。不可逆な削除は常に最後に行われ、取り消し可能な猶予期間が必ず設けられます。
operationId deleteRepo
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 204 | 削除済み | — |
| 403 | — | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}/ref-updates
閲覧者以上の権限が必要です。直近200件のエントリです。
これは監査ログのコピーではなく、リポジトリの履歴そのものです(§6.1)。oldは、force-pushで失われたコミットを復元するための唯一の手がかりです。
operationId listRefUpdates
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 200 | Ref履歴 | object |
| 403 | — | — |
| 404 | — | — |
GET /v1/me/ssh-keys
自分の SSH 公開鍵(runlot key list)
operationId listSSHKeys
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 200 | キー一覧 | object |
POST /v1/me/ssh-keys
フィンガープリントはグローバルに一意です(§5.3)。鍵そのものがアイデンティティであるため、重複するとアイデンティティが曖昧になります — 登録順序にアイデンティティが依存する認証は、認証とは呼べません。既に登録済みの鍵は409 ssh_key_existsを返します。
許可される鍵種別: ed25519、ecdsa-sha2-nistp256/384/521、rsa(2048ビット以上)。DSAは拒否されます。
operationId addSSHKey
リクエストボディ: application/json ・ object
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 201 | 登録された鍵 | SSHKey |
| 400 | — | — |
| 409 | 公開鍵は既に登録済みです(ssh_key_exists) | Error |
DELETE /v1/me/ssh-keys/{keyId}
認可キャッシュをバイパスします(§5.4)。鍵の削除機能があるのは、まさに今すぐブロックしたいからであり、TTLの経過を待たせるとこの機能は意味をなさなくなります。
operationId deleteSSHKey
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 204 | 削除済み | — |
| 404 | — | — |
GET /v1/me/tokens
平文はどこにも存在しません。保存されるのはハッシュのみです(§5.2)。
operationId listAccessTokens
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 200 | トークン一覧 | object |
POST /v1/me/tokens
**平文はこのレスポンスで一度だけ返されます。**再度参照することはできません。
gitはHTTPS経由でBasic認証を送信します。ユーザー名は無視され、パスワードフィールド内のトークンのみが参照されます(§5.2)。プレフィックスrunlot_pat_は固定です — 漏洩スキャンを機能させるには、リポジトリやログ、ペーストの中で機械的に検出できる必要があります。
operationId createAccessToken
リクエストボディ: application/json ・ object
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 201 | 発行されたトークン(平文を含む) | AccessTokenCreated |
| 400 | — | — |
DELETE /v1/me/tokens/{tokenId}
行を削除する代わりにrevokedAtを設定します — 削除してしまうと「このトークンがどれだけの期間有効だったか」に答える手段がなくなります。認可キャッシュをバイパスします(§5.4)。
operationId revokeAccessToken
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 204 | 破棄済み | — |
| 404 | — | — |
GET /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}/refs
viewer 以上が必要です。
ブラウジングはダッシュボードセッションで認証され、git転送はPATまたはSSHで認証されます(docs/git-hosting.md §12.2)。両方の認証を1つの経路に同居させると、そのプロセスはセッションCookieも扱う必要が生じ、CSRFの影響範囲がリポジトリへの書き込みにまで広がってしまいます。そのためダッシュボードはこのパスを経由し、cp-publicがnode-gitの内部読み取り経路に中継します — 認可はここで完結します。
operationId getRepoRefs
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 200 | Refの一覧 | RepoRefs |
| 403 | — | — |
| 404 | — | — |
| 503 | gitノードが存在しないか到達できません(git_unavailable、git_unreachable) | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}/tree
閲覧者以上の権限が必要です。pathが空の場合はルートを指します。
1000件で切り詰められます — 上限のないブラウジングは、単一のリポジトリがダッシュボードを停止させる手段になり得ます。切り詰められた場合、truncatedはtrueになります。
ツリーの外に出るパス(a/../..)は404を返します。..を黙って取り除くと、要求されたものとは異なるパスが返されてしまいます。
operationId getRepoTree
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 200 | ディレクトリ | RepoTree |
| 403 | — | — |
| 404 | リポジトリ、ref、またはパスが存在しません(no_ref・no_path) | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}/blob
viewer 以上が必要です。
1 MiBを超えるコンテンツは含まれません(tooLarge)。読み込んでから切り詰めるのではなく、そもそも読み込みません — 一度読み込んでしまえば、その時点でメモリは既に消費されています。バイナリファイルもコンテンツを含みません(binary)。
operationId getRepoBlob
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 200 | ファイル | RepoBlob |
| 403 | — | — |
| 404 | リポジトリ、ref、またはパスが存在しません(no_ref・no_path) | Error |
GET /v1/orgs/{orgSlug}/projects/{projectName}/repos/{repoName}/commits
閲覧者以上の権限が必要です。デフォルトは200件、最大200件です。
operationId getRepoCommits
| パラメーター | 場所 | 必須 | 型 | 説明 |
|---|---|---|---|---|
limit | query | 不可 | integer | — |
| ステータスコード | 説明 | レスポンスボディ |
|---|---|---|
| 200 | コミット一覧 | object |
| 403 | — | — |
| 404 | — | — |