예제 #1
0
/**
 * 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;
}
예제 #2
0
파일: egit-tag.c 프로젝트: ocodo/.emacs.d
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;
}
예제 #3
0
파일: tag.c 프로젝트: yuanms2/libgit2
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;
}