Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}