bool CGitIgnoreList::CheckAndUpdateCoreExcludefile(const CString &adminDir) { CString projectConfig = adminDir + _T("config"); CString globalConfig = g_Git.GetGitGlobalConfig(); CString globalXDGConfig = g_Git.GetGitGlobalXDGConfig(); CAutoWriteLock lock(m_coreExcludefilesSharedMutex); bool hasChanged = CheckAndUpdateGitSystemConfigPath(); hasChanged = hasChanged || CheckFileChanged(projectConfig); hasChanged = hasChanged || CheckFileChanged(globalConfig); hasChanged = hasChanged || CheckFileChanged(globalXDGConfig); if (!m_sGitSystemConfigPath.IsEmpty()) hasChanged = hasChanged || CheckFileChanged(m_sGitSystemConfigPath); CString excludesFile; { CAutoReadLock lock2(m_SharedMutex); excludesFile = m_CoreExcludesfiles[adminDir]; } if (!excludesFile.IsEmpty()) hasChanged = hasChanged || CheckFileChanged(excludesFile); if (!hasChanged) return false; CAutoConfig config(true); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(projectConfig), GIT_CONFIG_LEVEL_LOCAL, FALSE); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(globalConfig), GIT_CONFIG_LEVEL_GLOBAL, FALSE); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(globalXDGConfig), GIT_CONFIG_LEVEL_XDG, FALSE); if (!m_sGitSystemConfigPath.IsEmpty()) git_config_add_file_ondisk(config, CGit::GetGitPathStringA(m_sGitSystemConfigPath), GIT_CONFIG_LEVEL_SYSTEM, FALSE); config.GetString(_T("core.excludesfile"), excludesFile); if (excludesFile.IsEmpty()) excludesFile = GetWindowsHome() + _T("\\.config\\git\\ignore"); else if (excludesFile.Find(_T("~/")) == 0) excludesFile = GetWindowsHome() + excludesFile.Mid(1); CAutoWriteLock lockMap(m_SharedMutex); g_Git.GetFileModifyTime(projectConfig, &m_Map[projectConfig].m_LastModifyTime); g_Git.GetFileModifyTime(globalXDGConfig, &m_Map[globalXDGConfig].m_LastModifyTime); if (m_Map[globalXDGConfig].m_LastModifyTime == 0) m_Map.erase(globalXDGConfig); g_Git.GetFileModifyTime(globalConfig, &m_Map[globalConfig].m_LastModifyTime); if (m_Map[globalConfig].m_LastModifyTime == 0) m_Map.erase(globalConfig); if (!m_sGitSystemConfigPath.IsEmpty()) g_Git.GetFileModifyTime(m_sGitSystemConfigPath, &m_Map[m_sGitSystemConfigPath].m_LastModifyTime); if (m_Map[m_sGitSystemConfigPath].m_LastModifyTime == 0 || m_sGitSystemConfigPath.IsEmpty()) m_Map.erase(m_sGitSystemConfigPath); m_CoreExcludesfiles[adminDir] = excludesFile; return true; }
bool CGitIgnoreList::CheckAndUpdateCoreExcludefile(const CString &adminDir) { CString projectConfig = adminDir + _T("config"); CString globalConfig = g_Git.GetGitGlobalConfig(); CString globalXDGConfig = g_Git.GetGitGlobalXDGConfig(); CAutoWriteLock lock(&m_coreExcludefilesSharedMutex); bool hasChanged = CheckAndUpdateMsysGitBinpath(); CString systemConfig = m_sMsysGitBinPath + _T("\\..\\etc\\gitconfig"); hasChanged = hasChanged || CheckFileChanged(projectConfig); hasChanged = hasChanged || CheckFileChanged(globalConfig); hasChanged = hasChanged || CheckFileChanged(globalXDGConfig); if (!m_sMsysGitBinPath.IsEmpty()) hasChanged = hasChanged || CheckFileChanged(systemConfig); m_SharedMutex.AcquireShared(); CString excludesFile = m_CoreExcludesfiles[adminDir]; m_SharedMutex.ReleaseShared(); if (!excludesFile.IsEmpty()) hasChanged = hasChanged || CheckFileChanged(excludesFile); if (!hasChanged) return false; git_config * config; git_config_new(&config); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(projectConfig), GIT_CONFIG_LEVEL_LOCAL, FALSE); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(globalConfig), GIT_CONFIG_LEVEL_GLOBAL, FALSE); git_config_add_file_ondisk(config, CGit::GetGitPathStringA(globalXDGConfig), GIT_CONFIG_LEVEL_XDG, FALSE); if (!m_sMsysGitBinPath.IsEmpty()) git_config_add_file_ondisk(config, CGit::GetGitPathStringA(systemConfig), GIT_CONFIG_LEVEL_SYSTEM, FALSE); const char * out = NULL; CStringA name(_T("core.excludesfile")); git_config_get_string(&out, config, name); CStringA excludesFileA(out); excludesFile = CUnicodeUtils::GetUnicode(excludesFileA); if (excludesFile.IsEmpty()) excludesFile = GetWindowsHome() + _T("\\.config\\git\\ignore"); else if (excludesFile.Find(_T("~/")) == 0) excludesFile = GetWindowsHome() + excludesFile.Mid(1); git_config_free(config); CAutoWriteLock lockMap(&m_SharedMutex); g_Git.GetFileModifyTime(projectConfig, &m_Map[projectConfig].m_LastModifyTime); g_Git.GetFileModifyTime(globalXDGConfig, &m_Map[globalXDGConfig].m_LastModifyTime); if (m_Map[globalXDGConfig].m_LastModifyTime == 0) { m_Map[globalXDGConfig].m_SharedMutex.Release(); m_Map.erase(globalXDGConfig); } g_Git.GetFileModifyTime(globalConfig, &m_Map[globalConfig].m_LastModifyTime); if (m_Map[globalConfig].m_LastModifyTime == 0) { m_Map[globalConfig].m_SharedMutex.Release(); m_Map.erase(globalConfig); } if (!m_sMsysGitBinPath.IsEmpty()) g_Git.GetFileModifyTime(systemConfig, &m_Map[systemConfig].m_LastModifyTime); if (m_Map[systemConfig].m_LastModifyTime == 0 || m_sMsysGitBinPath.IsEmpty()) { m_Map[systemConfig].m_SharedMutex.Release(); m_Map.erase(systemConfig); } m_CoreExcludesfiles[adminDir] = excludesFile; return true; }