/** * 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; }
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); }
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); }
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; } }