Git fork
at reftables-rust 75 lines 2.0 kB view raw
1#define USE_THE_REPOSITORY_VARIABLE 2 3#include "git-compat-util.h" 4#include "object-name.h" 5#include "remote.h" 6#include "refspec.h" 7#include "repository.h" 8#include "checkout.h" 9#include "config.h" 10#include "strbuf.h" 11 12struct tracking_name_data { 13 /* const */ char *src_ref; 14 char *dst_ref; 15 struct object_id *dst_oid; 16 int num_matches; 17 const char *default_remote; 18 char *default_dst_ref; 19 struct object_id *default_dst_oid; 20}; 21 22#define TRACKING_NAME_DATA_INIT { 0 } 23 24static int check_tracking_name(struct remote *remote, void *cb_data) 25{ 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)) { 32 free(query.dst); 33 return 0; 34 } 35 cb->num_matches++; 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; 41 } 42 if (cb->dst_ref) { 43 free(query.dst); 44 return 0; 45 } 46 cb->dst_ref = query.dst; 47 return 0; 48} 49 50char *unique_tracking_name(const char *name, struct object_id *oid, 51 int *dwim_remotes_matched) 52{ 53 struct tracking_name_data cb_data = TRACKING_NAME_DATA_INIT; 54 const char *default_remote = NULL; 55 if (!repo_config_get_string_tmp(the_repository, "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; 67 } 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; 73 } 74 return NULL; 75}