Skip to content

Commit

Permalink
[api] add function to get snapshot's units. Fixes MER#1184
Browse files Browse the repository at this point in the history
Signed-off-by: Denis Zalevskiy <denis.zalevskiy@jolla.com>
  • Loading branch information
Denis Zalevskiy committed Sep 11, 2015
1 parent 95aef76 commit 786c693
Show file tree
Hide file tree
Showing 7 changed files with 140 additions and 30 deletions.
3 changes: 2 additions & 1 deletion include/vault/vault.hpp
Expand Up @@ -28,7 +28,7 @@ class Snapshot
{
public:
explicit Snapshot(const Gittin::Tag &commit);

explicit Snapshot(Gittin::Repo *repo, const QString &name);
inline Gittin::Tag tag() const { return m_tag; }

QString name() const;
Expand Down Expand Up @@ -73,6 +73,7 @@ class Vault
bool clear(const QVariantMap &options);

QList<Snapshot> snapshots() const;
QList<QString> units(QString const & snapshotName) const;
Snapshot snapshot(const QByteArray &tag) const;
QString notes(const QString &snapshotName);

Expand Down
1 change: 1 addition & 0 deletions qml/Vault/plugin.cpp
Expand Up @@ -17,6 +17,7 @@ class VaultPlugin : public QQmlExtensionPlugin
{
Q_ASSERT(QLatin1String(uri) == QLatin1String("NemoMobile.Vault"));
qmlRegisterType<Vault>(uri, 1, 0, "Vault");
qmlRegisterType<Vault>(uri, 1, 1, "Vault");
}

void initializeEngine(QQmlEngine *engine, const char *uri)
Expand Down
51 changes: 46 additions & 5 deletions qml/Vault/vault.cpp
Expand Up @@ -18,6 +18,9 @@ static const int _vault_operation_ __attribute__((unused))
Q_DECLARE_METATYPE(Vault::ImportExportAction)
static const int _vault_importexportaction_ __attribute__((unused))
= qRegisterMetaType<Vault::ImportExportAction>();
Q_DECLARE_METATYPE(Vault::DataType)
static const int _vault_datatype__ __attribute__((unused))
= qRegisterMetaType<Vault::DataType>();

class Worker : public QObject
{
Expand Down Expand Up @@ -158,10 +161,44 @@ class Worker : public QObject
emit done(Vault::RemoveSnapshot, QVariantMap());
}

QVariantMap units()
{
QVariantMap res;
for (auto &u: m_vault->config().units())
res.insert(u.name(), u.data());

return res;
}

Q_INVOKABLE void requestData(Vault::DataType dataType
, QVariantMap const &context)
{
try {
if (dataType == Vault::SnapshotUnits) {
auto snapshotName = str(context["snapshot"]);
auto reply = context;
auto unitNames = m_vault->units(snapshotName).toSet();
auto allUnits = units();
for (auto it = allUnits.begin(); it != allUnits.end(); ++it) {
auto info = it.value().toMap();
info["snapshot"] = unitNames.contains(it.key()) ? snapshotName : "";
it.value() = info;
}
reply["units"] = allUnits;
emit data(dataType, reply);
}
} catch (error::Error const &e) {
emit error(Vault::Data, e.m);
} catch (...) {
emit error(Vault::Data, map({{"Exception", "unknown"}}));
}
}

signals:
void progress(Vault::Operation op, const QVariantMap &map);
void error(Vault::Operation op, const QVariantMap &error);
void done(Vault::Operation op, const QVariantMap &);
void data(Vault::DataType id, const QVariantMap &data);

public:
vault::Vault *m_vault;
Expand Down Expand Up @@ -223,6 +260,7 @@ void Vault::initWorker(bool reload)
connect(m_worker, &Worker::progress, this, &Vault::progress);
connect(m_worker, &Worker::error, this, &Vault::error);
connect(m_worker, &Worker::done, this, &Vault::done);
connect(m_worker, &Worker::data, this, &Vault::data);
}
try {
m_worker->init(m_root);
Expand Down Expand Up @@ -271,11 +309,7 @@ QStringList Vault::snapshots() const

QVariantMap Vault::units() const
{
QVariantMap units;
for (auto &u: m_worker->m_vault->config().units()) {
units.insert(u.name(), u.data());
}
return units;
return m_worker->units();
}

void Vault::resetHead()
Expand Down Expand Up @@ -322,4 +356,11 @@ void Vault::startGc()
debug::error("Can't start vault-gc.service");
}

