From ce1bd4c6b7e43eb8d4aadbabff5b1338bb0abf2c Mon Sep 17 00:00:00 2001 From: Wayne Stambaugh Date: Wed, 28 Feb 2018 11:41:24 -0500 Subject: [PATCH] Eeschema: fix remapping backup project with schematics in subfolders. The backup code was designed for a project with all of the schematics in the project folder which is not always the case. Fix the schematic backup to keep the schematic folder structure in tact during backups. Fixes lp:1751662 https://bugs.launchpad.net/kicad/+bug/1751662 --- eeschema/dialogs/dialog_symbol_remap.cpp | 36 ++++++++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/eeschema/dialogs/dialog_symbol_remap.cpp b/eeschema/dialogs/dialog_symbol_remap.cpp index b11b1e0950..f81685fdec 100644 --- a/eeschema/dialogs/dialog_symbol_remap.cpp +++ b/eeschema/dialogs/dialog_symbol_remap.cpp @@ -312,17 +312,19 @@ bool DIALOG_SYMBOL_REMAP::remapSymbolToLibTable( SCH_COMPONENT* aSymbol ) bool DIALOG_SYMBOL_REMAP::backupProject( REPORTER& aReporter ) { - static wxString backupPath = "rescue-backup"; + static wxString backupFolder = "rescue-backup"; wxString tmp; wxString errorMsg; wxFileName srcFileName; wxFileName destFileName; + wxFileName backupPath; SCH_SCREENS schematic; // Copy backup files to different folder so as not to pollute the project folder. destFileName.SetPath( Prj().GetProjectPath() ); - destFileName.AppendDir( backupPath ); + destFileName.AppendDir( backupFolder ); + backupPath = destFileName; if( !destFileName.DirExists() ) { @@ -348,7 +350,7 @@ bool DIALOG_SYMBOL_REMAP::backupProject( REPORTER& aReporter ) srcFileName.SetPath( Prj().GetProjectPath() ); srcFileName.SetName( SYMBOL_LIB_TABLE::GetSymbolLibTableFileName() ); destFileName = srcFileName; - destFileName.AppendDir( backupPath ); + destFileName.AppendDir( backupFolder ); destFileName.SetName( destFileName.GetName() + timeStamp ); tmp.Printf( _( "Backing up file \"%s\" to file \"%s\"." ), @@ -367,12 +369,34 @@ bool DIALOG_SYMBOL_REMAP::backupProject( REPORTER& aReporter ) { destFileName = screen->GetFileName(); destFileName.SetName( destFileName.GetName() + timeStamp ); - destFileName.AppendDir( backupPath ); + + // Check for nest hierarchical schematic paths. + if( destFileName.GetPath() != backupPath.GetPath() ) + { + destFileName.SetPath( backupPath.GetPath() ); + + wxArrayString srcDirs = wxFileName( screen->GetFileName() ).GetDirs(); + wxArrayString destDirs = wxFileName( Prj().GetProjectPath() ).GetDirs(); + + for( size_t i = destDirs.GetCount(); i < srcDirs.GetCount(); i++ ) + destFileName.AppendDir( srcDirs[i] ); + } + else + { + destFileName.AppendDir( backupFolder ); + } tmp.Printf( _( "Backing up file \"%s\" to file \"%s\"." ), screen->GetFileName(), destFileName.GetFullPath() ); aReporter.Report( tmp, REPORTER::RPT_INFO ); + if( !destFileName.DirExists() && !destFileName.Mkdir( wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL ) ) + { + tmp.Printf( _( "Failed to create backup folder \"%s\"\n" ), destFileName.GetPath() ); + errorMsg += tmp; + continue; + } + if( wxFileName::Exists( screen->GetFileName() ) && !wxCopyFile( screen->GetFileName(), destFileName.GetFullPath() ) ) { @@ -384,7 +408,7 @@ bool DIALOG_SYMBOL_REMAP::backupProject( REPORTER& aReporter ) // Back up the project file. destFileName = Prj().GetProjectFullName(); destFileName.SetName( destFileName.GetName() + timeStamp ); - destFileName.AppendDir( backupPath ); + destFileName.AppendDir( backupFolder ); tmp.Printf( _( "Backing up file \"%s\" to file \"%s\"." ), Prj().GetProjectFullName(), destFileName.GetFullPath() ); @@ -404,7 +428,7 @@ bool DIALOG_SYMBOL_REMAP::backupProject( REPORTER& aReporter ) destFileName = srcFileName; destFileName.SetName( destFileName.GetName() + timeStamp ); - destFileName.AppendDir( backupPath ); + destFileName.AppendDir( backupFolder ); tmp.Printf( _( "Backing up file \"%s\" to file \"%s\"." ), srcFileName.GetFullPath(), destFileName.GetFullPath() );