Hello community, here is the log from the commit of package snapper for openSUSE:Factory checked in at Mon Sep 26 10:20:19 CEST 2011.
-------- --- snapper/snapper.changes 2011-09-16 14:03:08.000000000 +0200 +++ /mounts/work_src_done/STABLE/snapper/snapper.changes 2011-09-23 16:30:19.000000000 +0200 @@ -1,0 +2,10 @@ +Thu Sep 22 16:28:53 CEST 2011 - [email protected] + +- do not log output of diff command + +------------------------------------------------------------------- +Tue Sep 20 11:05:47 CEST 2011 - [email protected] + +- improved error handling (bnc#718914) + +------------------------------------------------------------------- calling whatdependson for head-i586 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ snapper-0.0.7.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.0.7/snapper/Exception.h new/snapper-0.0.7/snapper/Exception.h --- old/snapper-0.0.7/snapper/Exception.h 2011-09-16 10:58:51.000000000 +0200 +++ new/snapper-0.0.7/snapper/Exception.h 2011-09-20 14:40:11.000000000 +0200 @@ -30,31 +30,45 @@ namespace snapper { - struct FileNotFoundException : public std::exception + struct SnapperException : public std::exception + { + explicit SnapperException() throw() {} + virtual const char* what() const throw() { return "generic snapper exception"; } + }; + + + struct FileNotFoundException : public SnapperException { explicit FileNotFoundException() throw() {} virtual const char* what() const throw() { return "file not found"; } }; - struct IllegalSnapshotException : public std::exception + struct IllegalSnapshotException : public SnapperException { explicit IllegalSnapshotException() throw() {} virtual const char* what() const throw() { return "illegal snapshot"; } }; - struct LogicErrorException : public std::exception + struct LogicErrorException : public SnapperException { explicit LogicErrorException() throw() {} virtual const char* what() const throw() { return "logic error"; } }; - struct IOErrorException : public std::exception + struct IOErrorException : public SnapperException { explicit IOErrorException() throw() {} virtual const char* what() const throw() { return "IO error"; } }; + struct ProgramNotInstalledException : public SnapperException + { + explicit ProgramNotInstalledException(const char* msg) throw() : msg(msg) {} + virtual const char* what() const throw() { return msg; } + const char* msg; + }; + } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.0.7/snapper/File.cc new/snapper-0.0.7/snapper/File.cc --- old/snapper-0.0.7/snapper/File.cc 2011-08-26 14:51:54.000000000 +0200 +++ new/snapper-0.0.7/snapper/File.cc 2011-09-23 16:26:57.000000000 +0200 @@ -121,8 +121,10 @@ if (getSnapper()->getCompareCallback()) getSnapper()->getCompareCallback()->start(); - comparison->getSnapshot1()->mountFilesystemSnapshot(); - comparison->getSnapshot2()->mountFilesystemSnapshot(); + if (!comparison->getSnapshot1()->isCurrent()) + comparison->getSnapshot1()->mountFilesystemSnapshot(); + if (!comparison->getSnapshot2()->isCurrent()) + comparison->getSnapshot2()->mountFilesystemSnapshot(); #if 1 cmpdirs_cb_t cb = AppendHelper(comparison, entries); @@ -182,18 +184,16 @@ File file(comparison, name, status); entries.push_back(file); } - - sort(entries.begin(), entries.end()); - - y2mil("read " << entries.size() << " lines"); - - return true; } catch (const FileNotFoundException& e) { return false; } + sort(entries.begin(), entries.end()); + + y2mil("read " << entries.size() << " lines"); + return true; } @@ -410,7 +410,7 @@ File::getDiff(const string& options) const { SystemCmd cmd(DIFFBIN " " + options + " " + quote(getAbsolutePath(LOC_PRE)) + " " + - quote(getAbsolutePath(LOC_POST))); + quote(getAbsolutePath(LOC_POST)), false); return cmd.stdout(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.0.7/snapper/Filesystem.cc new/snapper-0.0.7/snapper/Filesystem.cc --- old/snapper-0.0.7/snapper/Filesystem.cc 2011-08-04 11:12:57.000000000 +0200 +++ new/snapper-0.0.7/snapper/Filesystem.cc 2011-09-20 14:40:11.000000000 +0200 @@ -49,6 +49,16 @@ } + Btrfs::Btrfs(const string& subvolume) + : Filesystem(subvolume) + { + if (access(BTRFSBIN, X_OK) != 0) + { + throw ProgramNotInstalledException(BTRFSBIN " not installed"); + } + } + + void Btrfs::addConfig() const { @@ -118,6 +128,21 @@ } + Ext4::Ext4(const string& subvolume) + : Filesystem(subvolume) + { + if (access(CHSNAPBIN, X_OK) != 0) + { + throw ProgramNotInstalledException(CHSNAPBIN " not installed"); + } + + if (access(CHATTRBIN, X_OK) != 0) + { + throw ProgramNotInstalledException(CHATTRBIN " not installed"); + } + } + + void Ext4::addConfig() const { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.0.7/snapper/Filesystem.h new/snapper-0.0.7/snapper/Filesystem.h --- old/snapper-0.0.7/snapper/Filesystem.h 2011-08-26 14:51:54.000000000 +0200 +++ new/snapper-0.0.7/snapper/Filesystem.h 2011-09-20 14:40:11.000000000 +0200 @@ -71,7 +71,7 @@ { public: - Btrfs(const string& subvolume) : Filesystem(subvolume) {} + Btrfs(const string& subvolume); virtual string name() const { return "btrfs"; } @@ -96,7 +96,7 @@ { public: - Ext4(const string& subvolume) : Filesystem(subvolume) {} + Ext4(const string& subvolume); virtual string name() const { return "ext4"; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.0.7/snapper/Snapper.cc new/snapper-0.0.7/snapper/Snapper.cc --- old/snapper-0.0.7/snapper/Snapper.cc 2011-09-15 17:30:03.000000000 +0200 +++ new/snapper-0.0.7/snapper/Snapper.cc 2011-09-23 16:26:57.000000000 +0200 @@ -179,8 +179,10 @@ y2mil("num1:" << snapshot1->getNum() << " num2:" << snapshot2->getNum()); - snapshot1->mountFilesystemSnapshot(); - snapshot2->mountFilesystemSnapshot(); + if (!snapshot1->isCurrent()) + snapshot1->mountFilesystemSnapshot(); + if (!snapshot2->isCurrent()) + snapshot2->mountFilesystemSnapshot(); bool invert = snapshot1->getNum() > snapshot2->getNum(); @@ -553,7 +555,7 @@ y2mil("config_name:" << config_name << " subvolume:" << subvolume << " fstype:" << fstype << " template_name:" << template_name); - if (config_name.empty() || config_name.find_first_of(" \t") != string::npos) + if (config_name.empty() || config_name.find_first_of(", \t") != string::npos) { throw AddConfigFailedException("illegal config name"); } @@ -563,6 +565,15 @@ throw AddConfigFailedException("illegal subvolume"); } + list<ConfigInfo> configs = getConfigs(); + for (list<ConfigInfo>::const_iterator it = configs.begin(); it != configs.end(); ++it) + { + if (it->subvolume == subvolume) + { + throw AddConfigFailedException("subvolume already covered"); + } + } + if (access(string(CONFIGTEMPLATEDIR "/" + template_name).c_str(), R_OK) != 0) { throw AddConfigFailedException("cannot access template config"); @@ -577,6 +588,10 @@ { throw AddConfigFailedException("invalid filesystem type"); } + catch (const ProgramNotInstalledException& e) + { + throw AddConfigFailedException(e.what()); + } try { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.0.7/snapper/Snapper.h new/snapper-0.0.7/snapper/Snapper.h --- old/snapper-0.0.7/snapper/Snapper.h 2011-09-15 17:30:03.000000000 +0200 +++ new/snapper-0.0.7/snapper/Snapper.h 2011-09-20 14:40:11.000000000 +0200 @@ -75,32 +75,32 @@ }; - struct ConfigNotFoundException : public std::exception + struct ConfigNotFoundException : public SnapperException { explicit ConfigNotFoundException() throw() {} virtual const char* what() const throw() { return "config not found"; } }; - struct InvalidConfigException : public std::exception + struct InvalidConfigException : public SnapperException { explicit InvalidConfigException() throw() {} virtual const char* what() const throw() { return "invalid config"; } }; - struct InvalidUserdataException : public std::exception + struct InvalidUserdataException : public SnapperException { explicit InvalidUserdataException() throw() {} virtual const char* what() const throw() { return "invalid userdata"; } }; - struct ListConfigsFailedException : public std::exception + struct ListConfigsFailedException : public SnapperException { explicit ListConfigsFailedException(const char* msg) throw() : msg(msg) {} virtual const char* what() const throw() { return msg; } const char* msg; }; - struct AddConfigFailedException : public std::exception + struct AddConfigFailedException : public SnapperException { explicit AddConfigFailedException(const char* msg) throw() : msg(msg) {} virtual const char* what() const throw() { return msg; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.0.7/snapper/Snapshot.cc new/snapper-0.0.7/snapper/Snapshot.cc --- old/snapper-0.0.7/snapper/Snapshot.cc 2011-09-16 12:00:41.000000000 +0200 +++ new/snapper-0.0.7/snapper/Snapshot.cc 2011-09-23 16:26:57.000000000 +0200 @@ -125,7 +125,10 @@ for (map<string, string>::const_iterator it = val.begin(); it != val.end(); ++it) { - if (it->first.empty()) + if (it->first.empty() || it->first.find_first_of(",=") != string::npos) + throw InvalidUserdataException(); + + if (it->second.find_first_of(",=") != string::npos) throw InvalidUserdataException(); } @@ -160,8 +163,8 @@ continue; } - unsigned int date; - if (!getChildValue(node, "date", tmp) || (date = scan_datetime(tmp, true)) == -1) + time_t date; + if (!getChildValue(node, "date", tmp) || (date = scan_datetime(tmp, true)) == (time_t)(-1)) { y2err("date missing or invalid. not adding snapshot " << *it1); continue; @@ -337,21 +340,18 @@ } - bool + void Snapshot::flushInfo() { if (!info_modified) - return true; - - if (!writeInfo()) - return false; + return; + writeInfo(); info_modified = false; - return true; } - bool + void Snapshot::writeInfo() const { XmlFile xml; @@ -380,9 +380,19 @@ setChildValue(userdata_node, "value", it->second); } - xml.save(infoDir() + "/info.xml"); + if (!xml.save(infoDir() + "/info.xml.tmp")) + { + y2err("saving info.xml failed infoDir: " << infoDir() << " errno: << " << errno << + " (" << strerror(errno) << ")"); + throw IOErrorException(); + } - return true; + if (rename(string(infoDir() + "/info.xml.tmp").c_str(), string(infoDir() + "/info.xml").c_str()) != 0) + { + y2err("rename info.xml failed infoDir: " << infoDir() << " errno: << " << errno << + " (" << strerror(errno) << ")"); + throw IOErrorException(); + } } @@ -390,7 +400,7 @@ Snapshot::mountFilesystemSnapshot() const { if (isCurrent()) - return; + throw IllegalSnapshotException(); snapper->getFilesystem()->mountSnapshot(num); } @@ -400,7 +410,7 @@ Snapshot::umountFilesystemSnapshot() const { if (isCurrent()) - return; + throw IllegalSnapshotException(); snapper->getFilesystem()->umountSnapshot(num); } @@ -434,9 +444,7 @@ snapshot.description = description; snapshot.info_modified = true; - snapshot.createFilesystemSnapshot(); - - return entries.insert(entries.end(), snapshot); + return createHelper(snapshot); } @@ -447,9 +455,7 @@ snapshot.description = description; snapshot.info_modified = true; - snapshot.createFilesystemSnapshot(); - - return entries.insert(entries.end(), snapshot); + return createHelper(snapshot); } @@ -463,7 +469,33 @@ snapshot.pre_num = pre->getNum(); snapshot.info_modified = true; - snapshot.createFilesystemSnapshot(); + return createHelper(snapshot); + } + + + Snapshots::iterator + Snapshots::createHelper(Snapshot& snapshot) + { + try + { + snapshot.createFilesystemSnapshot(); + } + catch (const CreateSnapshotFailedException& e) + { + rmdir(snapshot.infoDir().c_str()); + throw; + } + + try + { + snapshot.flushInfo(); + } + catch (const IOErrorException& e) + { + snapshot.deleteFilesystemSnapshot(); + rmdir(snapshot.infoDir().c_str()); + throw; + } return entries.insert(entries.end(), snapshot); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.0.7/snapper/Snapshot.h new/snapper-0.0.7/snapper/Snapshot.h --- old/snapper-0.0.7/snapper/Snapshot.h 2011-09-16 12:01:24.000000000 +0200 +++ new/snapper-0.0.7/snapper/Snapshot.h 2011-09-20 14:40:11.000000000 +0200 @@ -29,6 +29,8 @@ #include <list> #include <map> +#include "snapper/Exception.h" + namespace snapper { @@ -43,32 +45,32 @@ enum SnapshotType { SINGLE, PRE, POST }; - struct CreateSnapshotFailedException : public std::exception + struct CreateSnapshotFailedException : public SnapperException { explicit CreateSnapshotFailedException() throw() {} virtual const char* what() const throw() { return "create snapshot failed"; } }; - struct DeleteSnapshotFailedException : public std::exception + struct DeleteSnapshotFailedException : public SnapperException { explicit DeleteSnapshotFailedException() throw() {} virtual const char* what() const throw() { return "delete snapshot failed"; } }; - struct IsSnapshotMountedFailedException : public std::exception + struct IsSnapshotMountedFailedException : public SnapperException { explicit IsSnapshotMountedFailedException() throw() {} virtual const char* what() const throw() { return "is snapshot mounted failed"; } }; - struct MountSnapshotFailedException : public std::exception + struct MountSnapshotFailedException : public SnapperException { explicit MountSnapshotFailedException() throw() {} virtual const char* what() const throw() { return "mount snapshot failed"; } }; - struct UmountSnapshotFailedException : public std::exception + struct UmountSnapshotFailedException : public SnapperException { explicit UmountSnapshotFailedException() throw() {} virtual const char* what() const throw() { return "umount snapshot failed"; } @@ -103,7 +105,7 @@ void setUserdata(const map<string, string>& userdata); map<string, string> getUserdata() const { return userdata; } - bool flushInfo(); + void flushInfo(); string infoDir() const; string snapshotDir() const; @@ -133,7 +135,7 @@ bool info_modified; - bool writeInfo() const; + void writeInfo() const; void createFilesystemSnapshot() const; void deleteFilesystemSnapshot() const; @@ -190,6 +192,8 @@ iterator createPreSnapshot(string description); iterator createPostSnapshot(const_iterator pre); + iterator createHelper(Snapshot& snapshot); + void deleteSnapshot(iterator snapshot); unsigned int nextNumber(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.0.7/snapper/SystemCmd.cc new/snapper-0.0.7/snapper/SystemCmd.cc --- old/snapper-0.0.7/snapper/SystemCmd.cc 2011-02-28 16:48:13.000000000 +0100 +++ new/snapper-0.0.7/snapper/SystemCmd.cc 2011-09-22 16:30:38.000000000 +0200 @@ -39,8 +39,8 @@ using namespace std; -SystemCmd::SystemCmd( const string& Command_Cv ) - : Combine_b(false) + SystemCmd::SystemCmd(const string& Command_Cv, bool log_output) + : Combine_b(false), log_output(log_output) { y2mil("constructor SystemCmd:\"" << Command_Cv << "\""); init(); @@ -48,8 +48,8 @@ } -SystemCmd::SystemCmd() - : Combine_b(false) + SystemCmd::SystemCmd(bool log_output) + : Combine_b(false), log_output(log_output) { y2mil("constructor SystemCmd"); init(); @@ -292,7 +292,7 @@ if( !testmode ) checkOutput(); y2mil("system() Returns:" << Ret_i); - if( Ret_i!=0 ) + if (Ret_i != 0 && log_output) logOutput(); return Ret_i; } @@ -560,13 +560,16 @@ void SystemCmd::addLine(const string& Text_Cv, vector<string>& Lines_Cr) { - if (Lines_Cr.size() < line_limit) + if (log_output) { - y2mil("Adding Line " << Lines_Cr.size() + 1 << " \"" << Text_Cv << "\""); - } - else - { - y2deb("Adding Line " << Lines_Cr.size() + 1 << " \"" << Text_Cv << "\""); + if (Lines_Cr.size() < line_limit) + { + y2mil("Adding Line " << Lines_Cr.size() + 1 << " \"" << Text_Cv << "\""); + } + else + { + y2deb("Adding Line " << Lines_Cr.size() + 1 << " \"" << Text_Cv << "\""); + } } Lines_Cr.push_back(Text_Cv); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.0.7/snapper/SystemCmd.h new/snapper-0.0.7/snapper/SystemCmd.h --- old/snapper-0.0.7/snapper/SystemCmd.h 2011-02-28 16:48:13.000000000 +0100 +++ new/snapper-0.0.7/snapper/SystemCmd.h 2011-09-22 16:30:38.000000000 +0200 @@ -44,8 +44,8 @@ enum OutputStream { IDX_STDOUT, IDX_STDERR }; - SystemCmd(const string& Command_Cv); - SystemCmd(); + SystemCmd(const string& Command_Cv, bool log_output = true); + SystemCmd(bool log_output = true); virtual ~SystemCmd(); @@ -100,6 +100,7 @@ std::vector<string*> SelLines_aC[2]; bool NewLineSeen_ab[2]; bool Combine_b; + bool log_output; bool Background_b; string lastCmd; int Ret_i; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.0.7/snapper/XmlFile.h new/snapper-0.0.7/snapper/XmlFile.h --- old/snapper-0.0.7/snapper/XmlFile.h 2011-02-28 16:48:13.000000000 +0100 +++ new/snapper-0.0.7/snapper/XmlFile.h 2011-09-20 14:40:11.000000000 +0200 @@ -48,7 +48,7 @@ ~XmlFile(); bool save(const string& filename) - { return xmlSaveFormatFile(filename.c_str(), doc, 1); } + { return xmlSaveFormatFile(filename.c_str(), doc, 1) != -1; } void setRootElement(xmlNode* node) { xmlDocSetRootElement(doc, node); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.0.7/tools/snapper.cc new/snapper-0.0.7/tools/snapper.cc --- old/snapper-0.0.7/tools/snapper.cc 2011-09-15 18:22:18.000000000 +0200 +++ new/snapper-0.0.7/tools/snapper.cc 2011-09-23 16:26:57.000000000 +0200 @@ -22,6 +22,8 @@ #include <stdlib.h> #include <string.h> +#include <sys/types.h> +#include <sys/stat.h> #include <iostream> #include <boost/algorithm/string.hpp> @@ -57,6 +59,112 @@ Snapper* sh = NULL; +Snapshots::iterator +read_num(const string& str) +{ + Snapshots& snapshots = sh->getSnapshots(); + + istringstream s(str); + unsigned int num = 0; + s >> num; + + if (s.fail() || !s.eof()) + { + cerr << sformat(_("Invalid snapshot '%s'."), str.c_str()) << endl; + exit(EXIT_FAILURE); + } + + Snapshots::iterator snap = snapshots.find(num); + if (snap == snapshots.end()) + { + cerr << sformat(_("Snapshot '%u' not found."), num) << endl; + exit(EXIT_FAILURE); + } + + return snap; +} + + +pair<Snapshots::iterator, Snapshots::iterator> +read_nums(const string& str) +{ + string::size_type pos = str.find(".."); + if (pos == string::npos) + { + cerr << _("Invalid snapshots.") << endl; + exit(EXIT_FAILURE); + } + + Snapshots::iterator snap1 = read_num(str.substr(0, pos)); + Snapshots::iterator snap2 = read_num(str.substr(pos + 2)); + + if (snap1 == snap2) + { + cerr << _("Identical snapshots.") << endl; + exit(EXIT_FAILURE); + } + + return pair<Snapshots::iterator, Snapshots::iterator>(snap1, snap2); +} + + +map<string, string> +read_userdata(const string& s, const map<string, string>& old = map<string, string>()) +{ + map<string, string> userdata = old; + + list<string> tmp; + boost::split(tmp, s, boost::is_any_of(","), boost::token_compress_on); + if (tmp.empty()) + { + cerr << _("Invalid userdata.") << endl; + exit(EXIT_FAILURE); + } + + for (list<string>::const_iterator it = tmp.begin(); it != tmp.end(); ++it) + { + string::size_type pos = it->find("="); + if (pos == string::npos) + { + cerr << _("Invalid userdata.") << endl; + exit(EXIT_FAILURE); + } + + string key = boost::trim_copy(it->substr(0, pos)); + string value = boost::trim_copy(it->substr(pos + 1)); + + if (key.empty()) + { + cerr << _("Invalid userdata.") << endl; + exit(EXIT_FAILURE); + } + + if (value.empty()) + userdata.erase(key); + else + userdata[key] = value; + } + + return userdata; +} + + +string +show_userdata(const map<string, string>& userdata) +{ + string s; + + for (map<string, string>::const_iterator it = userdata.begin(); it != userdata.end(); ++it) + { + if (!s.empty()) + s += ", "; + s += it->first + "=" + it->second; + } + + return s; +} + + void help_list_configs() { @@ -169,112 +277,6 @@ } -Snapshots::iterator -read_num(const string& str) -{ - Snapshots& snapshots = sh->getSnapshots(); - - istringstream s(str); - unsigned int num = 0; - s >> num; - - if (s.fail() || !s.eof()) - { - cerr << sformat(_("Invalid snapshot '%s'."), str.c_str()) << endl; - exit(EXIT_FAILURE); - } - - Snapshots::iterator snap = snapshots.find(num); - if (snap == snapshots.end()) - { - cerr << sformat(_("Snapshot '%u' not found."), num) << endl; - exit(EXIT_FAILURE); - } - - return snap; -} - - -pair<Snapshots::iterator, Snapshots::iterator> -read_nums(const string& str) -{ - string::size_type pos = str.find(".."); - if (pos == string::npos) - { - cerr << _("Invalid snapshots.") << endl; - exit(EXIT_FAILURE); - } - - Snapshots::iterator snap1 = read_num(str.substr(0, pos)); - Snapshots::iterator snap2 = read_num(str.substr(pos + 2)); - - if (snap1 == snap2) - { - cerr << _("Identical snapshots.") << endl; - exit(EXIT_FAILURE); - } - - return pair<Snapshots::iterator, Snapshots::iterator>(snap1, snap2); -} - - -map<string, string> -read_userdata(const string& s, const map<string, string>& old = map<string, string>()) -{ - map<string, string> userdata = old; - - list<string> tmp; - boost::split(tmp, s, boost::is_any_of(","), boost::token_compress_on); - if (tmp.empty()) - { - cerr << _("Invalid userdata.") << endl; - exit(EXIT_FAILURE); - } - - for (list<string>::const_iterator it = tmp.begin(); it != tmp.end(); ++it) - { - string::size_type pos = it->find("="); - if (pos == string::npos) - { - cerr << _("Invalid userdata.") << endl; - exit(EXIT_FAILURE); - } - - string key = boost::trim_copy(it->substr(0, pos)); - string value = boost::trim_copy(it->substr(pos + 1)); - - if (key.empty()) - { - cerr << _("Invalid userdata.") << endl; - exit(EXIT_FAILURE); - } - - if (value.empty()) - userdata.erase(key); - else - userdata[key] = value; - } - - return userdata; -} - - -string -show_userdata(const map<string, string>& userdata) -{ - string s; - - for (map<string, string>::const_iterator it = userdata.begin(); it != userdata.end(); ++it) - { - if (!s.empty()) - s += ", "; - s += it->first + "=" + it->second; - } - - return s; -} - - void help_list() { @@ -495,35 +497,43 @@ exit(EXIT_FAILURE); } - switch (type) + try + { + switch (type) + { + case SINGLE: { + Snapshots::iterator snap1 = sh->createSingleSnapshot(description); + snap1->setCleanup(cleanup); + snap1->setUserdata(userdata); + snap1->flushInfo(); + if (print_number) + cout << snap1->getNum() << endl; + } break; + + case PRE: { + Snapshots::iterator snap1 = sh->createPreSnapshot(description); + snap1->setCleanup(cleanup); + snap1->setUserdata(userdata); + snap1->flushInfo(); + if (print_number) + cout << snap1->getNum() << endl; + } break; + + case POST: { + Snapshots::iterator snap2 = sh->createPostSnapshot(snap1); + snap2->setCleanup(cleanup); + snap2->setUserdata(userdata); + snap2->flushInfo(); + if (print_number) + cout << snap2->getNum() << endl; + sh->startBackgroundComparsion(snap1, snap2); + } break; + } + } + catch (const InvalidUserdataException& e) { - case SINGLE: { - Snapshots::iterator snap1 = sh->createSingleSnapshot(description); - snap1->setCleanup(cleanup); - snap1->setUserdata(userdata); - snap1->flushInfo(); - if (print_number) - cout << snap1->getNum() << endl; - } break; - - case PRE: { - Snapshots::iterator snap1 = sh->createPreSnapshot(description); - snap1->setCleanup(cleanup); - snap1->setUserdata(userdata); - snap1->flushInfo(); - if (print_number) - cout << snap1->getNum() << endl; - } break; - - case POST: { - Snapshots::iterator snap2 = sh->createPostSnapshot(snap1); - snap2->setCleanup(cleanup); - snap2->setUserdata(userdata); - snap2->flushInfo(); - if (print_number) - cout << snap2->getNum() << endl; - sh->startBackgroundComparsion(snap1, snap2); - } break; + cerr << _("Invalid userdata.") << endl; + exit(EXIT_FAILURE); } } @@ -560,27 +570,35 @@ exit(EXIT_FAILURE); } - while (getopts.hasArgs()) + try { - Snapshots::iterator snapshot = read_num(getopts.popArg()); - if (snapshot->isCurrent()) + while (getopts.hasArgs()) { - cerr << _("Invalid snapshot.") << endl; - exit(EXIT_FAILURE); - } + Snapshots::iterator snapshot = read_num(getopts.popArg()); - GetOpts::parsed_opts::const_iterator opt; + GetOpts::parsed_opts::const_iterator opt; - if ((opt = opts.find("description")) != opts.end()) - snapshot->setDescription(opt->second); + if ((opt = opts.find("description")) != opts.end()) + snapshot->setDescription(opt->second); - if ((opt = opts.find("cleanup-algorithm")) != opts.end()) - snapshot->setCleanup(opt->second); + if ((opt = opts.find("cleanup-algorithm")) != opts.end()) + snapshot->setCleanup(opt->second); - if ((opt = opts.find("userdata")) != opts.end()) - snapshot->setUserdata(read_userdata(opt->second, snapshot->getUserdata())); + if ((opt = opts.find("userdata")) != opts.end()) + snapshot->setUserdata(read_userdata(opt->second, snapshot->getUserdata())); - snapshot->flushInfo(); + snapshot->flushInfo(); + } + } + catch (const IllegalSnapshotException& e) + { + cerr << _("Invalid snapshot.") << endl; + exit(EXIT_FAILURE); + } + catch (const InvalidUserdataException& e) + { + cerr << _("Invalid userdata.") << endl; + exit(EXIT_FAILURE); } } @@ -604,16 +622,19 @@ exit(EXIT_FAILURE); } - while (getopts.hasArgs()) + try { - Snapshots::iterator snapshot = read_num(getopts.popArg()); - if (snapshot->isCurrent()) + while (getopts.hasArgs()) { - cerr << _("Invalid snapshot.") << endl; - exit(EXIT_FAILURE); - } + Snapshots::iterator snapshot = read_num(getopts.popArg()); - sh->deleteSnapshot(snapshot); + sh->deleteSnapshot(snapshot); + } + } + catch (const IllegalSnapshotException& e) + { + cerr << _("Invalid snapshot.") << endl; + exit(EXIT_FAILURE); } } @@ -637,16 +658,19 @@ exit(EXIT_FAILURE); } - while (getopts.hasArgs()) + try { - Snapshots::iterator snapshot = read_num(getopts.popArg()); - if (snapshot->isCurrent()) + while (getopts.hasArgs()) { - cerr << _("Invalid snapshot.") << endl; - exit(EXIT_FAILURE); - } + Snapshots::iterator snapshot = read_num(getopts.popArg()); - snapshot->mountFilesystemSnapshot(); + snapshot->mountFilesystemSnapshot(); + } + } + catch (const IllegalSnapshotException& e) + { + cerr << _("Invalid snapshot.") << endl; + exit(EXIT_FAILURE); } } @@ -670,16 +694,19 @@ exit(EXIT_FAILURE); } - while (getopts.hasArgs()) + try { - Snapshots::iterator snapshot = read_num(getopts.popArg()); - if (snapshot->isCurrent()) + while (getopts.hasArgs()) { - cerr << _("Invalid snapshot.") << endl; - exit(EXIT_FAILURE); - } + Snapshots::iterator snapshot = read_num(getopts.popArg()); - snapshot->umountFilesystemSnapshot(); + snapshot->umountFilesystemSnapshot(); + } + } + catch (const IllegalSnapshotException& e) + { + cerr << _("Invalid snapshot.") << endl; + exit(EXIT_FAILURE); } } @@ -1028,6 +1055,8 @@ int main(int argc, char** argv) { + umask(0027); + setlocale(LC_ALL, ""); initDefaultLogger(); @@ -1136,7 +1165,17 @@ sh->setUndoCallback(&undo_callback_impl); } - (*cmd->second)(); + try + { + (*cmd->second)(); + } + catch (const SnapperException& e) + { + y2err("caught final exception"); + cerr << sformat(_("Command failed (%s). See log for more information."), + e.what()) << endl; + exit(EXIT_FAILURE); + } deleteSnapper(sh); } ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
