Moved path normalization functions to a separate file
Normalizing paths to environmental variables might be useful in many places, therefore it is better to keep them accessible.
This commit is contained in:
parent
753f24aaaa
commit
759359f602
|
@ -247,6 +247,7 @@ set( COMMON_SRCS
|
||||||
eda_dde.cpp
|
eda_dde.cpp
|
||||||
eda_doc.cpp
|
eda_doc.cpp
|
||||||
eda_pattern_match.cpp
|
eda_pattern_match.cpp
|
||||||
|
env_paths.cpp
|
||||||
exceptions.cpp
|
exceptions.cpp
|
||||||
executable_names.cpp
|
executable_names.cpp
|
||||||
filter_reader.cpp
|
filter_reader.cpp
|
||||||
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2017 Wayne Stambaugh <stambaughw@verizon.net>
|
||||||
|
* Copyright (C) 2017 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
* Copyright (C) 2017 CERN
|
||||||
|
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <env_paths.h>
|
||||||
|
|
||||||
|
static bool normalizeAbsolutePaths( const wxFileName& aPathA,
|
||||||
|
const wxFileName& aPathB,
|
||||||
|
wxString* aResultPath )
|
||||||
|
{
|
||||||
|
wxCHECK_MSG( aPathA.IsAbsolute(), false, aPathA.GetPath() + " is not an absolute path." );
|
||||||
|
wxCHECK_MSG( aPathB.IsAbsolute(), false, aPathB.GetPath() + " is not an absolute path." );
|
||||||
|
|
||||||
|
if( aPathA.GetPath() == aPathB.GetPath() )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if( ( aPathA.GetDirCount() > aPathB.GetDirCount() )
|
||||||
|
|| ( aPathA.HasVolume() && !aPathB.HasVolume() )
|
||||||
|
|| ( !aPathA.HasVolume() && aPathB.HasVolume() )
|
||||||
|
|| ( ( aPathA.HasVolume() && aPathB.HasVolume() )
|
||||||
|
&& ( aPathA.GetVolume() == aPathB.GetVolume() ) ) )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
wxArrayString aDirs = aPathA.GetDirs();
|
||||||
|
wxArrayString bDirs = aPathB.GetDirs();
|
||||||
|
|
||||||
|
size_t i = 0;
|
||||||
|
|
||||||
|
while( i < aDirs.GetCount() )
|
||||||
|
{
|
||||||
|
if( aDirs[i] != bDirs[i] )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( aResultPath )
|
||||||
|
{
|
||||||
|
while( i < bDirs.GetCount() )
|
||||||
|
{
|
||||||
|
*aResultPath += bDirs[i] + wxT( "/" );
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxString NormalizePath( const wxFileName& aFilePath, const ENV_VAR_MAP* aEnvVars,
|
||||||
|
const PROJECT* aProject )
|
||||||
|
{
|
||||||
|
wxFileName envPath;
|
||||||
|
wxString tmp, varName, normalizedFullPath;
|
||||||
|
|
||||||
|
if( aEnvVars )
|
||||||
|
{
|
||||||
|
for( auto& entry : *aEnvVars )
|
||||||
|
{
|
||||||
|
// Don't bother normalizing paths that don't exist or the user cannot read.
|
||||||
|
if( !wxFileName::DirExists( entry.second.GetValue() )
|
||||||
|
|| !wxFileName::IsDirReadable( entry.second.GetValue() ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
envPath.SetPath( entry.second.GetValue() );
|
||||||
|
|
||||||
|
if( normalizeAbsolutePaths( envPath, aFilePath, &tmp ) )
|
||||||
|
{
|
||||||
|
varName = entry.first;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( varName.IsEmpty() && aProject )
|
||||||
|
{
|
||||||
|
envPath.SetPath( aProject->GetProjectPath() );
|
||||||
|
|
||||||
|
if( normalizeAbsolutePaths( envPath, aFilePath, &tmp ) )
|
||||||
|
varName = PROJECT_VAR_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !varName.IsEmpty() )
|
||||||
|
{
|
||||||
|
normalizedFullPath = wxString::Format( "${%s}/", varName );
|
||||||
|
|
||||||
|
if( !tmp.IsEmpty() )
|
||||||
|
normalizedFullPath += tmp;
|
||||||
|
|
||||||
|
normalizedFullPath += aFilePath.GetFullName();
|
||||||
|
}
|
||||||
|
|
||||||
|
return normalizedFullPath;
|
||||||
|
}
|
|
@ -37,6 +37,7 @@
|
||||||
#include <class_sch_screen.h>
|
#include <class_sch_screen.h>
|
||||||
#include <schframe.h>
|
#include <schframe.h>
|
||||||
#include <symbol_lib_table.h>
|
#include <symbol_lib_table.h>
|
||||||
|
#include <env_paths.h>
|
||||||
|
|
||||||
#include <dialog_symbol_remap.h>
|
#include <dialog_symbol_remap.h>
|
||||||
|
|
||||||
|
@ -123,53 +124,13 @@ void DIALOG_SYMBOL_REMAP::createProjectSymbolLibTable( REPORTER& aReporter )
|
||||||
libNameInc++;
|
libNameInc++;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString tmp;
|
|
||||||
wxString fullFileName;
|
|
||||||
wxString pluginType = SCH_IO_MGR::ShowType( SCH_IO_MGR::SCH_LEGACY );
|
wxString pluginType = SCH_IO_MGR::ShowType( SCH_IO_MGR::SCH_LEGACY );
|
||||||
wxFileName fn = lib->GetFullFileName();
|
wxFileName fn = lib->GetFullFileName();
|
||||||
|
|
||||||
// Use environment variable substitution where possible. This is based solely
|
// Use environment variable substitution where possible. This is based solely
|
||||||
// on the internal user environment variable list. Checking against all of the
|
// on the internal user environment variable list. Checking against all of the
|
||||||
// system wide environment variables is probably not a good idea.
|
// system wide environment variables is probably not a good idea.
|
||||||
const ENV_VAR_MAP& envMap = Pgm().GetLocalEnvVariables();
|
wxString fullFileName = NormalizePath( fn, &Pgm().GetLocalEnvVariables(), &Prj() );
|
||||||
wxFileName envPath;
|
|
||||||
|
|
||||||
for( auto& entry : envMap )
|
|
||||||
{
|
|
||||||
// Don't bother normalizing paths that don't exist or the user cannot read.
|
|
||||||
if( !wxFileName::DirExists( entry.second.GetValue() )
|
|
||||||
|| !wxFileName::IsDirReadable( entry.second.GetValue() ) )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
envPath.SetPath( entry.second.GetValue() );
|
|
||||||
|
|
||||||
if( normalizeAbsolutePaths( envPath, fn, &tmp ) )
|
|
||||||
{
|
|
||||||
fullFileName = "${" + entry.first + "}/";
|
|
||||||
|
|
||||||
if( !tmp.IsEmpty() )
|
|
||||||
fullFileName += tmp;
|
|
||||||
|
|
||||||
fullFileName += fn.GetFullName();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check the project path if no local environment variable paths where found.
|
|
||||||
if( fullFileName.IsEmpty() )
|
|
||||||
{
|
|
||||||
envPath.SetPath( Prj().GetProjectPath() );
|
|
||||||
|
|
||||||
if( normalizeAbsolutePaths( envPath, fn, &tmp ) )
|
|
||||||
{
|
|
||||||
fullFileName = wxString( "${" ) + PROJECT_VAR_NAME + wxString( "}/" );
|
|
||||||
|
|
||||||
if( !tmp.IsEmpty() )
|
|
||||||
fullFileName += tmp;
|
|
||||||
|
|
||||||
fullFileName += fn.GetFullName();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fall back to the absolute library path.
|
// Fall back to the absolute library path.
|
||||||
if( fullFileName.IsEmpty() )
|
if( fullFileName.IsEmpty() )
|
||||||
|
@ -302,46 +263,3 @@ bool DIALOG_SYMBOL_REMAP::remapSymbolToLibTable( SCH_COMPONENT* aSymbol )
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DIALOG_SYMBOL_REMAP::normalizeAbsolutePaths( const wxFileName& aPathA,
|
|
||||||
const wxFileName& aPathB,
|
|
||||||
wxString* aResultPath )
|
|
||||||
{
|
|
||||||
wxCHECK_MSG( aPathA.IsAbsolute(), false, aPathA.GetPath() + " is not an absolute path." );
|
|
||||||
wxCHECK_MSG( aPathB.IsAbsolute(), false, aPathB.GetPath() + " is not an absolute path." );
|
|
||||||
|
|
||||||
if( aPathA.GetPath() == aPathB.GetPath() )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if( ( aPathA.GetDirCount() > aPathB.GetDirCount() )
|
|
||||||
|| ( aPathA.HasVolume() && !aPathB.HasVolume() )
|
|
||||||
|| ( !aPathA.HasVolume() && aPathB.HasVolume() )
|
|
||||||
|| ( ( aPathA.HasVolume() && aPathB.HasVolume() )
|
|
||||||
&& ( aPathA.GetVolume() == aPathB.GetVolume() ) ) )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
wxArrayString aDirs = aPathA.GetDirs();
|
|
||||||
wxArrayString bDirs = aPathB.GetDirs();
|
|
||||||
|
|
||||||
size_t i = 0;
|
|
||||||
|
|
||||||
while( i < aDirs.GetCount() )
|
|
||||||
{
|
|
||||||
if( aDirs[i] != bDirs[i] )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( aResultPath )
|
|
||||||
{
|
|
||||||
while( i < bDirs.GetCount() )
|
|
||||||
{
|
|
||||||
*aResultPath += bDirs[i] + wxT( "/" );
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
|
@ -63,10 +63,6 @@ private:
|
||||||
void remapSymbolsToLibTable( REPORTER& aReporter );
|
void remapSymbolsToLibTable( REPORTER& aReporter );
|
||||||
|
|
||||||
bool remapSymbolToLibTable( SCH_COMPONENT* aSymbol );
|
bool remapSymbolToLibTable( SCH_COMPONENT* aSymbol );
|
||||||
|
|
||||||
bool normalizeAbsolutePaths( const wxFileName& aPathA,
|
|
||||||
const wxFileName& aPathB,
|
|
||||||
wxString* aResultPath );
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _DIALOG_SYMBOL_REMAP_H_
|
#endif // _DIALOG_SYMBOL_REMAP_H_
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2017 Wayne Stambaugh <stambaughw@verizon.net>
|
||||||
|
* Copyright (C) 2017 KiCad Developers, see AUTHORS.txt for contributors.
|
||||||
|
* Copyright (C) 2017 CERN
|
||||||
|
* @author Maciej Suminski <maciej.suminski@cern.ch>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
///> Helper functions to substitute paths with environmental variables.
|
||||||
|
|
||||||
|
#ifndef ENV_PATHS_H
|
||||||
|
#define ENV_PATHS_H
|
||||||
|
|
||||||
|
#include <pgm_base.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalizes a file path to an environmental variable, if possible.
|
||||||
|
*
|
||||||
|
* @param aFilePath is the full file path (path and file name) to be normalized.
|
||||||
|
* @param aEnvVars is an optional map of environmental variables to try substition with.
|
||||||
|
* @param aProject is an optional project, to normalize the file path to the project path.
|
||||||
|
* @return Normalized full file path (path and file name) if succeeded or empty string if the
|
||||||
|
* path could not be normalized.
|
||||||
|
*/
|
||||||
|
wxString NormalizePath( const wxFileName& aFilePath, const ENV_VAR_MAP* aEnvVars,
|
||||||
|
const PROJECT* aProject );
|
||||||
|
|
||||||
|
#endif /* ENV_PATHS_H */
|
Loading…
Reference in New Issue