28#include <git2/sys/merge.h>
49 git_merge_driver base;
55std::mutex g_registryMutex;
56std::map<std::string, MERGE_APPLY_FN> g_appliers;
57std::map<std::string, std::unique_ptr<KICAD_DRIVER>> g_drivers;
59int trampolineApply( git_merge_driver* aSelf,
const char** aPathOut, uint32_t* aModeOut,
60 git_buf* aMergedOut,
const char* ,
61 const git_merge_driver_source* aSrc )
63 KICAD_DRIVER* driver =
reinterpret_cast<KICAD_DRIVER*
>( aSelf );
65 if( !driver || !driver->apply )
68 unsigned int mode = 0;
69 int rc = driver->apply( aSrc, aPathOut, &mode, aMergedOut );
82 if( !aName || !aApply )
85 std::lock_guard<std::mutex> lock( g_registryMutex );
87 std::string
name( aName );
89 if( g_appliers.count(
name ) )
92 auto driver = std::make_unique<KICAD_DRIVER>();
93 driver->base.version = GIT_MERGE_DRIVER_VERSION;
94 driver->base.initialize =
nullptr;
95 driver->base.shutdown =
nullptr;
96 driver->base.apply = trampolineApply;
98 driver->apply = aApply;
100 int rc = git_merge_driver_register( driver->name.c_str(),
101 reinterpret_cast<git_merge_driver*
>( driver.get() ) );
105 wxLogTrace(
traceGit,
"git_merge_driver_register('%s') failed: %s",
110 g_appliers[
name] = aApply;
111 g_drivers[
name] = std::move( driver );
static wxString GetLastGitError()
const wxChar *const traceGit
Flag to enable Git debugging output.
int(*)(const git_merge_driver_source *src, const char ** path_out, unsigned int * mode_out, git_buf * merged_out) MERGE_APPLY_FN
Signature for a KiCad merge-driver apply function.
bool RegisterMergeDriver(const char *aName, MERGE_APPLY_FN aApply)
Register a KiCad merge driver with libgit2.
wxLogTrace helper definitions.