summaryrefslogtreecommitdiff
path: root/Hutch/Models/CommitDetail.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-03-17 23:19:43 -0500
committerChristian Cleberg <[email protected]>2026-03-17 23:19:43 -0500
commit32ad6cab8d58d99ebd8a28e8fa6e6f4e587cb1e5 (patch)
treeee36d421d704e508d5617d803b4c8cbdb4804fe1 /Hutch/Models/CommitDetail.swift
parent8f2057c53e9009c2529c9c4849c914666c0e4b40 (diff)
downloadhutch-32ad6cab8d58d99ebd8a28e8fa6e6f4e587cb1e5.tar.gz
hutch-32ad6cab8d58d99ebd8a28e8fa6e6f4e587cb1e5.tar.bz2
hutch-32ad6cab8d58d99ebd8a28e8fa6e6f4e587cb1e5.zip
v1.0
Diffstat (limited to 'Hutch/Models/CommitDetail.swift')
-rw-r--r--Hutch/Models/CommitDetail.swift65
1 files changed, 65 insertions, 0 deletions
diff --git a/Hutch/Models/CommitDetail.swift b/Hutch/Models/CommitDetail.swift
new file mode 100644
index 0000000..c95199d
--- /dev/null
+++ b/Hutch/Models/CommitDetail.swift
@@ -0,0 +1,65 @@
+import Foundation
+
+/// Full commit detail returned by the revparse_single query.
+struct CommitDetail: Codable, Sendable, Identifiable {
+ let id: String
+ let shortId: String
+ let author: CommitAuthor
+ let committer: CommitAuthor
+ let message: String
+ let diff: String?
+ let trailers: [CommitTrailer]
+ let parents: [ParentCommit]
+ let tree: CommitTree?
+
+ /// First line of the commit message.
+ var title: String {
+ message.prefix(while: { $0 != "\n" }).trimmingCharacters(in: .whitespaces)
+ }
+
+ /// The commit message body (everything after the first line), if any.
+ var body: String? {
+ guard let newlineIndex = message.firstIndex(of: "\n") else { return nil }
+ let body = message[message.index(after: newlineIndex)...]
+ .trimmingCharacters(in: .whitespacesAndNewlines)
+ return body.isEmpty ? nil : body
+ }
+}
+
+struct CommitTrailer: Codable, Sendable, Identifiable {
+ var id: String { "\(name):\(value)" }
+ let name: String
+ let value: String
+}
+
+struct ParentCommit: Codable, Sendable, Identifiable, Hashable {
+ let id: String
+ let shortId: String
+ let author: ParentAuthor
+}
+
+struct ParentAuthor: Codable, Sendable, Hashable {
+ let name: String
+}
+
+struct CommitTree: Codable, Sendable {
+ let entries: CommitTreeEntries
+}
+
+struct CommitTreeEntries: Codable, Sendable {
+ let results: [CommitTreeEntry]
+ let cursor: String?
+}
+
+struct CommitTreeEntry: Codable, Sendable, Identifiable {
+ let id: String
+ let name: String
+ let mode: Int
+ let object: CommitTreeObject?
+}
+
+struct CommitTreeObject: Codable, Sendable {
+ let type: String?
+ let id: String?
+ let shortId: String?
+}