Exemplo n.º 1
0
int CGitHeadFileList::ReadHeadHash(CString gitdir)
{
	CString HeadFile = gitdir;
	HeadFile += _T("\\.git\\HEAD");

	int ret = 0;
	m_Gitdir = gitdir;

	m_HeadFile = HeadFile;

	if( g_Git.GetFileModifyTime(m_HeadFile, &m_LastModifyTimeHead))
		return -1;

	try
	{
		do
		{
			CAutoFile hfile = CreateFile(HeadFile,
				GENERIC_READ,
				FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE,
				NULL,
				OPEN_EXISTING,
				FILE_ATTRIBUTE_NORMAL,
				NULL);

			if (!hfile)
			{
				ret = -1;
				break;
			}

			DWORD size = 0,filesize = 0;
			unsigned char buffer[40] ;
			ReadFile(hfile, buffer, 4, &size, NULL);
			if (size != 4)
			{
				ret = -1;
				break;
			}
			buffer[4]=0;
			if (strcmp((const char*)buffer,"ref:") == 0)
			{
				filesize = GetFileSize(hfile, NULL);

				unsigned char *p = (unsigned char*)malloc(filesize -4);

				ReadFile(hfile, p, filesize - 4, &size, NULL);

				m_HeadRefFile.Empty();
				g_Git.StringAppend(&this->m_HeadRefFile, p, CP_ACP, filesize - 4);
				CString ref = this->m_HeadRefFile;
				ref = ref.Trim();
				int start = 0;
				ref = ref.Tokenize(_T("\n"), start);
				free(p);
				m_HeadRefFile=gitdir+_T("\\.git\\") + m_HeadRefFile.Trim();
				m_HeadRefFile.Replace(_T('/'),_T('\\'));

				__int64 time;
				if (g_Git.GetFileModifyTime(m_HeadRefFile, &time, NULL))
				{
					m_HeadRefFile.Empty();
					if (GetPackRef(gitdir))
					{
						ret = -1;
						break;
					}
					if (this->m_PackRefMap.find(ref) == m_PackRefMap.end())
					{
						ret = -1;
						break;
					}
					this ->m_Head = m_PackRefMap[ref];
					ret = 0;
					break;
				}

				CAutoFile href = CreateFile(m_HeadRefFile,
					GENERIC_READ,
					FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE,
					NULL,
					OPEN_EXISTING,
					FILE_ATTRIBUTE_NORMAL,
					NULL);

				if (!href)
				{
					m_HeadRefFile.Empty();

					if (GetPackRef(gitdir))
					{
						ret = -1;
						break;
					}

					if (this->m_PackRefMap.find(ref) == m_PackRefMap.end())
					{
						ret = -1;
						break;
					}
					this ->m_Head = m_PackRefMap[ref];
					ret = 0;
					break;
				}
				ReadFile(href, buffer, 40, &size, NULL);
				if (size != 40)
				{
					ret = -1;
					break;
				}
				this->m_Head.ConvertFromStrA((char*)buffer);

				this->m_LastModifyTimeRef = time;

			}
			else
			{
				ReadFile(hfile, buffer + 4, 40 - 4, &size, NULL);
				if(size != 36)
				{
					ret = -1;
					break;
				}
				m_HeadRefFile.Empty();

				this->m_Head.ConvertFromStrA((char*)buffer);
			}
		} while(0);
	}
	catch(...)
	{
		ret = -1;
	}

	return ret;
}
Exemplo n.º 2
0
int CGitHeadFileList::ReadHeadHash(const CString& gitdir)
{
	CAutoWriteLock lock(m_SharedMutex);
	m_Gitdir = g_AdminDirMap.GetAdminDir(gitdir);

	m_HeadFile = m_Gitdir;
	m_HeadFile += _T("HEAD");

	if( CGit::GetFileModifyTime(m_HeadFile, &m_LastModifyTimeHead))
		return -1;

	CAutoFile hfile = CreateFile(m_HeadFile,
		GENERIC_READ,
		FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
		nullptr,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		nullptr);

	if (!hfile)
		return -1;

	DWORD size = 0;
	unsigned char buffer[40];
	ReadFile(hfile, buffer, 4, &size, nullptr);
	if (size != 4)
		return -1;
	buffer[4] = 0;
	if (strcmp((const char*)buffer, "ref:") == 0)
	{
		m_HeadRefFile.Empty();
		DWORD filesize = GetFileSize(hfile, nullptr);
		if (filesize < 5)
			return -1;

		unsigned char *p = (unsigned char*)malloc(filesize - 4);
		if (!p)
			return -1;

		ReadFile(hfile, p, filesize - 4, &size, nullptr);
		CGit::StringAppend(&m_HeadRefFile, p, CP_UTF8, filesize - 4);
		free(p);

		CString ref = m_HeadRefFile.Trim();
		int start = 0;
		ref = ref.Tokenize(_T("\n"), start);
		m_HeadRefFile = m_Gitdir + m_HeadRefFile;
		m_HeadRefFile.Replace(_T('/'), _T('\\'));

		__int64 time;
		if (CGit::GetFileModifyTime(m_HeadRefFile, &time, nullptr))
		{
			m_HeadRefFile.Empty();
			if (GetPackRef(gitdir))
				return -1;
			if (m_PackRefMap.find(ref) == m_PackRefMap.end())
				return -1;

			m_Head = m_PackRefMap[ref];
			return 0;
		}

		CAutoFile href = CreateFile(m_HeadRefFile,
			GENERIC_READ,
			FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE,
			nullptr,
			OPEN_EXISTING,
			FILE_ATTRIBUTE_NORMAL,
			nullptr);

		if (!href)
		{
			m_HeadRefFile.Empty();

			if (GetPackRef(gitdir))
				return -1;

			if (m_PackRefMap.find(ref) == m_PackRefMap.end())
				return -1;

			m_Head = m_PackRefMap[ref];
			return 0;
		}

		ReadFile(href, buffer, 40, &size, nullptr);
		if (size != 40)
			return -1;

		m_Head.ConvertFromStrA((char*)buffer);

		m_LastModifyTimeRef = time;

		return 0;
	}

	ReadFile(hfile, buffer + 4, 40 - 4, &size, nullptr);
	if (size != 36)
		return -1;

	m_HeadRefFile.Empty();

	m_Head.ConvertFromStrA((char*)buffer);

	return 0;
}