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) {
|
for (rm = *head; rm; rm = rm->next) {
|
||||||
if (branch_merge_matches(branch, i, rm->name)) {
|
if (branch_merge_matches(branch, i, rm->name)) {
|
||||||
rm->merge = 1;
|
rm->fetch_head_status = FETCH_HEAD_MERGE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -140,7 +140,7 @@ static void add_merge_config(struct ref **head,
|
|||||||
refspec.src = branch->merge[i]->src;
|
refspec.src = branch->merge[i]->src;
|
||||||
get_fetch_map(remote_refs, &refspec, tail, 1);
|
get_fetch_map(remote_refs, &refspec, tail, 1);
|
||||||
for (rm = *old_tail; rm; rm = rm->next)
|
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 */
|
/* Merge everything on the command line, but not --tags */
|
||||||
for (rm = ref_map; rm; rm = rm->next)
|
for (rm = ref_map; rm; rm = rm->next)
|
||||||
rm->merge = 1;
|
rm->fetch_head_status = FETCH_HEAD_MERGE;
|
||||||
if (tags == TAGS_SET)
|
if (tags == TAGS_SET)
|
||||||
get_fetch_map(remote_refs, tag_refspec, &tail, 0);
|
get_fetch_map(remote_refs, tag_refspec, &tail, 0);
|
||||||
} else {
|
} else {
|
||||||
@ -186,7 +186,7 @@ static struct ref *get_ref_map(struct transport *transport,
|
|||||||
*autotags = 1;
|
*autotags = 1;
|
||||||
if (!i && !has_merge && ref_map &&
|
if (!i && !has_merge && ref_map &&
|
||||||
!remote->fetch[0].pattern)
|
!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
|
* 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");
|
ref_map = get_remote_ref(remote_refs, "HEAD");
|
||||||
if (!ref_map)
|
if (!ref_map)
|
||||||
die(_("Couldn't find remote ref HEAD"));
|
die(_("Couldn't find remote ref HEAD"));
|
||||||
ref_map->merge = 1;
|
ref_map->fetch_head_status = FETCH_HEAD_MERGE;
|
||||||
tail = &ref_map->next;
|
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;
|
const char *what, *kind;
|
||||||
struct ref *rm;
|
struct ref *rm;
|
||||||
char *url, *filename = dry_run ? "/dev/null" : git_path("FETCH_HEAD");
|
char *url, *filename = dry_run ? "/dev/null" : git_path("FETCH_HEAD");
|
||||||
int want_merge;
|
int want_status;
|
||||||
|
|
||||||
fp = fopen(filename, "a");
|
fp = fopen(filename, "a");
|
||||||
if (!fp)
|
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
|
* We do a pass for each fetch_head_status type in their enum order, so
|
||||||
* second pass writes the rest, in order to allow using
|
* merged entries are written before not-for-merge. That lets readers
|
||||||
* FETCH_HEAD as a refname to refer to the ref to be merged.
|
* 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) {
|
for (rm = ref_map; rm; rm = rm->next) {
|
||||||
struct ref *ref = NULL;
|
struct ref *ref = NULL;
|
||||||
|
const char *merge_status_marker = "";
|
||||||
|
|
||||||
commit = lookup_commit_reference_gently(rm->old_sha1, 1);
|
commit = lookup_commit_reference_gently(rm->old_sha1, 1);
|
||||||
if (!commit)
|
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;
|
continue;
|
||||||
|
|
||||||
if (rm->peer_ref) {
|
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 ", kind);
|
||||||
strbuf_addf(¬e, "'%s' of ", what);
|
strbuf_addf(¬e, "'%s' of ", what);
|
||||||
}
|
}
|
||||||
fprintf(fp, "%s\t%s\t%s",
|
switch (rm->fetch_head_status) {
|
||||||
sha1_to_hex(rm->old_sha1),
|
case FETCH_HEAD_NOT_FOR_MERGE:
|
||||||
rm->merge ? "" : "not-for-merge",
|
merge_status_marker = "not-for-merge";
|
||||||
note.buf);
|
/* fall-through */
|
||||||
for (i = 0; i < url_len; ++i)
|
case FETCH_HEAD_MERGE:
|
||||||
if ('\n' == url[i])
|
fprintf(fp, "%s\t%s\t%s",
|
||||||
fputs("\\n", fp);
|
sha1_to_hex(rm->old_sha1),
|
||||||
else
|
merge_status_marker,
|
||||||
fputc(url[i], fp);
|
note.buf);
|
||||||
fputc('\n', fp);
|
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);
|
strbuf_reset(¬e);
|
||||||
if (ref) {
|
if (ref) {
|
||||||
|
14
cache.h
14
cache.h
@ -1024,9 +1024,21 @@ struct ref {
|
|||||||
unsigned int
|
unsigned int
|
||||||
force:1,
|
force:1,
|
||||||
forced_update:1,
|
forced_update:1,
|
||||||
merge:1,
|
|
||||||
deletion:1,
|
deletion:1,
|
||||||
matched: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 {
|
enum {
|
||||||
REF_STATUS_NONE = 0,
|
REF_STATUS_NONE = 0,
|
||||||
REF_STATUS_OK,
|
REF_STATUS_OK,
|
||||||
|
Loading…
Reference in New Issue
Block a user