Git-Raw
view release on metacpan or search on metacpan
xs/Graph.xs view on Meta::CPAN
MODULE = Git::Raw PACKAGE = Git::Raw::Graph
void
ahead(class, repo, local, upstream)
SV *class
SV *repo
SV *local
SV *upstream
PREINIT:
int ctx;
Repository repo_ptr;
size_t ahead, behind;
git_oid local_id, upstream_id;
PPCODE:
ctx = GIMME_V;
if (ctx != G_VOID) {
int rc;
repo_ptr = GIT_SV_TO_PTR(Repository, repo);
if (git_sv_to_commitish(repo_ptr -> repository, local, &local_id) == NULL)
croak_resolve("Could not resolve 'local' to a commit id");
if (git_sv_to_commitish(repo_ptr -> repository, upstream, &upstream_id) == NULL)
croak_resolve("Could not resolve 'upstream' to a commit id");
rc = git_graph_ahead_behind(
&ahead, &behind,
repo_ptr -> repository,
&local_id, &upstream_id
);
git_check_error(rc);
if (ctx == G_ARRAY) {
git_revwalk *walker = NULL;
size_t i;
rc = git_revwalk_new(&walker, repo_ptr -> repository);
git_check_error(rc);
rc = git_revwalk_push(walker, &local_id);
git_check_error(rc);
git_revwalk_sorting(walker, GIT_SORT_TOPOLOGICAL);
for (i = 0; i < ahead; ++i) {
git_oid commit_id;
Commit commit;
SV *c = NULL;
rc = git_revwalk_next(&commit_id, walker);
git_check_error(rc);
rc = git_commit_lookup(
&commit, repo_ptr -> repository,
&commit_id
);
git_check_error(rc);
GIT_NEW_OBJ_WITH_MAGIC(
c, "Git::Raw::Commit", commit, SvRV(repo)
);
mXPUSHs(c);
}
git_revwalk_free(walker);
XSRETURN((int) ahead);
} else {
mXPUSHs(newSViv((int) ahead));
XSRETURN(1);
}
} else
XSRETURN_EMPTY;
void
behind(class, repo, local, upstream)
SV *class
SV *repo
SV *local
SV *upstream
PREINIT:
int ctx;
Repository repo_ptr;
size_t ahead, behind;
git_oid local_id, upstream_id;
PPCODE:
ctx = GIMME_V;
if (ctx != G_VOID) {
int rc;
repo_ptr = GIT_SV_TO_PTR(Repository, repo);
if (git_sv_to_commitish(repo_ptr -> repository, local, &local_id) == NULL)
croak_resolve("Could not resolve 'local' to a commit id");
if (git_sv_to_commitish(repo_ptr -> repository, upstream, &upstream_id) == NULL)
croak_resolve("Could not resolve 'upstream' to a commit id");
rc = git_graph_ahead_behind(
&ahead, &behind,
repo_ptr -> repository,
&local_id, &upstream_id
);
git_check_error(rc);
if (ctx == G_ARRAY) {
git_revwalk *walker = NULL;
size_t i;
rc = git_revwalk_new(&walker, repo_ptr -> repository);
git_check_error(rc);
rc = git_revwalk_push(walker, &upstream_id);
git_check_error(rc);
git_revwalk_sorting(walker, GIT_SORT_TOPOLOGICAL);
for (i = 0; i < behind; ++i) {
git_oid commit_id;
Commit commit;
SV *c = NULL;
rc = git_revwalk_next(&commit_id, walker);
git_check_error(rc);
rc = git_commit_lookup(
&commit, repo_ptr -> repository,
&commit_id
);
git_check_error(rc);
GIT_NEW_OBJ_WITH_MAGIC(
c, "Git::Raw::Commit", commit, SvRV(repo)
);
mXPUSHs(c);
}
git_revwalk_free(walker);
XSRETURN((int) behind);
} else {
mXPUSHs(newSViv((int) behind));
XSRETURN(1);
}
} else
XSRETURN_EMPTY;
( run in 1.381 second using v1.01-cache-2.11-cpan-5511b514fd6 )