gitbay/Repos/RepoSettings.swift
48 lines · 1895 bytes
1import Foundation
2
3/// `repo settings show` — admin-only view of the repo's control knobs.
4/// Every field is omitted at its zero value, so absent means default.
5nonisolated struct RepoSettings: Decodable, Sendable, Hashable {
6 let protectedBranches: [String]?
7 /// `path.Match` globs; a matching tag is created once and then
8 /// refuses moves and deletion (v1.16.0).
9 let protectedTags: [String]?
10 let requireSignedCommits: Bool?
11 let requireChecks: Bool?
12 let requireApprovals: Int?
13 let requireResolved: Bool?
14 let requireCodeowners: Bool?
15 /// Protected branches take changes through merge requests only (v1.16.0).
16 let requireMR: Bool?
17 let gitDaemon: Bool?
18 let archived: Bool?
19 let website: String?
20
21 enum CodingKeys: String, CodingKey {
22 case protectedBranches = "protected_branches"
23 case protectedTags = "protected_tags"
24 case requireMR = "require_mr"
25 case requireSignedCommits = "require_signed_commits"
26 case requireChecks = "require_checks"
27 case requireApprovals = "require_approvals"
28 case requireResolved = "require_resolved"
29 case requireCodeowners = "require_codeowners"
30 case gitDaemon = "git_daemon"
31 case archived, website
32 }
33
34 var branches: [String] { protectedBranches ?? [] }
35 var tags: [String] { protectedTags ?? [] }
36}
37
38/// One row of `repo access list`: an account and its effective role.
39/// Since v1.16.0 the row says where the access comes from — owner,
40/// direct, org admin, org member, or team; only a direct grant can be
41/// revoked here. An older server lists direct grants and says nothing.
42nonisolated struct AccessGrant: Decodable, Sendable, Hashable, Identifiable {
43 let user: String
44 let role: String
45 let source: String?
46 var id: String { user }
47 var isDirect: Bool { source == nil || source == "direct" }
48}