Skip to content

Commit

Permalink
Merge branch 'nd/resolve-ref'
Browse files Browse the repository at this point in the history
* nd/resolve-ref:
  Rename resolve_ref() to resolve_ref_unsafe()
  Convert resolve_ref+xstrdup to new resolve_refdup function
  revert: convert resolve_ref() to read_ref_full()
  • Loading branch information
Junio C Hamano committed Dec 20, 2011
2 parents b8fc5ab + 8cad474 commit 2e05710
Show file tree
Hide file tree
Showing 21 changed files with 73 additions and 76 deletions.
2 changes: 1 addition & 1 deletion branch.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ int validate_new_branchname(const char *name, struct strbuf *ref,
const char *head;
unsigned char sha1[20];

head = resolve_ref("HEAD", sha1, 0, NULL);
head = resolve_ref_unsafe("HEAD", sha1, 0, NULL);
if (!is_bare_repository() && head && !strcmp(head, ref->buf))
die("Cannot force update the current branch.");
}
Expand Down
14 changes: 6 additions & 8 deletions builtin/branch.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ static int branch_merged(int kind, const char *name,
*/
struct commit *reference_rev = NULL;
const char *reference_name = NULL;
void *reference_name_to_free = NULL;
int merged;

if (kind == REF_LOCAL_BRANCH) {
Expand All @@ -114,11 +115,9 @@ static int branch_merged(int kind, const char *name,
branch->merge &&
branch->merge[0] &&
branch->merge[0]->dst &&
(reference_name =
resolve_ref(branch->merge[0]->dst, sha1, 1, NULL)) != NULL) {
reference_name = xstrdup(reference_name);
(reference_name = reference_name_to_free =
resolve_refdup(branch->merge[0]->dst, sha1, 1, NULL)) != NULL)
reference_rev = lookup_commit_reference(sha1);
}
}
if (!reference_rev)
reference_rev = head_rev;
Expand All @@ -143,7 +142,7 @@ static int branch_merged(int kind, const char *name,
" '%s', even though it is merged to HEAD."),
name, reference_name);
}
free((char *)reference_name);
free(reference_name_to_free);
return merged;
}

Expand Down Expand Up @@ -253,7 +252,7 @@ static char *resolve_symref(const char *src, const char *prefix)
int flag;
const char *dst, *cp;

dst = resolve_ref(src, sha1, 0, &flag);
dst = resolve_ref_unsafe(src, sha1, 0, &flag);
if (!(dst && (flag & REF_ISSYMREF)))
return NULL;
if (prefix && (cp = skip_prefix(dst, prefix)))
Expand Down Expand Up @@ -738,10 +737,9 @@ int cmd_branch(int argc, const char **argv, const char *prefix)

track = git_branch_track;

head = resolve_ref("HEAD", head_sha1, 0, NULL);
head = resolve_refdup("HEAD", head_sha1, 0, NULL);
if (!head)
die(_("Failed to resolve HEAD as a valid ref."));
head = xstrdup(head);
if (!strcmp(head, "HEAD")) {
detached = 1;
} else {
Expand Down
15 changes: 7 additions & 8 deletions builtin/checkout.c
Original file line number Diff line number Diff line change
Expand Up @@ -705,17 +705,14 @@ static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
{
int ret = 0;
struct branch_info old;
void *path_to_free;
unsigned char rev[20];
int flag;
memset(&old, 0, sizeof(old));
old.path = resolve_ref("HEAD", rev, 0, &flag);
if (old.path)
old.path = xstrdup(old.path);
old.path = path_to_free = resolve_refdup("HEAD", rev, 0, &flag);
old.commit = lookup_commit_reference_gently(rev, 1);
if (!(flag & REF_ISSYMREF)) {
free((char *)old.path);
if (!(flag & REF_ISSYMREF))
old.path = NULL;
}

if (old.path && !prefixcmp(old.path, "refs/heads/"))
old.name = old.path + strlen("refs/heads/");
Expand All @@ -729,16 +726,18 @@ static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
}

ret = merge_working_tree(opts, &old, new);
if (ret)
if (ret) {
free(path_to_free);
return ret;
}

if (!opts->quiet && !old.path && old.commit && new->commit != old.commit)
orphaned_commit_warning(old.commit);

update_refs_for_switch(opts, &old, new);

ret = post_checkout_hook(old.commit, new->commit, 1);
free((char *)old.path);
free(path_to_free);
return ret || opts->writeout_error;
}

