forked from r-lib/gert
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.c
More file actions
124 lines (119 loc) · 4.09 KB
/
Copy pathconfig.c
File metadata and controls
124 lines (119 loc) · 4.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "utils.h"
static int count_config_iter(git_config *cfg){
int count = 0;
git_config_entry *entry = NULL;
git_config_iterator *iter = NULL;
bail_if(git_config_iterator_new(&iter, cfg), "git_config_iterator_new");
while (git_config_next(&entry, iter) == 0)
count++;
git_config_iterator_free(iter);
return count;
}
static const char *level2string(int level){
static char *programdata = "programdata";
static char *system = "system";
static char *xdg = "xdg";
static char *global = "global";
static char *local = "local";
static char *app = "app";
static char *highest = "highest";
static char *unknown = "unknown";
switch(level){
case GIT_CONFIG_LEVEL_PROGRAMDATA:
return programdata;
case GIT_CONFIG_LEVEL_SYSTEM:
return system;
case GIT_CONFIG_LEVEL_XDG:
return xdg;
case GIT_CONFIG_LEVEL_GLOBAL:
return global;
case GIT_CONFIG_LEVEL_LOCAL:
return local;
case GIT_CONFIG_LEVEL_APP:
return app;
case GIT_CONFIG_HIGHEST_LEVEL:
return highest;
}
return unknown;
}
SEXP R_git_config_list(SEXP ptr){
git_config_iterator *iter = NULL;
git_config_entry *entry = NULL;
git_config *cfg = NULL;
if(Rf_isNull(ptr)) {
bail_if(git_config_open_default(&cfg), "git_config_open_default");
} else {
bail_if(git_repository_config(&cfg, get_git_repository(ptr)),"git_repository_config");
}
int count = count_config_iter(cfg);
SEXP names = PROTECT(Rf_allocVector(STRSXP, count));
SEXP values = PROTECT(Rf_allocVector(STRSXP, count));
SEXP levels = PROTECT(Rf_allocVector(STRSXP, count));
int i = 0;
bail_if(git_config_iterator_new(&iter, cfg), "git_config_iterator_new");
while (git_config_next(&entry, iter) == 0) {
SET_STRING_ELT(names, i, safe_char(entry->name));
SET_STRING_ELT(values, i, safe_char(entry->value));
SET_STRING_ELT(levels, i, safe_char(level2string(entry->level)));
i++;
}
git_config_iterator_free(iter);
git_config_free(cfg);
SEXP out = build_tibble(3, "name", names, "value", values, "level", levels);
UNPROTECT(3);
return out;
}
SEXP R_git_config_set(SEXP ptr, SEXP name, SEXP value, SEXP add){
git_config *cfg = NULL;
const char *cname = CHAR(STRING_ELT(name, 0));
if(Rf_isNull(ptr)) {
bail_if(git_config_open_default(&cfg), "git_config_open_default");
} else {
bail_if(git_repository_config(&cfg, get_git_repository(ptr)),"git_repository_config");
}
if(Rf_asLogical(add)) {
if(TYPEOF(value) != STRSXP)
Rf_error("add = TRUE only supported for string values");
bail_if(git_config_set_multivar(cfg, cname, "^$", CHAR(STRING_ELT(value, 0))), "git_config_set_multivar");
} else {
switch(TYPEOF(value)){
case STRSXP:
bail_if(git_config_set_string(cfg, cname, CHAR(STRING_ELT(value, 0))), "git_config_set_string");
break;
case LGLSXP:
bail_if(git_config_set_bool(cfg, cname, Rf_asLogical(value)), "git_config_set_bool");
break;
case INTSXP:
bail_if(git_config_set_int32(cfg, cname, Rf_asInteger(value)), "git_config_set_int32");
break;
case REALSXP:
//NB: gets stored as string anyway
bail_if(git_config_set_int64(cfg, cname, (int64_t) Rf_asReal(value)), "git_config_set_int64");
break;
case NILSXP:
bail_if(git_config_delete_entry(cfg, cname), "git_config_delete_entry");
break;
default:
Rf_error("Option value must be string, boolean, number, or NULL");
}
}
git_config_free(cfg);
return R_NilValue;
}
SEXP R_git_config_unset(SEXP ptr, SEXP name, SEXP pattern){
git_config *cfg = NULL;
const char *cname = CHAR(STRING_ELT(name, 0));
if(Rf_isNull(ptr)) {
bail_if(git_config_open_default(&cfg), "git_config_open_default");
} else {
bail_if(git_repository_config(&cfg, get_git_repository(ptr)),"git_repository_config");
}
if(Rf_length(pattern)){
const char *cpattern = CHAR(STRING_ELT(pattern, 0));
bail_if(git_config_delete_multivar(cfg, cname, cpattern), "git_config_delete_multivar");
} else {
bail_if(git_config_delete_entry(cfg, cname), "git_config_delete_entry");
}
git_config_free(cfg);
return R_NilValue;
}