Better determined what should be backed up
authorCarl N Baldwin <cnb@hpsvcnb.fc.hp.com>
Fri, 21 Oct 2005 14:58:44 +0000 (08:58 -0600)
committerCarl N Baldwin <cnb@hpsvcnb.fc.hp.com>
Fri, 21 Oct 2005 14:58:44 +0000 (08:58 -0600)
filedata.cpp
filedata.hpp
main.cc

index 31078ea9878c8c2068a08176812f85e5e5b25ca5..6b14517eec2125bfe80b922101328b0e33fdc364 100644 (file)
@@ -75,3 +75,17 @@ istream &operator>>( istream &i, FileData &d ) {
 
   return i;
 }
+
+bool needs_backup( const FileData *before, const FileData *after ) {
+  assert( before->getFileName() == after->getFileName() );
+
+  if( after->getLastBackupDate()  <  after->getModifiedDate() ) return true;
+
+  if( before->getFileType()       != after->getFileType()     ) return true;
+  if( before->getPermissions()    != after->getPermissions()  ) return true;
+  if( before->getUserName()       != after->getUserName()     ) return true;
+  if( before->getGroupName()      != after->getGroupName()    ) return true;
+  if( before->getFileSize()       != after->getFileSize()     ) return true;
+
+  return false;
+}
index 62546747f1f3e8d7da7f49680ee73e3d9679c29a..b339f05f92b2fcc4c425e13c119b56bbb37a8a5b 100644 (file)
@@ -4,6 +4,7 @@
 #include <string>
 #include <set>
 #include <vector>
+#include <cassert>
 
 class FileData {
   public:
@@ -67,6 +68,8 @@ struct FileDataNameCmp {
     std::less<std::string> cmp;
 };
 
+bool needs_backup( const FileData *before, const FileData *after );
+
 typedef std::set<FileData*,FileDataNameCmp> file_set;
 typedef std::vector<FileData*> file_vector;
 
diff --git a/main.cc b/main.cc
index e2864fda9603de454d0eb41d1257dc2b9a55c9e3..07868bcd65199d14e2a43da88dbf3740018bb672 100644 (file)
--- a/main.cc
+++ b/main.cc
@@ -62,7 +62,7 @@ void populate_set( istream &in, SET &files ) {
 
 template<class SET>
 void partition_sets( const SET &current, const SET &old,
-                     SET &added, SET &common, SET &deleted  ) {
+                     SET &added, SET &common, SET &old_common, SET &deleted  ) {
   FileDataNameCmp cmp;
 
   set_difference( current.begin(), current.end(),
@@ -79,6 +79,11 @@ void partition_sets( const SET &current, const SET &old,
                   old.begin(),     old.end(),
                   inserter( common, common.begin() ),
                   cmp );
+
+  set_union(      old.begin(),    old.end(),
+                  common.begin(), common.end(),
+                  inserter( old_common, old_common.begin() ),
+                  cmp );
 }
 
 int main() {
@@ -93,23 +98,8 @@ int main() {
   }
 
   // Now divide the two sets into three sets (added, deleted and common )
-  file_set added, deleted, common;
-  partition_sets( current, backed_up, added, common, deleted );
-
-  { // This little block will copy the last_backup_date from the second set to the first
-    FileDataNameCmp cmp;
-
-    file_set common_with_dates;
-    set_union( backed_up.begin(), backed_up.end(),
-               current.begin(),   current.end(),
-               inserter( common_with_dates, common_with_dates.begin() ),
-               cmp );
-
-    file_set::iterator i = common.begin(), j = common_with_dates.begin();
-    for( ; i != common.end(); ++i, ++j ) {
-      (*i)->setLastBackupDate( (*j)->getLastBackupDate() );
-    }
-  }
+  file_set added, deleted, common, old_common;
+  partition_sets( current, backed_up, added, common, old_common, deleted );
 
   // Now find the list of files to backup.
   file_set backups;
@@ -117,14 +107,15 @@ int main() {
   // backup all added files
   copy( added.begin(), added.end(), inserter( backups, backups.begin() ) );
 
-  // backup common files that have changed since the last backup date.
-  for( file_set::iterator i = common.begin(); i != common.end(); ++i ) {
-    if( (*i)->getLastBackupDate() < (*i)->getModifiedDate() ) {
-      backups.insert( *i );
-    }
+  // Backup files that have been modified
+  file_set::iterator i = common.begin(), j = old_common.begin();
+  for( ; i != common.end(); ++i, ++j ) {
+    (*i)->setLastBackupDate( (*j)->getLastBackupDate() );
+
+    if( needs_backup( *j, *i ) ) backups.insert( *i );
   }
 
-  // Now, sort the backups by filesize and build a list of up to SIZE
+  // Now, sort the backups by filesize and build a list that'll fit on a DVD
   file_vector backups_s;
   copy( backups.begin(), backups.end(), back_inserter( backups_s ) );