SlHelpers
Loading...
Searching...
No Matches
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
14namespace SlGit {
15
16class Repo;
17
21class Diff {
22 using GitTy = git_diff;
23 using Holder = SlHelpers::UniqueHolder<GitTy>;
24
25 friend class Repo;
26public:
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 }
58
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(); }
97private:
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}
Diff is a representation of a git diff.
Definition Diff.h:21
bool isSortedICase() const noexcept
Return true if ignore-case-sorted.
Definition Diff.h:74
GitTy * diff() const noexcept
Get the stored pointer to libgit2's git_diff.
Definition Diff.h:94
static std::optional< Diff > createFromBuffer(std::string_view buffer) noexcept
Create a new Diff from buffer.
const git_diff_delta * getDelta(size_t idx) const noexcept
Get a delta on the idx-th position.
Definition Diff.h:59
std::optional< Buf > toBuf(git_diff_format_t format) const noexcept
Convert to Buf.
int print(git_diff_format_t format, const PrintCB &printCB) const
Invoke forEachCB callbacks for each file, hunk, ... in the diff.
int forEach(const ForEachCB &forEachCB) const
Invoke forEachCB callbacks for each file, hunk, ... in the diff.
size_t numDeltas(const git_delta_t &type) const noexcept
Get count of deltas with the type (GIT_DELTA_ADDED, ...).
Definition Diff.h:55
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:28
size_t numDeltas() const noexcept
Get count of deltas in this Diff.
Definition Diff.h:53
bool findSimilar(const git_diff_find_options *options=nullptr) const noexcept
Find similar files in the Diff (in-place).
Definition Diff.h:69
The most important Git class.
Definition Repo.h:45
Callbacks for forEach().
Definition Diff.h:32
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
const std::function< int(const git_diff_delta &delta, const git_diff_binary &bin)> binary
Callback for each binary bin.
Definition Diff.h:38
const std::function< int(const git_diff_delta &delta, const git_diff_hunk &hunk)> hunk
Callback for each hunk.
Definition Diff.h:41
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
Wrapper around std::unique_ptr for easier re-definition of free.
Definition Unique.h:41