mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-06 19:37:29 +00:00

When traversing the directory structure, the iterator pushes and pops ignore files using a vector. Some directories don't have ignore files, so it uses a path comparison to decide when it is right to actually pop the last ignore file. This was only comparing directory suffixes, though, so a subdirectory with the same name as a parent could result in the parent's .gitignore being popped off the list ignores too early. This changes the logic to compare the entire relative path of the ignore file.
95 lines
2.1 KiB
C
95 lines
2.1 KiB
C
#include "clar_libgit2.h"
|
|
#include "status_helpers.h"
|
|
|
|
int cb_status__normal(
|
|
const char *path, unsigned int status_flags, void *payload)
|
|
{
|
|
status_entry_counts *counts = payload;
|
|
|
|
if (counts->debug)
|
|
cb_status__print(path, status_flags, NULL);
|
|
|
|
if (counts->entry_count >= counts->expected_entry_count)
|
|
counts->wrong_status_flags_count++;
|
|
else if (strcmp(path, counts->expected_paths[counts->entry_count]))
|
|
counts->wrong_sorted_path++;
|
|
else if (status_flags != counts->expected_statuses[counts->entry_count])
|
|
counts->wrong_status_flags_count++;
|
|
|
|
counts->entry_count++;
|
|
return 0;
|
|
}
|
|
|
|
int cb_status__count(const char *p, unsigned int s, void *payload)
|
|
{
|
|
volatile int *count = (int *)payload;
|
|
|
|
GIT_UNUSED(p);
|
|
GIT_UNUSED(s);
|
|
|
|
(*count)++;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int cb_status__single(const char *p, unsigned int s, void *payload)
|
|
{
|
|
status_entry_single *data = (status_entry_single *)payload;
|
|
|
|
if (data->debug)
|
|
fprintf(stderr, "%02d: %s (%04x)\n", data->count, p, s);
|
|
|
|
data->count++;
|
|
data->status = s;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int cb_status__print(
|
|
const char *path, unsigned int status_flags, void *payload)
|
|
{
|
|
char istatus = ' ', wstatus = ' ';
|
|
int icount = 0, wcount = 0;
|
|
|
|
if (status_flags & GIT_STATUS_INDEX_NEW) {
|
|
istatus = 'A'; icount++;
|
|
}
|
|
if (status_flags & GIT_STATUS_INDEX_MODIFIED) {
|
|
istatus = 'M'; icount++;
|
|
}
|
|
if (status_flags & GIT_STATUS_INDEX_DELETED) {
|
|
istatus = 'D'; icount++;
|
|
}
|
|
if (status_flags & GIT_STATUS_INDEX_RENAMED) {
|
|
istatus = 'R'; icount++;
|
|
}
|
|
if (status_flags & GIT_STATUS_INDEX_TYPECHANGE) {
|
|
istatus = 'T'; icount++;
|
|
}
|
|
|
|
if (status_flags & GIT_STATUS_WT_NEW) {
|
|
wstatus = 'A'; wcount++;
|
|
}
|
|
if (status_flags & GIT_STATUS_WT_MODIFIED) {
|
|
wstatus = 'M'; wcount++;
|
|
}
|
|
if (status_flags & GIT_STATUS_WT_DELETED) {
|
|
wstatus = 'D'; wcount++;
|
|
}
|
|
if (status_flags & GIT_STATUS_WT_TYPECHANGE) {
|
|
wstatus = 'T'; wcount++;
|
|
}
|
|
if (status_flags & GIT_STATUS_IGNORED) {
|
|
wstatus = 'I'; wcount++;
|
|
}
|
|
|
|
fprintf(stderr, "%c%c %s (%d/%d%s)\n",
|
|
istatus, wstatus, path, icount, wcount,
|
|
(icount > 1 || wcount > 1) ? " INVALID COMBO" : "");
|
|
|
|
if (payload)
|
|
*((int *)payload) += 1;
|
|
|
|
return 0;
|
|
}
|