mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-16 20:15:13 +00:00
stash: add git_stash_foreach()
This commit is contained in:
parent
590fb68be0
commit
233884131d
@ -62,6 +62,46 @@ GIT_EXTERN(int) git_stash_save(
|
|||||||
const char *message,
|
const char *message,
|
||||||
uint32_t flags);
|
uint32_t flags);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When iterating over all the stashed states, callback that will be
|
||||||
|
* issued per entry.
|
||||||
|
*
|
||||||
|
* @param index The position within the stash list. 0 points to the
|
||||||
|
* most recent stashed state.
|
||||||
|
*
|
||||||
|
* @param message The stash message.
|
||||||
|
*
|
||||||
|
* @param stash_oid The commit oid of the stashed state.
|
||||||
|
*
|
||||||
|
* @param payload Extra parameter to callback function.
|
||||||
|
*
|
||||||
|
* @return 0 on success, GIT_EUSER on non-zero callback, or error code
|
||||||
|
*/
|
||||||
|
typedef int (*stash_cb)(
|
||||||
|
size_t index,
|
||||||
|
const char* message,
|
||||||
|
const git_oid *stash_oid,
|
||||||
|
void *payload);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loop over all the stashed states and issue a callback for each one.
|
||||||
|
*
|
||||||
|
* If the callback returns a non-zero value, this will stop looping.
|
||||||
|
*
|
||||||
|
* @param repo Repository where to find the stash.
|
||||||
|
*
|
||||||
|
* @param callabck Callback to invoke per found stashed state. The most recent
|
||||||
|
* stash state will be enumerated first.
|
||||||
|
*
|
||||||
|
* @param payload Extra parameter to callback function.
|
||||||
|
*
|
||||||
|
* @return 0 on success, GIT_EUSER on non-zero callback, or error code
|
||||||
|
*/
|
||||||
|
GIT_EXTERN(int) git_stash_foreach(
|
||||||
|
git_repository *repo,
|
||||||
|
stash_cb callback,
|
||||||
|
void *payload);
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
GIT_END_DECL
|
GIT_END_DECL
|
||||||
#endif
|
#endif
|
||||||
|
42
src/stash.c
42
src/stash.c
@ -575,3 +575,45 @@ cleanup:
|
|||||||
git_index_free(index);
|
git_index_free(index);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int git_stash_foreach(
|
||||||
|
git_repository *repo,
|
||||||
|
stash_cb callback,
|
||||||
|
void *payload)
|
||||||
|
{
|
||||||
|
git_reference *stash;
|
||||||
|
git_reflog *reflog = NULL;
|
||||||
|
int error;
|
||||||
|
size_t i, max;
|
||||||
|
const git_reflog_entry *entry;
|
||||||
|
|
||||||
|
error = git_reference_lookup(&stash, repo, GIT_REFS_STASH_FILE);
|
||||||
|
if (error == GIT_ENOTFOUND)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (error < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if ((error = git_reflog_read(&reflog, stash)) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
max = git_reflog_entrycount(reflog);
|
||||||
|
for (i = 0; i < max; i++) {
|
||||||
|
entry = git_reflog_entry_byindex(reflog, max - i - 1);
|
||||||
|
|
||||||
|
if (callback(i,
|
||||||
|
git_reflog_entry_msg(entry),
|
||||||
|
git_reflog_entry_oidnew(entry),
|
||||||
|
payload)) {
|
||||||
|
error = GIT_EUSER;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
error = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
git_reference_free(stash);
|
||||||
|
git_reflog_free(reflog);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
119
tests-clar/stash/foreach.c
Normal file
119
tests-clar/stash/foreach.c
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
#include "clar_libgit2.h"
|
||||||
|
#include "fileops.h"
|
||||||
|
#include "stash_helpers.h"
|
||||||
|
|
||||||
|
struct callback_data
|
||||||
|
{
|
||||||
|
char **oids;
|
||||||
|
int invokes;
|
||||||
|
};
|
||||||
|
|
||||||
|
static git_repository *repo;
|
||||||
|
static git_signature *signature;
|
||||||
|
static git_oid stash_tip_oid;
|
||||||
|
struct callback_data data;
|
||||||
|
|
||||||
|
#define REPO_NAME "stash"
|
||||||
|
|
||||||
|
void test_stash_foreach__initialize(void)
|
||||||
|
{
|
||||||
|
cl_git_pass(git_signature_new(
|
||||||
|
&signature,
|
||||||
|
"nulltoken",
|
||||||
|
"emeric.fermas@gmail.com",
|
||||||
|
1323847743, 60)); /* Wed Dec 14 08:29:03 2011 +0100 */
|
||||||
|
|
||||||
|
memset(&data, 0, sizeof(struct callback_data));
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_stash_foreach__cleanup(void)
|
||||||
|
{
|
||||||
|
git_signature_free(signature);
|
||||||
|
git_repository_free(repo);
|
||||||
|
cl_git_pass(git_futils_rmdir_r(REPO_NAME, NULL, GIT_DIRREMOVAL_FILES_AND_DIRS));
|
||||||
|
}
|
||||||
|
|
||||||
|
static int callback_cb(
|
||||||
|
size_t index,
|
||||||
|
const char* message,
|
||||||
|
const git_oid *stash_oid,
|
||||||
|
void *payload)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
bool found = false;
|
||||||
|
struct callback_data *data = (struct callback_data *)payload;
|
||||||
|
|
||||||
|
cl_assert_equal_i(0, git_oid_streq(stash_oid, data->oids[data->invokes++]));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 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);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user