void EnvVars::OnProjectActivated(CodeBlocksEvent& event) { #if TRACE_ENVVARS Manager::Get()->GetLogManager()->DebugLog(F(_T("OnProjectActivated"))); #endif if (IsAttached()) { wxString prj_envvar_set = m_ProjectSets[event.GetProject()]; if (prj_envvar_set.IsEmpty()) // There is no envvar set to apply... // Apply default envvar set (but only, if not already active) nsEnvVars::EnvvarSetApply(wxEmptyString, false); else // ...there is an envvar set setup to apply. { if (nsEnvVars::EnvvarSetExists(prj_envvar_set)) { EV_DBGLOG(_T("EnvVars: Discarding envvars set '") +nsEnvVars::GetActiveSetName()+_T("'.")); nsEnvVars::EnvvarSetDiscard(wxEmptyString); // Remove currently active envvars if (prj_envvar_set.IsEmpty()) EV_DBGLOG(_T("EnvVars: Setting up default envvars set.")); else EV_DBGLOG(_T("EnvVars: Setting up envvars set '")+prj_envvar_set +_T("' for activated project.")); // Apply envvar set always (as the old one has been discarded above) nsEnvVars::EnvvarSetApply(prj_envvar_set, true); } else EnvvarSetWarning(prj_envvar_set); } } event.Skip(); // propagate the event to other listeners }// OnProjectActivated
wxArrayString nsEnvVars::GetEnvvarsBySetPath(const wxString& set_path) { #if defined(TRACE_ENVVARS) Manager::Get()->GetLogManager()->DebugLog(F(_T("GetEnvvarsBySetPath"))); #endif wxArrayString envvars; EV_DBGLOG(_T("EnvVars: Searching for envvars in path '%s'."), set_path.wx_str()); ConfigManager *cfg = Manager::Get()->GetConfigManager(_T("envvars")); if (!cfg || set_path.IsEmpty()) return envvars; wxArrayString envvars_keys = cfg->EnumerateKeys(set_path); unsigned int num_envvars = envvars_keys.GetCount(); for (unsigned int i=0; i<num_envvars; ++i) { wxString envvar = cfg->Read(set_path+_T("/")+envvars_keys[i]); if (!envvar.IsEmpty()) envvars.Add(envvar); else EV_DBGLOG(_T("EnvVars: Warning: empty envvar detected and skipped.")); } EV_DBGLOG(_T("EnvVars: Read %lu/%u envvars in path '%s'."), static_cast<unsigned long>(envvars.GetCount()), num_envvars, set_path.wx_str()); return envvars; }// GetEnvvarsBySetPath
wxString nsEnvVars::GetActiveSetName() { #if TRACE_ENVVARS Manager::Get()->GetLogManager()->DebugLog(F(_T("GetActiveSetName"))); #endif wxString active_set = nsEnvVars::EnvVarsDefault; // load and apply configuration (to application only) ConfigManager *cfg = Manager::Get()->GetConfigManager(_T("envvars")); if (!cfg) return active_set; // try to get the envvar set name of the currently active global envvar set wxString active_set_cfg = cfg->Read(_T("/active_set")); if (!active_set_cfg.IsEmpty()) active_set = active_set_cfg; #if wxCHECK_VERSION(2, 9, 0) EV_DBGLOG(_T("EnvVars: Obtained '%s' as active envvar set from config."), active_set.wx_str()); #else EV_DBGLOG(_T("EnvVars: Obtained '%s' as active envvar set from config."), active_set.c_str()); #endif return active_set; }// GetActiveSetName
void nsEnvVars::EnvvarSetApply(const wxString& set_name, bool even_if_active) { #if defined(TRACE_ENVVARS) Manager::Get()->GetLogManager()->DebugLog(F(_T("EnvvarSetApply"))); #endif // Load and apply envvar set from config (to application only) ConfigManager *cfg = Manager::Get()->GetConfigManager(_T("envvars")); if (!cfg) return; // Stores the currently active envar set that has been successfully applied at last static wxString last_set_applied = wxEmptyString; wxString set_to_apply = set_name; if (set_to_apply.IsEmpty()) set_to_apply = nsEnvVars::GetActiveSetName(); // Early exit for a special case requested by even_if_active parameter if (!even_if_active && set_to_apply.IsSameAs(last_set_applied)) { EV_DBGLOG(_T("EnvVars: Set '%s' will not be applied (already active)."), set_to_apply.wx_str()); return; } // Show currently activated set in debug log (for reference) wxString set_path = nsEnvVars::GetSetPathByName(set_to_apply); EV_DBGLOG(_T("EnvVars: Active envvar set is '%s', config path '%s'."), set_to_apply.wx_str(), set_path.wx_str()); // NOTE: Keep this in sync with EnvVarsConfigDlg::LoadSettings // Read and apply all envvars from currently active set in config wxArrayString vars = nsEnvVars::GetEnvvarsBySetPath(set_path); size_t envvars_total = vars.GetCount(); size_t envvars_applied = 0; for (unsigned int i=0; i<envvars_total; ++i) { // Format: [checked?]|[key]|[value] wxArrayString var_array = nsEnvVars::EnvvarStringTokeniser(vars[i]); if (nsEnvVars::EnvvarArrayApply(var_array)) envvars_applied++; else { EV_DBGLOG(_T("EnvVars: Invalid envvar in '%s' at position #%u."), set_path.wx_str(), i); } }// for if (envvars_total>0) { last_set_applied = set_to_apply; EV_DBGLOG(_T("EnvVars: %lu/%lu envvars applied within C::B focus."), static_cast<unsigned long>(envvars_applied), static_cast<unsigned long>(envvars_total)); } }// EnvvarSetApply
void EnvVarsConfigDlg::OnRemoveSetClick(wxCommandEvent& WXUNUSED(event)) { #if defined(TRACE_ENVVARS) Manager::Get()->GetLogManager()->DebugLog(F(_T("OnRemoveSetClick"))); #endif wxChoice* choSet = XRCCTRL(*this, "choSet", wxChoice); if (!choSet) return; if (choSet->GetCount()<2) { cbMessageBox(_("Must have at least one set active (can be empty)."), _("Information"), wxICON_INFORMATION); return; } wxCheckListBox* lstEnvVars = XRCCTRL(*this, "lstEnvVars", wxCheckListBox); if (!lstEnvVars) return; ConfigManager *cfg = Manager::Get()->GetConfigManager(_T("envvars")); if (!cfg) return; if (cbMessageBox(_("Are you sure you want to delete the set?"), _("Confirmation"), wxYES | wxNO | wxICON_QUESTION) == wxID_YES) { // Obtain active set int active_set_idx = choSet->GetCurrentSelection(); wxString active_set = choSet->GetString(active_set_idx); // Remove envvars from C::B focus (and listbox) EV_DBGLOG(_T("EnvVars: Unsetting variables of envvar set '%s'."), active_set.wx_str()); nsEnvVars::EnvvarsClearUI(lstEnvVars); // Don't care about return value // Remove envvars set from config wxString active_set_path = nsEnvVars::GetSetPathByName(active_set, false); EV_DBGLOG(_T("EnvVars: Removing envvar set '%s' at path '%s' from config."), active_set.wx_str(), active_set_path.wx_str()); cfg->DeleteSubPath(active_set_path); // Remove envvars set from choicebox choSet->Delete(active_set_idx); if (active_set_idx>0) choSet->SetSelection(active_set_idx-1); else choSet->SetSelection(0); }// if SaveSettingsActiveSet(choSet->GetString(choSet->GetCurrentSelection())); LoadSettings(); }// OnRemoveSetClick
void EnvVarsConfigDlg::SaveSettings() { #if defined(TRACE_ENVVARS) if (Manager::Get() && Manager::Get()->GetLogManager()); Manager::Get()->GetLogManager()->DebugLog(F(_T("SaveSettings"))); #endif wxChoice* choSet = XRCCTRL(*this, "choSet", wxChoice); if (!choSet) return; wxCheckListBox* lstEnvVars = XRCCTRL(*this, "lstEnvVars", wxCheckListBox); if (!lstEnvVars) return; wxCheckBox* chkDebugLog = XRCCTRL(*this, "chkDebugLog", wxCheckBox); if (!chkDebugLog) return; ConfigManager *cfg = Manager::Get()->GetConfigManager(_T("envvars")); if (!cfg) return; wxString active_set = choSet->GetString(choSet->GetCurrentSelection()); if (active_set.IsEmpty()) active_set = nsEnvVars::EnvVarsDefault; SaveSettingsActiveSet(active_set); wxString active_set_path = nsEnvVars::GetSetPathByName(active_set, false); EV_DBGLOG(_T("EnvVars: Removing (old) envvar set '%s' at path '%s' from config."), active_set.wx_str(), active_set_path.wx_str()); cfg->DeleteSubPath(active_set_path); EV_DBGLOG(_T("EnvVars: Saving (new) envvar set '%s'."), active_set.wx_str()); cfg->SetPath(active_set_path); for (int i=0; i<(int)lstEnvVars->GetCount(); ++i) { // Format: [checked?]|[key]|[value] wxString check = (lstEnvVars->IsChecked(i))?_T("1"):_T("0"); wxString key = lstEnvVars->GetString(i).BeforeFirst(_T('=')).Trim(true).Trim(false); wxString value = lstEnvVars->GetString(i).AfterFirst(_T('=')).Trim(true).Trim(false); wxString txt; txt << check << nsEnvVars::EnvVarsSep << key << nsEnvVars::EnvVarsSep << value; wxString cfg_key; cfg_key.Printf(_T("EnvVar%d"), i); cfg->Write(cfg_key, txt); }// for cfg->Write(_T("/debug_log"), chkDebugLog->GetValue()); }// SaveSettings
bool nsEnvVars::EnvvarApply(const wxString& key, const wxString& value) { #if defined(TRACE_ENVVARS) Manager::Get()->GetLogManager()->DebugLog(F(_T("EnvvarApply"))); #endif // Replace all macros the user might have setup for the key wxString the_key = key; Manager::Get()->GetMacrosManager()->ReplaceMacros(the_key); if (the_key.Trim().IsEmpty()) return false; // Value: First, expand stuff like: // set PATH=%PATH%;C:\NewPath OR export PATH=$PATH:/new_path // After, replace all macros the user might have used in addition wxString value_set; bool is_set = wxGetEnv(the_key, &value_set); wxString the_value = value; if (is_set) { std::map<wxString,wxString>::iterator it = nsEnvVars::EnvVarsStack.find(the_key); if (it==nsEnvVars::EnvVarsStack.end()) // envvar not already on the stack nsEnvVars::EnvVarsStack[the_key] = value_set; // remember the old value // Avoid endless recursion if the value set contains e.g. $PATH, too if (nsEnvVars::EnvvarIsRecursive(the_key,the_value)) { if (nsEnvVars::EnvvarIsRecursive(the_key,value_set)) { EV_DBGLOG(_T("EnvVars: Setting environment variable '%s' failed " "due to unresolvable recursion."), the_key.wx_str()); return false; } // Restore original value in case of recursion before if (it!=nsEnvVars::EnvVarsStack.end()) value_set = nsEnvVars::EnvVarsStack[the_key]; // Resolve recursion now (if any) wxString recursion; if (platform::windows) recursion = _T("%")+the_key+_("%"); else recursion = _T("$")+the_key; the_value.Replace(recursion.wx_str(), value_set.wx_str()); } } // Replace all macros the user might have setup for the value Manager::Get()->GetMacrosManager()->ReplaceMacros(the_value); EV_DBGLOG(_T("EnvVars: Trying to set environment variable '%s' to value '%s'..."), the_key.wx_str(), the_value.wx_str()); if (!wxSetEnv(the_key, the_value)) // set the envvar as computed { EV_DBGLOG(_T("EnvVars: Setting environment variable '%s' failed."), the_key.wx_str()); return false; } return true; }// EnvvarApply
void nsEnvVars::EnvvarSetDiscard(const wxString& set_name) { #if defined(TRACE_ENVVARS) Manager::Get()->GetLogManager()->DebugLog(F(_T("EnvvarSetDiscard"))); #endif // load and apply envvar set from config (to application only) ConfigManager *cfg = Manager::Get()->GetConfigManager(_T("envvars")); if (!cfg) return; wxString set_to_discard = set_name; if (set_to_discard.IsEmpty()) set_to_discard = nsEnvVars::GetActiveSetName(); // Show currently activated set in debug log (for reference) wxString set_path = nsEnvVars::GetSetPathByName(set_to_discard); EV_DBGLOG(_T("EnvVars: Active envvar set is '%s', config path '%s'."), set_to_discard.wx_str(), set_path.wx_str()); // Read and apply all envvars from currently active set in config wxArrayString vars = nsEnvVars::GetEnvvarsBySetPath(set_path); size_t envvars_total = vars.GetCount(); size_t envvars_discarded = 0; for (unsigned int i=0; i<envvars_total; ++i) { // Format: [checked?]|[key]|[value] wxArrayString var_array = nsEnvVars::EnvvarStringTokeniser(vars[i]); if (var_array.GetCount()==3) { wxString check = var_array[0]; bool bCheck = check.Trim(true).Trim(false).IsSameAs(_T("1"))?true:false; // Do not unset envvars that are not activated (checked) if (!bCheck) continue; // next for-loop // unset the old envvar if (nsEnvVars::EnvvarDiscard(var_array[1])) envvars_discarded++; } else { EV_DBGLOG(_T("EnvVars: Invalid envvar in '%s' at position #%u."), set_path.wx_str(), i); } }// for if (envvars_total>0) { EV_DBGLOG(_T("EnvVars: %lu/%lu envvars discarded within C::B focus."), static_cast<unsigned long>(envvars_discarded), static_cast<unsigned long>(envvars_total)); } }// EnvvarSetDiscard
void EnvVars::SetProjectEnvvarSet(cbProject* project, const wxString& envvar_set) { #if TRACE_ENVVARS Manager::Get()->GetLogManager()->DebugLog(F(_T("SetProjectEnvvarSet"))); #endif m_ProjectSets[project] = envvar_set; EV_DBGLOG(_T("EnvVars: Discarding envvars set '")+nsEnvVars::GetActiveSetName()+_T("'.")); nsEnvVars::EnvvarSetDiscard(wxEmptyString); // remove currently active envvars if (envvar_set.IsEmpty()) EV_DBGLOG(_T("EnvVars: Setting up default envvars set.")); else EV_DBGLOG(_T("EnvVars: Setting up envvars set '")+envvar_set+_T("' for activated project.")); nsEnvVars::EnvvarSetApply(envvar_set, true); // apply currently active envvar set for wxEmptyString }// SetProjectEnvvarSet
bool nsEnvVars::EnvvarDiscard(const wxString &key) { #if defined(TRACE_ENVVARS) Manager::Get()->GetLogManager()->DebugLog(F(_T("EnvvarDiscard"))); #endif // Replace all macros the user might have setup for the key wxString the_key = key; Manager::Get()->GetMacrosManager()->ReplaceMacros(the_key); if (the_key.Trim().IsEmpty()) return false; if (!wxGetEnv(the_key, NULL)) return false; // envvar was not set - nothing to do. std::map<wxString,wxString>::iterator it = nsEnvVars::EnvVarsStack.find(the_key); if (it!=nsEnvVars::EnvVarsStack.end()) // found an old envvar on the stack return nsEnvVars::EnvvarApply(the_key, it->second); // restore old value if (!wxUnsetEnv(the_key)) { Manager::Get()->GetLogManager()->Log(F( _("Unsetting environment variable '%s' failed."), the_key.wx_str()) ); EV_DBGLOG(_T("EnvVars: Unsetting environment variable '%s' failed."), the_key.wx_str()); return false; } return true; }// EnvvarDiscard
void EnvVarsConfigDlg::OnCreateSetClick(wxCommandEvent& WXUNUSED(event)) { #if defined(TRACE_ENVVARS) Manager::Get()->GetLogManager()->DebugLog(F(_T("OnCreateSetClick"))); #endif wxChoice* choSet = XRCCTRL(*this, "choSet", wxChoice); if (!choSet) return; wxString set = wxGetTextFromUser(_("Enter (lower case) name for new environment variables set:"), _("Input Set"), nsEnvVars::EnvVarsDefault); if (set.IsEmpty() || (!VerifySetUnique(choSet, set))) return; wxCheckListBox* lstEnvVars = XRCCTRL(*this, "lstEnvVars", wxCheckListBox); if (!lstEnvVars) return; EV_DBGLOG(_T("EnvVars: Unsetting variables of envvar set '%s'."), choSet->GetString(choSet->GetCurrentSelection()).wx_str()); nsEnvVars::EnvvarsClearUI(lstEnvVars); // Don't care about return value lstEnvVars->Clear(); int idx = choSet->Append(set.MakeLower()); choSet->SetSelection(idx); SaveSettings(); LoadSettings(); }// OnCreateSetClick
bool nsEnvVars::EnvvarDiscard(const wxString &key) { #if TRACE_ENVVARS Manager::Get()->GetLogManager()->DebugLog(F(_T("EnvvarDiscard"))); #endif // Replace all macros the user might have setup for the key wxString the_key = key; Manager::Get()->GetMacrosManager()->ReplaceMacros(the_key); if (!wxUnsetEnv(the_key)) { Manager::Get()->GetLogManager()->Log(F( _("Unsetting environment variable '%s' failed."), #if wxCHECK_VERSION(2, 9, 0) the_key.wx_str()) #else the_key.c_str()) #endif ); EV_DBGLOG(_T("EnvVars: Unsetting environment variable '%s' failed."), #if wxCHECK_VERSION(2, 9, 0) the_key.wx_str()); #else the_key.c_str()); #endif return false; }
void EnvVarsConfigDlg::SaveSettingsActiveSet(wxString active_set) { #if defined(TRACE_ENVVARS) Manager::Get()->GetLogManager()->DebugLog(F(_T("SaveSettingsActiveSet"))); #endif ConfigManager *cfg = Manager::Get()->GetConfigManager(_T("envvars")); if (!cfg) return; if (active_set.IsEmpty()) active_set = nsEnvVars::EnvVarsDefault; EV_DBGLOG(_T("EnvVars: Saving '%s' as active envvar set to config."), active_set.wx_str()); cfg->Write(_T("/active_set"), active_set); }// SaveSettingsActiveSet
wxArrayString nsEnvVars::GetEnvvarSetNames() { #if defined(TRACE_ENVVARS) Manager::Get()->GetLogManager()->DebugLog(F(_T("GetEnvvarSetNames"))); #endif wxArrayString set_names; ConfigManager *cfg = Manager::Get()->GetConfigManager(_T("envvars")); if (!cfg) { set_names.Add(nsEnvVars::EnvVarsDefault); return set_names; } // Read all envvar sets available wxArrayString sets = cfg->EnumerateSubPaths(_T("/sets")); unsigned int num_sets = sets.GetCount(); EV_DBGLOG(_T("EnvVars: Found %u envvar sets in config."), num_sets); if (num_sets==0) set_names.Add(nsEnvVars::EnvVarsDefault); else { for (unsigned int i=0; i<num_sets; ++i) { wxString set_name = sets[i]; if (set_name.IsEmpty()) set_name.Printf(_T("Set%u"), i); set_names.Add(set_name); }// for }// if return set_names; }// GetEnvvarSetNames
void EnvVarsConfigDlg::LoadSettings() { #if defined(TRACE_ENVVARS) Manager::Get()->GetLogManager()->DebugLog(F(_T("LoadSettings"))); #endif wxChoice* choSet = XRCCTRL(*this, "choSet", wxChoice); if (!choSet) return; wxCheckListBox* lstEnvVars = XRCCTRL(*this, "lstEnvVars", wxCheckListBox); if (!lstEnvVars) return; wxCheckBox* chkDebugLog = XRCCTRL(*this, "chkDebugLog", wxCheckBox); if (!chkDebugLog) return; // load and apply configuration (to application and GUI) ConfigManager *cfg = Manager::Get()->GetConfigManager(_T("envvars")); if (!cfg) return; choSet->Clear(); lstEnvVars->Clear(); chkDebugLog->SetValue(cfg->ReadBool(_T("/debug_log"))); // Read the currently active envvar set wxString active_set = nsEnvVars::GetActiveSetName(); int active_set_idx = 0; // Read all envvar sets available wxArrayString set_names = nsEnvVars::GetEnvvarSetNames(); unsigned int num_sets = set_names.GetCount(); EV_DBGLOG(_T("EnvVars: Found %u envvar sets in config."), num_sets); unsigned int num_sets_applied = 0; for (unsigned int i=0; i<num_sets; ++i) { choSet->Append(set_names[i]); if (active_set.IsSameAs(set_names[i])) active_set_idx = i; num_sets_applied++; } EV_DBGLOG(_T("EnvVars: Setup %u/%u envvar sets from config."), num_sets_applied, num_sets); if ((int)choSet->GetCount()>active_set_idx) // Select the last active set (from config) choSet->SetSelection(active_set_idx); // Show currently activated set in debug log (for reference) wxString active_set_path = nsEnvVars::GetSetPathByName(active_set); EV_DBGLOG(_T("EnvVars: Active envvar set is '%s' at index %d, config path '%s'."), active_set.wx_str(), active_set_idx, active_set_path.wx_str()); // NOTE: Keep this in sync with nsEnvVars::EnvvarSetApply // Read and show all envvars from currently active set in listbox wxArrayString vars = nsEnvVars::GetEnvvarsBySetPath(active_set_path); size_t envvars_total = vars.GetCount(); size_t envvars_applied = 0; for (unsigned int i=0; i<envvars_total; ++i) { // Format: [checked?]|[key]|[value] wxArrayString var_array = nsEnvVars::EnvvarStringTokeniser(vars[i]); if (nsEnvVars::EnvvarArrayApply(var_array, lstEnvVars)) envvars_applied++; else { EV_DBGLOG(_T("EnvVars: Invalid envvar in '%s' at position #%u."), active_set_path.wx_str(), i); } }// for if (envvars_total>0) { EV_DBGLOG(_T("EnvVars: %lu/%lu envvars applied within C::B focus."), static_cast<unsigned long>(envvars_applied), static_cast<unsigned long>(envvars_total)); } }// LoadSettings