From 6a6af78512f64f118f239a51ea810bb35da67eb7 Mon Sep 17 00:00:00 2001 From: Marcus Reid Date: Sun, 6 Sep 2015 07:38:29 -0700 Subject: [PATCH] Add current stashes to response. --- README.md | 10 ++++++ src/GitStatusCache/src/Git.cpp | 37 +++++++++++++++++++++ src/GitStatusCache/src/Git.h | 14 ++++++++ src/GitStatusCache/src/StatusController.cpp | 18 ++++++++++ 4 files changed, 79 insertions(+) diff --git a/README.md b/README.md index a0b3c24..f203858 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,16 @@ Retrieves current status information for the requested "Path". "WorkingUnreadable": [], "Ignored": [], "Conflicted": [] + "Stashes" : [{ + "Name" : "stash@{0}", + "Sha1Id" : "e24d59d0d03a3f680def647a7bb62f027d8671c", + "Message" : "On master: Second stash!" + }, { + "Name" : "stash@{1}", + "Sha1Id" : "0cbabd043bae55a76c3c041e6db2b129a0a4872", + "Message" : "On master: My stash." + } + ] } ### GetCacheStatistics ### diff --git a/src/GitStatusCache/src/Git.cpp b/src/GitStatusCache/src/Git.cpp index 108dac4..b1e570c 100644 --- a/src/GitStatusCache/src/Git.cpp +++ b/src/GitStatusCache/src/Git.cpp @@ -443,6 +443,42 @@ bool Git::GetFileStatus(Git::Status& status, UniqueGitRepository& repository) return true; } +bool Git::GetStashList(Status& status, UniqueGitRepository& repository) +{ + std::vector stashes; + auto result = git_stash_foreach( + repository.get(), + [](size_t index, const char* message, const git_oid *stash_id, void *payload) + { + if (payload == nullptr) + return -1; + + char hashBuffer[40] = { 0 }; + Stash stash; + stash.Sha1Id = std::string(git_oid_tostr(hashBuffer, _countof(hashBuffer), stash_id)); + stash.Index = index; + stash.Message = std::string(message); + + auto payloadAsStashes = reinterpret_cast*>(payload); + payloadAsStashes->emplace_back(std::move(stash)); + return 0; + }, + &stashes); + + if (result != GIT_OK) + { + auto lastError = giterr_last(); + Log("Git.GetStashList.FailedToRetrieveStashList", Severity::Error) + << R"(Failed to retrieve stash list. { "repositoryPath": ")" << status.RepositoryPath + << R"(", "result": ")" << ConvertErrorCodeToString(static_cast(result)) + << R"(", "lastError": ")" << (lastError == nullptr ? "null" : lastError->message) << R"(" })"; + return false; + } + + status.Stashes = std::move(stashes); + return true; +} + std::tuple Git::DiscoverRepository(const std::string& path) { Git::Status status; @@ -486,6 +522,7 @@ std::tuple Git::GetStatus(const std::string& path) Git::GetWorkingDirectory(status, repository); Git::GetRepositoryState(status, repository); Git::GetRefStatus(status, repository); + Git::GetStashList(status, repository); if (!Git::GetFileStatus(status, repository)) return std::make_tuple(false, Git::Status()); diff --git a/src/GitStatusCache/src/Git.h b/src/GitStatusCache/src/Git.h index e8a776f..3608212 100644 --- a/src/GitStatusCache/src/Git.h +++ b/src/GitStatusCache/src/Git.h @@ -7,6 +7,13 @@ class Git { public: + struct Stash + { + uint64_t Index; + std::string Sha1Id; + std::string Message; + }; + struct Status { std::string RepositoryPath; @@ -33,6 +40,8 @@ class Git std::vector Ignored; std::vector Conflicted; + + std::vector Stashes; }; private: @@ -82,6 +91,11 @@ class Git */ bool GetFileStatus(Status& status, UniqueGitRepository& repository); + /** + * Retrieves information about stashes and updates status. + */ + bool GetStashList(Status& status, UniqueGitRepository& repository); + public: Git(); ~Git(); diff --git a/src/GitStatusCache/src/StatusController.cpp b/src/GitStatusCache/src/StatusController.cpp index 1ca9609..8ad38a2 100644 --- a/src/GitStatusCache/src/StatusController.cpp +++ b/src/GitStatusCache/src/StatusController.cpp @@ -163,6 +163,24 @@ std::string StatusController::GetStatus(const rapidjson::Document& document, con AddArrayToJson(writer, "Ignored", statusToReport.Ignored); AddArrayToJson(writer, "Conflicted", statusToReport.Conflicted); + writer.String("Stashes"); + writer.StartArray(); + for (const auto& value : statusToReport.Stashes) + { + writer.StartObject(); + writer.String("Name"); + std::string name = "stash@{"; + name += std::to_string(value.Index); + name += "}"; + writer.String(name.c_str()); + writer.String("Sha1Id"); + writer.String(value.Sha1Id.c_str()); + writer.String("Message"); + writer.String(value.Message.c_str()); + writer.EndObject(); + } + writer.EndArray(); + writer.EndObject(); return buffer.GetString();