Add a C++ rpmdb-diff API wrapping the C one, bind in Rust

I'd like to compute diffs in apply-live to differentiate
between "pure layering" versus modifications/removals.
This commit is contained in:
Colin Walters 2021-02-12 22:24:33 +00:00 committed by OpenShift Merge Robot
parent 29a2304fe2
commit 1d242ddb59
4 changed files with 128 additions and 0 deletions

View File

@ -42,6 +42,7 @@ librpmostreepriv_sources = \
src/libpriv/rpmostree-refsack.cxx \
src/libpriv/rpmostree-rpm-util.cxx \
src/libpriv/rpmostree-rpm-util.h \
src/libpriv/rpmostree-diff.cxx \
src/libpriv/rpmostree-importer.cxx \
src/libpriv/rpmostree-importer.h \
src/libpriv/rpmostree-unpacker-core.cxx \

View File

@ -265,6 +265,15 @@ pub mod ffi {
fn main_print_error(msg: &str);
}
unsafe extern "C++" {
include!("rpmostree-diff.hpp");
type RPMDiff;
fn n_removed(&self) -> i32;
fn n_added(&self) -> i32;
fn n_modified(&self) -> i32;
dest: &CxxString,
}
unsafe extern "C++" {
include!("rpmostree-output.h");
type Progress;

View File

@ -0,0 +1,61 @@
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2 of the licence or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <memory>
#include "rpmostree-diff.hpp"
#include "rpmostree-db.h"
#include "rpmostree-util.h"
namespace rpmostreecxx {
RPMDiff::RPMDiff(GPtrArray *removed, GPtrArray *added, GPtrArray *modified_old, GPtrArray *modified_new) {
removed_ = g_ptr_array_ref(removed);
added_ = g_ptr_array_ref(added);
modified_old_ = g_ptr_array_ref(modified_old);
modified_new_ = g_ptr_array_ref(modified_new);
}
RPMDiff::~RPMDiff() {
g_ptr_array_unref(removed_);
g_ptr_array_unref(added_);
g_ptr_array_unref(modified_old_);
g_ptr_array_unref(modified_new_);
}
std::unique_ptr<RPMDiff>
rpmdb_diff(OstreeRepo &repo, const std::string &from, const std::string &to) {
g_autoptr(GPtrArray) removed = NULL;
g_autoptr(GPtrArray) added = NULL;
g_autoptr(GPtrArray) modified_old = NULL;
g_autoptr(GPtrArray) modified_new = NULL;
g_autoptr(GError) local_error = NULL;
if (!rpm_ostree_db_diff(&repo, from.c_str(), to.c_str(),
&removed, &added, &modified_old, &modified_new,
NULL, &local_error))
util::throw_gerror(local_error);
return std::make_unique<RPMDiff>(removed, added, modified_old, modified_new);
}
void
RPMDiff::print() const
{
rpmostree_diff_print_formatted (RPMOSTREE_DIFF_PRINT_FORMAT_FULL_MULTILINE, NULL, 0,
removed_, added_, modified_old_, modified_new_);
}
} /* namespace */

View File

@ -0,0 +1,57 @@
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2 of the licence or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
#pragma once
#include <string>
#include <exception>
#include <sstream>
#include <memory>
#include <ostree.h>
#include "rust/cxx.h"
namespace rpmostreecxx {
class RPMDiff final {
public:
int n_removed() const {
return removed_->len;
}
int n_added() const {
return added_->len;
}
int n_modified() const {
return modified_old_->len + modified_new_->len;
}
~RPMDiff();
RPMDiff(GPtrArray *removed, GPtrArray *added, GPtrArray *modified_old, GPtrArray *modified_new);
// TODO(cgwalters) enhance this with options
void print() const;
private:
GPtrArray *removed_;
GPtrArray *added_;
GPtrArray *modified_old_;
GPtrArray *modified_new_;
};
std::unique_ptr<RPMDiff> rpmdb_diff(OstreeRepo &repo, const std::string &src, const std::string &dest);
} /* namespace */