505
strbuf_release(&truname);
506
}
507
508
- if (!strcmp(remote, "FETCH_HEAD") &&
509
- !access(git_path("FETCH_HEAD"), R_OK)) {
510
- const char *filename;
511
- FILE *fp;
512
- struct strbuf line = STRBUF_INIT;
513
- char *ptr;
514
-
515
- filename = git_path("FETCH_HEAD");
516
- fp = fopen(filename, "r");
517
- if (!fp)
518
- die_errno(_("could not open '%s' for reading"),
519
- filename);
520
- strbuf_getline(&line, fp, '\n');
521
- fclose(fp);
522
- ptr = strstr(line.buf, "\tnot-for-merge\t");
523
- if (ptr)
524
- strbuf_remove(&line, ptr-line.buf+1, 13);
525
- strbuf_addbuf(msg, &line);
526
- strbuf_release(&line);
527
- goto cleanup;
528
- }
529
-
508
if (remote_head->util) {
509
struct merge_remote_desc *desc;
510
desc = merge_remote_util(remote_head);
1068
strbuf_setlen(merge_msg, merge_msg->len - 1);
1069
}
1070
1071
+static void handle_fetch_head(struct commit_list **remotes, struct strbuf *merge_names)
1072
+{
1073
+ const char *filename;
1074
+ int fd, pos, npos;
1075
+ struct strbuf fetch_head_file = STRBUF_INIT;
1076
+
1077
+ if (!merge_names)
1078
+ merge_names = &fetch_head_file;
1079
+
1080
+ filename = git_path("FETCH_HEAD");
1081
+ fd = open(filename, O_RDONLY);
1082
+ if (fd < 0)
1083
+ die_errno(_("could not open '%s' for reading"), filename);
1084
+
1085
+ if (strbuf_read(merge_names, fd, 0) < 0)
1086
+ die_errno(_("could not read '%s'"), filename);
1087
+ if (close(fd) < 0)
1088
+ die_errno(_("could not close '%s'"), filename);
1089
+
1090
+ for (pos = 0; pos < merge_names->len; pos = npos) {
1091
+ unsigned char sha1[20];
1092
+ char *ptr;
1093
+ struct commit *commit;
1094
+
1095
+ ptr = strchr(merge_names->buf + pos, '\n');
1096
+ if (ptr)
1097
+ npos = ptr - merge_names->buf + 1;
1098
+ else
1099
+ npos = merge_names->len;
1100
+
1101
+ if (npos - pos < 40 + 2 ||
1102
+ get_sha1_hex(merge_names->buf + pos, sha1))
1103
+ commit = NULL; /* bad */
1104
+ else if (memcmp(merge_names->buf + pos + 40, "\t\t", 2))
1105
+ continue; /* not-for-merge */
1106
+ else {
1107
+ char saved = merge_names->buf[pos + 40];
1108
+ merge_names->buf[pos + 40] = '\0';
1109
+ commit = get_merge_parent(merge_names->buf + pos);
1110
+ merge_names->buf[pos + 40] = saved;
1111
+ }
1112
+ if (!commit) {
1113
+ if (ptr)
1114
+ *ptr = '\0';
1115
+ die("not something we can merge in %s: %s",
1116
+ filename, merge_names->buf + pos);
1117
+ }
1118
+ remotes = &commit_list_insert(commit, remotes)->next;
1119
+ }
1120
+
1121
+ if (merge_names == &fetch_head_file)
1122
+ strbuf_release(&fetch_head_file);
1123
+}
1124
+
1125
static struct commit_list *collect_parents(struct commit *head_commit,
1126
int *head_subsumed,
1127
int argc, const char **argv,
1137
1138
if (head_commit)
1139
remotes = &commit_list_insert(head_commit, remotes)->next;
1108
- for (i = 0; i < argc; i++) {
1109
- struct commit *commit = get_merge_parent(argv[i]);
1110
- if (!commit)
1111
- help_unknown_ref(argv[i], "merge",
1112
- "not something we can merge");
1113
- remotes = &commit_list_insert(commit, remotes)->next;
1114
- }
1140
1116
- remoteheads = reduce_parents(head_commit, head_subsumed, remoteheads);
1141
+ if (argc == 1 && !strcmp(argv[0], "FETCH_HEAD")) {
1142
+ handle_fetch_head(remotes, autogen);
1143
+ remoteheads = reduce_parents(head_commit, head_subsumed, remoteheads);
1144
+ } else {
1145
+ for (i = 0; i < argc; i++) {
1146
+ struct commit *commit = get_merge_parent(argv[i]);
1147
+ if (!commit)
1148
+ help_unknown_ref(argv[i], "merge",
1149
+ "not something we can merge");
1150
+ remotes = &commit_list_insert(commit, remotes)->next;
1151
+ }
1152
+ remoteheads = reduce_parents(head_commit, head_subsumed, remoteheads);
1153
+ if (autogen) {
1154
+ struct commit_list *p;
1155
+ for (p = remoteheads; p; p = p->next)
1156
+ merge_name(merge_remote_util(p->item)->name, autogen);
1157
+ }
1158
+ }
1159
1160
if (autogen) {
1119
- struct commit_list *p;
1120
- for (p = remoteheads; p; p = p->next)
1121
- merge_name(merge_remote_util(p->item)->name, autogen);
1122
-
1161
prepare_merge_message(autogen, merge_msg);
1162
strbuf_release(autogen);
1163
}