Exemplo n.º 1
0
BOOL CCachedDirectory::LoadFromDisk(FILE * pFile)
{
	AutoLocker lock(m_critSec);
#define LOADVALUEFROMFILE(x) if (fread(&x, sizeof(x), 1, pFile)!=1) return false;
	try
	{
		unsigned int value = 0;
		LOADVALUEFROMFILE(value);
		if (value != GIT_CACHE_VERSION)
			return false;		// not the correct version
		int mapsize = 0;
		LOADVALUEFROMFILE(mapsize);
		for (int i=0; i<mapsize; ++i)
		{
			LOADVALUEFROMFILE(value);
			if (value > MAX_PATH)
				return false;
			if (value)
			{
				CString sKey;
				if (fread(sKey.GetBuffer(value+1), sizeof(TCHAR), value, pFile)!=value)
				{
					sKey.ReleaseBuffer(0);
					return false;
				}
				sKey.ReleaseBuffer(value);
				CStatusCacheEntry entry;
				if (!entry.LoadFromDisk(pFile))
					return false;
				// only read non empty keys (just needed for transition from old TGit clients)
				if (!sKey.IsEmpty())
					m_entryCache[sKey] = entry;
			}
		}
		LOADVALUEFROMFILE(mapsize);
		for (int i=0; i<mapsize; ++i)
		{
			LOADVALUEFROMFILE(value);
			if (value > MAX_PATH)
				return false;
			if (value)
			{
				CString sPath;
				if (fread(sPath.GetBuffer(value), sizeof(TCHAR), value, pFile)!=value)
				{
					sPath.ReleaseBuffer(0);
					return false;
				}
				sPath.ReleaseBuffer(value);
				git_wc_status_kind status;
				LOADVALUEFROMFILE(status);
				m_childDirectories[CTGitPath(sPath)] = status;
			}
		}
		LOADVALUEFROMFILE(value);
		if (value > MAX_PATH)
			return false;
		if (value)
		{
			CString sPath;
			if (fread(sPath.GetBuffer(value+1), sizeof(TCHAR), value, pFile)!=value)
			{
				sPath.ReleaseBuffer(0);
				return false;
			}
			sPath.ReleaseBuffer(value);
			// make sure paths do not end with backslash (just needed for transition from old TGit clients)
			if (sPath.GetLength() > 3 && sPath[sPath.GetLength() - 1] == _T('\\'))
				sPath.TrimRight(_T("\\"));
			m_directoryPath.SetFromWin(sPath);
			m_directoryPath.GetGitPathString(); // make sure git path string is set
		}
		if (!m_ownStatus.LoadFromDisk(pFile))
			return false;

		LOADVALUEFROMFILE(m_currentFullStatus);
		LOADVALUEFROMFILE(m_mostImportantFileStatus);
	}
	catch ( CAtlException )
	{
		return false;
	}
	return true;

}
Exemplo n.º 2
0
BOOL CCachedDirectory::LoadFromDisk(FILE * pFile)
{
    AutoLocker lock(m_critSec);
#define LOADVALUEFROMFILE(x) if (fread(&x, sizeof(x), 1, pFile)!=1) return false;
    try
    {
        unsigned int value = 0;
        LOADVALUEFROMFILE(value);
        if (value != CACHEDIRECTORYDISKVERSION)
            return false;       // not the correct version

        int mapsize = 0;
        LOADVALUEFROMFILE(mapsize);
        for (int i=0; i<mapsize; ++i)
        {
            LOADVALUEFROMFILE(value);
            if (value > MAX_PATH)
                return false;
            if (value)
            {
                CStringA sKey;
                if (fread(sKey.GetBuffer(value+1), sizeof(char), value, pFile)!=value)
                {
                    sKey.ReleaseBuffer(0);
                    return false;
                }
                sKey.ReleaseBuffer(value);
                CStatusCacheEntry entry;
                if (!entry.LoadFromDisk(pFile))
                    return false;
                m_entryCache[sKey] = entry;
            }
        }
        LOADVALUEFROMFILE(mapsize);
        for (int i=0; i<mapsize; ++i)
        {
            LOADVALUEFROMFILE(value);
            if (value > MAX_PATH)
                return false;
            if (value)
            {
                CStringA sPath;
                if (fread(sPath.GetBuffer(value), sizeof(char), value, pFile)!=value)
                {
                    sPath.ReleaseBuffer(0);
                    return false;
                }
                sPath.ReleaseBuffer(value);
                svn_wc_status_kind status;
                LOADVALUEFROMFILE(status);
                m_childDirectories[sPath] = status;
            }
        }
        LOADVALUEFROMFILE(m_wcDbFileTime);
        LOADVALUEFROMFILE(value);
        if (value > MAX_PATH)
            return false;
        if (value)
        {
            CString sPath;
            if (fread(sPath.GetBuffer(value+1), sizeof(TCHAR), value, pFile)!=value)
            {
                sPath.ReleaseBuffer(0);
                return false;
            }
            sPath.ReleaseBuffer(value);
            m_directoryPath.SetFromWin(sPath);
        }
        if (!m_ownStatus.LoadFromDisk(pFile))
            return false;

        LOADVALUEFROMFILE(m_currentFullStatus);
        LOADVALUEFROMFILE(m_mostImportantFileStatus);
    }
    catch ( CAtlException )
    {
        return false;
    }
    return true;

}