Unify and correct Autosave functions
Autosave was not working correctly, partly due to different
implementations in eeschema and pcbnew and partly due to a mistaken
refactor at some point during v5 development. This unifies the expected
autosave prefix to _autosave- for both pcbnew and eeschema. It also
unifies the expected suffix for the backup files to -bak.
Fixes: lp:1820433
* https://bugs.launchpad.net/kicad/+bug/1820433
(cherry picked from commit 078320e2fb
)
This commit is contained in:
parent
4facd57cb7
commit
168fa09f5f
|
@ -582,16 +582,14 @@ bool EDA_BASE_FRAME::IsWritable( const wxFileName& aFileName )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EDA_BASE_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName,
|
void EDA_BASE_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName )
|
||||||
const wxString& aBackupFileExtension )
|
|
||||||
{
|
{
|
||||||
wxCHECK_RET( aFileName.IsOk(), wxT( "Invalid file name!" ) );
|
wxCHECK_RET( aFileName.IsOk(), wxT( "Invalid file name!" ) );
|
||||||
wxCHECK_RET( !aBackupFileExtension.IsEmpty(), wxT( "Invalid backup file extension!" ) );
|
|
||||||
|
|
||||||
wxFileName autoSaveFileName = aFileName;
|
wxFileName autoSaveFileName = aFileName;
|
||||||
|
|
||||||
// Check for auto save file.
|
// Check for auto save file.
|
||||||
autoSaveFileName.SetName( AUTOSAVE_PREFIX_FILENAME + aFileName.GetName() );
|
autoSaveFileName.SetName( GetAutoSaveFilePrefix() + aFileName.GetName() );
|
||||||
|
|
||||||
wxLogTrace( traceAutoSave,
|
wxLogTrace( traceAutoSave,
|
||||||
wxT( "Checking for auto save file " ) + autoSaveFileName.GetFullPath() );
|
wxT( "Checking for auto save file " ) + autoSaveFileName.GetFullPath() );
|
||||||
|
@ -615,18 +613,14 @@ void EDA_BASE_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName,
|
||||||
{
|
{
|
||||||
// Get the backup file name.
|
// Get the backup file name.
|
||||||
wxFileName backupFileName = aFileName;
|
wxFileName backupFileName = aFileName;
|
||||||
backupFileName.SetExt( aBackupFileExtension );
|
backupFileName.SetExt( aFileName.GetExt() + GetBackupSuffix() );
|
||||||
|
|
||||||
// If an old backup file exists, delete it. If an old copy of the file exists, rename
|
// If an old backup file exists, delete it. If an old copy of the file exists, rename
|
||||||
// it to the backup file name
|
// it to the backup file name
|
||||||
if( aFileName.FileExists() )
|
if( aFileName.FileExists() )
|
||||||
{
|
{
|
||||||
// Remove the old file backup file.
|
|
||||||
if( backupFileName.FileExists() )
|
|
||||||
wxRemoveFile( backupFileName.GetFullPath() );
|
|
||||||
|
|
||||||
// Rename the old file to the backup file name.
|
// Rename the old file to the backup file name.
|
||||||
if( !wxRenameFile( aFileName.GetFullPath(), backupFileName.GetFullPath() ) )
|
if( !wxRenameFile( aFileName.GetFullPath(), backupFileName.GetFullPath(), true ) )
|
||||||
{
|
{
|
||||||
msg.Printf( _( "Could not create backup file \"%s\"" ),
|
msg.Printf( _( "Could not create backup file \"%s\"" ),
|
||||||
GetChars( backupFileName.GetFullPath() ) );
|
GetChars( backupFileName.GetFullPath() ) );
|
||||||
|
|
|
@ -135,7 +135,7 @@ bool SCH_EDIT_FRAME::SaveEEFile( SCH_SCREEN* aScreen, bool aSaveUnderNewName,
|
||||||
{
|
{
|
||||||
// Delete auto save file.
|
// Delete auto save file.
|
||||||
wxFileName autoSaveFileName = schematicFileName;
|
wxFileName autoSaveFileName = schematicFileName;
|
||||||
autoSaveFileName.SetName( AUTOSAVE_PREFIX_FILENAME + schematicFileName.GetName() );
|
autoSaveFileName.SetName( GetAutoSaveFilePrefix() + schematicFileName.GetName() );
|
||||||
|
|
||||||
if( autoSaveFileName.FileExists() )
|
if( autoSaveFileName.FileExists() )
|
||||||
{
|
{
|
||||||
|
@ -289,6 +289,9 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||||
g_RootSheet = NULL; // Force CreateScreens() to build new empty project on load failure.
|
g_RootSheet = NULL; // Force CreateScreens() to build new empty project on load failure.
|
||||||
SCH_PLUGIN::SCH_PLUGIN_RELEASER pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_LEGACY ) );
|
SCH_PLUGIN::SCH_PLUGIN_RELEASER pi( SCH_IO_MGR::FindPlugin( SCH_IO_MGR::SCH_LEGACY ) );
|
||||||
|
|
||||||
|
// This will rename the file if there is an autosave and the user want to recover
|
||||||
|
CheckForAutoSaveFile( fullFileName );
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
g_RootSheet = pi->Load( fullFileName, &Kiway() );
|
g_RootSheet = pi->Load( fullFileName, &Kiway() );
|
||||||
|
@ -745,8 +748,8 @@ bool SCH_EDIT_FRAME::doAutoSave()
|
||||||
|
|
||||||
tmpFileName = fn = screen->GetFileName();
|
tmpFileName = fn = screen->GetFileName();
|
||||||
|
|
||||||
// Auto save file name is the normal file name prefixed with AUTOSAVE_PREFIX_FILENAME.
|
// Auto save file name is the normal file name prefixed with GetAutoSavePrefix().
|
||||||
fn.SetName( AUTOSAVE_PREFIX_FILENAME + fn.GetName() );
|
fn.SetName( GetAutoSaveFilePrefix() + fn.GetName() );
|
||||||
|
|
||||||
screen->SetFileName( fn.GetFullPath() );
|
screen->SetFileName( fn.GetFullPath() );
|
||||||
|
|
||||||
|
|
|
@ -690,7 +690,7 @@ void SCH_DRAW_PANEL::OnKeyEvent( wxKeyEvent& event )
|
||||||
|
|
||||||
void SCH_DRAW_PANEL::onPaint( wxPaintEvent& aEvent )
|
void SCH_DRAW_PANEL::onPaint( wxPaintEvent& aEvent )
|
||||||
{
|
{
|
||||||
if( !m_gal->IsInitialized() )
|
if( !m_gal->IsInitialized() || !m_gal->IsVisible() )
|
||||||
// The first wxPaintEvent can be fired at startup before the GAL engine is fully initialized
|
// The first wxPaintEvent can be fired at startup before the GAL engine is fully initialized
|
||||||
// (depending on platforms). Do nothing in this case
|
// (depending on platforms). Do nothing in this case
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -689,8 +689,8 @@ void SCH_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent )
|
||||||
{
|
{
|
||||||
fn = Prj().AbsolutePath( screen->GetFileName() );
|
fn = Prj().AbsolutePath( screen->GetFileName() );
|
||||||
|
|
||||||
// Auto save file name is the normal file name prepended with AUTOSAVE_PREFIX_FILENAME.
|
// Auto save file name is the normal file name prepended with GetAutoSaveFilePrefix().
|
||||||
fn.SetName( AUTOSAVE_PREFIX_FILENAME + fn.GetName() );
|
fn.SetName( GetAutoSaveFilePrefix() + fn.GetName() );
|
||||||
|
|
||||||
if( fn.FileExists() && fn.IsFileWritable() )
|
if( fn.FileExists() && fn.IsFileWritable() )
|
||||||
wxRemoveFile( fn.GetFullPath() );
|
wxRemoveFile( fn.GetFullPath() );
|
||||||
|
|
|
@ -60,18 +60,6 @@
|
||||||
#define CREATE_BACKUP_FILE true
|
#define CREATE_BACKUP_FILE true
|
||||||
#define NO_BACKUP_FILE false
|
#define NO_BACKUP_FILE false
|
||||||
|
|
||||||
/**
|
|
||||||
* Prefix to create filenames for schematic files or other difile when auto-saved
|
|
||||||
* to retrieve a crash.
|
|
||||||
*
|
|
||||||
* The auto-saved filenames are AUTOSAVE_PREFIX_FILENAME + \<sourcefilename\>
|
|
||||||
* where \<sourcefilename\> is the flename without path of the auto-saved file
|
|
||||||
* Warning: avoid any special charactoer like / \\ \$ \% which can create issues on Unix
|
|
||||||
* or Window with filenames or env var expansion.
|
|
||||||
*/
|
|
||||||
#define AUTOSAVE_PREFIX_FILENAME wxT( "_saved_" )
|
|
||||||
|
|
||||||
|
|
||||||
class EDA_ITEM;
|
class EDA_ITEM;
|
||||||
class EDA_RECT;
|
class EDA_RECT;
|
||||||
class EDA_DRAW_PANEL;
|
class EDA_DRAW_PANEL;
|
||||||
|
@ -159,6 +147,24 @@ protected:
|
||||||
///> Default style flags used for wxAUI toolbars
|
///> Default style flags used for wxAUI toolbars
|
||||||
static constexpr int KICAD_AUI_TB_STYLE = wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_PLAIN_BACKGROUND;
|
static constexpr int KICAD_AUI_TB_STYLE = wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_PLAIN_BACKGROUND;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetBackupSuffix
|
||||||
|
* @return the suffix to be appended to the file extension on backup
|
||||||
|
*/
|
||||||
|
static wxString GetBackupSuffix()
|
||||||
|
{
|
||||||
|
return wxT( "-bak" );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetAutoSaveFilePrefix
|
||||||
|
* @return the string to prepend to a file name for automatic save.
|
||||||
|
*/
|
||||||
|
static wxString GetAutoSaveFilePrefix()
|
||||||
|
{
|
||||||
|
return wxT( "_autosave-" );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function onAutoSaveTimer
|
* Function onAutoSaveTimer
|
||||||
* handles the auto save timer event.
|
* handles the auto save timer event.
|
||||||
|
@ -386,10 +392,8 @@ public:
|
||||||
* is removed.
|
* is removed.
|
||||||
* </p>
|
* </p>
|
||||||
* @param aFileName A wxFileName object containing the file name to check.
|
* @param aFileName A wxFileName object containing the file name to check.
|
||||||
* @param aBackupFileExtension A wxString object containing the backup file extension
|
|
||||||
* used to create the backup file name.
|
|
||||||
*/
|
*/
|
||||||
void CheckForAutoSaveFile( const wxFileName& aFileName, const wxString& aBackupFileExtension );
|
void CheckForAutoSaveFile( const wxFileName& aFileName );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function ShowChangedLanguage
|
* Function ShowChangedLanguage
|
||||||
|
|
|
@ -62,16 +62,6 @@
|
||||||
#define USE_INSTRUMENTATION 0
|
#define USE_INSTRUMENTATION 0
|
||||||
|
|
||||||
|
|
||||||
static const wxChar backupSuffix[] = wxT( "-bak" );
|
|
||||||
static const wxChar autosavePrefix[] = wxT( "_autosave-" );
|
|
||||||
|
|
||||||
|
|
||||||
wxString PCB_EDIT_FRAME::GetAutoSaveFilePrefix()
|
|
||||||
{
|
|
||||||
return wxString( autosavePrefix );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function AskLoadBoardFileName
|
* Function AskLoadBoardFileName
|
||||||
* puts up a wxFileDialog asking for a BOARD filename to open.
|
* puts up a wxFileDialog asking for a BOARD filename to open.
|
||||||
|
@ -265,12 +255,12 @@ bool PCB_EDIT_FRAME::Files_io_from_id( int id )
|
||||||
|
|
||||||
if( id == ID_MENU_RECOVER_BOARD_AUTOSAVE )
|
if( id == ID_MENU_RECOVER_BOARD_AUTOSAVE )
|
||||||
{
|
{
|
||||||
wxString rec_name = wxString( autosavePrefix ) + fn.GetName();
|
wxString rec_name = GetAutoSaveFilePrefix() + fn.GetName();
|
||||||
fn.SetName( rec_name );
|
fn.SetName( rec_name );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wxString backup_ext = fn.GetExt()+ backupSuffix;
|
wxString backup_ext = fn.GetExt() + GetBackupSuffix();
|
||||||
fn.SetExt( backup_ext );
|
fn.SetExt( backup_ext );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -381,10 +371,6 @@ IO_MGR::PCB_FILE_T plugin_type( const wxString& aFileName, int aCtl )
|
||||||
// both legacy and eagle share a common file extension.
|
// both legacy and eagle share a common file extension.
|
||||||
pluginType = ( aCtl & KICTL_EAGLE_BRD ) ? IO_MGR::EAGLE : IO_MGR::LEGACY;
|
pluginType = ( aCtl & KICTL_EAGLE_BRD ) ? IO_MGR::EAGLE : IO_MGR::LEGACY;
|
||||||
}
|
}
|
||||||
else if( fn.GetExt().CmpNoCase( IO_MGR::GetFileExtension( IO_MGR::LEGACY ) + backupSuffix ) == 0 )
|
|
||||||
{
|
|
||||||
pluginType = IO_MGR::LEGACY;
|
|
||||||
}
|
|
||||||
else if( fn.GetExt().CmpNoCase( IO_MGR::GetFileExtension( IO_MGR::PCAD ) ) == 0 )
|
else if( fn.GetExt().CmpNoCase( IO_MGR::GetFileExtension( IO_MGR::PCAD ) ) == 0 )
|
||||||
{
|
{
|
||||||
pluginType = IO_MGR::PCAD;
|
pluginType = IO_MGR::PCAD;
|
||||||
|
@ -478,6 +464,9 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||||
|
|
||||||
PLUGIN::RELEASER pi( IO_MGR::PluginFind( pluginType ) );
|
PLUGIN::RELEASER pi( IO_MGR::PluginFind( pluginType ) );
|
||||||
|
|
||||||
|
// This will rename the file if there is an autosave and the user want to recover
|
||||||
|
CheckForAutoSaveFile( fullFileName );
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
PROPERTIES props;
|
PROPERTIES props;
|
||||||
|
@ -541,11 +530,6 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||||
|
|
||||||
GetScreen()->ClrModify();
|
GetScreen()->ClrModify();
|
||||||
|
|
||||||
{
|
|
||||||
wxFileName fn = fullFileName;
|
|
||||||
CheckForAutoSaveFile( fullFileName, fn.GetExt() );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( pluginType == IO_MGR::LEGACY &&
|
if( pluginType == IO_MGR::LEGACY &&
|
||||||
loadedBoard->GetFileFormatVersionAtLoad() < LEGACY_BOARD_FILE_VERSION )
|
loadedBoard->GetFileFormatVersionAtLoad() < LEGACY_BOARD_FILE_VERSION )
|
||||||
{
|
{
|
||||||
|
@ -618,12 +602,12 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static wxString create_backup_file( const wxString& aFileName )
|
wxString PCB_EDIT_FRAME::createBackupFile( const wxString& aFileName )
|
||||||
{
|
{
|
||||||
wxFileName fn = aFileName;
|
wxFileName fn = aFileName;
|
||||||
wxFileName backupFileName = aFileName;
|
wxFileName backupFileName = aFileName;
|
||||||
|
|
||||||
backupFileName.SetExt( fn.GetExt() + backupSuffix );
|
backupFileName.SetExt( fn.GetExt() + GetBackupSuffix() );
|
||||||
|
|
||||||
// If an old backup file exists, delete it. If an old board file exists,
|
// If an old backup file exists, delete it. If an old board file exists,
|
||||||
// rename it to the backup file name.
|
// rename it to the backup file name.
|
||||||
|
@ -674,11 +658,9 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF
|
||||||
|
|
||||||
wxString backupFileName;
|
wxString backupFileName;
|
||||||
|
|
||||||
// aCreateBackupFile == false is mainly used to write autosave files
|
|
||||||
// or new files in save as... command
|
|
||||||
if( aCreateBackupFile )
|
if( aCreateBackupFile )
|
||||||
{
|
{
|
||||||
backupFileName = create_backup_file( aFileName );
|
backupFileName = createBackupFile( aFileName );
|
||||||
}
|
}
|
||||||
|
|
||||||
GetBoard()->SynchronizeNetsAndNetClasses();
|
GetBoard()->SynchronizeNetsAndNetClasses();
|
||||||
|
@ -729,7 +711,7 @@ bool PCB_EDIT_FRAME::SavePcbFile( const wxString& aFileName, bool aCreateBackupF
|
||||||
// Delete auto save file on successful save.
|
// Delete auto save file on successful save.
|
||||||
wxFileName autoSaveFileName = pcbFileName;
|
wxFileName autoSaveFileName = pcbFileName;
|
||||||
|
|
||||||
autoSaveFileName.SetName( wxString( autosavePrefix ) + pcbFileName.GetName() );
|
autoSaveFileName.SetName( GetAutoSaveFilePrefix() + pcbFileName.GetName() );
|
||||||
|
|
||||||
if( autoSaveFileName.FileExists() )
|
if( autoSaveFileName.FileExists() )
|
||||||
wxRemoveFile( autoSaveFileName.GetFullPath() );
|
wxRemoveFile( autoSaveFileName.GetFullPath() );
|
||||||
|
@ -816,7 +798,7 @@ bool PCB_EDIT_FRAME::doAutoSave()
|
||||||
wxFileName autoSaveFileName = tmpFileName;
|
wxFileName autoSaveFileName = tmpFileName;
|
||||||
|
|
||||||
// Auto save file name is the board file name prepended with autosaveFilePrefix string.
|
// Auto save file name is the board file name prepended with autosaveFilePrefix string.
|
||||||
autoSaveFileName.SetName( wxString( autosavePrefix ) + autoSaveFileName.GetName() );
|
autoSaveFileName.SetName( GetAutoSaveFilePrefix() + autoSaveFileName.GetName() );
|
||||||
|
|
||||||
if( !autoSaveFileName.IsOk() )
|
if( !autoSaveFileName.IsOk() )
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -611,7 +611,7 @@ void PCB_EDIT_FRAME::OnCloseWindow( wxCloseEvent& Event )
|
||||||
// Delete the auto save file if it exists.
|
// Delete the auto save file if it exists.
|
||||||
wxFileName fn = GetBoard()->GetFileName();
|
wxFileName fn = GetBoard()->GetFileName();
|
||||||
|
|
||||||
// Auto save file name is the normal file name prefixed with '_autosave'.
|
// Auto save file name is the normal file name prefixed with 'GetAutoSaveFilePrefix()'.
|
||||||
fn.SetName( GetAutoSaveFilePrefix() + fn.GetName() );
|
fn.SetName( GetAutoSaveFilePrefix() + fn.GetName() );
|
||||||
|
|
||||||
// When the auto save feature does not have write access to the board file path, it falls
|
// When the auto save feature does not have write access to the board file path, it falls
|
||||||
|
|
|
@ -113,6 +113,8 @@ protected:
|
||||||
void createPopUpBlockMenu( wxMenu* menu );
|
void createPopUpBlockMenu( wxMenu* menu );
|
||||||
void createPopUpMenuForMarkers( MARKER_PCB* aMarker, wxMenu* aPopMenu );
|
void createPopUpMenuForMarkers( MARKER_PCB* aMarker, wxMenu* aPopMenu );
|
||||||
|
|
||||||
|
wxString createBackupFile( const wxString& aFileName );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* an helper function to enable some menus only active when the display
|
* an helper function to enable some menus only active when the display
|
||||||
* is switched to GAL mode and which do nothing in legacy mode
|
* is switched to GAL mode and which do nothing in legacy mode
|
||||||
|
@ -308,12 +310,6 @@ public:
|
||||||
*/
|
*/
|
||||||
void UpdateUserInterface();
|
void UpdateUserInterface();
|
||||||
|
|
||||||
/**
|
|
||||||
* Function GetAutoSaveFilePrefix
|
|
||||||
* @return the string to prepend to a file name for automatic save.
|
|
||||||
*/
|
|
||||||
static wxString GetAutoSaveFilePrefix();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute a remote command send by Eeschema via a socket,
|
* Execute a remote command send by Eeschema via a socket,
|
||||||
* port KICAD_PCB_PORT_SERVICE_NUMBER (currently 4242)
|
* port KICAD_PCB_PORT_SERVICE_NUMBER (currently 4242)
|
||||||
|
|
Loading…
Reference in New Issue