From: Arvin Schnell Date: Tue, 8 Feb 2011 11:00:44 +0000 (+0100) Subject: - implementing deleting of snapshots X-Git-Tag: v0.1.3~505 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e0c5d94e4b87f5a6e7942770d58a2cbc9aff2f5a;p=thirdparty%2Fsnapper.git - implementing deleting of snapshots --- diff --git a/snapper/Snapper.cc b/snapper/Snapper.cc index 61f73ede..b44a4ec5 100644 --- a/snapper/Snapper.cc +++ b/snapper/Snapper.cc @@ -78,6 +78,15 @@ namespace snapper } + void + Snapper::deleteSnapshot(Snapshots::iterator snapshot) + { + assert(snapshot != snapshots.end()); + + snapshots.deleteSnapshot(snapshot); + } + + void Snapper::startBackgroundComparsion(Snapshots::const_iterator snapshot1, Snapshots::const_iterator snapshot2) diff --git a/snapper/Snapper.h b/snapper/Snapper.h index 43d2d2c4..f5b43301 100644 --- a/snapper/Snapper.h +++ b/snapper/Snapper.h @@ -48,12 +48,15 @@ namespace snapper Snapper(); ~Snapper(); + Snapshots& getSnapshots() { return snapshots; } const Snapshots& getSnapshots() const { return snapshots; } Snapshots::iterator createSingleSnapshot(string description); Snapshots::iterator createPreSnapshot(string description); Snapshots::iterator createPostSnapshot(Snapshots::const_iterator pre); + void deleteSnapshot(Snapshots::iterator snapshot); + void startBackgroundComparsion(Snapshots::const_iterator snapshot1, Snapshots::const_iterator snapshot2); diff --git a/snapper/Snapshot.cc b/snapper/Snapshot.cc index 4b789059..b226fee9 100644 --- a/snapper/Snapshot.cc +++ b/snapper/Snapshot.cc @@ -250,6 +250,14 @@ namespace snapper } + bool + Snapshot::deleteFilesystemSnapshot() const + { + SystemCmd cmd(BTRFSBIN " subvolume delete /" + snapshotDir()); + return cmd.retcode() == 0; + } + + Snapshots::iterator Snapshots::createSingleSnapshot(string description) { @@ -298,6 +306,23 @@ namespace snapper } + void + Snapshots::deleteSnapshot(iterator snapshot) + { + assert(!snapshot->isCurrent()); + + snapshot->deleteFilesystemSnapshot(); + + unlink((snapshot->baseDir() + "/info.xml").c_str()); + + list tmp = glob(snapshot->baseDir() + "/filelist-*.txt", GLOB_NOSORT); + for (list::const_iterator it = tmp.begin(); it != tmp.end(); ++it) + unlink(it->c_str()); + + rmdir(snapshot->baseDir().c_str()); + } + + struct num_is { num_is(unsigned int num) : num(num) {} diff --git a/snapper/Snapshot.h b/snapper/Snapshot.h index 0684988e..7c4746c8 100644 --- a/snapper/Snapshot.h +++ b/snapper/Snapshot.h @@ -77,7 +77,7 @@ namespace snapper bool writeInfo() const; bool createFilesystemSnapshot() const; - + bool deleteFilesystemSnapshot() const; }; @@ -118,6 +118,8 @@ namespace snapper iterator createPreSnapshot(string description); iterator createPostSnapshot(const_iterator pre); + void deleteSnapshot(iterator snapshot); + unsigned int nextNumber(); bool initialized; diff --git a/tools/snapper.cc b/tools/snapper.cc index b3790a3d..deab0aee 100644 --- a/tools/snapper.cc +++ b/tools/snapper.cc @@ -133,6 +133,30 @@ void createSnap( const list& args ) } +void +deleteSnap(const list& args) +{ + Snapshots& snapshots = sh->getSnapshots(); + + list::const_iterator s = args.begin(); + while (s != args.end()) + { + unsigned int number; + *s >> number; + s++; + + Snapshots::iterator snapshot = snapshots.find(number); + if (snapshot == snapshots.end()) + { + cerr << "snapshots not found" << endl; + exit(EXIT_FAILURE); + } + + sh->deleteSnapshot(snapshot); + } +} + + void readNums(const list& args, Snapshots::const_iterator& snap1, Snapshots::const_iterator& snap2) { @@ -238,11 +262,12 @@ main(int argc, char** argv) cmds["list"] = listSnap; cmds["help"] = showHelp; cmds["create"] = createSnap; + cmds["delete"] = deleteSnap; cmds["diff"] = showDifference; cmds["rollback"] = doRollback; sh = createSnapper(); - + sh->setCompareCallback(&compare_callback_impl); int cnt = optind;