int git_reference_foreach_glob( git_repository *repo, const char *glob, git_reference_foreach_name_cb callback, void *payload) { git_reference_iterator *iter; const char *refname; int error; if (git_reference_iterator_glob_new(&iter, repo, glob) < 0) return -1; while ((error = git_reference_next_name(&refname, iter)) == 0) { if (callback(refname, payload)) { error = GIT_EUSER; goto out; } } if (error == GIT_ITEROVER) error = 0; out: git_reference_iterator_free(iter); return error; }
int git_reference_foreach_glob( git_repository *repo, const char *glob, git_reference_foreach_name_cb callback, void *payload) { git_reference_iterator *iter; const char *refname; int error; if ((error = git_reference_iterator_glob_new(&iter, repo, glob)) < 0) return error; while (!(error = git_reference_next_name(&refname, iter))) { if ((error = callback(refname, payload)) != 0) { giterr_set_after_callback(error); break; } } if (error == GIT_ITEROVER) error = 0; git_reference_iterator_free(iter); return error; }
// normal from glob and just names int luagi_reference_iterator( lua_State *L ) { git_repository **repo = checkrepo( L, 1 ); const char *glob = luaL_optstring( L, 2, NULL ); git_reference_iterator **iter = lua_newuserdata( L, sizeof( git_reference_iterator * ) ); int ret = 0; if( glob == NULL ) { ret = git_reference_iterator_new( iter, *repo ); } else { ret = git_reference_iterator_glob_new ( iter, *repo, glob ); } if( ret ) { ltk_error_abort( L ); return 0; } luaL_getmetatable(L, LUAGI_REFERENCE_ITER_FUNCS); lua_setmetatable(L, -2); lua_pushcclosure( L, reference_iter, 1 ); return 1; }
static int push_glob(git_revwalk *walk, const char *glob, int hide) { int error = 0; git_buf buf = GIT_BUF_INIT; git_reference *ref; git_reference_iterator *iter; size_t wildcard; assert(walk && glob); /* refs/ is implied if not given in the glob */ if (git__prefixcmp(glob, GIT_REFS_DIR) != 0) git_buf_joinpath(&buf, GIT_REFS_DIR, glob); else git_buf_puts(&buf, glob); if (git_buf_oom(&buf)) return -1; /* If no '?', '*' or '[' exist, we append '/ *' to the glob */ wildcard = strcspn(glob, "?*["); if (!glob[wildcard]) git_buf_put(&buf, "/*", 2); if ((error = git_reference_iterator_glob_new(&iter, walk->repo, buf.ptr)) < 0) goto out; while ((error = git_reference_next(&ref, iter)) == 0) { error = push_ref(walk, git_reference_name(ref), hide, true); git_reference_free(ref); if (error < 0) break; } git_reference_iterator_free(iter); if (error == GIT_ITEROVER) error = 0; out: git_buf_free(&buf); return error; }