@@ -28,6 +28,11 @@ struct rewrite {
28
28
int instead_of_nr ;
29
29
int instead_of_alloc ;
30
30
};
31
+ struct rewrites {
32
+ struct rewrite * * rewrite ;
33
+ int rewrite_alloc ;
34
+ int rewrite_nr ;
35
+ };
31
36
32
37
static struct remote * * remotes ;
33
38
static int remotes_alloc ;
@@ -41,14 +46,13 @@ static struct branch *current_branch;
41
46
static const char * default_remote_name ;
42
47
static int explicit_default_remote_name ;
43
48
44
- static struct rewrite * * rewrite ;
45
- static int rewrite_alloc ;
46
- static int rewrite_nr ;
49
+ static struct rewrites rewrites ;
50
+ static struct rewrites rewrites_push ;
47
51
48
52
#define BUF_SIZE (2048)
49
53
static char buffer [BUF_SIZE ];
50
54
51
- static const char * alias_url (const char * url )
55
+ static const char * alias_url (const char * url , struct rewrites * r )
52
56
{
53
57
int i , j ;
54
58
char * ret ;
@@ -57,25 +61,25 @@ static const char *alias_url(const char *url)
57
61
58
62
longest = NULL ;
59
63
longest_i = -1 ;
60
- for (i = 0 ; i < rewrite_nr ; i ++ ) {
61
- if (!rewrite [i ])
64
+ for (i = 0 ; i < r -> rewrite_nr ; i ++ ) {
65
+ if (!r -> rewrite [i ])
62
66
continue ;
63
- for (j = 0 ; j < rewrite [i ]-> instead_of_nr ; j ++ ) {
64
- if (!prefixcmp (url , rewrite [i ]-> instead_of [j ].s ) &&
67
+ for (j = 0 ; j < r -> rewrite [i ]-> instead_of_nr ; j ++ ) {
68
+ if (!prefixcmp (url , r -> rewrite [i ]-> instead_of [j ].s ) &&
65
69
(!longest ||
66
- longest -> len < rewrite [i ]-> instead_of [j ].len )) {
67
- longest = & (rewrite [i ]-> instead_of [j ]);
70
+ longest -> len < r -> rewrite [i ]-> instead_of [j ].len )) {
71
+ longest = & (r -> rewrite [i ]-> instead_of [j ]);
68
72
longest_i = i ;
69
73
}
70
74
}
71
75
}
72
76
if (!longest )
73
77
return url ;
74
78
75
- ret = xmalloc (rewrite [longest_i ]-> baselen +
79
+ ret = xmalloc (r -> rewrite [longest_i ]-> baselen +
76
80
(strlen (url ) - longest -> len ) + 1 );
77
- strcpy (ret , rewrite [longest_i ]-> base );
78
- strcpy (ret + rewrite [longest_i ]-> baselen , url + longest -> len );
81
+ strcpy (ret , r -> rewrite [longest_i ]-> base );
82
+ strcpy (ret + r -> rewrite [longest_i ]-> baselen , url + longest -> len );
79
83
return ret ;
80
84
}
81
85
@@ -101,17 +105,25 @@ static void add_url(struct remote *remote, const char *url)
101
105
remote -> url [remote -> url_nr ++ ] = url ;
102
106
}
103
107
104
- static void add_url_alias (struct remote * remote , const char * url )
105
- {
106
- add_url (remote , alias_url (url ));
107
- }
108
-
109
108
static void add_pushurl (struct remote * remote , const char * pushurl )
110
109
{
111
110
ALLOC_GROW (remote -> pushurl , remote -> pushurl_nr + 1 , remote -> pushurl_alloc );
112
111
remote -> pushurl [remote -> pushurl_nr ++ ] = pushurl ;
113
112
}
114
113
114
+ static void add_pushurl_alias (struct remote * remote , const char * url )
115
+ {
116
+ const char * pushurl = alias_url (url , & rewrites_push );
117
+ if (pushurl != url )
118
+ add_pushurl (remote , pushurl );
119
+ }
120
+
121
+ static void add_url_alias (struct remote * remote , const char * url )
122
+ {
123
+ add_url (remote , alias_url (url , & rewrites ));
124
+ add_pushurl_alias (remote , url );
125
+ }
126
+
115
127
static struct remote * make_remote (const char * name , int len )
116
128
{
117
129
struct remote * ret ;
@@ -169,22 +181,22 @@ static struct branch *make_branch(const char *name, int len)
169
181
return ret ;
170
182
}
171
183
172
- static struct rewrite * make_rewrite (const char * base , int len )
184
+ static struct rewrite * make_rewrite (struct rewrites * r , const char * base , int len )
173
185
{
174
186
struct rewrite * ret ;
175
187
int i ;
176
188
177
- for (i = 0 ; i < rewrite_nr ; i ++ ) {
189
+ for (i = 0 ; i < r -> rewrite_nr ; i ++ ) {
178
190
if (len
179
- ? (len == rewrite [i ]-> baselen &&
180
- !strncmp (base , rewrite [i ]-> base , len ))
181
- : !strcmp (base , rewrite [i ]-> base ))
182
- return rewrite [i ];
191
+ ? (len == r -> rewrite [i ]-> baselen &&
192
+ !strncmp (base , r -> rewrite [i ]-> base , len ))
193
+ : !strcmp (base , r -> rewrite [i ]-> base ))
194
+ return r -> rewrite [i ];
183
195
}
184
196
185
- ALLOC_GROW (rewrite , rewrite_nr + 1 , rewrite_alloc );
197
+ ALLOC_GROW (r -> rewrite , r -> rewrite_nr + 1 , r -> rewrite_alloc );
186
198
ret = xcalloc (1 , sizeof (struct rewrite ));
187
- rewrite [rewrite_nr ++ ] = ret ;
199
+ r -> rewrite [r -> rewrite_nr ++ ] = ret ;
188
200
if (len ) {
189
201
ret -> base = xstrndup (base , len );
190
202
ret -> baselen = len ;
@@ -355,8 +367,13 @@ static int handle_config(const char *key, const char *value, void *cb)
355
367
subkey = strrchr (name , '.' );
356
368
if (!subkey )
357
369
return 0 ;
358
- rewrite = make_rewrite (name , subkey - name );
359
370
if (!strcmp (subkey , ".insteadof" )) {
371
+ rewrite = make_rewrite (& rewrites , name , subkey - name );
372
+ if (!value )
373
+ return config_error_nonbool (key );
374
+ add_instead_of (rewrite , xstrdup (value ));
375
+ } else if (!strcmp (subkey , ".pushinsteadof" )) {
376
+ rewrite = make_rewrite (& rewrites_push , name , subkey - name );
360
377
if (!value )
361
378
return config_error_nonbool (key );
362
379
add_instead_of (rewrite , xstrdup (value ));
@@ -430,13 +447,17 @@ static void alias_all_urls(void)
430
447
{
431
448
int i , j ;
432
449
for (i = 0 ; i < remotes_nr ; i ++ ) {
450
+ int add_pushurl_aliases ;
433
451
if (!remotes [i ])
434
452
continue ;
435
- for (j = 0 ; j < remotes [i ]-> url_nr ; j ++ ) {
436
- remotes [i ]-> url [j ] = alias_url (remotes [i ]-> url [j ]);
437
- }
438
453
for (j = 0 ; j < remotes [i ]-> pushurl_nr ; j ++ ) {
439
- remotes [i ]-> pushurl [j ] = alias_url (remotes [i ]-> pushurl [j ]);
454
+ remotes [i ]-> pushurl [j ] = alias_url (remotes [i ]-> pushurl [j ], & rewrites );
455
+ }
456
+ add_pushurl_aliases = remotes [i ]-> pushurl_nr == 0 ;
457
+ for (j = 0 ; j < remotes [i ]-> url_nr ; j ++ ) {
458
+ if (add_pushurl_aliases )
459
+ add_pushurl_alias (remotes [i ], remotes [i ]-> url [j ]);
460
+ remotes [i ]-> url [j ] = alias_url (remotes [i ]-> url [j ], & rewrites );
440
461
}
441
462
}
442
463
}
0 commit comments