6
6
#include "url.h"
7
7
#include "prompt.h"
8
8
#include "sigchain.h"
9
+ #include "urlmatch.h"
9
10
10
11
void credential_init (struct credential * c )
11
12
{
@@ -40,39 +41,24 @@ static int credential_config_callback(const char *var, const char *value,
40
41
void * data )
41
42
{
42
43
struct credential * c = data ;
43
- const char * key , * dot ;
44
+ const char * key ;
44
45
45
46
if (!skip_prefix (var , "credential." , & key ))
46
47
return 0 ;
47
48
48
49
if (!value )
49
50
return config_error_nonbool (var );
50
51
51
- dot = strrchr (key , '.' );
52
- if (dot ) {
53
- struct credential want = CREDENTIAL_INIT ;
54
- char * url = xmemdupz (key , dot - key );
55
- int matched ;
56
-
57
- credential_from_url (& want , url );
58
- matched = credential_match (& want , c );
59
-
60
- credential_clear (& want );
61
- free (url );
62
-
63
- if (!matched )
64
- return 0 ;
65
- key = dot + 1 ;
66
- }
67
-
68
52
if (!strcmp (key , "helper" )) {
69
53
if (* value )
70
54
string_list_append (& c -> helpers , value );
71
55
else
72
56
string_list_clear (& c -> helpers , 0 );
73
57
} else if (!strcmp (key , "username" )) {
74
- if (!c -> username )
58
+ if (!c -> username_from_proto ) {
59
+ free (c -> username );
75
60
c -> username = xstrdup (value );
61
+ }
76
62
}
77
63
else if (!strcmp (key , "usehttppath" ))
78
64
c -> use_http_path = git_config_bool (var , value );
@@ -87,11 +73,38 @@ static int proto_is_http(const char *s)
87
73
return !strcmp (s , "https" ) || !strcmp (s , "http" );
88
74
}
89
75
76
+ static void credential_describe (struct credential * c , struct strbuf * out );
77
+ static void credential_format (struct credential * c , struct strbuf * out );
78
+
79
+ static int select_all (const struct urlmatch_item * a ,
80
+ const struct urlmatch_item * b )
81
+ {
82
+ return 0 ;
83
+ }
84
+
90
85
static void credential_apply_config (struct credential * c )
91
86
{
87
+ char * normalized_url ;
88
+ struct urlmatch_config config = { STRING_LIST_INIT_DUP };
89
+ struct strbuf url = STRBUF_INIT ;
90
+
92
91
if (c -> configured )
93
92
return ;
94
- git_config (credential_config_callback , c );
93
+
94
+ config .section = "credential" ;
95
+ config .key = NULL ;
96
+ config .collect_fn = credential_config_callback ;
97
+ config .cascade_fn = NULL ;
98
+ config .select_fn = select_all ;
99
+ config .cb = c ;
100
+
101
+ credential_format (c , & url );
102
+ normalized_url = url_normalize (url .buf , & config .url );
103
+
104
+ git_config (urlmatch_config_entry , & config );
105
+ free (normalized_url );
106
+ strbuf_release (& url );
107
+
95
108
c -> configured = 1 ;
96
109
97
110
if (!c -> use_http_path && proto_is_http (c -> protocol )) {
@@ -112,6 +125,23 @@ static void credential_describe(struct credential *c, struct strbuf *out)
112
125
strbuf_addf (out , "/%s" , c -> path );
113
126
}
114
127
128
+ static void credential_format (struct credential * c , struct strbuf * out )
129
+ {
130
+ if (!c -> protocol )
131
+ return ;
132
+ strbuf_addf (out , "%s://" , c -> protocol );
133
+ if (c -> username && * c -> username ) {
134
+ strbuf_add_percentencode (out , c -> username );
135
+ strbuf_addch (out , '@' );
136
+ }
137
+ if (c -> host )
138
+ strbuf_addstr (out , c -> host );
139
+ if (c -> path ) {
140
+ strbuf_addch (out , '/' );
141
+ strbuf_add_percentencode (out , c -> path );
142
+ }
143
+ }
144
+
115
145
static char * credential_ask_one (const char * what , struct credential * c ,
116
146
int flags )
117
147
{
@@ -163,6 +193,7 @@ int credential_read(struct credential *c, FILE *fp)
163
193
if (!strcmp (key , "username" )) {
164
194
free (c -> username );
165
195
c -> username = xstrdup (value );
196
+ c -> username_from_proto = 1 ;
166
197
} else if (!strcmp (key , "password" )) {
167
198
free (c -> password );
168
199
c -> password = xstrdup (value );
@@ -349,10 +380,14 @@ void credential_from_url(struct credential *c, const char *url)
349
380
else if (!colon || at <= colon ) {
350
381
/* Case (2) */
351
382
c -> username = url_decode_mem (cp , at - cp );
383
+ if (c -> username && * c -> username )
384
+ c -> username_from_proto = 1 ;
352
385
host = at + 1 ;
353
386
} else {
354
387
/* Case (3) */
355
388
c -> username = url_decode_mem (cp , colon - cp );
389
+ if (c -> username && * c -> username )
390
+ c -> username_from_proto = 1 ;
356
391
c -> password = url_decode_mem (colon + 1 , at - (colon + 1 ));
357
392
host = at + 1 ;
358
393
}
0 commit comments