Expand Down
2 changes: 1 addition & 1 deletion builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -1304,7 +1304,7 @@ static void print_summary(const char *prefix, const unsigned char *sha1,
rev.diffopt.break_opt = 0;
diff_setup_done(&rev.diffopt);

head = resolve_ref("HEAD", junk_sha1, 0, NULL);
head = resolve_ref_unsafe("HEAD", junk_sha1, 0, NULL);
printf("[%s%s ",
!prefixcmp(head, "refs/heads/") ?
head + 11 :
Expand Down
7 changes: 4 additions & 3 deletions builtin/fmt-merge-msg.c
Original file line number Diff line number Diff line change
Expand Up @@ -372,14 +372,15 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
int i = 0, pos = 0;
unsigned char head_sha1[20];
const char *current_branch;
void *current_branch_to_free;

/* get current branch */
current_branch = resolve_ref("HEAD", head_sha1, 1, NULL);
current_branch = current_branch_to_free =
resolve_refdup("HEAD", head_sha1, 1, NULL);
if (!current_branch)
die("No current branch");
if (!prefixcmp(current_branch, "refs/heads/"))
current_branch += 11;
current_branch = xstrdup(current_branch);

/* get a line */
while (pos < in->len) {
Expand Down Expand Up @@ -421,7 +422,7 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
}

strbuf_complete_line(out);
free((char *)current_branch);
free(current_branch_to_free);
return 0;
}

Expand Down
7 changes: 2 additions & 5 deletions builtin/for-each-ref.c
Original file line number Diff line number Diff line change
Expand Up @@ -628,11 +628,8 @@ static void populate_value(struct refinfo *ref)

if (need_symref && (ref->flag & REF_ISSYMREF) && !ref->symref) {
unsigned char unused1[20];
const char *symref;
symref = resolve_ref(ref->refname, unused1, 1, NULL);
if (symref)
ref->symref = xstrdup(symref);
else
ref->symref = resolve_refdup(ref->refname, unused1, 1, NULL);
if (!ref->symref)
ref->symref = "";
}

Expand Down
2 changes: 1 addition & 1 deletion builtin/fsck.c
Original file line number Diff line number Diff line change
Expand Up @@ -563,7 +563,7 @@ static int fsck_head_link(void)
if (verbose)
fprintf(stderr, "Checking HEAD link\n");

head_points_at = resolve_ref("HEAD", head_sha1, 0, &flag);
head_points_at = resolve_ref_unsafe("HEAD", head_sha1, 0, &flag);
if (!head_points_at)
return error("Invalid HEAD");
if (!strcmp(head_points_at, "HEAD"))
Expand Down
4 changes: 2 additions & 2 deletions builtin/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -1040,7 +1040,7 @@ static char *find_branch_name(struct rev_info *rev)
if (positive < 0)
return NULL;
strbuf_addf(&buf, "refs/heads/%s", rev->cmdline.rev[positive].name);
branch = resolve_ref(buf.buf, branch_sha1, 1, NULL);
branch = resolve_ref_unsafe(buf.buf, branch_sha1, 1, NULL);
if (!branch ||
prefixcmp(branch, "refs/heads/") ||
hashcmp(rev->cmdline.rev[positive].item->sha1, branch_sha1))
Expand Down Expand Up @@ -1268,7 +1268,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)

rev.pending.objects[0].item->flags |= UNINTERESTING;
add_head_to_pending(&rev);
ref = resolve_ref("HEAD", sha1, 1, NULL);
ref = resolve_ref_unsafe("HEAD", sha1, 1, NULL);
if (ref && !prefixcmp(ref, "refs/heads/"))
branch_name = xstrdup(ref + strlen("refs/heads/"));
else
Expand Down
12 changes: 5 additions & 7 deletions builtin/merge.c
Original file line number Diff line number Diff line change
Expand Up @@ -1100,6 +1100,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
struct commit_list *common = NULL;
const char *best_strategy = NULL, *wt_strategy = NULL;
struct commit_list **remotes = &remoteheads;
void *branch_to_free;

