Coverage Report

Created: 2025-07-18 06:25

/src/clib/deps/parse-repo/parse-repo.c
Line
Count
Source (jump to first uncovered line)
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
3.65k
parse_repo_owner(const char *slug, const char *fallback) {
18
3.65k
  char *copy = NULL;
19
3.65k
  char *owner = NULL;
20
21
3.65k
  if (NULL == slug) return NULL;
22
3.65k
  if (0 == strlen(slug)) return NULL;
23
3.59k
  if (!(copy = strdup(slug))) return NULL;
24
25
3.59k
  if ((owner = strchr(copy, '/'))) {
26
948
    int delta = owner - copy;
27
948
    if (!delta) {
28
166
      free(copy);
29
166
      return NULL;
30
166
    }
31
32
782
    char *tmp = substr(copy, 0, delta);
33
782
    free(copy);
34
782
    return tmp;
35
948
  }
36
37
2.65k
  if (fallback && 0 < strlen(copy) && '@' != copy[0]) {
38
2.49k
    owner = strdup(fallback);
39
2.49k
  }
40
41
2.65k
  free(copy);
42
2.65k
  return owner;
43
3.59k
}
44
45
char *
46
3.65k
parse_repo_name(const char *slug) {
47
3.65k
  char *owner = NULL;
48
3.65k
  char *copy = NULL;
49
3.65k
  char *name = NULL;
50
3.65k
  char *version = NULL;
51
52
3.65k
  if (NULL == slug) return NULL;
53
3.65k
  if (0 == strlen(slug)) return NULL;
54
3.59k
  if (!(copy = strdup(slug))) return NULL;
55
56
3.59k
  if ((version = strchr(copy, '@'))) {
57
782
    int delta = version - copy;
58
782
    char *tmp = substr(copy, 0, delta);
59
782
    free(copy);
60
782
    if (!tmp) return NULL;
61
605
    copy = tmp;
62
605
  }
63
64
3.42k
  if ((owner = strchr(copy, '/'))) {
65
894
    int delta = owner - copy;
66
894
    if (!delta) {
67
166
      free(copy);
68
166
      return NULL;
69
166
    }
70
71
728
    char *tmp = substr(copy, delta + 1, -1);
72
728
    free(copy);
73
728
    copy = tmp;
74
728
  }
75
76
3.25k
  if (copy) name = strdup(copy);
77
3.25k
  free(copy);
78
3.25k
  return name;
79
3.42k
}
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
}