Coverage Report

Created: 2026-08-03 06:43

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/clib/deps/parse-repo/parse-repo.c
Line
Count
Source
1
2
//
3
// parse-repo.c
4
//
5
// Copyright (c) 2014 Stephen Mathieson
6
// MIT licensed
7
//
8
9
#include <string.h>
10
#include <stdio.h>
11
#include <stdlib.h>
12
#include "strdup/strdup.h"
13
#include "substr/substr.h"
14
#include "parse-repo.h"
15
16
char *
17
4.03k
parse_repo_owner(const char *slug, const char *fallback) {
18
4.03k
  char *copy = NULL;
19
4.03k
  char *owner = NULL;
20
21
4.03k
  if (NULL == slug) return NULL;
22
4.03k
  if (0 == strlen(slug)) return NULL;
23
3.97k
  if (!(copy = strdup(slug))) return NULL;
24
25
3.97k
  if ((owner = strchr(copy, '/'))) {
26
821
    int delta = owner - copy;
27
821
    if (!delta) {
28
183
      free(copy);
29
183
      return NULL;
30
183
    }
31
32
638
    char *tmp = substr(copy, 0, delta);
33
638
    free(copy);
34
638
    return tmp;
35
821
  }
36
37
3.15k
  if (fallback && 0 < strlen(copy) && '@' != copy[0]) {
38
3.02k
    owner = strdup(fallback);
39
3.02k
  }
40
41
3.15k
  free(copy);
42
3.15k
  return owner;
43
3.97k
}
44
45
char *
46
4.03k
parse_repo_name(const char *slug) {
47
4.03k
  char *owner = NULL;
48
4.03k
  char *copy = NULL;
49
4.03k
  char *name = NULL;
50
4.03k
  char *version = NULL;
51
52
4.03k
  if (NULL == slug) return NULL;
53
4.03k
  if (0 == strlen(slug)) return NULL;
54
3.97k
  if (!(copy = strdup(slug))) return NULL;
55
56
3.97k
  if ((version = strchr(copy, '@'))) {
57
702
    int delta = version - copy;
58
702
    char *tmp = substr(copy, 0, delta);
59
702
    free(copy);
60
702
    if (!tmp) return NULL;
61
549
    copy = tmp;
62
549
  }
63
64
3.82k
  if ((owner = strchr(copy, '/'))) {
65
772
    int delta = owner - copy;
66
772
    if (!delta) {
67
183
      free(copy);
68
183
      return NULL;
69
183
    }
70
71
589
    char *tmp = substr(copy, delta + 1, -1);
72
589
    free(copy);
73
589
    copy = tmp;
74
589
  }
75
76
3.63k
  if (copy) name = strdup(copy);
77
3.63k
  free(copy);
78
3.63k
  return name;
79
3.82k
}
80
81
char *
82
0
parse_repo_version(const char *slug, const char *fallback) {
83
  // malformed slugs
84
0
  if (NULL == slug) return NULL;
85
0
  if (0 == strlen(slug)) return NULL;
86
0
  char *name = parse_repo_name(slug);
87
0
  if (NULL == name) return NULL;
88
0
  free(name);
89
90
0
  char *version = strchr(slug, '@');
91
0
  if (version) {
92
0
    version++;
93
    // malformed
94
0
    if (0 == strlen(version)) return NULL;
95
    // * <-> master
96
0
    if ('*' == version[0]) return strdup("master");
97
0
    return strdup(version);
98
0
  }
99
100
0
  version = NULL;
101
0
  if (fallback) version = strdup(fallback);
102
0
  return version;
103
0
}