refactor "ref->merge" flag
Each "struct ref" has a boolean flag that is set by the fetch code to determine whether the ref should be marked as "not-for-merge" or not when we write it out to FETCH_HEAD. It would be useful to turn this boolean into a tri-state, with the third state meaning "do not bother writing it out to FETCH_HEAD at all". That would let us add extra refs to the set of refs to be stored (e.g., to store copies of things we fetched) without impacting FETCH_HEAD. This patch turns it into an enum that covers the tri-state case, and hopefully makes the code more explicit and easier to read. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
4ab90e7a5c
commit
900f2814b8
@ -119,7 +119,7 @@ static void add_merge_config(struct ref **head,
|
||||
|
||||
for (rm = *head; rm; rm = rm->next) {
|
||||
if (branch_merge_matches(branch, i, rm->name)) {
|
||||
rm->merge = 1;
|
||||
rm->fetch_head_status = FETCH_HEAD_MERGE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -140,7 +140,7 @@ static void add_merge_config(struct ref **head,
|
||||
refspec.src = branch->merge[i]->src;
|
||||
get_fetch_map(remote_refs, &refspec, tail, 1);
|
||||
for (rm = *old_tail; rm; rm = rm->next)
|
||||
rm->merge = 1;
|
||||
rm->fetch_head_status = FETCH_HEAD_MERGE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -167,7 +167,7 @@ static struct ref *get_ref_map(struct transport *transport,
|
||||
}
|
||||
/* Merge everything on the command line, but not --tags */
|
||||
for (rm = ref_map; rm; rm = rm->next)
|
||||
rm->merge = 1;
|
||||
rm->fetch_head_status = FETCH_HEAD_MERGE;
|
||||
if (tags == TAGS_SET)
|
||||
get_fetch_map(remote_refs, tag_refspec, &tail, 0);
|
||||
} else {
|
||||
@ -186,7 +186,7 @@ static struct ref *get_ref_map(struct transport *transport,
|
||||
*autotags = 1;
|
||||
if (!i && !has_merge && ref_map &&
|
||||
!remote->fetch[0].pattern)
|
||||
ref_map->merge = 1;
|
||||
ref_map->fetch_head_status = FETCH_HEAD_MERGE;
|
||||
}
|
||||
/*
|
||||
* if the remote we're fetching from is the same
|
||||
@ -202,7 +202,7 @@ static struct ref *get_ref_map(struct transport *transport,
|
||||
ref_map = get_remote_ref(remote_refs, "HEAD");
|
||||
if (!ref_map)
|
||||
die(_("Couldn't find remote ref HEAD"));
|
||||
ref_map->merge = 1;
|
||||
ref_map->fetch_head_status = FETCH_HEAD_MERGE;
|
||||
tail = &ref_map->next;
|
||||
}
|
||||
}
|
||||
@ -389,7 +389,7 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
|
||||
const char *what, *kind;
|
||||
struct ref *rm;
|
||||
char *url, *filename = dry_run ? "/dev/null" : git_path("FETCH_HEAD");
|
||||
int want_merge;
|
||||
int want_status;
|
||||
|
||||
fp = fopen(filename, "a");
|
||||
if (!fp)
|
||||
@ -407,19 +407,22 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
|
||||
}
|
||||
|
||||
/*
|
||||
* The first pass writes objects to be merged and then the
|
||||
* second pass writes the rest, in order to allow using
|
||||
* FETCH_HEAD as a refname to refer to the ref to be merged.
|
||||
* We do a pass for each fetch_head_status type in their enum order, so
|
||||
* merged entries are written before not-for-merge. That lets readers
|
||||
* use FETCH_HEAD as a refname to refer to the ref to be merged.
|
||||
*/
|
||||
for (want_merge = 1; 0 <= want_merge; want_merge--) {
|
||||
for (want_status = FETCH_HEAD_MERGE;
|
||||
want_status <= FETCH_HEAD_IGNORE;
|
||||
want_status++) {
|
||||
for (rm = ref_map; rm; rm = rm->next) {
|
||||
struct ref *ref = NULL;
|
||||
const char *merge_status_marker = "";
|
||||
|
||||
commit = lookup_commit_reference_gently(rm->old_sha1, 1);
|
||||
if (!commit)
|
||||
rm->merge = 0;
|
||||
rm->fetch_head_status = FETCH_HEAD_NOT_FOR_MERGE;
|
||||
|
||||
if (rm->merge != want_merge)
|
||||
if (rm->fetch_head_status != want_status)
|
||||
continue;
|
||||
|
||||
if (rm->peer_ref) {
|
||||
@ -465,16 +468,26 @@ static int store_updated_refs(const char *raw_url, const char *remote_name,
|
||||
strbuf_addf(¬e, "%s ", kind);
|
||||
strbuf_addf(¬e, "'%s' of ", what);
|
||||
}
|
||||
fprintf(fp, "%s\t%s\t%s",
|
||||
sha1_to_hex(rm->old_sha1),
|
||||
rm->merge ? "" : "not-for-merge",
|
||||
note.buf);
|
||||
for (i = 0; i < url_len; ++i)
|
||||
if ('\n' == url[i])
|
||||
fputs("\\n", fp);
|
||||
else
|
||||
fputc(url[i], fp);
|
||||
fputc('\n', fp);
|
||||
switch (rm->fetch_head_status) {
|
||||
case FETCH_HEAD_NOT_FOR_MERGE:
|
||||
merge_status_marker = "not-for-merge";
|
||||
/* fall-through */
|
||||
case FETCH_HEAD_MERGE:
|
||||
fprintf(fp, "%s\t%s\t%s",
|
||||
sha1_to_hex(rm->old_sha1),
|
||||
merge_status_marker,
|
||||
note.buf);
|
||||
for (i = 0; i < url_len; ++i)
|
||||
if ('\n' == url[i])
|
||||
fputs("\\n", fp);
|
||||
else
|
||||
fputc(url[i], fp);
|
||||
fputc('\n', fp);
|
||||
break;
|
||||
default:
|
||||
/* do not write anything to FETCH_HEAD */
|
||||
break;
|
||||
}
|
||||
|
||||
strbuf_reset(¬e);
|
||||
if (ref) {
|
||||
|
14
cache.h
14
cache.h
@ -1024,9 +1024,21 @@ struct ref {
|
||||
unsigned int
|
||||
force:1,
|
||||
forced_update:1,
|
||||
merge:1,
|
||||
deletion:1,
|
||||
matched:1;
|
||||
|
||||
/*
|
||||
* Order is important here, as we write to FETCH_HEAD
|
||||
* in numeric order. And the default NOT_FOR_MERGE
|
||||
* should be 0, so that xcalloc'd structures get it
|
||||
* by default.
|
||||
*/
|
||||
enum {
|
||||
FETCH_HEAD_MERGE = -1,
|
||||
FETCH_HEAD_NOT_FOR_MERGE = 0,
|
||||
FETCH_HEAD_IGNORE = 1
|
||||
} fetch_head_status;
|
||||
|
||||
enum {
|
||||
REF_STATUS_NONE = 0,
|
||||
REF_STATUS_OK,
|
||||
|
Loading…
Reference in New Issue
Block a user