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