void Vault::requestData(DataType dataType, QVariantMap const &context)
{
QMetaObject::invokeMethod(m_worker, "requestData"
, Q_ARG(Vault::DataType, dataType)
, Q_ARG(QVariantMap, context));
}

#include "vault.moc"
11 changes: 10 additions & 1 deletion qml/Vault/vault.hpp
Expand Up @@ -27,10 +27,16 @@ class Vault : public QObject
Restore,
RemoveSnapshot,
ExportImportPrepare,
ExportImportExecute
ExportImportExecute,
Data
}
Q_ENUMS(Operation);

enum DataType {
SnapshotUnits
}
Q_ENUMS(DataType);

explicit Vault(QObject *parent = nullptr);
~Vault();

Expand All @@ -53,6 +59,7 @@ class Vault : public QObject

Q_INVOKABLE void registerUnit(const QJSValue &unit, bool global);
Q_INVOKABLE void startGc();
Q_INVOKABLE void requestData(DataType, QVariantMap const &);

signals:
void rootChanged();
Expand All @@ -62,6 +69,8 @@ class Vault : public QObject
void progress(Operation operation, const QVariantMap &data);
void error(Operation operation, const QVariantMap &error);

void data(DataType id, const QVariantMap &context);

private:
void initWorker(bool reload);

Expand Down
74 changes: 53 additions & 21 deletions src/vault.cpp
Expand Up @@ -18,13 +18,16 @@
#include <gittin/commit.hpp>
#include <gittin/branch.hpp>
#include <gittin/repostatus.hpp>
#include <gittin/command.hpp>

#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QDateTime>
#include <QDir>

#include <tuple>

namespace os = qtaround::os;
namespace subprocess = qtaround::subprocess;
namespace error = qtaround::error;
Expand Down Expand Up @@ -59,6 +62,11 @@ Snapshot::Snapshot(const Gittin::Tag &tag)
{
}

Snapshot::Snapshot(Gittin::Repo *repo, const QString &name)
: m_tag(repo, QString(">") + name)
{
}

QString Snapshot::name() const
{
return m_tag.name().mid(1);
Expand All @@ -69,8 +77,6 @@ void Snapshot::remove()
m_tag.destroy();
}



Vault::Vault(const QString &path)
: m_path(path)
, m_blobStorage(os::path::join(path, ".git", "blobs"))
Expand Down Expand Up @@ -111,6 +117,18 @@ bool Vault::UnitPath::exists() const
return os::path::isDir(path);
}

template <typename ... Args>
std::tuple<int, QString, QString> executeIn
(QString const &dir, QString const &vaultUtilName, Args && ... args)
{
auto p = subprocess::Process();
p.setWorkingDirectory(dir);
p.start(os::path::join(VAULT_LIBEXEC_PATH, vaultUtilName)
, {std::forward<Args>(args)...});
p.wait(-1);
return std::make_tuple(p.rc(), p.stdout(), p.stderr());
}

int Vault::execute(const QVariantMap &options)
{
debug::debug("Executing", options);
Expand Down Expand Up @@ -192,15 +210,12 @@ int Vault::execute(const QVariantMap &options)
}
vault.unregisterUnit(options.value("unit").toString());
} else if (action == "gc") {
auto p = subprocess::Process();
p.setWorkingDirectory(vault.root());
p.start(os::path::join(VAULT_LIBEXEC_PATH, "git-vault-gc"), {});
p.wait(-1);
auto res = executeIn(vault.root(), "git-vault-gc");
QTextStream out(stdout, QIODevice::WriteOnly);
QTextStream err(stderr, QIODevice::WriteOnly);
out << p.stdout() << endl;
err << p.stderr() << endl;
return p.rc();
out << std::get<1>(res) << endl;
err << std::get<2>(res) << endl;
return std::get<0>(res);
} else {
error::raise({{"msg", "Unknown action"}, {"action", action}});
}
Expand Down Expand Up @@ -504,7 +519,7 @@ void Vault::resetMaster()
Vault::Result Vault::restore(const QString &snapshot, const QString &home, const QStringList &units, const ProgressCallback &callback)
{
auto l = lock();
Snapshot ss(Gittin::Tag(&m_vcs, QString(">") + snapshot));
Snapshot ss(&m_vcs, snapshot);
return restore(ss, home, units, callback);
}

