/** * Get all tags that can be found in a repository. * * @param repo S4 class git_repository * @return VECXSP with S4 objects of class git_tag */ SEXP git2r_tag_list(SEXP repo) { int err; SEXP result = R_NilValue; git2r_tag_foreach_cb_data cb_data = {0, NULL, R_NilValue, R_NilValue}; git_repository *repository; repository = git2r_repository_open(repo); if (!repository) git2r_error(__func__, NULL, git2r_err_invalid_repository, NULL); /* Count number of tags before creating the list */ err = git_tag_foreach(repository, &git2r_tag_foreach_cb, &cb_data); if (err) { if (GIT_ENOTFOUND == err) { err = 0; PROTECT(result = allocVector(VECSXP, 0)); setAttrib(result, R_NamesSymbol, allocVector(STRSXP, 0)); } goto cleanup; } PROTECT(result = allocVector(VECSXP, cb_data.n)); setAttrib(result, R_NamesSymbol, allocVector(STRSXP, cb_data.n)); cb_data.n = 0; cb_data.tags = result; cb_data.repo = repo; cb_data.repository = repository; err = git_tag_foreach(repository, &git2r_tag_foreach_cb, &cb_data); cleanup: if (repository) git_repository_free(repository); if (R_NilValue != result) UNPROTECT(1); if (err) git2r_error(__func__, giterr_last(), NULL, NULL); return result; }
emacs_value egit_tag_foreach(emacs_env *env, emacs_value _repo, emacs_value func) { EGIT_ASSERT_REPOSITORY(_repo); EM_ASSERT_FUNCTION(func); egit_generic_payload ctx = {.env = env, .func = func, .parent = NULL}; git_repository *repo = EGIT_EXTRACT(_repo); int retval = git_tag_foreach(repo, &egit_tag_foreach_callback, &ctx); EM_RETURN_NIL_IF_NLE(); if (retval == GIT_EUSER) return em_nil; EGIT_CHECK_ERROR(retval); return em_nil; }
int git_tag_list_match(git_strarray *tag_names, const char *pattern, git_repository *repo) { int error; tag_filter_data filter; git_vector taglist; assert(tag_names && repo && pattern); if ((error = git_vector_init(&taglist, 8, NULL)) < 0) return error; filter.taglist = &taglist; filter.pattern = pattern; error = git_tag_foreach(repo, &tag_list_cb, (void *)&filter); if (error < 0) git_vector_free(&taglist); tag_names->strings = (char **)git_vector_detach(&tag_names->count, NULL, &taglist); return 0; }