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; }
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; }