@@ -28,6 +28,11 @@ struct rewrite {
2828 int instead_of_nr ;
2929 int instead_of_alloc ;
3030};
31+ struct rewrites {
32+ struct rewrite * * rewrite ;
33+ int rewrite_alloc ;
34+ int rewrite_nr ;
35+ };
3136
3237static struct remote * * remotes ;
3338static int remotes_alloc ;
@@ -41,14 +46,13 @@ static struct branch *current_branch;
4146static const char * default_remote_name ;
4247static int explicit_default_remote_name ;
4348
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 ;
4751
4852#define BUF_SIZE (2048)
4953static char buffer [BUF_SIZE ];
5054
51- static const char * alias_url (const char * url )
55+ static const char * alias_url (const char * url , struct rewrites * r )
5256{
5357 int i , j ;
5458 char * ret ;
@@ -57,25 +61,25 @@ static const char *alias_url(const char *url)
5761
5862 longest = NULL ;
5963 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 ])
6266 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 ) &&
6569 (!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 ]);
6872 longest_i = i ;
6973 }
7074 }
7175 }
7276 if (!longest )
7377 return url ;
7478
75- ret = xmalloc (rewrite [longest_i ]-> baselen +
79+ ret = xmalloc (r -> rewrite [longest_i ]-> baselen +
7680 (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 );
7983 return ret ;
8084}
8185
@@ -101,17 +105,25 @@ static void add_url(struct remote *remote, const char *url)
101105 remote -> url [remote -> url_nr ++ ] = url ;
102106}
103107
104- static void add_url_alias (struct remote * remote , const char * url )
105- {
106- add_url (remote , alias_url (url ));
107- }
108-
109108static void add_pushurl (struct remote * remote , const char * pushurl )
110109{
111110 ALLOC_GROW (remote -> pushurl , remote -> pushurl_nr + 1 , remote -> pushurl_alloc );
112111 remote -> pushurl [remote -> pushurl_nr ++ ] = pushurl ;
113112}
114113
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+
115127static struct remote * make_remote (const char * name , int len )
116128{
117129 struct remote * ret ;
@@ -169,22 +181,22 @@ static struct branch *make_branch(const char *name, int len)
169181 return ret ;
170182}
171183
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 )
173185{
174186 struct rewrite * ret ;
175187 int i ;
176188
177- for (i = 0 ; i < rewrite_nr ; i ++ ) {
189+ for (i = 0 ; i < r -> rewrite_nr ; i ++ ) {
178190 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 ];
183195 }
184196
185- ALLOC_GROW (rewrite , rewrite_nr + 1 , rewrite_alloc );
197+ ALLOC_GROW (r -> rewrite , r -> rewrite_nr + 1 , r -> rewrite_alloc );
186198 ret = xcalloc (1 , sizeof (struct rewrite ));
187- rewrite [rewrite_nr ++ ] = ret ;
199+ r -> rewrite [r -> rewrite_nr ++ ] = ret ;
188200 if (len ) {
189201 ret -> base = xstrndup (base , len );
190202 ret -> baselen = len ;
@@ -355,8 +367,13 @@ static int handle_config(const char *key, const char *value, void *cb)
355367 subkey = strrchr (name , '.' );
356368 if (!subkey )
357369 return 0 ;
358- rewrite = make_rewrite (name , subkey - name );
359370 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 );
360377 if (!value )
361378 return config_error_nonbool (key );
362379 add_instead_of (rewrite , xstrdup (value ));
@@ -430,13 +447,17 @@ static void alias_all_urls(void)
430447{
431448 int i , j ;
432449 for (i = 0 ; i < remotes_nr ; i ++ ) {
450+ int add_pushurl_aliases ;
433451 if (!remotes [i ])
434452 continue ;
435- for (j = 0 ; j < remotes [i ]-> url_nr ; j ++ ) {
436- remotes [i ]-> url [j ] = alias_url (remotes [i ]-> url [j ]);
437- }
438453 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 );
440461 }
441462 }
442463}
0 commit comments