]> git.ipfire.org Git - thirdparty/snapper.git/commitdiff
- implementing deleting of snapshots
authorArvin Schnell <aschnell@suse.de>
Tue, 8 Feb 2011 11:00:44 +0000 (12:00 +0100)
committerArvin Schnell <aschnell@suse.de>
Tue, 8 Feb 2011 11:00:44 +0000 (12:00 +0100)
snapper/Snapper.cc
snapper/Snapper.h
snapper/Snapshot.cc
snapper/Snapshot.h
tools/snapper.cc

index 61f73ede75a0c222d573cddf24bbaaf8aa768d6c..b44a4ec5cd78fdb3fd8e3a1f20b05ff4ca42a497 100644 (file)
@@ -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)
index 43d2d2c41c1f0da7456564e18806deff3618a0b1..f5b43301591c2820ff1ea641664247c60acd4948 100644 (file)
@@ -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);
 
index 4b789059b5cfce727875984da210cac79d08e21d..b226fee94a7be564ee19f91b08ec3a20b1a7d0b5 100644 (file)
@@ -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<string> tmp = glob(snapshot->baseDir() + "/filelist-*.txt", GLOB_NOSORT);
+       for (list<string>::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) {}
index 0684988ea33e09d4ff857a9c035d04e4deeedafe..7c4746c83d9fce8ca63af0e98c7a744eb7a0c7dc 100644 (file)
@@ -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;
index b3790a3d777e51fbde3440137a2a39725b00f7c6..deab0aeec76a0184cd6b721ecddd74b419680b73 100644 (file)
@@ -133,6 +133,30 @@ void createSnap( const list<string>& args )
     }
 
 
+void
+deleteSnap(const list<string>& args)
+{
+    Snapshots& snapshots = sh->getSnapshots();
+
+    list<string>::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<string>& 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;