88#include "bundle.h"
99#include "dir.h"
1010#include "refs.h"
11+ #include "branch.h"
1112
1213/* rsync support */
1314
@@ -135,6 +136,53 @@ static void insert_packed_refs(const char *packed_refs, struct ref **list)
135136 }
136137}
137138
139+ static void set_upstreams (struct transport * transport , struct ref * refs ,
140+ int pretend )
141+ {
142+ struct ref * ref ;
143+ for (ref = refs ; ref ; ref = ref -> next ) {
144+ const char * localname ;
145+ const char * tmp ;
146+ const char * remotename ;
147+ unsigned char sha [20 ];
148+ int flag = 0 ;
149+ /*
150+ * Check suitability for tracking. Must be successful /
151+ * already up-to-date ref create/modify (not delete).
152+ */
153+ if (ref -> status != REF_STATUS_OK &&
154+ ref -> status != REF_STATUS_UPTODATE )
155+ continue ;
156+ if (!ref -> peer_ref )
157+ continue ;
158+ if (!ref -> new_sha1 || is_null_sha1 (ref -> new_sha1 ))
159+ continue ;
160+
161+ /* Follow symbolic refs (mainly for HEAD). */
162+ localname = ref -> peer_ref -> name ;
163+ remotename = ref -> name ;
164+ tmp = resolve_ref (localname , sha , 1 , & flag );
165+ if (tmp && flag & REF_ISSYMREF &&
166+ !prefixcmp (tmp , "refs/heads/" ))
167+ localname = tmp ;
168+
169+ /* Both source and destination must be local branches. */
170+ if (!localname || prefixcmp (localname , "refs/heads/" ))
171+ continue ;
172+ if (!remotename || prefixcmp (remotename , "refs/heads/" ))
173+ continue ;
174+
175+ if (!pretend )
176+ install_branch_config (BRANCH_CONFIG_VERBOSE ,
177+ localname + 11 , transport -> remote -> name ,
178+ remotename );
179+ else
180+ printf ("Would set upstream of '%s' to '%s' of '%s'\n" ,
181+ localname + 11 , remotename + 11 ,
182+ transport -> remote -> name );
183+ }
184+ }
185+
138186static const char * rsync_url (const char * url )
139187{
140188 return prefixcmp (url , "rsync://" ) ? skip_prefix (url , "rsync:" ) : url ;
@@ -974,6 +1022,10 @@ int transport_push(struct transport *transport,
9741022 verify_remote_names (refspec_nr , refspec );
9751023
9761024 if (transport -> push ) {
1025+ /* Maybe FIXME. But no important transport uses this case. */
1026+ if (flags & TRANSPORT_PUSH_SET_UPSTREAM )
1027+ die ("This transport does not support using --set-upstream" );
1028+
9771029 return transport -> push (transport , refspec_nr , refspec , flags );
9781030 } else if (transport -> push_refs ) {
9791031 struct ref * remote_refs =
@@ -983,6 +1035,7 @@ int transport_push(struct transport *transport,
9831035 int verbose = flags & TRANSPORT_PUSH_VERBOSE ;
9841036 int quiet = flags & TRANSPORT_PUSH_QUIET ;
9851037 int porcelain = flags & TRANSPORT_PUSH_PORCELAIN ;
1038+ int pretend = flags & TRANSPORT_PUSH_DRY_RUN ;
9861039 int ret , err ;
9871040
9881041 if (flags & TRANSPORT_PUSH_ALL )
@@ -1009,6 +1062,9 @@ int transport_push(struct transport *transport,
10091062 verbose | porcelain , porcelain ,
10101063 nonfastforward );
10111064
1065+ if (flags & TRANSPORT_PUSH_SET_UPSTREAM )
1066+ set_upstreams (transport , remote_refs , pretend );
1067+
10121068 if (!(flags & TRANSPORT_PUSH_DRY_RUN )) {
10131069 struct ref * ref ;
10141070 for (ref = remote_refs ; ref ; ref = ref -> next )
0 commit comments