mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-08 22:08:56 +00:00
Improve and comment git_ignore__pop_dir
This just cleans up the improved logic for popping ignore dirs and documents why the complex behavior is needed.
This commit is contained in:
parent
ba8b8c0407
commit
3bc3ed80f4
24
src/ignore.c
24
src/ignore.c
@ -168,15 +168,25 @@ int git_ignore__pop_dir(git_ignores *ign)
|
|||||||
{
|
{
|
||||||
if (ign->ign_path.length > 0) {
|
if (ign->ign_path.length > 0) {
|
||||||
git_attr_file *file = git_vector_last(&ign->ign_path);
|
git_attr_file *file = git_vector_last(&ign->ign_path);
|
||||||
size_t keylen = strlen(file->key);
|
const char *start, *end, *scan;
|
||||||
|
size_t keylen;
|
||||||
|
|
||||||
while (keylen && file->key[keylen] != '/')
|
/* - ign->dir looks something like "a/b" (or "a/b/c/d")
|
||||||
keylen--;
|
* - file->key looks something like "0#a/b/.gitignore
|
||||||
keylen -= 1; /* because we will skip "0#" prefix */
|
*
|
||||||
|
* We are popping the last directory off ign->dir. We also want to
|
||||||
|
* remove the file from the vector if the directory part of the key
|
||||||
|
* matches the ign->dir path. We need to test if the "a/b" part of
|
||||||
|
* the file key matches the path we are about to pop.
|
||||||
|
*/
|
||||||
|
|
||||||
if (ign->dir.size > keylen &&
|
for (start = end = scan = &file->key[2]; *scan; ++scan)
|
||||||
!memcmp(ign->dir.ptr + ign->dir.size - keylen,
|
if (*scan == '/')
|
||||||
file->key + 2, keylen))
|
end = scan; /* point 'end' to last '/' in key */
|
||||||
|
keylen = (end - start) + 1;
|
||||||
|
|
||||||
|
if (ign->dir.size >= keylen &&
|
||||||
|
!memcmp(ign->dir.ptr + ign->dir.size - keylen, start, keylen))
|
||||||
git_vector_pop(&ign->ign_path);
|
git_vector_pop(&ign->ign_path);
|
||||||
|
|
||||||
git_buf_rtruncate_at_char(&ign->dir, '/');
|
git_buf_rtruncate_at_char(&ign->dir, '/');
|
||||||
|
Loading…
Reference in New Issue
Block a user