static void adjust_git_path(struct strbuf *buf, int git_dir_len) { const char *base = buf->buf + git_dir_len; if (git_graft_env && is_dir_file(base, "info", "grafts")) strbuf_splice(buf, 0, buf->len, get_graft_file(), strlen(get_graft_file())); else if (git_index_env && !strcmp(base, "index")) strbuf_splice(buf, 0, buf->len, get_index_file(), strlen(get_index_file())); else if (git_db_env && dir_prefix(base, "objects")) replace_dir(buf, git_dir_len + 7, get_object_directory()); else if (git_common_dir_env) update_common_dir(buf, git_dir_len); }
static int convert_graft_file(int force) { const char *graft_file = get_graft_file(); FILE *fp = fopen_or_warn(graft_file, "r"); struct strbuf buf = STRBUF_INIT, err = STRBUF_INIT; struct argv_array args = ARGV_ARRAY_INIT; if (!fp) return -1; while (strbuf_getline(&buf, fp) != EOF) { if (*buf.buf == '#') continue; argv_array_split(&args, buf.buf); if (args.argc && create_graft(args.argc, args.argv, force, 1)) strbuf_addf(&err, "\n\t%s", buf.buf); argv_array_clear(&args); } fclose(fp); strbuf_release(&buf); if (!err.len) return unlink_or_warn(graft_file); warning(_("could not convert the following graft(s):\n%s"), err.buf); strbuf_release(&err); return -1; }
static void prepare_commit_graft(void) { char *graft_file = get_graft_file(); FILE *fp = fopen(graft_file, "r"); char buf[1024]; if (!fp) { commit_graft = (struct commit_graft **) "hack"; return; } while (fgets(buf, sizeof(buf), fp)) { /* The format is just "Commit Parent1 Parent2 ...\n" */ int len = strlen(buf); int i; struct commit_graft *graft = NULL; if (buf[len-1] == '\n') buf[--len] = 0; if (buf[0] == '#') continue; if ((len + 1) % 41) { bad_graft_data: error("bad graft data: %s", buf); free(graft); continue; } i = (len + 1) / 41 - 1; graft = xmalloc(sizeof(*graft) + 20 * i); graft->nr_parent = i; if (get_sha1_hex(buf, graft->sha1)) goto bad_graft_data; for (i = 40; i < len; i += 41) { if (buf[i] != ' ') goto bad_graft_data; if (get_sha1_hex(buf + i + 1, graft->parent[i/41])) goto bad_graft_data; } i = commit_graft_pos(graft->sha1); if (0 <= i) { error("duplicate graft data: %s", buf); free(graft); continue; } i = -i - 1; if (commit_graft_alloc <= ++commit_graft_nr) { commit_graft_alloc = alloc_nr(commit_graft_alloc); commit_graft = xrealloc(commit_graft, sizeof(*commit_graft) * commit_graft_alloc); } if (i < commit_graft_nr) memmove(commit_graft + i + 1, commit_graft + i, (commit_graft_nr - i - 1) * sizeof(*commit_graft)); commit_graft[i] = graft; } fclose(fp); }