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 (1904B)
    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(
             76       const git_diff_delta* delta, float progress, void* payload
             77   );
          
             79   static int hunk_cb(
             80       const git_diff_delta* delta, const git_diff_hunk* hunk, void* payload
             81   );
          
             83   static int line_cb(
             84       const git_diff_delta* delta,
             85       const git_diff_hunk* hunk,
             86       const git_diff_line* line,
             87       void* payload
             88   );
          
             90   git2wrap::diff m_diff;
             91   git2wrap::diff_stats m_stats;
          
             93   mutable std::vector<delta> m_deltas;
             94 };
          
             96 }  // namespace startgit