|
|
@@ -12,6 +12,7 @@
|
|
|
#include <iostream>
|
|
|
#include <fstream>
|
|
|
#include <string>
|
|
|
+#include <cassert>
|
|
|
|
|
|
using namespace boost::filesystem;
|
|
|
using std::string;
|
|
|
@@ -30,6 +31,57 @@ namespace
|
|
|
std::cout << "could not open input file: " << p.string() << '\n';
|
|
|
std::getline( fin, target, '\0' ); // read the whole file
|
|
|
}
|
|
|
+
|
|
|
+// svn_keyword -------------------------------------------------------------//
|
|
|
+
|
|
|
+ int svn_keyword( string::const_iterator beg, string::const_iterator end )
|
|
|
+ {
|
|
|
+ static const char k1 [] = {"LastChangeDate"};
|
|
|
+ static const char k1a[] = {"Date"};
|
|
|
+ static const char k2 [] = {"LastChangeRevision"};
|
|
|
+ static const char k2a[] = {"Rev"};
|
|
|
+ static const char k3 [] = {"LastChangedBy"};
|
|
|
+ static const char k3a[] = {"Author"};
|
|
|
+ static const char k4 [] = {"HeadURL"};
|
|
|
+ static const char k4a[] = {"URL"};
|
|
|
+ static const char k5 [] = {"Id"};
|
|
|
+
|
|
|
+ std::size_t sz( end - beg );
|
|
|
+ const char * p(&*beg);
|
|
|
+ if ( sz > sizeof(k1) && memcmp(p, k1, sizeof(k1-1)) == 0 ) return 1;
|
|
|
+ if ( sz > sizeof(k1a) && memcmp(p, k1a, sizeof(k1a-1)) == 0 ) return 1;
|
|
|
+ if ( sz > sizeof(k2) && memcmp(p, k2, sizeof(k2-1)) == 0 ) return 2;
|
|
|
+ if ( sz > sizeof(k2a) && memcmp(p, k2a, sizeof(k2a-1)) == 0 ) return 2;
|
|
|
+ if ( sz > sizeof(k3) && memcmp(p, k3, sizeof(k3-1)) == 0 ) return 3;
|
|
|
+ if ( sz > sizeof(k3a) && memcmp(p, k3a, sizeof(k3a-1)) == 0 ) return 3;
|
|
|
+ if ( sz > sizeof(k4) && memcmp(p, k4, sizeof(k4-1)) == 0 ) return 4;
|
|
|
+ if ( sz > sizeof(k4a) && memcmp(p, k4a, sizeof(k4a-1)) == 0 ) return 4;
|
|
|
+ if ( sz > sizeof(k5) && memcmp(p, k5, sizeof(k5-1)) == 0 ) return 5;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+// equivalent --------------------------------------------------------------//
|
|
|
+// (ignoring SVN keyword contents)
|
|
|
+
|
|
|
+ bool equivalent( const string & s1, const string & s2 )
|
|
|
+ {
|
|
|
+ assert(s1.size() == s2.size());
|
|
|
+ string::const_iterator it1(s1.begin()), end1(s1.end());
|
|
|
+ string::const_iterator it2(s2.begin()), end2(s2.end());
|
|
|
+
|
|
|
+ for ( ; it1 != end1 && it2 != end2; ++it1, ++it2 )
|
|
|
+ {
|
|
|
+ if ( *it1 != *it2 ) return false;
|
|
|
+ int keyword;
|
|
|
+ if ( *it1 == '$' && (keyword=svn_keyword(it1, end1)) != 0
|
|
|
+ && keyword == svn_keyword(it2, end2) )
|
|
|
+ {
|
|
|
+ do { ++it1; } while ( it1 != end1 && *it1 != '$');
|
|
|
+ do { ++it2; } while ( it2 != end2 && *it2 != '$');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// main --------------------------------------------------------------------//
|
|
|
@@ -68,21 +120,12 @@ int main( int argc, char * argv[] )
|
|
|
}
|
|
|
else if ( is_regular_file( it.status() ) )
|
|
|
{
|
|
|
- if ( file_size(*it) != file_size(t) )
|
|
|
- {
|
|
|
- std::cout << t.string() << " different size\n";
|
|
|
- }
|
|
|
-
|
|
|
- // size of the two files is the same, so compare contents
|
|
|
- else
|
|
|
+ string contents1, contents2;
|
|
|
+ load_file(*it, contents1);
|
|
|
+ load_file(t, contents2);
|
|
|
+ if ( !equivalent( contents1, contents2 ) )
|
|
|
{
|
|
|
- string contents1, contents2;
|
|
|
- load_file(*it, contents1);
|
|
|
- load_file(t, contents2);
|
|
|
- if ( contents1 != contents2 )
|
|
|
- {
|
|
|
- std::cout << t.string() << " different content\n";
|
|
|
- }
|
|
|
+ std::cout << t.string() << " different content\n";
|
|
|
}
|
|
|
}
|
|
|
}
|