コード例 #1
0
ファイル: GitIndex.cpp プロジェクト: vok1980/TortoiseGit
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;
}
コード例 #2
0
ファイル: GitIndex.cpp プロジェクト: Jopie64/tortoisegit
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;
}