Skip to content

Commit

Permalink
Source control navigator history tab (#1534)
Browse files Browse the repository at this point in the history
  • Loading branch information
austincondiff authored Jan 10, 2024
1 parent 683942e commit 5b6eb0d
Show file tree
Hide file tree
Showing 15 changed files with 595 additions and 209 deletions.
48 changes: 40 additions & 8 deletions CodeEdit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
04BC1CDE2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BC1CDD2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift */; };
04C3255B2801F86400C8DA2D /* ProjectNavigatorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FEC6D27FE4B4A00E57D53 /* ProjectNavigatorViewController.swift */; };
04C3255C2801F86900C8DA2D /* ProjectNavigatorMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 285FEC7127FE4EEF00E57D53 /* ProjectNavigatorMenu.swift */; };
200412EF280F3EAC00BCAF5C /* HistoryInspectorNoHistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 200412EE280F3EAC00BCAF5C /* HistoryInspectorNoHistoryView.swift */; };
201169D72837B2E300F92B46 /* SourceControlNavigatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201169D62837B2E300F92B46 /* SourceControlNavigatorView.swift */; };
201169DB2837B34000F92B46 /* SourceControlNavigatorChangedFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201169DA2837B34000F92B46 /* SourceControlNavigatorChangedFileView.swift */; };
201169DD2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201169DC2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift */; };
Expand All @@ -40,7 +39,7 @@
20D839AE280E0CA700B27357 /* HistoryPopoverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20D839AD280E0CA700B27357 /* HistoryPopoverView.swift */; };
20EBB501280C325D00F3A5DA /* FileInspectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20EBB500280C325D00F3A5DA /* FileInspectorView.swift */; };
20EBB503280C327C00F3A5DA /* HistoryInspectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20EBB502280C327C00F3A5DA /* HistoryInspectorView.swift */; };
20EBB505280C329800F3A5DA /* HistoryInspectorItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20EBB504280C329800F3A5DA /* HistoryInspectorItemView.swift */; };
20EBB505280C329800F3A5DA /* CommitListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20EBB504280C329800F3A5DA /* CommitListItemView.swift */; };
2806E9022979588B000040F4 /* Contributor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2806E9012979588B000040F4 /* Contributor.swift */; };
2806E904297958B9000040F4 /* ContributorRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2806E903297958B9000040F4 /* ContributorRowView.swift */; };
2813F93827ECC4AA00E305E4 /* FindNavigatorResultList.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7E201B327E9989900CB86D0 /* FindNavigatorResultList.swift */; };
Expand Down Expand Up @@ -430,6 +429,11 @@
B6AB09A32AAABFEC0003A3A6 /* EditorTabBarLeadingAccessories.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6AB09A22AAABFEC0003A3A6 /* EditorTabBarLeadingAccessories.swift */; };
B6AB09A52AAAC00F0003A3A6 /* EditorTabBarTrailingAccessories.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6AB09A42AAAC00F0003A3A6 /* EditorTabBarTrailingAccessories.swift */; };
B6AB09B32AB919CF0003A3A6 /* View+actionBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6AB09B22AB919CF0003A3A6 /* View+actionBar.swift */; };
B6C4F2A12B3CA37500B2B140 /* SourceControlNavigatorHistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C4F2A02B3CA37500B2B140 /* SourceControlNavigatorHistoryView.swift */; };
B6C4F2A32B3CA74800B2B140 /* CommitDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C4F2A22B3CA74800B2B140 /* CommitDetailsView.swift */; };
B6C4F2A62B3CABD200B2B140 /* HistoryInspectorItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C4F2A52B3CABD200B2B140 /* HistoryInspectorItemView.swift */; };
B6C4F2A92B3CB00100B2B140 /* CommitDetailsHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C4F2A82B3CB00100B2B140 /* CommitDetailsHeaderView.swift */; };
B6C4F2AC2B3CC4D000B2B140 /* CommitChangedFileListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C4F2AB2B3CC4D000B2B140 /* CommitChangedFileListItemView.swift */; };
B6C6A42A297716A500A3D28F /* EditorTabCloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C6A429297716A500A3D28F /* EditorTabCloseButton.swift */; };
B6C6A42E29771A8D00A3D28F /* EditorTabButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C6A42D29771A8D00A3D28F /* EditorTabButtonStyle.swift */; };
B6C6A43029771F7100A3D28F /* EditorTabBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6C6A42F29771F7100A3D28F /* EditorTabBackground.swift */; };
Expand Down Expand Up @@ -550,7 +554,6 @@
04BA7C232AE2E7CD00584E1C /* SourceControlNavigatorSyncView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorSyncView.swift; sourceTree = "<group>"; };
04BA7C262AE2E9F100584E1C /* GitClient+Push.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GitClient+Push.swift"; sourceTree = "<group>"; };
04BC1CDD2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorFileTabCloseButton.swift; sourceTree = "<group>"; };
200412EE280F3EAC00BCAF5C /* HistoryInspectorNoHistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryInspectorNoHistoryView.swift; sourceTree = "<group>"; };
201169D62837B2E300F92B46 /* SourceControlNavigatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorView.swift; sourceTree = "<group>"; };
201169DA2837B34000F92B46 /* SourceControlNavigatorChangedFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorChangedFileView.swift; sourceTree = "<group>"; };
201169DC2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorToolbarBottom.swift; sourceTree = "<group>"; };
Expand All @@ -562,7 +565,7 @@
20D839AD280E0CA700B27357 /* HistoryPopoverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryPopoverView.swift; sourceTree = "<group>"; };
20EBB500280C325D00F3A5DA /* FileInspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileInspectorView.swift; sourceTree = "<group>"; };
20EBB502280C327C00F3A5DA /* HistoryInspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryInspectorView.swift; sourceTree = "<group>"; };
20EBB504280C329800F3A5DA /* HistoryInspectorItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryInspectorItemView.swift; sourceTree = "<group>"; };
20EBB504280C329800F3A5DA /* CommitListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommitListItemView.swift; sourceTree = "<group>"; };
28052DFB29730DE300F4F90A /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
28052DFC29730DF600F4F90A /* Alpha.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Alpha.xcconfig; sourceTree = "<group>"; };
28052DFD29730E0300F4F90A /* Beta.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Beta.xcconfig; sourceTree = "<group>"; };
Expand Down Expand Up @@ -945,6 +948,11 @@
B6AB09A22AAABFEC0003A3A6 /* EditorTabBarLeadingAccessories.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabBarLeadingAccessories.swift; sourceTree = "<group>"; };
B6AB09A42AAAC00F0003A3A6 /* EditorTabBarTrailingAccessories.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabBarTrailingAccessories.swift; sourceTree = "<group>"; };
B6AB09B22AB919CF0003A3A6 /* View+actionBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+actionBar.swift"; sourceTree = "<group>"; };
B6C4F2A02B3CA37500B2B140 /* SourceControlNavigatorHistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SourceControlNavigatorHistoryView.swift; sourceTree = "<group>"; };
B6C4F2A22B3CA74800B2B140 /* CommitDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommitDetailsView.swift; sourceTree = "<group>"; };
B6C4F2A52B3CABD200B2B140 /* HistoryInspectorItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryInspectorItemView.swift; sourceTree = "<group>"; };
B6C4F2A82B3CB00100B2B140 /* CommitDetailsHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommitDetailsHeaderView.swift; sourceTree = "<group>"; };
B6C4F2AB2B3CC4D000B2B140 /* CommitChangedFileListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommitChangedFileListItemView.swift; sourceTree = "<group>"; };
B6C6A429297716A500A3D28F /* EditorTabCloseButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabCloseButton.swift; sourceTree = "<group>"; };
B6C6A42D29771A8D00A3D28F /* EditorTabButtonStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorTabButtonStyle.swift; sourceTree = "<group>"; };
B6C6A42F29771F7100A3D28F /* EditorTabBackground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorTabBackground.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1061,6 +1069,7 @@
201169D52837B29600F92B46 /* SourceControlNavigator */ = {
isa = PBXGroup;
children = (
B66DD19E2B3C0E0C0004FFEC /* History */,
201169E02837B3D100F92B46 /* Changes */,
201169E32837B3EF00F92B46 /* Repository */,
201169DE2837B3C700F92B46 /* Views */,
Expand Down Expand Up @@ -2526,6 +2535,26 @@
path = "Preview Content";
sourceTree = "<group>";
};
B66DD19E2B3C0E0C0004FFEC /* History */ = {
isa = PBXGroup;
children = (
B66DD19F2B3C0E160004FFEC /* Views */,
);
path = History;
sourceTree = "<group>";
};
B66DD19F2B3C0E160004FFEC /* Views */ = {
isa = PBXGroup;
children = (
B6C4F2A02B3CA37500B2B140 /* SourceControlNavigatorHistoryView.swift */,
20EBB504280C329800F3A5DA /* CommitListItemView.swift */,
B6C4F2A22B3CA74800B2B140 /* CommitDetailsView.swift */,
B6C4F2A82B3CB00100B2B140 /* CommitDetailsHeaderView.swift */,
B6C4F2AB2B3CC4D000B2B140 /* CommitChangedFileListItemView.swift */,
);
path = Views;
sourceTree = "<group>";
};
B67660622AA961E900CD56B0 /* Tab */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -2566,8 +2595,7 @@
2072FA12280D74ED00C7F8D4 /* HistoryInspectorModel.swift */,
20D839AD280E0CA700B27357 /* HistoryPopoverView.swift */,
20EBB502280C327C00F3A5DA /* HistoryInspectorView.swift */,
20EBB504280C329800F3A5DA /* HistoryInspectorItemView.swift */,
200412EE280F3EAC00BCAF5C /* HistoryInspectorNoHistoryView.swift */,
B6C4F2A52B3CABD200B2B140 /* HistoryInspectorItemView.swift */,
);
path = HistoryInspector;
sourceTree = "<group>";
Expand Down Expand Up @@ -3162,6 +3190,7 @@
58A2E40C29C3975D005CB615 /* CEWorkspaceFileIcon.swift in Sources */,
587B9E8F29301D8F00AC7927 /* BitBucketUserRouter.swift in Sources */,
B66A4E5129C917D5004573B4 /* AboutWindow.swift in Sources */,
B6C4F2A62B3CABD200B2B140 /* HistoryInspectorItemView.swift in Sources */,
B65B10FE2B08B07D002852CF /* SourceControlNavigatorChangesList.swift in Sources */,
58F2EB03292FB2B0004A9BDE /* Documentation.docc in Sources */,
611192042B08CCED00D4459B /* SearchIndexer+ProgressivSearch.swift in Sources */,
Expand Down Expand Up @@ -3204,13 +3233,15 @@
581BFB672926431000D251EC /* WelcomeWindowView.swift in Sources */,
58A5DFA329339F6400D1BD5D /* CommandManager.swift in Sources */,
58798284292ED0FB0085B254 /* TerminalEmulatorView.swift in Sources */,
B6C4F2AC2B3CC4D000B2B140 /* CommitChangedFileListItemView.swift in Sources */,
6C82D6B329BFD88700495C54 /* NavigateCommands.swift in Sources */,
B66A4E4C29C9179B004573B4 /* CodeEditApp.swift in Sources */,
4E7F066629602E7B00BB3C12 /* CodeEditSplitViewController.swift in Sources */,
587B9E8D29301D8F00AC7927 /* GitHubAccount.swift in Sources */,
201169E72837B5CA00F92B46 /* SourceControlManager.swift in Sources */,
58822528292C280D00E83CDE /* StatusBarEncodingSelector.swift in Sources */,
6C7F37FE2A3EA6FA00217B83 /* View+focusedValue.swift in Sources */,
B6C4F2A12B3CA37500B2B140 /* SourceControlNavigatorHistoryView.swift in Sources */,
B6C6A43029771F7100A3D28F /* EditorTabBackground.swift in Sources */,
B60718372B170638009CDAB4 /* SourceControlNavigatorRenameBranchView.swift in Sources */,
6C578D8129CD294800DC73B2 /* ExtensionActivatorView.swift in Sources */,
Expand All @@ -3225,7 +3256,6 @@
28B8F884280FFE4600596236 /* NSTableView+Background.swift in Sources */,
6CBA0D512A1BF524002C6FAA /* SegmentedControlImproved.swift in Sources */,
58F2EB06292FB2B0004A9BDE /* KeybindingsSettings.swift in Sources */,
200412EF280F3EAC00BCAF5C /* HistoryInspectorNoHistoryView.swift in Sources */,
587B9E8E29301D8F00AC7927 /* BitBucketRepositoryRouter.swift in Sources */,
B61A606929F4481A009B43F9 /* MonospacedFontPicker.swift in Sources */,
B61DA9DF29D929E100BF4A43 /* GeneralSettingsView.swift in Sources */,
Expand Down Expand Up @@ -3392,6 +3422,7 @@
B65B11042B09DB1C002852CF /* GitClient+Fetch.swift in Sources */,
5878DA872918642F00DD95A3 /* AcknowledgementsViewModel.swift in Sources */,
B6E41C7929DE02800088F9F4 /* AccountSelectionView.swift in Sources */,
B6C4F2A92B3CB00100B2B140 /* CommitDetailsHeaderView.swift in Sources */,
B6EA1FFB29DB78F6001BF195 /* ThemeSettingsThemeDetails.swift in Sources */,
587B9E7029301D8F00AC7927 /* GitLabUser.swift in Sources */,
04660F6A27E51E5C00477777 /* CodeEditWindowController.swift in Sources */,
Expand Down Expand Up @@ -3451,7 +3482,7 @@
587B9E5A29301D8F00AC7927 /* GitCloneView.swift in Sources */,
B65B10F52B081A0C002852CF /* SourceControlAddRemoteView.swift in Sources */,
58D01C99293167DC00C5B6B4 /* String+MD5.swift in Sources */,
20EBB505280C329800F3A5DA /* HistoryInspectorItemView.swift in Sources */,
20EBB505280C329800F3A5DA /* CommitListItemView.swift in Sources */,
5878DAB2291D627C00DD95A3 /* EditorPathBarView.swift in Sources */,
04BC1CDE2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift in Sources */,
6C6BD70129CD172700235D17 /* ExtensionsListView.swift in Sources */,
Expand Down Expand Up @@ -3480,6 +3511,7 @@
B6C6A42E29771A8D00A3D28F /* EditorTabButtonStyle.swift in Sources */,
58822525292C280D00E83CDE /* StatusBarMenuStyle.swift in Sources */,
6C147C4229A328C10089B630 /* Editor.swift in Sources */,
B6C4F2A32B3CA74800B2B140 /* CommitDetailsView.swift in Sources */,
6C2C155829B4F49100EA60A5 /* SplitViewItem.swift in Sources */,
6CDA84AD284C1BA000C1CC3A /* EditorTabBarContextMenu.swift in Sources */,
6C81916729B3E80700B75C92 /* ModifierKeysObserver.swift in Sources */,
Expand Down
30 changes: 30 additions & 0 deletions CodeEdit/Features/Git/Client/GitClient+Commit.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,36 @@ extension GitClient {
return try parseUnsyncedCommitsOutput(from: output)
}

