#include #include #include #include extern "C" { #include } #include "git.h" #include "passphraseprovider.h" Git::Git() { git_libgit2_init(); }; Git::~Git() { git_libgit2_shutdown(); }; bool Git::clone(QUrl url, QString dir_out_path) { auto ret = false; auto tmp_dir_path = QStandardPaths::writableLocation( QStandardPaths::CacheLocation).append("/clone"); auto gitCred = new UTGitCredProvider(); pt2cred_acquire_cb = gitCred->cred_acquire_cb; QDir tmp_dir(tmp_dir_path); tmp_dir.removeRecursively(); git_repository *cloned_repo = NULL; git_clone_options clone_opts = GIT_CLONE_OPTIONS_INIT; git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; clone_opts.checkout_opts = checkout_opts; clone_opts.fetch_opts.callbacks.credentials = gitCred->*pt2cred_acquire_cb; qDebug() << "Cloning " << url << " in " << tmp_dir_path; auto error = git_clone(&cloned_repo, url.toString().toLocal8Bit().constData(), tmp_dir_path.toLocal8Bit().constData(), &clone_opts); if (cloned_repo) { git_repository_free(cloned_repo); } if(error) { const git_error *err = giterr_last(); if (err) { qDebug() << "ERROR " << err->klass << ": " << err->message; } else { qDebug() << "ERROR " << error << ": no detailed info"; } } else { qDebug() << "Removing destination"; QDir dir_out(dir_out_path); dir_out.removeRecursively(); qDebug() << "Moving cloned dir to destination"; QDir dir; qDebug() << tmp_dir_path << " to " << dir_out_path; ret = dir.rename(tmp_dir_path, dir_out_path); } tmp_dir.removeRecursively(); delete gitCred; return !error and ret; }