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)


0 #pragma once
2 #include <string>
4 #include <git2wrap/commit.hpp>
5 #include <git2wrap/diff.hpp>
7 namespace startgit
8 {
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 }
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 == '-'; }
23 private:
24 std::string m_content;
25 char m_origin;
26 };
28 struct hunk
29 {
30 friend class diff;
31 explicit hunk(const git_diff_hunk* dlt)
32 : m_ptr(*dlt)
33 {
34 }
36 const auto* operator->() const { return &m_ptr; }
37 const auto& get_lines() const { return m_lines; }
39 private:
40 git_diff_hunk m_ptr;
41 std::vector<line> m_lines;
42 };
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; }
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 };
63 class diff
64 {
65 public:
66 explicit diff(const git2wrap::commit& cmmt);
68 std::string get_files_changed() const;
69 std::string get_insertions() const;
70 std::string get_deletions() const;
72 const std::vector<delta>& get_deltas() const;
74 private:
75 static int file_cb(const git_diff_delta* delta,
76 float progress,
77 void* payload);
79 static int hunk_cb(const git_diff_delta* delta,
80 const git_diff_hunk* hunk,
81 void* payload);
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);
88 git2wrap::diff m_diff;
89 git2wrap::diff_stats m_stats;
91 mutable std::vector<delta> m_deltas;
92 };
94 } // namespace startgit