void test_status_worktree__ignores(void) { int i, ignored; git_repository *repo = cl_git_sandbox_init("status"); for (i = 0; i < (int)entry_count0; i++) { cl_git_pass( git_status_should_ignore(&ignored, repo, entry_paths0[i]) ); cl_assert(ignored == (entry_statuses0[i] == GIT_STATUS_IGNORED)); } cl_git_pass( git_status_should_ignore(&ignored, repo, "nonexistent_file") ); cl_assert(!ignored); cl_git_pass( git_status_should_ignore(&ignored, repo, "ignored_nonexistent_file") ); cl_assert(ignored); }
emacs_value egit_status_should_ignore_p(emacs_env *env, emacs_value _repo, emacs_value _path) { EGIT_ASSERT_REPOSITORY(_repo); EM_ASSERT_STRING(_path); char *path = EM_EXTRACT_STRING(_path); git_repository *repo = EGIT_EXTRACT(_repo); int ignored; int rv = git_status_should_ignore(&ignored, repo, path); free(path); EGIT_CHECK_ERROR(rv); return ignored == 0 ? em_nil : em_t; }
void test_status_ignore__0(void) { struct { const char *path; int expected; } test_cases[] = { /* pattern "ign" from .gitignore */ { "file", 0 }, { "ign", 1 }, { "sub", 0 }, { "sub/file", 0 }, { "sub/ign", 1 }, { "sub/ign/file", 1 }, { "sub/ign/sub", 1 }, { "sub/ign/sub/file", 1 }, { "sub/sub", 0 }, { "sub/sub/file", 0 }, { "sub/sub/ign", 1 }, { "sub/sub/sub", 0 }, /* pattern "dir/" from .gitignore */ { "dir", 1 }, { "dir/", 1 }, { "sub/dir", 1 }, { "sub/dir/", 1 }, { "sub/dir/file", 1 }, /* contained in ignored parent */ { "sub/sub/dir", 0 }, /* dir is not actually a dir, but a file */ { NULL, 0 } }, *one_test; g_repo = cl_git_sandbox_init("attr"); for (one_test = test_cases; one_test->path != NULL; one_test++) { int ignored; cl_git_pass(git_status_should_ignore(&ignored, g_repo, one_test->path)); cl_assert_(ignored == one_test->expected, one_test->path); } /* confirm that ignore files were cached */ cl_assert(git_attr_cache__is_cached(g_repo, 0, ".git/info/exclude")); cl_assert(git_attr_cache__is_cached(g_repo, 0, ".gitignore")); }
void test_status_ignore__automatically_ignore_bad_files(void) { int ignored; g_repo = cl_git_sandbox_init("empty_standard_repo"); cl_git_pass(git_status_should_ignore(&ignored, g_repo, ".git")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/file/.")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "path/../funky")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "path/whatever.c")); cl_assert(!ignored); cl_git_pass(git_ignore_add_rule(g_repo, "*.c\n")); cl_git_pass(git_status_should_ignore(&ignored, g_repo, ".git")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/file/.")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "path/../funky")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "path/whatever.c")); cl_assert(ignored); cl_git_pass(git_ignore_clear_internal_rules(g_repo)); cl_git_pass(git_status_should_ignore(&ignored, g_repo, ".git")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/file/.")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "path/../funky")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "path/whatever.c")); cl_assert(!ignored); }
void test_status_ignore__internal_ignores_inside_deep_paths(void) { int ignored; const char *add_me = "Debug\nthis/is/deep\npatterned*/dir\n"; g_repo = cl_git_sandbox_init("empty_standard_repo"); cl_git_pass(git_ignore_add_rule(g_repo, add_me)); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "Debug")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "and/Debug")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "really/Debug/this/file")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "Debug/what/I/say")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "and/NoDebug")); cl_assert(!ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "NoDebug/this")); cl_assert(!ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "please/NoDebug/this")); cl_assert(!ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/is/deep")); cl_assert(ignored); /* pattern containing slash gets FNM_PATHNAME so all slashes must match */ cl_git_pass(git_status_should_ignore(&ignored, g_repo, "and/this/is/deep")); cl_assert(!ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/is/deep/too")); cl_assert(ignored); /* pattern containing slash gets FNM_PATHNAME so all slashes must match */ cl_git_pass(git_status_should_ignore(&ignored, g_repo, "but/this/is/deep/and/ignored")); cl_assert(!ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/is/not/deep")); cl_assert(!ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "is/this/not/as/deep")); cl_assert(!ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "this/is/deepish")); cl_assert(!ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "xthis/is/deep")); cl_assert(!ignored); }
void test_status_ignore__adding_internal_ignores(void) { int ignored; g_repo = cl_git_sandbox_init("empty_standard_repo"); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.txt")); cl_assert(!ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); cl_assert(!ignored); cl_git_pass(git_ignore_add_rule(g_repo, "*.nomatch\n")); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.txt")); cl_assert(!ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); cl_assert(!ignored); cl_git_pass(git_ignore_add_rule(g_repo, "*.txt\n")); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.txt")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); cl_assert(!ignored); cl_git_pass(git_ignore_add_rule(g_repo, "*.bar\n")); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.txt")); cl_assert(ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); cl_assert(ignored); cl_git_pass(git_ignore_clear_internal_rules(g_repo)); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.txt")); cl_assert(!ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); cl_assert(!ignored); cl_git_pass(git_ignore_add_rule( g_repo, "multiple\n*.rules\n# comment line\n*.bar\n")); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "one.txt")); cl_assert(!ignored); cl_git_pass(git_status_should_ignore(&ignored, g_repo, "two.bar")); cl_assert(ignored); }
int Gitarre::StatusCb (const char *path, unsigned int status_flags, int i, StatusCbMode mode) { if (mode == Gitarre::Add || ( mode == Gitarre::Update && ( (status_flags & GIT_STATUS_WT_NEW) || (status_flags & GIT_STATUS_WT_DELETED) ))) { Repository *repo = Repos[i]; git_repository *gitRepo = repo->GetGitRepo(); QString repoPath = repo->GetPath(); QString relPath (path); // Split path into hierarchy QStringList hier = relPath.split ("/"); // For every hierarchy member, check whether directory exists and was added to RepoView QString absoluteDirPath = repoPath; QTreeWidgetItem *item = RepoView->topLevelItem(i); for (int j = 0; j < hier.size() - 1; ++j) { absoluteDirPath += QString ('/') + hier[j]; QTreeWidgetItem *foundItem = findChildItem (item, hier[j]); if (!foundItem) { foundItem = new QTreeWidgetItem (QStringList (hier[j])); foundItem->setIcon (0, QIcon::fromTheme ("folder")); QDir absoluteDir (absoluteDirPath); if (!absoluteDir.exists()) foundItem->setForeground(0, QBrush (ColorDeleted)); else { // TODO: This is not working for some reason; find alternative way to address (maybe via .gitignore directly?) int ignored; git_status_should_ignore (&ignored, gitRepo, absoluteDirPath.toStdString().c_str()); if (ignored) foundItem->setForeground(0, QBrush (ColorIgnored)); } item->addChild(foundItem); } item = foundItem; } if (mode == Gitarre::Add || ( mode == Gitarre::Update && !(status_flags & GIT_STATUS_WT_DELETED))) { QTreeWidgetItem *child = NULL; if (mode == Gitarre::Update) { child = findChildItem (item, hier.back()); } if (!child) { QTreeWidgetItem *child = new QTreeWidgetItem (QStringList (hier.back())); child->setIcon(0, QIcon::fromTheme ("text-x-generic")); if (status_flags & GIT_STATUS_IGNORED) child->setForeground(0, QBrush (ColorIgnored)); else if (status_flags & GIT_STATUS_WT_DELETED) child->setForeground(0, QBrush (ColorDeleted)); else if (status_flags & GIT_STATUS_WT_NEW) child->setForeground(0, QBrush (ColorNew)); item->addChild(child); if (mode == Gitarre::Update) item->sortChildren(0, Qt::AscendingOrder); } } else // only option is mode == Gitarre::Update && status_flags & GIT_STATUS_WT_DELETED { QTreeWidgetItem *child = findChildItem (item, hier.back()); if (!child) { QTreeWidgetItem *child = new QTreeWidgetItem (QStringList (hier.back())); child->setIcon(0, QIcon::fromTheme ("text-x-generic")); item->addChild(child); item->sortChildren(0, Qt::AscendingOrder); } child->setForeground(0, QBrush (ColorDeleted)); } } return 0; }