so://phie

soso

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"

4

5#include "../templ/duc_git_repo_refs.h"

6

7static 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}

46

47static 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}

50

51static 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}

64

65const 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};