Coverage Report

Created: 2024-05-20 06:35

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