Merge branch 'only-backup-when-different' into 'master'
Issue 12453: Backup project only when different to previous Closes #12453 See merge request kicad/code/kicad!1322
This commit is contained in:
commit
4fb7bb88d3
|
@ -33,14 +33,47 @@
|
||||||
#include <wxstream_helper.h>
|
#include <wxstream_helper.h>
|
||||||
#include <wx/log.h>
|
#include <wx/log.h>
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
|
||||||
#define ZipFileExtension wxT( "zip" )
|
#define ZipFileExtension wxT( "zip" )
|
||||||
|
|
||||||
|
|
||||||
PROJECT_ARCHIVER::PROJECT_ARCHIVER()
|
PROJECT_ARCHIVER::PROJECT_ARCHIVER()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PROJECT_ARCHIVER::AreZipArchivesIdentical( const wxString& aZipFileA,
|
||||||
|
const wxString& aZipFileB, REPORTER& aReporter )
|
||||||
|
{
|
||||||
|
wxFFileInputStream streamA( aZipFileA );
|
||||||
|
wxFFileInputStream streamB( aZipFileB );
|
||||||
|
|
||||||
|
if( !streamA.IsOk() || !streamB.IsOk() )
|
||||||
|
{
|
||||||
|
aReporter.Report( _( "Could not open archive file." ), RPT_SEVERITY_ERROR );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxZipInputStream zipStreamA = wxZipInputStream( streamA );
|
||||||
|
wxZipInputStream zipStreamB = wxZipInputStream( streamB );
|
||||||
|
|
||||||
|
std::set<wxUint32> crcsA;
|
||||||
|
std::set<wxUint32> crcsB;
|
||||||
|
|
||||||
|
|
||||||
|
for( wxZipEntry* entry = zipStreamA.GetNextEntry(); entry; entry = zipStreamA.GetNextEntry() )
|
||||||
|
{
|
||||||
|
crcsA.insert( entry->GetCrc() );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( wxZipEntry* entry = zipStreamB.GetNextEntry(); entry; entry = zipStreamB.GetNextEntry() )
|
||||||
|
{
|
||||||
|
crcsB.insert( entry->GetCrc() );
|
||||||
|
}
|
||||||
|
|
||||||
|
return crcsA == crcsB;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Unarchive Files code comes from wxWidgets sample/archive/archive.cpp
|
// Unarchive Files code comes from wxWidgets sample/archive/archive.cpp
|
||||||
bool PROJECT_ARCHIVER::Unarchive( const wxString& aSrcFile, const wxString& aDestDir,
|
bool PROJECT_ARCHIVER::Unarchive( const wxString& aSrcFile, const wxString& aDestDir,
|
||||||
|
|
|
@ -1339,17 +1339,36 @@ bool SETTINGS_MANAGER::TriggerBackupIfNeeded( REPORTER& aReporter ) const
|
||||||
return first.GetTicks() > second.GetTicks();
|
return first.GetTicks() > second.GetTicks();
|
||||||
} );
|
} );
|
||||||
|
|
||||||
// Do we even need to back up?
|
// Backup
|
||||||
if( !files.empty() )
|
bool backupSuccessful = BackupProject( aReporter );
|
||||||
|
if( !backupSuccessful )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Update the file list
|
||||||
|
files.clear();
|
||||||
|
dir.Traverse( traverser, wxT( "*.zip" ) );
|
||||||
|
|
||||||
|
// Sort newest-first
|
||||||
|
std::sort( files.begin(), files.end(),
|
||||||
|
[&]( const wxString& aFirst, const wxString& aSecond ) -> bool
|
||||||
|
{
|
||||||
|
wxDateTime first = modTime( aFirst );
|
||||||
|
wxDateTime second = modTime( aSecond );
|
||||||
|
|
||||||
|
return first.GetTicks() > second.GetTicks();
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Are there any changes since the last backup?
|
||||||
|
if( files.size() > 1 )
|
||||||
{
|
{
|
||||||
wxDateTime lastTime = modTime( files[0] );
|
PROJECT_ARCHIVER archiver;
|
||||||
|
bool identicalToPrevious =
|
||||||
|
archiver.AreZipArchivesIdentical( files[0], files[1], aReporter );
|
||||||
|
|
||||||
if( lastTime.IsValid() )
|
if( identicalToPrevious )
|
||||||
{
|
{
|
||||||
wxTimeSpan delta = wxDateTime::Now() - modTime( files[0] );
|
wxRemoveFile( files[0] );
|
||||||
|
return true;
|
||||||
if( delta.IsShorterThan( wxTimeSpan::Seconds( settings.min_interval ) ) )
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1413,7 +1432,7 @@ bool SETTINGS_MANAGER::TriggerBackupIfNeeded( REPORTER& aReporter ) const
|
||||||
wxRemoveFile( file );
|
wxRemoveFile( file );
|
||||||
}
|
}
|
||||||
|
|
||||||
return BackupProject( aReporter );
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,16 @@ public:
|
||||||
|
|
||||||
~PROJECT_ARCHIVER() = default;
|
~PROJECT_ARCHIVER() = default;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares the crcs of all the files in zip archive to determine whether the archives are identical
|
||||||
|
* @param aZipFileA is the full path to the first zip
|
||||||
|
* @param aZipFileB is the full path to the second zip
|
||||||
|
* @param aReporter is used to report status
|
||||||
|
* @return true if the archives are identical
|
||||||
|
*/
|
||||||
|
bool AreZipArchivesIdentical( const wxString& aZipFileA, const wxString& aZipFileB,
|
||||||
|
REPORTER& aReporter );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates an archive of the project
|
* Creates an archive of the project
|
||||||
* @param aSrcFile is the full path to the project to be archived
|
* @param aSrcFile is the full path to the project to be archived
|
||||||
|
|
Loading…
Reference in New Issue