struct branch *branch_get(const char *name) { struct branch *ret; read_config(); if (!name || !*name || !strcmp(name, "HEAD")) ret = current_branch; else ret = make_branch(name, 0); if (ret && ret->remote_name) { ret->remote = remote_get(ret->remote_name); if (ret->merge_nr) { int i; ret->merge = xcalloc(sizeof(*ret->merge), ret->merge_nr); for (i = 0; i < ret->merge_nr; i++) { ret->merge[i] = xcalloc(1, sizeof(**ret->merge)); ret->merge[i]->src = xstrdup(ret->merge_name[i]); remote_find_tracking(ret->remote, ret->merge[i]); } } } return ret; }
static int check_tracking_branch(struct remote *remote, void *cb_data) { char *tracking_branch = cb_data; struct refspec query; memset(&query, 0, sizeof(struct refspec)); query.dst = tracking_branch; return !remote_find_tracking(remote, &query); }
static int check_tracking_branch(struct remote *remote, void *cb_data) { char *tracking_branch = cb_data; struct refspec query; memset(&query, 0, sizeof(struct refspec)); query.dst = tracking_branch; return !(remote_find_tracking(remote, &query) || prefixcmp(query.src, "refs/heads/")); }
static int check_tracking_name(struct remote *remote, void *cb_data) { struct tracking_name_data *cb = cb_data; struct refspec query; memset(&query, 0, sizeof(struct refspec)); query.src = cb->src_ref; if (remote_find_tracking(remote, &query) || get_oid(query.dst, cb->dst_oid)) { free(query.dst); return 0; } if (cb->dst_ref) { free(query.dst); cb->unique = 0; return 0; } cb->dst_ref = query.dst; return 0; }
static int find_tracked_branch(struct remote *remote, void *priv) { struct tracking *tracking = priv; if (!remote_find_tracking(remote, &tracking->spec)) { if (++tracking->matches == 1) { tracking->src = tracking->spec.src; tracking->remote = remote->name; } else { free(tracking->spec.src); if (tracking->src) { free(tracking->src); tracking->src = NULL; } } tracking->spec.src = NULL; } return 0; }
static void update_tracking_ref(struct remote *remote, struct ref *ref) { struct refspec rs; if (ref->status != REF_STATUS_OK && ref->status != REF_STATUS_UPTODATE) return; rs.src = ref->name; rs.dst = NULL; if (!remote_find_tracking(remote, &rs)) { if (args.verbose) fprintf(stderr, "updating local tracking ref '%s'\n", rs.dst); if (ref->deletion) { delete_ref(rs.dst, NULL, 0); } else update_ref("update by push", rs.dst, ref->new_sha1, NULL, 0, 0); free(rs.dst); } }