My pretty neat website
git clone git://soophie.de/soso
blob: 2257907bd1e7b24be37eaf09616ec43e264d2c23 (2282 bytes)[raw]
1
#include <git2.h>2
#include "git_repo.h"3
#include "git_repo_refs.h"5
#include "../templ/duc_git_repo_refs.h"7
static orb_rc_t fetch(orb_module_t *self) {8
duc_git_repo_refs_t *data = self->data;9
git_repo_refs_param_list_t *param_list = self->param_list;10
if (!param_list) return ORB_FATAL(1);11
if (!param_list->repo) return ORB_FATAL(2);12
data->repo = param_list->repo;13
git_reference_iterator *iter = NULL;14
git_reference *ref_handle = NULL;15
git_reference_iterator_new(&iter, param_list->repo->handle);16
while (git_reference_next(&ref_handle, iter) == 0) {17
data->ref_list = realloc(data->ref_list, sizeof(git_repo_ref_t) * (data->ref_list_len + 1));18
git_repo_ref_t *ref = &data->ref_list[data->ref_list_len];19
memset(ref, 0, sizeof(git_repo_ref_t));20
const git_oid *oid = git_reference_target(ref_handle);21
char oid_str[GIT_OID_HEXSZ + 1];22
git_oid_tostr(oid_str, sizeof(oid_str), oid);23
ref->oid = strdup(oid_str);24
const char *ref_name = git_reference_name(ref_handle);25
if (git_reference_is_branch(ref_handle)) {26
ref->name = strdup(ref_name + strlen("refs/heads/"));27
ref->type = "branch";28
}29
if (git_reference_is_tag(ref_handle)) {30
ref->name = strdup(ref_name + strlen("refs/tags/"));31
ref->type = "tag";32
}33
if (git_reference_is_remote(ref_handle)) {34
ref->name = strdup(ref_name + strlen("refs/remotes/"));35
ref->type = "remote";36
}37
if (!ref->name) {38
ref->name = strdup(ref_name);39
}40
git_reference_free(ref_handle);41
data->ref_list_len++;42
}43
git_reference_iterator_free(iter);44
return ORB_OK;45
}47
static orb_rc_t render(orb_module_t *self, void *out) {48
return ORB_ERR(duc_git_repo_refs_render(out, (duc_git_repo_refs_t *) self->data));49
}51
static void cleanup(orb_module_t *self) {52
duc_git_repo_refs_t *data = self->data;53
if (data->ref_list && data->ref_list_len > 0) {54
for (size_t i = 0; i < data->ref_list_len; i++) {55
git_repo_ref_t *ref = &data->ref_list[i];56
free(ref->oid);57
free(ref->name);58
}59
free(data->ref_list);60
data->ref_list = NULL;61
data->ref_list_len = 0;62
}63
}65
const orb_module_type_t GIT_REPO_REFS_TYPE = {66
.size = sizeof(duc_git_repo_refs_t),67
.fetch = fetch,68
.render = render,69
.cleanup = cleanup,70
};