if (argc == 2 && !strcmp(argv[1], "-h"))
usage_with_options(builtin_merge_usage, builtin_merge_options);
Expand All @@ -1108,12 +1109,9 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
* Check if we are _not_ on a detached HEAD, i.e. if there is a
* current branch.
*/
branch = resolve_ref("HEAD", head_sha1, 0, &flag);
if (branch) {
if (!prefixcmp(branch, "refs/heads/"))
branch += 11;
branch = xstrdup(branch);
}
branch = branch_to_free = resolve_refdup("HEAD", head_sha1, 0, &flag);
if (branch && !prefixcmp(branch, "refs/heads/"))
branch += 11;
if (!branch || is_null_sha1(head_sha1))
head_commit = NULL;
else
Expand Down Expand Up @@ -1524,6 +1522,6 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
ret = suggest_conflicts(option_renormalize);

done:
free((char *)branch);
free(branch_to_free);
return ret;
}
7 changes: 4 additions & 3 deletions builtin/notes.c
Original file line number Diff line number Diff line change
Expand Up @@ -804,6 +804,7 @@ static int merge_commit(struct notes_merge_options *o)
struct notes_tree *t;
struct commit *partial;
struct pretty_print_context pretty_ctx;
void *local_ref_to_free;
int ret;

/*
Expand All @@ -826,10 +827,10 @@ static int merge_commit(struct notes_merge_options *o)
t = xcalloc(1, sizeof(struct notes_tree));
init_notes(t, "NOTES_MERGE_PARTIAL", combine_notes_overwrite, 0);

o->local_ref = resolve_ref("NOTES_MERGE_REF", sha1, 0, NULL);
o->local_ref = local_ref_to_free =
resolve_refdup("NOTES_MERGE_REF", sha1, 0, NULL);
if (!o->local_ref)
die("Failed to resolve NOTES_MERGE_REF");
o->local_ref = xstrdup(o->local_ref);

if (notes_merge_commit(o, t, partial, sha1))
die("Failed to finalize notes merge");
Expand All @@ -846,7 +847,7 @@ static int merge_commit(struct notes_merge_options *o)
free_notes(t);
strbuf_release(&msg);
ret = merge_abort(o);
free((char *)o->local_ref);
free(local_ref_to_free);
return ret;
}

Expand Down
9 changes: 4 additions & 5 deletions builtin/receive-pack.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ static int prefer_ofs_delta = 1;
static int auto_update_server_info;
static int auto_gc = 1;
static const char *head_name;
static void *head_name_to_free;
static int sent_capabilities;

static enum deny_action parse_deny_action(const char *var, const char *value)
Expand Down Expand Up @@ -571,7 +572,7 @@ static void check_aliased_update(struct command *cmd, struct string_list *list)
int flag;

strbuf_addf(&buf, "%s%s", get_git_namespace(), cmd->ref_name);
dst_name = resolve_ref(buf.buf, sha1, 0, &flag);
dst_name = resolve_ref_unsafe(buf.buf, sha1, 0, &flag);
strbuf_release(&buf);

if (!(flag & REF_ISSYMREF))
Expand Down Expand Up @@ -695,10 +696,8 @@ static void execute_commands(struct command *commands, const char *unpacker_erro

check_aliased_updates(commands);

free((char *)head_name);
head_name = resolve_ref("HEAD", sha1, 0, NULL);
if (head_name)
head_name = xstrdup(head_name);
free(head_name_to_free);
head_name = head_name_to_free = resolve_refdup("HEAD", sha1, 0, NULL);

for (cmd = commands; cmd; cmd = cmd->next)
if (!cmd->skip_update)
Expand Down
2 changes: 1 addition & 1 deletion builtin/remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -573,7 +573,7 @@ static int read_remote_branches(const char *refname,
strbuf_addf(&buf, "refs/remotes/%s/", rename->old);
if (!prefixcmp(refname, buf.buf)) {
item = string_list_append(rename->remote_branches, xstrdup(refname));
symref = resolve_ref(refname, orig_sha1, 1, &flag);
symref = resolve_ref_unsafe(refname, orig_sha1, 1, &flag);
if (flag & REF_ISSYMREF)
item->util = xstrdup(symref);
else
Expand Down
2 changes: 1 addition & 1 deletion builtin/revert.c
Original file line number Diff line number Diff line change
Expand Up @@ -903,7 +903,7 @@ static int rollback_single_pick(void)
if (!file_exists(git_path("CHERRY_PICK_HEAD")) &&
!file_exists(git_path("REVERT_HEAD")))
return error(_("no cherry-pick or revert in progress"));
if (!resolve_ref("HEAD", head_sha1, 0, NULL))
if (read_ref_full("HEAD", head_sha1, 0, NULL))
return error(_("cannot resolve HEAD"));
if (is_null_sha1(head_sha1))
return error(_("cannot abort from a branch yet to be born"));
Expand Down
6 changes: 2 additions & 4 deletions builtin/show-branch.c
Original file line number Diff line number Diff line change
Expand Up @@ -726,10 +726,8 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)

if (ac == 0) {
static const char *fake_av[2];
const char *refname;

refname = resolve_ref("HEAD", sha1, 1, NULL);
fake_av[0] = xstrdup(refname);
fake_av[0] = resolve_refdup("HEAD", sha1, 1, NULL);
fake_av[1] = NULL;
av = fake_av;
ac = 1;
Expand Down Expand Up @@ -791,7 +789,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
}
}

head_p = resolve_ref("HEAD", head_sha1, 1, NULL);
head_p = resolve_ref_unsafe("HEAD", head_sha1, 1, NULL);
if (head_p) {
head_len = strlen(head_p);
memcpy(head, head_p, head_len + 1);
Expand Down
2 changes: 1 addition & 1 deletion builtin/symbolic-ref.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ static void check_symref(const char *HEAD, int quiet)
{
unsigned char sha1[20];
int flag;
const char *refs_heads_master = resolve_ref(HEAD, sha1, 0, &flag);
const char *refs_heads_master = resolve_ref_unsafe(HEAD, sha1, 0, &flag);

if (!refs_heads_master)
die("No such ref: %s", HEAD);
Expand Down
3 changes: 2 additions & 1 deletion cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -867,7 +867,8 @@ extern int read_ref(const char *filename, unsigned char *sha1);
*
* errno is sometimes set on errors, but not always.
*/
extern const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *flag);
extern const char *resolve_ref_unsafe(const char *ref, unsigned char *sha1, int reading, int *flag);
extern char *resolve_refdup(const char *ref, unsigned char *sha1, int reading, int *flag);

