Handle read-only settings files better
Fixes https://gitlab.com/kicad/code/kicad/-/issues/5688
This commit is contained in:
parent
30830d9127
commit
7fcef7268b
|
@ -204,46 +204,58 @@ bool JSON_SETTINGS::LoadFromFile( const wxString& aDirectory )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if( !path.IsFileWritable() )
|
||||||
|
m_writeFile = false;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
FILE* fp = wxFopen( path.GetFullPath(), wxT( "rt" ) );
|
FILE* fp = wxFopen( path.GetFullPath(), wxT( "rt" ) );
|
||||||
*static_cast<nlohmann::json*>( this ) = nlohmann::json::parse( fp, nullptr,
|
|
||||||
/* allow_exceptions = */ true,
|
|
||||||
/* ignore_comments = */ true );
|
|
||||||
|
|
||||||
// If parse succeeds, check if schema migration is required
|
if( fp )
|
||||||
int filever = -1;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
filever = at( PointerFromString( "meta.version" ) ).get<int>();
|
*static_cast<nlohmann::json*>( this ) = nlohmann::json::parse( fp, nullptr,
|
||||||
}
|
/* allow_exceptions = */ true,
|
||||||
catch( ... )
|
/* ignore_comments = */ true );
|
||||||
{
|
|
||||||
wxLogTrace(
|
|
||||||
traceSettings, "%s: file version could not be read!", GetFullFilename() );
|
|
||||||
success = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( filever >= 0 && filever < m_schemaVersion )
|
// If parse succeeds, check if schema migration is required
|
||||||
{
|
int filever = -1;
|
||||||
wxLogTrace( traceSettings, "%s: attempting migration from version %d to %d",
|
|
||||||
GetFullFilename(), filever, m_schemaVersion );
|
|
||||||
|
|
||||||
if( Migrate() )
|
try
|
||||||
{
|
{
|
||||||
migrated = true;
|
filever = at( PointerFromString( "meta.version" ) ).get<int>();
|
||||||
}
|
}
|
||||||
else
|
catch( ... )
|
||||||
{
|
{
|
||||||
wxLogTrace( traceSettings, "%s: migration failed!", GetFullFilename() );
|
wxLogTrace( traceSettings, "%s: file version could not be read!",
|
||||||
|
GetFullFilename() );
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( filever >= 0 && filever < m_schemaVersion )
|
||||||
|
{
|
||||||
|
wxLogTrace( traceSettings, "%s: attempting migration from version %d to %d",
|
||||||
|
GetFullFilename(), filever, m_schemaVersion );
|
||||||
|
|
||||||
|
if( Migrate() )
|
||||||
|
{
|
||||||
|
migrated = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxLogTrace( traceSettings, "%s: migration failed!", GetFullFilename() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( filever > m_schemaVersion )
|
||||||
|
{
|
||||||
|
wxLogTrace( traceSettings,
|
||||||
|
"%s: warning: file version %d is newer than latest (%d)",
|
||||||
|
GetFullFilename(), filever, m_schemaVersion );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( filever > m_schemaVersion )
|
else
|
||||||
{
|
{
|
||||||
wxLogTrace( traceSettings,
|
wxLogTrace( traceSettings, "%s exists but can't be opened for read",
|
||||||
"%s: warning: file version %d is newer than latest (%d)", GetFullFilename(),
|
GetFullFilename() );
|
||||||
filever, m_schemaVersion );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( nlohmann::json::parse_error& error )
|
catch( nlohmann::json::parse_error& error )
|
||||||
|
|
|
@ -730,6 +730,9 @@ bool SETTINGS_MANAGER::LoadProject( const wxString& aFullPath, bool aSetActive )
|
||||||
|
|
||||||
bool success = loadProjectFile( *project );
|
bool success = loadProjectFile( *project );
|
||||||
|
|
||||||
|
if( success )
|
||||||
|
project->SetReadOnly( project->GetProjectFile().IsReadOnly() );
|
||||||
|
|
||||||
m_projects_list.push_back( std::move( project ) );
|
m_projects_list.push_back( std::move( project ) );
|
||||||
m_projects[fullPath] = m_projects_list.back().get();
|
m_projects[fullPath] = m_projects_list.back().get();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue