{
public:
- Files() : initialized(false) {}
-
- void assertInit();
+ friend class Snapper;
- bool doRollback();
+ Files() : initialized(false) {}
typedef vector<File>::iterator iterator;
typedef vector<File>::const_iterator const_iterator;
private:
+ void assertInit();
+
void initialize();
void create();
bool load();
bool save();
+ bool doRollback();
+
bool initialized;
vector<File> entries;
return true;
}
+
+ bool
+ Snapper::doRollback()
+ {
+ return files.doRollback();
+ }
+
}
void startBackgroundComparsion(Snapshots::const_iterator snapshot1,
Snapshots::const_iterator snapshot2);
- bool setComparisonNums(Snapshots::const_iterator new_snapshot1,
- Snapshots::const_iterator new_snapshot2);
+ bool setComparisonNums(Snapshots::const_iterator snapshot1,
+ Snapshots::const_iterator snapshot2);
Snapshots::const_iterator getSnapshot1() const { return snapshot1; }
Snapshots::const_iterator getSnapshot2() const { return snapshot2; }
Files& getFiles() { return files; }
const Files& getFiles() const { return files; }
+ bool doRollback();
+
void setCompareCallback(CompareCallback* p) { compare_callback = p; }
CompareCallback* getCompareCallback() const { return compare_callback; }
}
- inline bool
- snapshot_num_less(const Snapshot& snapshot, unsigned int num)
+ struct num_is
{
- return snapshot.getNum() < num;
- }
+ num_is(unsigned int num) : num(num) {}
+ bool operator()(const Snapshot& s) const { return s.getNum() == num; }
+ const unsigned int num;
+ };
Snapshots::iterator
Snapshots::find(unsigned int num)
{
- return lower_bound(entries.begin(), entries.end(), num, snapshot_num_less);
+ return find_if(entries.begin(), entries.end(), num_is(num));
}
Snapshots::const_iterator
Snapshots::find(unsigned int num) const
{
- return lower_bound(entries.begin(), entries.end(), num, snapshot_num_less);
+ return find_if(entries.begin(), entries.end(), num_is(num));
}
}
{
public:
- Snapshots() : initialized(false) {}
+ friend class Snapper;
- void assertInit();
+ Snapshots() : initialized(false) {}
typedef list<Snapshot>::iterator iterator;
typedef list<Snapshot>::const_iterator const_iterator;
iterator find(unsigned int num);
const_iterator find(unsigned int num) const;
- iterator createSingleSnapshot(string description);
- iterator createPreSnapshot(string description);
- iterator createPostSnapshot(const_iterator pre);
-
private:
+ void assertInit();
+
void initialize();
void read();
+ iterator createSingleSnapshot(string description);
+ iterator createPreSnapshot(string description);
+ iterator createPostSnapshot(const_iterator pre);
+
unsigned int nextNumber();
bool initialized;
}
-void showDifference( const list<string>& args )
+void
+readNums(const list<string>& args, Snapshots::const_iterator& snap1, Snapshots::const_iterator& snap2)
+{
+ const Snapshots& snapshots = sh->getSnapshots();
+
+ list<string>::const_iterator s = args.begin();
+ if (s != args.end())
{
- unsigned int num1 = 0;
- unsigned int num2 = 0;
+ unsigned int num1 = 0;
+ if (*s != "current")
+ *s >> num1;
+ s++;
- readNums(args, num1, num2);
+ snap1 = snapshots.find(num1);
+ if (snap1 == snapshots.end())
+ {
+ cerr << "snapshots not found" << endl;
+ exit(EXIT_FAILURE);
+ }
+ }
+ if (s != args.end())
+ {
+ unsigned int num2 = 0;
+ if (*s != "current")
+ *s >> num2;
+ s++;
- const Snapshots& snapshots = sh->getSnapshots();
- sh->setComparisonNums(snapshots.find(num1), snapshots.find(num2));
+ snap2 = snapshots.find(num2);
+ if (snap2 == snapshots.end())
+ {
+ cerr << "snapshots not found" << endl;
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ y2mil("num1:" << snap1->getNum() << " num2:" << snap2->getNum());
+}
+
+
+void
+showDifference( const list<string>& args )
+{
+ Snapshots::const_iterator snap1;
+ Snapshots::const_iterator snap2;
+
+ readNums(args, snap1, snap2);
+
+ sh->setComparisonNums(snap1, snap2);
const Files& files = sh->getFiles();
for (Files::const_iterator it = files.begin(); it != files.end(); ++it)
cout << statusToString(it->getPreToPostStatus()) << " " << it->getName() << endl;
- }
+}
-void doRollback( const list<string>& args )
- {
- unsigned int num1 = 0;
- unsigned int num2 = 0;
+void
+doRollback( const list<string>& args )
+{
+ Snapshots::const_iterator snap1;
+ Snapshots::const_iterator snap2;
- readNums(args, num1, num2);
+ readNums(args, snap1, snap2);
- const Snapshots& snapshots = sh->getSnapshots();
- sh->setComparisonNums(snapshots.find(num1), snapshots.find(num2));
+ sh->setComparisonNums(snap1, snap2);
Files& files = sh->getFiles();
for (Files::iterator it = files.begin(); it != files.end(); ++it)
it->setRollback(true);
- files.doRollback();
- }
+ sh->doRollback();
+}
int