Clean up autosave files when reverting.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/15998
This commit is contained in:
parent
88a4979fff
commit
f83d60a48f
|
@ -3,6 +3,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
* Copyright (C) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||||
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@gmail.com>
|
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@gmail.com>
|
||||||
|
* Copyright (C) 2023 CERN (www.cern.ch)
|
||||||
* Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -1356,11 +1357,25 @@ void EDA_BASE_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wxLogTrace( traceAutoSave,
|
DeleteAutoSaveFile( aFileName );
|
||||||
wxT( "Removing auto save file " ) + autoSaveFileName.GetFullPath() );
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Remove the auto save file when using the previous file as is.
|
|
||||||
wxRemoveFile( autoSaveFileName.GetFullPath() );
|
void EDA_BASE_FRAME::DeleteAutoSaveFile( const wxFileName& aFileName )
|
||||||
|
{
|
||||||
|
if( !Pgm().IsGUI() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
wxCHECK_RET( aFileName.IsOk(), wxT( "Invalid file name!" ) );
|
||||||
|
|
||||||
|
wxFileName autoSaveFn = aFileName;
|
||||||
|
autoSaveFn.SetName( GetAutoSaveFilePrefix() + aFileName.GetName() );
|
||||||
|
|
||||||
|
if( autoSaveFn.FileExists() )
|
||||||
|
{
|
||||||
|
wxLogTrace( traceAutoSave, wxT( "Removing auto save file " ) + autoSaveFn.GetFullPath() );
|
||||||
|
wxRemoveFile( autoSaveFn.GetFullPath() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
* Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||||
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@gmail.com>
|
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@gmail.com>
|
||||||
* Copyright (C) 2013 CERN (www.cern.ch)
|
* Copyright (C) 2013-2023 CERN (www.cern.ch)
|
||||||
* Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -236,7 +236,15 @@ bool SCH_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||||
autoSaveFn.SetName( getAutoSaveFileName() );
|
autoSaveFn.SetName( getAutoSaveFileName() );
|
||||||
autoSaveFn.ClearExt();
|
autoSaveFn.ClearExt();
|
||||||
|
|
||||||
|
if( ( aCtl & KICTL_REVERT ) )
|
||||||
|
{
|
||||||
|
DeleteAutoSaveFile( fullFileName );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// This will rename the file if there is an autosave and the user wants to recover
|
||||||
CheckForAutoSaveFile( autoSaveFn );
|
CheckForAutoSaveFile( autoSaveFn );
|
||||||
|
}
|
||||||
|
|
||||||
SetScreen( nullptr );
|
SetScreen( nullptr );
|
||||||
|
|
||||||
|
@ -1517,6 +1525,15 @@ bool SCH_EDIT_FRAME::updateAutoSaveFile()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void removeFile( const wxString& aFilename, wxArrayString& aUnremoved )
|
||||||
|
{
|
||||||
|
wxLogTrace( traceAutoSave, wxS( "Removing auto save file " ) + aFilename );
|
||||||
|
|
||||||
|
if( wxFileExists( aFilename ) && !wxRemoveFile( aFilename ) )
|
||||||
|
aUnremoved.Add( aFilename );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
void SCH_EDIT_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName )
|
void SCH_EDIT_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName )
|
||||||
{
|
{
|
||||||
if( !Pgm().IsGUI() )
|
if( !Pgm().IsGUI() )
|
||||||
|
@ -1538,11 +1555,11 @@ void SCH_EDIT_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName )
|
||||||
int response = wxMessageBox( msg, Pgm().App().GetAppDisplayName(), wxYES_NO | wxICON_QUESTION,
|
int response = wxMessageBox( msg, Pgm().App().GetAppDisplayName(), wxYES_NO | wxICON_QUESTION,
|
||||||
this );
|
this );
|
||||||
|
|
||||||
wxTextFile autoSaveFile( aFileName.GetFullPath() );
|
wxTextFile fileList( aFileName.GetFullPath() );
|
||||||
|
|
||||||
if( !autoSaveFile.Open() )
|
if( !fileList.Open() )
|
||||||
{
|
{
|
||||||
msg.Printf( _( "The file '%s` could not be opened.\n"
|
msg.Printf( _( "The file '%s' could not be opened.\n"
|
||||||
"Manual recovery of automatically saved files is required." ),
|
"Manual recovery of automatically saved files is required." ),
|
||||||
aFileName.GetFullPath() );
|
aFileName.GetFullPath() );
|
||||||
|
|
||||||
|
@ -1554,8 +1571,7 @@ void SCH_EDIT_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName )
|
||||||
{
|
{
|
||||||
wxArrayString unrecoveredFiles;
|
wxArrayString unrecoveredFiles;
|
||||||
|
|
||||||
for( wxString fn = autoSaveFile.GetFirstLine(); !autoSaveFile.Eof();
|
for( wxString fn = fileList.GetFirstLine(); !fileList.Eof(); fn = fileList.GetNextLine() )
|
||||||
fn = autoSaveFile.GetNextLine() )
|
|
||||||
{
|
{
|
||||||
wxFileName recoveredFn = fn;
|
wxFileName recoveredFn = fn;
|
||||||
wxString tmp = recoveredFn.GetName();
|
wxString tmp = recoveredFn.GetName();
|
||||||
|
@ -1602,50 +1618,53 @@ void SCH_EDIT_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName )
|
||||||
wxMessageBox( msg, Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
|
wxMessageBox( msg, Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
|
||||||
this );
|
this );
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxArrayString unremovedFiles;
|
wxArrayString unremovedFiles;
|
||||||
|
removeFile( aFileName.GetFullPath(), unremovedFiles );
|
||||||
for( wxString fn = autoSaveFile.GetFirstLine(); !autoSaveFile.Eof();
|
|
||||||
fn = autoSaveFile.GetNextLine() )
|
|
||||||
{
|
|
||||||
wxLogTrace( traceAutoSave, wxS( "Removing auto save file " ) + fn );
|
|
||||||
|
|
||||||
if( wxFileExists( fn ) && !wxRemoveFile( fn ) )
|
|
||||||
unremovedFiles.Add( fn );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !unremovedFiles.IsEmpty() )
|
if( !unremovedFiles.IsEmpty() )
|
||||||
{
|
{
|
||||||
msg = _( "The following automatically saved file(s) could not be removed\n" );
|
msg.Printf( _( "The autosave file '%s' could not be removed.\n"
|
||||||
|
"Manual removal will be required." ),
|
||||||
|
unremovedFiles[0] );
|
||||||
|
|
||||||
|
wxMessageBox( msg, Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION, this );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DeleteAutoSaveFile( aFileName );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SCH_EDIT_FRAME::DeleteAutoSaveFile( const wxFileName& aFileName )
|
||||||
|
{
|
||||||
|
if( !Pgm().IsGUI() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
wxCHECK_RET( aFileName.IsOk(), wxS( "Invalid file name!" ) );
|
||||||
|
|
||||||
|
if( !aFileName.FileExists() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
wxTextFile fileList( aFileName.GetFullPath() );
|
||||||
|
wxArrayString unremovedFiles;
|
||||||
|
|
||||||
|
for( wxString fn = fileList.GetFirstLine(); !fileList.Eof(); fn = fileList.GetNextLine() )
|
||||||
|
removeFile( fn, unremovedFiles );
|
||||||
|
|
||||||
|
removeFile( aFileName.GetFullPath(), unremovedFiles );
|
||||||
|
|
||||||
|
if( !unremovedFiles.IsEmpty() )
|
||||||
|
{
|
||||||
|
wxString msg = _( "The following automatically saved file(s) could not be removed\n" );
|
||||||
|
|
||||||
for( size_t i = 0; i < unremovedFiles.GetCount(); i++ )
|
for( size_t i = 0; i < unremovedFiles.GetCount(); i++ )
|
||||||
msg += unremovedFiles[i] + wxS( "\n" );
|
msg += unremovedFiles[i] + wxS( "\n" );
|
||||||
|
|
||||||
msg += _( "Manual removal will be required for the file(s) above." );
|
msg += _( "Manual removal will be required for the file(s) above." );
|
||||||
wxMessageBox( msg, Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION,
|
wxMessageBox( msg, Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION, this );
|
||||||
this );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the auto save master file.
|
|
||||||
wxLogTrace( traceAutoSave, wxS( "Removing auto save file '%s'" ), aFileName.GetFullPath() );
|
|
||||||
|
|
||||||
if( !wxRemoveFile( aFileName.GetFullPath() ) )
|
|
||||||
{
|
|
||||||
msg.Printf( _( "The automatic save master file\n"
|
|
||||||
"'%s'\n"
|
|
||||||
"could not be deleted." ), aFileName.GetFullPath() );
|
|
||||||
|
|
||||||
wxMessageDialog dlg( this, msg, Pgm().App().GetAppDisplayName(),
|
|
||||||
wxOK | wxICON_EXCLAMATION | wxCENTER );
|
|
||||||
|
|
||||||
dlg.SetExtendedMessage(
|
|
||||||
_( "This file must be manually removed or the auto save feature will be\n"
|
|
||||||
"shown every time the schematic editor is launched." ) );
|
|
||||||
|
|
||||||
dlg.ShowModal();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras wanadoo.fr
|
* Copyright (C) 2015 Jean-Pierre Charras, jp.charras wanadoo.fr
|
||||||
* Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
|
* Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
|
||||||
|
* Copyright (C) 2023 CERN (www.cern.ch)
|
||||||
* Copyright (C) 2004-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2004-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -809,6 +810,7 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void CheckForAutoSaveFile( const wxFileName& aFileName ) override;
|
virtual void CheckForAutoSaveFile( const wxFileName& aFileName ) override;
|
||||||
|
|
||||||
|
virtual void DeleteAutoSaveFile( const wxFileName& aFileName ) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Toggle the show/hide state of the left side schematic navigation panel
|
* Toggle the show/hide state of the left side schematic navigation panel
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2019 CERN
|
* Copyright (C) 2019-2023 CERN
|
||||||
* Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -160,7 +160,7 @@ int SCH_EDITOR_CONTROL::Revert( const TOOL_EVENT& aEvent )
|
||||||
screen->SetContentModified( false ); // do not prompt the user for changes
|
screen->SetContentModified( false ); // do not prompt the user for changes
|
||||||
|
|
||||||
m_frame->ReleaseFile();
|
m_frame->ReleaseFile();
|
||||||
m_frame->OpenProjectFiles( std::vector<wxString>( 1, schematic.GetFileName() ) );
|
m_frame->OpenProjectFiles( std::vector<wxString>( 1, schematic.GetFileName() ), KICTL_REVERT );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2009-2015 Jean-Pierre Charras, jp.charras wanadoo.fr
|
* Copyright (C) 2009-2015 Jean-Pierre Charras, jp.charras wanadoo.fr
|
||||||
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
|
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
|
||||||
|
* Copyright (C) 2023 CERN (www.cern.ch)
|
||||||
* Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -476,6 +477,8 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void CheckForAutoSaveFile( const wxFileName& aFileName );
|
virtual void CheckForAutoSaveFile( const wxFileName& aFileName );
|
||||||
|
|
||||||
|
virtual void DeleteAutoSaveFile( const wxFileName& aFileName );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the status bar information.
|
* Update the status bar information.
|
||||||
*
|
*
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
* Copyright (C) 2014 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
||||||
* Copyright (C) 2017-2023 KiCad Developers, see change_log.txt for contributors.
|
* Copyright (C) 2017-2023 KiCad Developers, see change_log.txt for contributors.
|
||||||
|
* Copyright (C) 2023 CERN (www.cern.ch)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
|
@ -76,6 +77,7 @@ public:
|
||||||
#define KICTL_KICAD_ONLY (1<<1) ///< chosen file is from KiCad according to user
|
#define KICTL_KICAD_ONLY (1<<1) ///< chosen file is from KiCad according to user
|
||||||
#define KICTL_CREATE (1<<2) ///< caller thinks requested project files may not exist.
|
#define KICTL_CREATE (1<<2) ///< caller thinks requested project files may not exist.
|
||||||
#define KICTL_IMPORT_LIB (1<<3) ///< import all footprints into a project library.
|
#define KICTL_IMPORT_LIB (1<<3) ///< import all footprints into a project library.
|
||||||
|
#define KICTL_REVERT (1<<4) ///< reverting to a previously-saved (KiCad) file.
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open a project or set of files given by @a aFileList.
|
* Open a project or set of files given by @a aFileList.
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004-2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
* Copyright (C) 2004-2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
||||||
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
|
* Copyright (C) 2011 Wayne Stambaugh <stambaughw@gmail.com>
|
||||||
|
* Copyright (C) 2023 CERN (www.cern.ch)
|
||||||
* Copyright (C) 2016-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2016-2023 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
|
@ -322,7 +323,7 @@ bool PCB_EDIT_FRAME::Files_io_from_id( int id )
|
||||||
|
|
||||||
ReleaseFile();
|
ReleaseFile();
|
||||||
|
|
||||||
return OpenProjectFiles( std::vector<wxString>( 1, fn.GetFullPath() ) );
|
return OpenProjectFiles( std::vector<wxString>( 1, fn.GetFullPath() ), KICTL_REVERT );
|
||||||
}
|
}
|
||||||
|
|
||||||
case ID_NEW_BOARD:
|
case ID_NEW_BOARD:
|
||||||
|
@ -622,8 +623,15 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
|
||||||
std::placeholders::_1 ) );
|
std::placeholders::_1 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// This will rename the file if there is an autosave and the user want to recover
|
if( ( aCtl & KICTL_REVERT ) )
|
||||||
|
{
|
||||||
|
DeleteAutoSaveFile( fullFileName );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// This will rename the file if there is an autosave and the user wants to recover
|
||||||
CheckForAutoSaveFile( fullFileName );
|
CheckForAutoSaveFile( fullFileName );
|
||||||
|
}
|
||||||
|
|
||||||
bool failedLoad = false;
|
bool failedLoad = false;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue