SlHelpers
Diff.h
1 // SPDX-License-Identifier: GPL-2.0-only
2 
3 #pragma once
4 
5 #include <functional>
6 
7 #include <git2.h>
8 #include <optional>
9 
10 #include "../helpers/Unique.h"
11 
12 #include "Buf.h"
13 
14 namespace SlGit {
15 
16 class Repo;
17 
21 class Diff {
22  using GitTy = git_diff;
24 
25  friend class Repo;
26 public:
28  using PrintCB = std::function<int(const git_diff_delta &delta, const git_diff_hunk *hunk,
29  const git_diff_line &line)>;
30 
32  struct ForEachCB {
34  const std::function<int(const git_diff_delta &delta,
35  float progress)> file = nullptr;
37  const std::function<int(const git_diff_delta &delta,
38  const git_diff_binary &bin)> binary = nullptr;
40  const std::function<int(const git_diff_delta &delta,
41  const git_diff_hunk &hunk)> hunk = nullptr;
43  const std::function<int(const git_diff_delta &delta, const git_diff_hunk &hunk,
44  const git_diff_line &line)> line = nullptr;
45  };
46 
47  Diff() = delete;
48 
50  static std::optional<Diff> createFromBuffer(std::string_view buffer) noexcept;
51 
53  size_t numDeltas() const noexcept { return git_diff_num_deltas(diff()); }
55  size_t numDeltas(const git_delta_t &type) const noexcept {
56  return git_diff_num_deltas_of_type(diff(), type);
57  }
59  const git_diff_delta *getDelta(size_t idx) const noexcept {
60  return git_diff_get_delta(diff(), idx);
61  }
62 
69  bool findSimilar(const git_diff_find_options *options = nullptr) const noexcept {
70  return !git_diff_find_similar(diff(), options);
71  }
72 
74  bool isSortedICase() const noexcept { return git_diff_is_sorted_icase(diff()); }
75 
81  int forEach(const ForEachCB &forEachCB) const;
88  int print(git_diff_format_t format, const PrintCB &printCB) const;
89 
91  std::optional<Buf> toBuf(git_diff_format_t format) const noexcept;
92 
94  GitTy *diff() const noexcept { return m_diff.get(); }
96  operator GitTy *() const noexcept { return diff(); }
97 private:
98  explicit Diff(GitTy *diff) noexcept : m_diff(diff) { }
99 
100  static int fileCB(const git_diff_delta *delta, float progress, void *payload);
101  static int binaryCB(const git_diff_delta *delta, const git_diff_binary *binary,
102  void *payload);
103  static int hunkCB(const git_diff_delta *delta, const git_diff_hunk *hunk, void *payload);
104  static int lineCB(const git_diff_delta *delta, const git_diff_hunk *hunk,
105  const git_diff_line *line, void *payload);
106  static int printCB(const git_diff_delta *delta, const git_diff_hunk *hunk,
107  const git_diff_line *line, void *payload);
108 
109  Holder m_diff;
110 };
111 
112 }
Definition: Blob.h:11
bool findSimilar(const git_diff_find_options *options=nullptr) const noexcept
Find similar files in the Diff (in-place)
Definition: Diff.h:69
GitTy * diff() const noexcept
Get the stored pointer to libgit2&#39;s git_diff.
Definition: Diff.h:94
int print(git_diff_format_t format, const PrintCB &printCB) const
Invoke forEachCB callbacks for each file, hunk, ... in the diff.
static std::optional< Diff > createFromBuffer(std::string_view buffer) noexcept
Create a new Diff from buffer.
const std::function< int(const git_diff_delta &delta, float progress)> file
Callback for each file (old_file and new_file in delta)
Definition: Diff.h:35
size_t numDeltas() const noexcept
Get count of deltas in this Diff.
Definition: Diff.h:53
std::optional< Buf > toBuf(git_diff_format_t format) const noexcept
Convert to Buf.
The most important Git class.
Definition: Repo.h:45
const git_diff_delta * getDelta(size_t idx) const noexcept
Get a delta on the idx-th position.
Definition: Diff.h:59
bool isSortedICase() const noexcept
Return true if ignore-case-sorted.
Definition: Diff.h:74
const std::function< int(const git_diff_delta &delta, const git_diff_hunk &hunk, const git_diff_line &line)> line
Callback for each line.
Definition: Diff.h:44
std::function< int(const git_diff_delta &delta, const git_diff_hunk *hunk, const git_diff_line &line)> PrintCB
Callback for print()
Definition: Diff.h:29
const std::function< int(const git_diff_delta &delta, const git_diff_binary &bin)> binary
Callback for each binary bin.
Definition: Diff.h:38
size_t numDeltas(const git_delta_t &type) const noexcept
Get count of deltas with the type (GIT_DELTA_ADDED, ...)
Definition: Diff.h:55
Callbacks for forEach()
Definition: Diff.h:32
int forEach(const ForEachCB &forEachCB) const
Invoke forEachCB callbacks for each file, hunk, ... in the diff.
const std::function< int(const git_diff_delta &delta, const git_diff_hunk &hunk)> hunk
Callback for each hunk.
Definition: Diff.h:41
Diff is a representation of a git diff.
Definition: Diff.h:21