From 90937265ddf1bc981363e1611b67b56ac466dc16 Mon Sep 17 00:00:00 2001 From: GigabiteStudios Date: Thu, 18 Jun 2026 20:09:58 -0500 Subject: [PATCH] feat(git): integrate Git Credential Manager --- src/managers/git_manager.cpp | 55 ++++++++++++++++++++++++++++++++++++ src/managers/git_manager.h | 1 + src/models/repository.h | 2 ++ 3 files changed, 58 insertions(+) diff --git a/src/managers/git_manager.cpp b/src/managers/git_manager.cpp index c4f8e82..187d7c4 100644 --- a/src/managers/git_manager.cpp +++ b/src/managers/git_manager.cpp @@ -434,6 +434,57 @@ bool GitManager::captureGit(RepositoryView& repository, const std::vector args = remote.empty() ? std::vector{"fetch", "--all", "--prune"} : std::vector{"fetch", remote, "--prune"}; @@ -462,6 +514,7 @@ bool GitManager::fetch(RepositoryView& repository, const std::string& remote, st } bool GitManager::pull(RepositoryView& repository, int mode, std::string& error) { + if (!prepareCredentials(repository, error)) return false; if (mode == 0) return fetch(repository, {}, error); std::vector args{"pull"}; if (mode == 1) args.push_back("--ff"); @@ -471,6 +524,7 @@ bool GitManager::pull(RepositoryView& repository, int mode, std::string& error) } bool GitManager::push(RepositoryView& repository, std::string& error) { + if (!prepareCredentials(repository, error)) return false; if (runGit(repository, {"push"}, "Push complete", error)) return true; if (repository.remotes.empty()) return false; const std::string remote = std::find(repository.remotes.begin(), repository.remotes.end(), "origin") != @@ -546,6 +600,7 @@ bool GitManager::createTag(RepositoryView& repository, const std::string& name, bool GitManager::addRemote(RepositoryView& repository, const std::string& name, const std::string& url, std::string& error) { + repository.credentials_checked = false; return runGit(repository, {"remote", "add", name, url}, "Remote added", error); } diff --git a/src/managers/git_manager.h b/src/managers/git_manager.h index dd9007f..73c57dd 100644 --- a/src/managers/git_manager.h +++ b/src/managers/git_manager.h @@ -54,6 +54,7 @@ private: void computeGraphLanes(RepositoryView& repository); bool loadRepositoryData(RepositoryView& repository, std::string& error); void loadWorkingTree(RepositoryView& repository); + bool prepareCredentials(RepositoryView& repository, std::string& error); bool runGit(RepositoryView& repository, const std::vector& arguments, const char* success_message, std::string& message, bool reload = true); }; diff --git a/src/models/repository.h b/src/models/repository.h index e3426de..8c45f81 100644 --- a/src/models/repository.h +++ b/src/models/repository.h @@ -47,6 +47,7 @@ struct RepositoryView { git_repository* repo = nullptr; git_revwalk* commit_walk = nullptr; bool history_exhausted = false; + bool credentials_checked = false; std::string path; std::string name = "New Tab"; std::string branch = "detached"; @@ -70,5 +71,6 @@ struct RepositoryView { commit_walk = nullptr; if (repo) git_repository_free(repo); repo = nullptr; + credentials_checked = false; } };