extern int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref);
extern int dwim_log(const char *str, int len, unsigned char *sha1, char **ref);
Expand Down
15 changes: 8 additions & 7 deletions reflog-walk.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,12 @@ static struct complete_reflogs *read_complete_reflog(const char *ref)
for_each_reflog_ent(ref, read_one_reflog, reflogs);
if (reflogs->nr == 0) {
unsigned char sha1[20];
const char *name = resolve_ref(ref, sha1, 1, NULL);
const char *name;
void *name_to_free;
name = name_to_free = resolve_refdup(ref, sha1, 1, NULL);
if (name) {
name = xstrdup(name);
for_each_reflog_ent(name, read_one_reflog, reflogs);
free((char *)name);
free(name_to_free);
}
}
if (reflogs->nr == 0) {
Expand Down Expand Up @@ -171,11 +172,11 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
else {
if (*branch == '\0') {
unsigned char sha1[20];
const char *head = resolve_ref("HEAD", sha1, 0, NULL);
if (!head)
die ("No current branch");
free(branch);
branch = xstrdup(head);
branch = resolve_refdup("HEAD", sha1, 0, NULL);
if (!branch)
die ("No current branch");

}
reflogs = read_complete_reflog(branch);
if (!reflogs || reflogs->nr == 0) {
Expand Down
Loading

0 comments on commit 2e05710

Please sign in to comment.