1 #define USE_THE_REPOSITORY_VARIABLE
3 #include "git-compat-util.h"
4 #include "object-name.h"
7 #include "repository.h"
12 struct tracking_name_data
{
13 /* const */ char *src_ref
;
15 struct object_id
*dst_oid
;
17 const char *default_remote
;
18 char *default_dst_ref
;
19 struct object_id
*default_dst_oid
;
22 #define TRACKING_NAME_DATA_INIT { 0 }
24 static int check_tracking_name(struct remote
*remote
, void *cb_data
)
26 struct tracking_name_data
*cb
= cb_data
;
27 struct refspec_item query
;
28 memset(&query
, 0, sizeof(struct refspec_item
));
29 query
.src
= cb
->src_ref
;
30 if (remote_find_tracking(remote
, &query
) ||
31 repo_get_oid(the_repository
, query
.dst
, cb
->dst_oid
)) {
36 if (cb
->default_remote
&& !strcmp(remote
->name
, cb
->default_remote
)) {
37 struct object_id
*dst
= xmalloc(sizeof(*cb
->default_dst_oid
));
38 cb
->default_dst_ref
= xstrdup(query
.dst
);
39 oidcpy(dst
, cb
->dst_oid
);
40 cb
->default_dst_oid
= dst
;
46 cb
->dst_ref
= query
.dst
;
50 char *unique_tracking_name(const char *name
, struct object_id
*oid
,
51 int *dwim_remotes_matched
)
53 struct tracking_name_data cb_data
= TRACKING_NAME_DATA_INIT
;
54 const char *default_remote
= NULL
;
55 if (!git_config_get_string_tmp("checkout.defaultremote", &default_remote
))
56 cb_data
.default_remote
= default_remote
;
57 cb_data
.src_ref
= xstrfmt("refs/heads/%s", name
);
58 cb_data
.dst_oid
= oid
;
59 for_each_remote(check_tracking_name
, &cb_data
);
60 if (dwim_remotes_matched
)
61 *dwim_remotes_matched
= cb_data
.num_matches
;
62 free(cb_data
.src_ref
);
63 if (cb_data
.num_matches
== 1) {
64 free(cb_data
.default_dst_ref
);
65 free(cb_data
.default_dst_oid
);
66 return cb_data
.dst_ref
;
68 free(cb_data
.dst_ref
);
69 if (cb_data
.default_dst_ref
) {
70 oidcpy(oid
, cb_data
.default_dst_oid
);
71 free(cb_data
.default_dst_oid
);
72 return cb_data
.default_dst_ref
;