func getCommitChangedFiles(commitSHA: String) async throws -> [GitChangedFile] {
do {
let output = try await run("diff-tree --no-commit-id --name-status -r \(commitSHA)")
let data = output
.trimmingCharacters(in: .newlines)
.components(separatedBy: "\n")
return try data.compactMap { line in
let components = line.split(separator: "\t")
guard components.count == 2 else { return nil }
let changeType = String(components[0])
let pathName = String(components[1])

guard let url = URL(string: pathName ) else {
throw GitClientError.failedToDecodeURL
}

let gitType: GitType? = .init(rawValue: changeType)
let fullLink = self.directoryURL.appending(path: url.relativePath)

return GitChangedFile(
changeType: gitType,
fileLink: fullLink
)
}
} catch {
print("Error: \(error)")
return []
}
}

private func parseUnsyncedCommitsOutput(from string: String) throws -> (ahead: Int, behind: Int) {
let components = string.components(separatedBy: .newlines)
guard var abLine = components.first(where: { $0.starts(with: "# branch.ab") }) else {
Expand Down
25 changes: 19 additions & 6 deletions CodeEdit/Features/Git/Client/GitClient+CommitHistory.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,29 @@
import Foundation

extension GitClient {
// Gets the commit history log of the current file opened
// in the workspace.
func getCommitHistory(entries: Int?, fileLocalPath: String?) async throws -> [GitCommit] {
var entriesString = ""
/// Gets the commit history log for the specified branch or file
/// - Parameters:
/// - branchName: Name of the branch
/// - maxCount: Maximum amount of entries to get
/// - fileLocalPath: Optional path of file to get history for
/// - Returns: Array of git commits
func getCommitHistory(
branchName: String? = nil,
maxCount: Int? = nil,
fileLocalPath: String? = nil
) async throws -> [GitCommit] {
var branchNameString = ""
var maxCountString = ""
let fileLocalPath = fileLocalPath?.escapedWhiteSpaces() ?? ""
if let entries { entriesString = "-n \(entries)" }
if let branchName { branchNameString = "--first-parent \(branchName)" }
if let maxCount { maxCountString = "-n \(maxCount)" }
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale.current
dateFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss Z"
let output = try await run("log --pretty=%h¦%H¦%s¦%aN¦%ae¦%cn¦%ce¦%aD¦ \(entriesString) \(fileLocalPath)")
let output = try await run(
"log --pretty=%h¦%H¦%s¦%aN¦%ae¦%cn¦%ce¦%aD¦ \(maxCountString) \(branchNameString) \(fileLocalPath)"
.trimmingCharacters(in: .whitespacesAndNewlines)
)
let remote = try await run("ls-remote --get-url")
let remoteURL = URL(string: remote.trimmingCharacters(in: .whitespacesAndNewlines))

Expand Down
22 changes: 22 additions & 0 deletions CodeEdit/Features/Git/SourceControlManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,28 @@ final class SourceControlManager: ObservableObject {
}
}

/// Get all changed files for a commit
func getCommitChangedFiles(commitSHA: String) async -> [CEWorkspaceFile] {
do {
var fileDictionary = [URL: CEWorkspaceFile]()

// Process changed files
for item in try await gitClient.getCommitChangedFiles(commitSHA: commitSHA) {
fileDictionary[item.fileLink] = CEWorkspaceFile(
url: item.fileLink,
changeType: item.changeType
)
}

// TODO: Profile
let changedFiles = Array(fileDictionary.values.sorted())

return changedFiles
} catch {
return []
}
}

/// Set changed files on main actor
@MainActor
private func setChangedFiles(_ files: [CEWorkspaceFile]) {
Expand Down
Loading

0 comments on commit 5b6eb0d

Please sign in to comment.