Expand Down Expand Up @@ -578,6 +593,23 @@ QString Vault::notes(const QString &snapshot)
return tag.notes();
}

QList<QString> Vault::units(QString const & snapshotName) const
{
auto l = lock();
QList<QString> result;
auto res = executeIn(root(), "git-vault-snapshot-units", snapshotName);
if (!std::get<0>(res)) {
auto data = str(std::get<1>(res));
result = data.split("\n", QString::SkipEmptyParts);
} else {
QTextStream err(stderr, QIODevice::WriteOnly);
err << "Error while running git-vault-snapshot-units\n";
err << std::get<1>(res);
err << std::get<2>(res);
}
return result;
}

bool Vault::exists() const
{
return os::path::isDir(m_path);
Expand Down Expand Up @@ -718,16 +750,16 @@ struct Unit
}

if (m_vcs->status(m_root.path()).isClean()) {
debug::info("Nothing to backup for ", name);
return;
}

// add all only in data dir to avoid blobs to get into git
// objects storage
m_vcs->add(os::path::join(m_root.path(), "data"), Gittin::AddOptions::All);
status = m_vcs->status(m_root.path());
if (status.hasDirtyFiles()) {
error::raise({{"msg", "Dirty tree"}, {"dir", m_root.path()}/*, {"status", status_dump(status)}*/});
debug::info("No changes for the unit ", name);
// but still commit to track user's intention to backup unit
} else {
// add all only in data dir to avoid blobs to get into git
// objects storage
m_vcs->add(os::path::join(m_root.path(), "data"), Gittin::AddOptions::All);
status = m_vcs->status(m_root.path());
if (status.hasDirtyFiles()) {
error::raise({{"msg", "Dirty tree"}, {"dir", m_root.path()}/*, {"status", status_dump(status)}*/});
}
}

m_vcs->commit(">" + name);
Expand Down Expand Up @@ -800,7 +832,7 @@ bool Vault::restoreUnit(const QString &home, const QString &unit, const Progress

void Vault::tagSnapshot(const QString &msg)
{
m_vcs.tag(QLatin1String(">") + msg);
m_vcs.tag(Snapshot(&m_vcs, msg).tag().name());
}

/**
Expand Down
4 changes: 2 additions & 2 deletions tools/CMakeLists.txt
@@ -1,11 +1,11 @@
configure_file(vault-gc.service.in vault-gc.service @ONLY)

install(
PROGRAMS git-vault-gc gc-default
PROGRAMS git-vault-gc gc-default git-vault-snapshot-units
DESTINATION ${TOOLS_DIR}
)

install(
FILES git-vault-rebase-generate.awk git-vault-rebase-prepare.awk
FILES git-vault-rebase-generate.awk git-vault-rebase-prepare.awk vault-misc
DESTINATION ${TOOLS_DIR}
)
26 changes: 26 additions & 0 deletions tools/git-vault-snapshot-units
@@ -0,0 +1,26 @@
#!/bin/bash

src=$(dirname $0)
src=$(cd $src;pwd)
source $src/vault-misc || exit 1

ensure_param_count_exit_usage $# 1 "<tag>"
tag=">$1"

tag_describe() {
git describe --tags "$1" || error 33 "No tag '$1'"
}

tag=$(tag_describe "$tag")
tag_prev=$((tag_describe "$tag^" | sed -e 's|\(.*\)-[0-9]*-g[0-9a-f]*|\1|') || error 44 "No previous tag")
units=
for c in $(git log --format=%s "$tag_prev..$tag" | grep '^>'); do
unit=$(echo $c | sed -e 's|^>||')
if [[ "x$units" != "x" ]]; then
units+=" $unit"
else
units=$unit
fi
done
echo $units | tr " " "\n" | sort -u | grep -v "^$"

0 comments on commit 786c693

Please sign in to comment.