git
/
checkout.c
75 строк · 2.0 Кб
1#define USE_THE_REPOSITORY_VARIABLE2
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;14char *dst_ref;15struct object_id *dst_oid;16int num_matches;17const char *default_remote;18char *default_dst_ref;19struct 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{
26struct tracking_name_data *cb = cb_data;27struct refspec_item query;28memset(&query, 0, sizeof(struct refspec_item));29query.src = cb->src_ref;30if (remote_find_tracking(remote, &query) ||31repo_get_oid(the_repository, query.dst, cb->dst_oid)) {32free(query.dst);33return 0;34}35cb->num_matches++;36if (cb->default_remote && !strcmp(remote->name, cb->default_remote)) {37struct object_id *dst = xmalloc(sizeof(*cb->default_dst_oid));38cb->default_dst_ref = xstrdup(query.dst);39oidcpy(dst, cb->dst_oid);40cb->default_dst_oid = dst;41}42if (cb->dst_ref) {43free(query.dst);44return 0;45}46cb->dst_ref = query.dst;47return 0;48}
49
50char *unique_tracking_name(const char *name, struct object_id *oid,51int *dwim_remotes_matched)52{
53struct tracking_name_data cb_data = TRACKING_NAME_DATA_INIT;54const char *default_remote = NULL;55if (!git_config_get_string_tmp("checkout.defaultremote", &default_remote))56cb_data.default_remote = default_remote;57cb_data.src_ref = xstrfmt("refs/heads/%s", name);58cb_data.dst_oid = oid;59for_each_remote(check_tracking_name, &cb_data);60if (dwim_remotes_matched)61*dwim_remotes_matched = cb_data.num_matches;62free(cb_data.src_ref);63if (cb_data.num_matches == 1) {64free(cb_data.default_dst_ref);65free(cb_data.default_dst_oid);66return cb_data.dst_ref;67}68free(cb_data.dst_ref);69if (cb_data.default_dst_ref) {70oidcpy(oid, cb_data.default_dst_oid);71free(cb_data.default_dst_oid);72return cb_data.default_dst_ref;73}74return NULL;75}
76