/** * Derives the remote-tracking branch from the remote and refspec. * * FIXME: The current implementation assumes the default mapping of * refs/heads/<branch_name> to refs/remotes/<remote_name>/<branch_name>. */ static const char *get_tracking_branch(const char *remote, const char *refspec) { struct refspec_item spec; const char *spec_src; const char *merge_branch; refspec_item_init_or_die(&spec, refspec, REFSPEC_FETCH); spec_src = spec.src; if (!*spec_src || !strcmp(spec_src, "HEAD")) spec_src = "HEAD"; else if (skip_prefix(spec_src, "heads/", &spec_src)) ; else if (skip_prefix(spec_src, "refs/heads/", &spec_src)) ; else if (starts_with(spec_src, "refs/") || starts_with(spec_src, "tags/") || starts_with(spec_src, "remotes/")) spec_src = ""; if (*spec_src) { if (!strcmp(remote, ".")) merge_branch = mkpath("refs/heads/%s", spec_src); else merge_branch = mkpath("refs/remotes/%s/%s", remote, spec_src); } else merge_branch = NULL; refspec_item_clear(&spec); return merge_branch; }
void refspec_append(struct refspec *rs, const char *refspec) { struct refspec_item item; refspec_item_init_or_die(&item, refspec, rs->fetch); ALLOC_GROW(rs->items, rs->nr + 1, rs->alloc); rs->items[rs->nr++] = item; ALLOC_GROW(rs->raw, rs->raw_nr + 1, rs->raw_alloc); rs->raw[rs->raw_nr++] = xstrdup(refspec); }