예제 #1
0
/**
 * List stashes in a repository
 *
 * @param repo S3 class git_repository
 * @return VECXSP with S3 objects of class git_stash
 */
SEXP git2r_stash_list(SEXP repo)
{
    SEXP list = R_NilValue;
    int error, nprotect = 0;
    git2r_stash_list_cb_data cb_data = {0, R_NilValue, R_NilValue, NULL};
    git_repository *repository = NULL;

    repository = git2r_repository_open(repo);
    if (!repository)
        git2r_error(__func__, NULL, git2r_err_invalid_repository, NULL);

    /* Count number of stashes before creating the list */
    error = git_stash_foreach(repository, &git2r_stash_list_cb, &cb_data);
    if (error)
        goto cleanup;

    PROTECT(list = Rf_allocVector(VECSXP, cb_data.n));
    nprotect++;
    cb_data.n = 0;
    cb_data.list = list;
    cb_data.repo = repo;
    cb_data.repository = repository;
    error = git_stash_foreach(repository, &git2r_stash_list_cb, &cb_data);

cleanup:
    git_repository_free(repository);

    if (nprotect)
        UNPROTECT(nprotect);

    if (error)
        git2r_error(__func__, GIT2R_ERROR_LAST(), NULL, NULL);

    return list;
}
예제 #2
0
파일: foreach.c 프로젝트: GitUser11/libgit2
void test_stash_foreach__can_enumerate_a_repository(void)
{
    char *oids_default[] = {
        "1d91c842a7cdfc25872b3a763e5c31add8816c25", NULL
    };

    char *oids_untracked[] = {
        "7f89a8b15c878809c5c54d1ff8f8c9674154017b",
        "1d91c842a7cdfc25872b3a763e5c31add8816c25", NULL
    };

    char *oids_ignored[] = {
        "c95599a8fef20a7e57582c6727b1a0d02e0a5828",
        "7f89a8b15c878809c5c54d1ff8f8c9674154017b",
        "1d91c842a7cdfc25872b3a763e5c31add8816c25", NULL
    };

    cl_git_pass(git_repository_init(&repo, REPO_NAME, 0));

    setup_stash(repo, signature);

    cl_git_pass(git_stash_save(
                    &stash_tip_oid,
                    repo,
                    signature,
                    NULL,
                    GIT_STASH_DEFAULT));

    data.oids = oids_default;

    cl_git_pass(git_stash_foreach(repo, callback_cb, &data));
    cl_assert_equal_i(1, data.invokes);

    data.oids = oids_untracked;
    data.invokes = 0;

    cl_git_pass(git_stash_save(
                    &stash_tip_oid,
                    repo,
                    signature,
                    NULL,
                    GIT_STASH_INCLUDE_UNTRACKED));

    cl_git_pass(git_stash_foreach(repo, callback_cb, &data));
    cl_assert_equal_i(2, data.invokes);

    data.oids = oids_ignored;
    data.invokes = 0;

    cl_git_pass(git_stash_save(
                    &stash_tip_oid,
                    repo,
                    signature,
                    NULL,
                    GIT_STASH_INCLUDE_IGNORED));

    cl_git_pass(git_stash_foreach(repo, callback_cb, &data));
    cl_assert_equal_i(3, data.invokes);
}
예제 #3
0
파일: foreach.c 프로젝트: GitUser11/libgit2
void test_stash_foreach__enumerating_a_empty_repository_doesnt_fail(void)
{
    char *oids[] = { NULL };

    data.oids = oids;

    cl_git_pass(git_repository_init(&repo, REPO_NAME, 0));

    cl_git_pass(git_stash_foreach(repo, callback_cb, &data));

    cl_assert_equal_i(0, data.invokes);
}
예제 #4
0
파일: qgit.cpp 프로젝트: bokic/gitmaster
void QGit::listStashes()
{
    git_repository *repo = nullptr;
    QStringList stashes;
    int res = 0;

    QGitError error;

    try {

        res = git_repository_open(&repo, m_path.absolutePath().toUtf8().constData());
        if (res)
        {
            throw QGitError("git_repository_open", res);
        }

        res = git_stash_foreach(repo, [](size_t index, const char* message, const git_oid *stash_id, void *payload) -> int {

                Q_UNUSED(index);
                Q_UNUSED(stash_id);

                auto list = static_cast<QStringList *>(payload);

                list->append(QString::fromUtf8(message));

                return 0;
            }, &stashes);
        if (res)
        {
            throw QGitError("git_stash_foreach", res);
        }

    } catch(const QGitError &ex) {
        error = ex;
    }

    emit listStashesReply(stashes, error);

    if (repo)
    {
        git_repository_free(repo);
        repo = nullptr;
    }
}