diff options
| author | nulltoken <emeric.fermas@gmail.com> | 2012-06-21 18:29:38 +0200 |
|---|---|---|
| committer | nulltoken <emeric.fermas@gmail.com> | 2012-06-21 18:51:27 +0200 |
| commit | a8fd805e2ff73a3825ddfe6f290774ef5a217972 (patch) | |
| tree | 054d10e2bd560544fa102a62594463d5436fbf11 /src/branch.c | |
| parent | 9311423c34bbd369928152c6a2b669204276ddd1 (diff) | |
| download | libgit2-a8fd805e2ff73a3825ddfe6f290774ef5a217972.tar.gz | |
branch: add git_branch_foreach()
Diffstat (limited to 'src/branch.c')
| -rw-r--r-- | src/branch.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/branch.c b/src/branch.c index 8b97a8206..94d9a955e 100644 --- a/src/branch.c +++ b/src/branch.c @@ -183,6 +183,49 @@ int git_branch_list(git_strarray *branch_names, git_repository *repo, unsigned i return 0; } +typedef struct { + int (*branch_cb)( + const char *branch_name, + git_branch_t branch_type, + void *payload); + void *callback_payload; + unsigned int branch_type; +} branch_foreach_filter; + +static int branch_foreach_cb(const char *branch_name, void *payload) +{ + branch_foreach_filter *filter = (branch_foreach_filter *)payload; + + if (filter->branch_type & GIT_BRANCH_LOCAL && + git__prefixcmp(branch_name, GIT_REFS_HEADS_DIR) == 0) + return filter->branch_cb(branch_name + strlen(GIT_REFS_HEADS_DIR), GIT_BRANCH_LOCAL, filter->callback_payload); + + if (filter->branch_type & GIT_BRANCH_REMOTE && + git__prefixcmp(branch_name, GIT_REFS_REMOTES_DIR) == 0) + return filter->branch_cb(branch_name + strlen(GIT_REFS_REMOTES_DIR), GIT_BRANCH_REMOTE, filter->callback_payload); + + return 0; +} + +int git_branch_foreach( + git_repository *repo, + unsigned int list_flags, + int (*branch_cb)( + const char *branch_name, + git_branch_t branch_type, + void *payload), + void *payload +) +{ + branch_foreach_filter filter; + + filter.branch_cb = branch_cb; + filter.branch_type = list_flags; + filter.callback_payload = payload; + + return git_reference_foreach(repo, GIT_REF_LISTALL, &branch_foreach_cb, (void *)&filter); +} + int git_branch_move(git_repository *repo, const char *old_branch_name, const char *new_branch_name, int force) { git_reference *reference = NULL; |
