startgit

Static page generator for git repositories
git clone git://git.dimitrijedobrota.com/startgit.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |

diff.hpp (2003B)


1 #pragma once 2 3 #include <string> 4 5 #include <git2wrap/commit.hpp> 6 #include <git2wrap/diff.hpp> 7 8 namespace startgit 9 { 10 11 struct line 12 { 13 friend class diff; 14 explicit line(const git_diff_line* lin) 15 : m_content(lin->content, lin->content_len) 16 , m_origin(lin->origin) 17 { 18 } 19 20 const std::string& get_content() const { return m_content; } 21 bool is_add() const { return m_origin == '+'; } 22 bool is_del() const { return m_origin == '-'; } 23 24 private: 25 std::string m_content; 26 char m_origin; 27 }; 28 29 struct hunk 30 { 31 friend class diff; 32 explicit hunk(const git_diff_hunk* dlt) 33 : m_ptr(*dlt) 34 { 35 } 36 37 const auto* operator->() const { return &m_ptr; } 38 const auto& get_lines() const { return m_lines; } 39 40 private: 41 git_diff_hunk m_ptr; 42 std::vector<line> m_lines; 43 }; 44 45 struct delta 46 { 47 friend class diff; 48 explicit delta(const git_diff_delta* dlt) 49 : m_ptr(*dlt) 50 { 51 } 52 const auto* operator->() const { return &m_ptr; } 53 const auto& get_hunks() const { return m_hunks; } 54 auto get_adds() const { return m_adds; } 55 auto get_dels() const { return m_dels; } 56 57 private: 58 git_diff_delta m_ptr; 59 std::vector<hunk> m_hunks; 60 uint32_t m_adds = 0; 61 uint32_t m_dels = 0; 62 }; 63 64 class diff 65 { 66 public: 67 explicit diff(const git2wrap::commit& cmmt); 68 69 std::string get_files_changed() const; 70 std::string get_insertions() const; 71 std::string get_deletions() const; 72 73 const std::vector<delta>& get_deltas() const; 74 75 private: 76 static int file_cb(const git_diff_delta* delta, 77 float progress, 78 void* payload); 79 80 static int hunk_cb(const git_diff_delta* delta, 81 const git_diff_hunk* hunk, 82 void* payload); 83 84 static int line_cb(const git_diff_delta* delta, 85 const git_diff_hunk* hunk, 86 const git_diff_line* line, 87 void* payload); 88 89 git2wrap::diff m_diff; 90 git2wrap::diff_stats m_stats; 91 92 mutable std::vector<delta> m_deltas; 93 }; 94 95 } // namespace startgit