Skip to content

Commit 21fb8e9

Browse files
authored
Merge pull request #101 from github/joshmgross/repo-permissions
Add repository permissions to repo context
2 parents 6dbeb38 + cb5c009 commit 21fb8e9

2 files changed

Lines changed: 34 additions & 3 deletions

File tree

src/git/repository-permissions.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
export type RepositoryPermission = "admin" | "write" | "read";
2+
3+
// https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#get-a-repository
4+
// This should always be set for authenticated requests
5+
type RepositoryPermissionResponse = {
6+
admin: boolean;
7+
maintain?: boolean;
8+
push: boolean;
9+
triage?: boolean;
10+
pull: boolean;
11+
};
12+
13+
export function getRepositoryPermission(permissions: RepositoryPermissionResponse | undefined): RepositoryPermission {
14+
return permissions?.admin ? "admin" : permissions?.push ? "write" : "read";
15+
}
16+
17+
export function hasAdminPermission(permission: RepositoryPermission): boolean {
18+
return permission === "admin";
19+
}
20+
21+
export function hasWritePermission(permission: RepositoryPermission): boolean {
22+
return permission === "admin" || permission === "write";
23+
}

src/git/repository.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import * as vscode from "vscode";
22
import {Octokit} from "@octokit/rest";
33

44
import {handleSamlError} from "../api/handleSamlError";
5+
import {getSession} from "../auth/auth";
56
import {getRemoteName} from "../configuration/configuration";
67
import {Protocol} from "../external/protocol";
78
import {logDebug, logError} from "../log";
89
import {API, GitExtension, RefType, RepositoryState} from "../typings/git";
910
import {canReachGitHubAPI} from "../util";
11+
import {RepositoryPermission, getRepositoryPermission} from "./repository-permissions";
1012

1113
interface GitHubUrls {
1214
workspaceUri: vscode.Uri;
@@ -127,13 +129,14 @@ export interface GitHubRepoContext {
127129
name: string;
128130

129131
organizationOwned: boolean;
130-
131132
defaultBranch: string;
133+
permissionLevel: RepositoryPermission;
132134
}
133135

134136
export interface GitHubContext {
135137
repos: GitHubRepoContext[];
136138
reposByUri: Map<string, GitHubRepoContext>;
139+
username: string;
137140
}
138141

139142
let gitHubContext: Promise<GitHubContext | undefined> | undefined;
@@ -159,6 +162,9 @@ export async function getGitHubContext(): Promise<GitHubContext | undefined> {
159162

160163
logDebug("Found protocol infos", protocolInfos.length.toString());
161164

165+
const session = await getSession();
166+
const username = session.account.label;
167+
162168
const repos = await handleSamlError(async (client: Octokit) => {
163169
return await Promise.all(
164170
protocolInfos.map(async (protocolInfo): Promise<GitHubRepoContext> => {
@@ -179,15 +185,17 @@ export async function getGitHubContext(): Promise<GitHubContext | undefined> {
179185
owner: protocolInfo.protocol.owner,
180186
id: repoInfo.data.id,
181187
defaultBranch: `refs/heads/${repoInfo.data.default_branch}`,
182-
organizationOwned: repoInfo.data.owner.type === "Organization"
188+
organizationOwned: repoInfo.data.owner.type === "Organization",
189+
permissionLevel: getRepositoryPermission(repoInfo.data.permissions)
183190
};
184191
})
185192
);
186193
});
187194

188195
gitHubContext = Promise.resolve({
189196
repos,
190-
reposByUri: new Map(repos.map(r => [r.workspaceUri.toString(), r]))
197+
reposByUri: new Map(repos.map(r => [r.workspaceUri.toString(), r])),
198+
username
191199
});
192200
} catch (e) {
193201
// Reset the context so the next attempt will try this flow again

0 commit comments

Comments
 (0)