Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
glushchenko committed Dec 25, 2022
1 parent 6cd0cd7 commit dbead34
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 88 deletions.
146 changes: 71 additions & 75 deletions FSNotes/Business/Project+Git.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ extension Project {
return nil
}

let parentURL = getGitProject().url
let parentURL = getRepositoryProject().url
let relative = url.path.replacingOccurrences(of: parentURL.path, with: "")

if relative.first == "/" {
Expand All @@ -29,81 +29,105 @@ extension Project {
}

public func getGitOrigin() -> String? {
if let origin = gitOrigin, origin.count > 0 {
if let origin = getRepositoryProject().gitOrigin, origin.count > 0 {
return origin
}

let parentProject = getParent()
return nil
}

public func isRepositoryRoot(project: Project) -> Bool {
if project.isRoot {
return true
}

if parentProject.isDefault, let origin = UserDefaultsManagement.gitOrigin, origin.count > 0 {
return UserDefaultsManagement.gitOrigin
if project.isDefault {
return true
}

if let gitOrigin = parentProject.gitOrigin, gitOrigin.count > 0 {
return gitOrigin
if project.isArchive {
return true
}

return nil
if let origin = project.gitOrigin, origin.count > 0 {
return true
}

return false
}

public func getGitRepositoryUrl() -> URL {
if UserDefaultsManagement.separateRepo && !isCloudProject() {
return url.appendingPathComponent(".git", isDirectory: true)
public func getRepositoryProject() -> Project {
if isRepositoryRoot(project: self) {
return self
}

var parent = self.parent

while let unwrapedParent = parent {
if isRepositoryRoot(project: unwrapedParent) {
return unwrapedParent
}

parent = unwrapedParent.parent
}

return UserDefaultsManagement.gitStorage.appendingPathComponent(getShortSign() + " - " + label + ".git", isDirectory: true)
return self
}

public func isRepoExist() -> Bool {
let url = getGitRepositoryUrl()
return FileManager.default.directoryExists(atUrl: url)
public func getRepositoryUrl() -> URL {
let rootProject = getRepositoryProject()

if UserDefaultsManagement.separateRepo && !rootProject.isCloudProject() {
return rootProject.url.appendingPathComponent(".git", isDirectory: true)
}

let repoURL = UserDefaultsManagement.gitStorage.appendingPathComponent(getShortSign() + " - " + rootProject.label + ".git")

return repoURL
}

public func getRepository() throws -> Repository? {
if UserDefaultsManagement.separateRepo && !isCloudProject() {
return getSeparateRepository()
}

let repositoryManager = RepositoryManager()
let repoURL = UserDefaultsManagement.gitStorage.appendingPathComponent(getShortSign() + " - " + label + ".git")
let repositoryProject = getRepositoryProject()
let repoURL = getRepositoryUrl()

// Open
do {
let repository = try repositoryManager.openRepository(at: repoURL)
return repository
} catch {/*_*/}

// Prepare temporary dir
let cloneURL = UserDefaultsManagement.gitStorage.appendingPathComponent("tmp")

try? FileManager.default.removeItem(at: cloneURL)
try? FileManager.default.createDirectory(at: cloneURL, withIntermediateDirectories: true)

// Clone
if let originString = getGitOrigin(), let origin = URL(string: originString) {
let cloneURL = UserDefaultsManagement.gitStorage.appendingPathComponent("tmp")
try? FileManager.default.removeItem(at: cloneURL)

do {
let repository = try repositoryManager.cloneRepository(from: origin, at: cloneURL, authentication: getHandler())

repository.setWorkTree(path: url.path)

repository.setWorkTree(path: repositoryProject.url.path)
let dotGit = cloneURL.appendingPathComponent(".git")

if FileManager.default.directoryExists(atUrl: dotGit) {
try? FileManager.default.moveItem(at: dotGit, to: repoURL)

return try repositoryManager.openRepository(at: repoURL)
}
} catch {/*_*/}
} catch {
print("Repo clone error: \(error)")
}

return nil
}

// Init
do {
let cloneURL = UserDefaultsManagement.gitStorage.appendingPathComponent("tmp")
try? FileManager.default.createDirectory(at: cloneURL, withIntermediateDirectories: true)

let signature = Signature(name: "FSNotes App", email: "[email protected]")
let repository = try repositoryManager.initRepository(at: cloneURL, signature: signature)

repository.setWorkTree(path: url.path)
repository.setWorkTree(path: repositoryProject.url.path)

let dotGit = cloneURL.appendingPathComponent(".git")

Expand All @@ -119,43 +143,22 @@ extension Project {
return nil
}

public func getSeparateRepository() -> Repository? {
let repositoryManager = RepositoryManager()
let repoURL = url.appendingPathComponent(".git", isDirectory: true)

do {
let repository = try repositoryManager.openRepository(at: repoURL)
return repository
} catch {/*_*/}

guard let originString = getGitOrigin(), let origin = URL(string: originString) else { return nil }

let cloneURL = UserDefaultsManagement.gitStorage.appendingPathComponent("tmp")
try? FileManager.default.removeItem(at: cloneURL)

do {
_ = try repositoryManager.cloneRepository(from: origin, at: cloneURL, authentication: getHandler())
let dotGit = cloneURL.appendingPathComponent(".git")

if FileManager.default.directoryExists(atUrl: dotGit) {
try FileManager.default.moveItem(at: dotGit, to: repoURL)

return try repositoryManager.openRepository(at: repoURL)
}
} catch {
print("Clone error: \(error)")
}

return nil
}

public func isUseSeparateRepo() -> Bool {
public func useSeparateRepo() -> Bool {
return UserDefaultsManagement.separateRepo && !isCloudProject()
}

public func isCloudProject() -> Bool {
return UserDefaultsManagement.storagePath == UserDefaultsManagement.iCloudDocumentsContainer?.path
&& url.path == UserDefaultsManagement.storagePath
if UserDefaultsManagement.storagePath == UserDefaultsManagement.iCloudDocumentsContainer?.path {
if url.path == UserDefaultsManagement.storagePath {
return true
}

if getParent().isCloudDrive {
return true
}
}

return false
}

public func getHandler() -> SshKeyHandler? {
Expand Down Expand Up @@ -241,9 +244,10 @@ extension Project {

public func pull() throws {
guard let repository = try getRepository() else { return }
let repositoryProject = getRepositoryProject()

if !UserDefaultsManagement.separateRepo || isCloudProject() {
repository.setWorkTree(path: url.path)
repository.setWorkTree(path: repositoryProject.url.path)
}

let handler = getHandler()
Expand All @@ -252,17 +256,9 @@ extension Project {
let remote = repository.remotes
let origin = try remote.get(remoteName: "origin")

_ = try origin.pull(signature: sign, authentication: handler, project: self)
}

public func getGitProject() -> Project {
if isGitOriginExist() {
return self
} else {
return getParent()
}
_ = try origin.pull(signature: sign, authentication: handler, project: repositoryProject)
}

public func isGitOriginExist() -> Bool {
if let origin = gitOrigin, origin.count > 0 {
return true
Expand Down
10 changes: 1 addition & 9 deletions FSNotes/Business/Storage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -555,15 +555,7 @@ class Storage {
&& $0.showInSidebar
})
}

public func getCloudDriveProjects() -> [Project] {
return projects.filter({$0.isCloudDrive == true})
}

public func getLocalProjects() -> [Project] {
return projects.filter({$0.isCloudDrive == false})
}


public func getProjectPaths() -> [String] {
var pathList: [String] = []
let projects = getProjects()
Expand Down
4 changes: 4 additions & 0 deletions FSNotes/Helpers/FileSystemEventManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ class FileSystemEventManager {
let dirURL = URL(fileURLWithPath: event.path, isDirectory: true)
let project = self.storage.getProjectBy(url: dirURL)

guard dirURL.lastPathComponent != ".git" else {
return
}

guard !dirURL.isHidden() else {
// hide if exist and hidden (xattr "es.fsnot.hidden.dir")
if event.dirChange {
Expand Down
1 change: 1 addition & 0 deletions FSNotes/Preferences/PreferencesGitViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ class PreferencesGitViewController: NSViewController {
@IBAction func origin(_ sender: NSTextField) {
let project = Storage.sharedInstance().getDefault()
project?.gitOrigin = sender.stringValue
project?.saveSettings()

UserDefaultsManagement.gitOrigin = sender.stringValue
}
Expand Down
4 changes: 2 additions & 2 deletions FSNotes/ProjectSettingsViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ class ProjectSettingsViewController: NSViewController {
return
}

if project.isRepoExist() {
if FileManager.default.directoryExists(atUrl: project.getRepositoryUrl()) {
let alert = NSAlert()
alert.messageText = NSLocalizedString("Git repository already exists, delete it and clone again??", comment: "")
alert.informativeText = NSLocalizedString("This action cannot be undone.", comment: "")
Expand All @@ -125,7 +125,7 @@ class ProjectSettingsViewController: NSViewController {
alert.beginSheetModal(for: window) { (returnCode: NSApplication.ModalResponse) -> Void in
if returnCode == NSApplication.ModalResponse.alertFirstButtonReturn {
do {
try FileManager.default.removeItem(at: project.getGitRepositoryUrl())
try FileManager.default.removeItem(at: project.getRepositoryUrl())

ProjectSettingsViewController.cloneAndPull(project: project)
} catch {/*_*/}
Expand Down
2 changes: 1 addition & 1 deletion FSNotes/View/SidebarOutlineView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -989,7 +989,7 @@ class SidebarOutlineView: NSOutlineView,
guard let project = ViewController.shared()?.getSidebarProject() else { return }

vc.gitQueue.addOperation({
let project = project.getGitProject()
let project = project.getRepositoryProject()

do {
try project.commit()
Expand Down
2 changes: 1 addition & 1 deletion FSNotes/ViewController+Git.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ extension EditorViewController {
guard let note = getSelectedNotes()?.first, let window = self.view.window else { return }

ViewController.shared()?.gitQueue.addOperation({
let project = note.project.getGitProject()
let project = note.project.getRepositoryProject()
try? project.commit(message: commitMessage)

// No hands – no mults
Expand Down

0 comments on commit dbead34

Please sign in to comment.