Coverage Report

Created: 2026-04-09 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.13k
parse_repo_owner(const char *slug, const char *fallback) {
18
4.13k
  char *copy = NULL;
19
4.13k
  char *owner = NULL;
20
21
4.13k
  if (NULL == slug) return NULL;
22
4.13k
  if (0 == strlen(slug)) return NULL;
23
4.07k
  if (!(copy = strdup(slug))) return NULL;
24
25
4.07k
  if ((owner = strchr(copy, '/'))) {
26
849
    int delta = owner - copy;
27
849
    if (!delta) {
28
191
      free(copy);
29
191
      return NULL;
30
191
    }
31
32
658
    char *tmp = substr(copy, 0, delta);
33
658
    free(copy);
34
658
    return tmp;
35
849
  }
36
37
3.22k
  if (fallback && 0 < strlen(copy) && '@' != copy[0]) {
38
3.08k
    owner = strdup(fallback);
39
3.08k
  }
40
41
3.22k
  free(copy);
42
3.22k
  return owner;
43
4.07k
}
44
45
char *
46
4.13k
parse_repo_name(const char *slug) {
47
4.13k
  char *owner = NULL;
48
4.13k
  char *copy = NULL;
49
4.13k
  char *name = NULL;
50
4.13k
  char *version = NULL;
51
52
4.13k
  if (NULL == slug) return NULL;
53
4.13k
  if (0 == strlen(slug)) return NULL;
54
4.07k
  if (!(copy = strdup(slug))) return NULL;
55
56
4.07k
  if ((version = strchr(copy, '@'))) {
57
740
    int delta = version - copy;
58
740
    char *tmp = substr(copy, 0, delta);
59
740
    free(copy);
60
740
    if (!tmp) return NULL;
61
574
    copy = tmp;
62
574
  }
63
64
3.90k
  if ((owner = strchr(copy, '/'))) {
65
802
    int delta = owner - copy;
66
802
    if (!delta) {
67
191
      free(copy);
68
191
      return NULL;
69
191
    }
70
71
611
    char *tmp = substr(copy, delta + 1, -1);
72
611
    free(copy);
73
611
    copy = tmp;
74
611
  }
75
76
3.71k
  if (copy) name = strdup(copy);
77
3.71k
  free(copy);
78
3.71k
  return name;
79
3.90k
}
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
}