Coverage Report

Created: 2023-03-26 06:03

/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
0
parse_repo_owner(const char *slug, const char *fallback) {
18
0
  char *copy = NULL;
19
0
  char *owner = NULL;
20
21
0
  if (NULL == slug) return NULL;
22
0
  if (0 == strlen(slug)) return NULL;
23
0
  if (!(copy = strdup(slug))) return NULL;
24
25
0
  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
0
  if (fallback && 0 < strlen(copy) && '@' != copy[0]) {
38
0
    owner = strdup(fallback);
39
0
  }
40
41
0
  free(copy);
42
0
  return owner;
43
0
}
44
45
char *
46
0
parse_repo_name(const char *slug) {
47
0
  char *owner = NULL;
48
0
  char *copy = NULL;
49
0
  char *name = NULL;
50
0
  char *version = NULL;
51
52
0
  if (NULL == slug) return NULL;
53
0
  if (0 == strlen(slug)) return NULL;
54
0
  if (!(copy = strdup(slug))) return NULL;
55
56
0
  if ((version = strchr(copy, '@'))) {
57
0
    int delta = version - copy;
58
0
    char *tmp = substr(copy, 0, delta);
59
0
    free(copy);
60
0
    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
}