int CGitIgnoreItem::FetchIgnoreList(const CString &projectroot, const CString &file) { CAutoWriteLock lock(&this->m_SharedMutex); if (this->m_pExcludeList) { free(m_pExcludeList); m_pExcludeList=NULL; } this->m_BaseDir.Empty(); if (projectroot.GetLength() < file.GetLength()) { CString base = file.Mid(projectroot.GetLength() + 1); base.Replace(_T('\\'), _T('/')); if (base != _T(".git/info/exclude")) { int start = base.ReverseFind(_T('/')); if(start >= 0) { base = base.Left(start); this->m_BaseDir = CUnicodeUtils::GetMulti(base,CP_ACP) ; } } } { if(g_Git.GetFileModifyTime(file, &m_LastModifyTime)) return -1; if(git_create_exclude_list(&this->m_pExcludeList)) return -1; CAutoFile hfile = CreateFile(file, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (!hfile) return -1 ; DWORD size=0,filesize=0; filesize=GetFileSize(hfile, NULL); if(filesize == INVALID_FILE_SIZE) return -1; BYTE *buffer = new BYTE[filesize + 1]; if(buffer == NULL) return -1; if(! ReadFile(hfile, buffer,filesize,&size,NULL)) return GetLastError(); BYTE *p = buffer; for (int i = 0; i < size; i++) { if (buffer[i] == '\n' || buffer[i] == '\r' || i == (size - 1)) { if (buffer[i] == '\n' || buffer[i] == '\r') buffer[i] = 0; if (i == size - 1) buffer[size] = 0; if(p[0] != '#' && p[0] != 0) git_add_exclude((const char*)p, this->m_BaseDir.GetBuffer(), m_BaseDir.GetLength(), this->m_pExcludeList); p=buffer+i+1; } } /* Can't free buffer, exluced list will use this buffer*/ //delete buffer; //buffer = NULL; } return 0; }
int CGitIgnoreItem::FetchIgnoreList(const CString &projectroot, const CString &file, bool isGlobal) { if (this->m_pExcludeList) { git_free_exclude_list(m_pExcludeList); m_pExcludeList = nullptr; } free(m_buffer); m_buffer = nullptr; this->m_BaseDir.Empty(); if (!isGlobal) { CString base = file.Mid(projectroot.GetLength() + 1); base.Replace(_T('\\'), _T('/')); int start = base.ReverseFind(_T('/')); if(start > 0) { base.Truncate(start); this->m_BaseDir = CUnicodeUtils::GetMulti(base, CP_UTF8) + "/"; } } if (CGit::GetFileModifyTime(file, &m_LastModifyTime)) return -1; CAutoFile hfile = CreateFile(file, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); if (!hfile) return -1 ; DWORD filesize = GetFileSize(hfile, nullptr); if (filesize == INVALID_FILE_SIZE) return -1; m_buffer = new BYTE[filesize + 1]; if (!m_buffer) return -1; DWORD size = 0; if (!ReadFile(hfile, m_buffer, filesize, &size, nullptr)) { free(m_buffer); m_buffer = nullptr; return -1; } m_buffer[size] = 0; if (git_create_exclude_list(&m_pExcludeList)) { free(m_buffer); m_buffer = nullptr; return -1; } BYTE *p = m_buffer; int line = 0; for (DWORD i = 0; i < size; ++i) { if (m_buffer[i] == '\n' || m_buffer[i] == '\r' || i == (size - 1)) { if (m_buffer[i] == '\n' || m_buffer[i] == '\r') m_buffer[i] = 0; if (p[0] != '#' && p[0] != 0) git_add_exclude((const char*)p, this->m_BaseDir, m_BaseDir.GetLength(), this->m_pExcludeList, ++line); p = m_buffer + i + 1; } } if (!line) { git_free_exclude_list(m_pExcludeList); m_pExcludeList = nullptr; free(m_buffer); m_buffer = nullptr; } return 0; }