X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=fast-import.c;h=7089e6f9e6c5fa9142f468e54afe7d33a6d2eec7;hb=d14e7407b34b8c11b407358b9677c283c381a71c;hp=73e5439d97481a0e4dcaa17d025b27ec3fdcf41b;hpb=464509f790f409d95e0820364ef7296d82942d8c;p=git.git diff --git a/fast-import.c b/fast-import.c index 73e5439d9..7089e6f9e 100644 --- a/fast-import.c +++ b/fast-import.c @@ -890,7 +890,7 @@ static char *create_index(void) SHA1_Update(&ctx, (*c)->sha1, 20); } sha1write(f, pack_data->sha1, sizeof(pack_data->sha1)); - sha1close(f, NULL, 1); + sha1close(f, NULL, CSUM_FSYNC); free(idx); SHA1_Final(pack_data->sha1, &ctx); return tmpfile; @@ -1690,7 +1690,7 @@ static void skip_optional_lf(void) ungetc(term_char, stdin); } -static void cmd_mark(void) +static void parse_mark(void) { if (!prefixcmp(command_buf.buf, "mark :")) { next_mark = strtoumax(command_buf.buf + 6, NULL, 10); @@ -1700,7 +1700,7 @@ static void cmd_mark(void) next_mark = 0; } -static void cmd_data(struct strbuf *sb) +static void parse_data(struct strbuf *sb) { strbuf_reset(sb); @@ -1798,13 +1798,13 @@ static char *parse_ident(const char *buf) return ident; } -static void cmd_new_blob(void) +static void parse_new_blob(void) { static struct strbuf buf = STRBUF_INIT; read_next_command(); - cmd_mark(); - cmd_data(&buf); + parse_mark(); + parse_data(&buf); store_object(OBJ_BLOB, &buf, &last_blob, NULL, next_mark); } @@ -1868,6 +1868,7 @@ static void file_change_m(struct branch *b) case S_IFREG | 0644: case S_IFREG | 0755: case S_IFLNK: + case S_IFGITLINK: case 0644: case 0755: /* ok */ @@ -1900,7 +1901,20 @@ static void file_change_m(struct branch *b) p = uq.buf; } - if (inline_data) { + if (S_ISGITLINK(mode)) { + if (inline_data) + die("Git links cannot be specified 'inline': %s", + command_buf.buf); + else if (oe) { + if (oe->type != OBJ_COMMIT) + die("Not a commit (actually a %s): %s", + typename(oe->type), command_buf.buf); + } + /* + * Accept the sha1 without checking; it expected to be in + * another repository. + */ + } else if (inline_data) { static struct strbuf buf = STRBUF_INIT; if (p != uq.buf) { @@ -1908,7 +1922,7 @@ static void file_change_m(struct branch *b) p = uq.buf; } read_next_command(); - cmd_data(&buf); + parse_data(&buf); store_object(OBJ_BLOB, &buf, &last_blob, sha1, 0); } else if (oe) { if (oe->type != OBJ_BLOB) @@ -1995,7 +2009,7 @@ static void file_change_deleteall(struct branch *b) load_tree(&b->branch_tree); } -static void cmd_from_commit(struct branch *b, char *buf, unsigned long size) +static void parse_from_commit(struct branch *b, char *buf, unsigned long size) { if (!buf || size < 46) die("Not a valid commit: %s", sha1_to_hex(b->sha1)); @@ -2006,7 +2020,7 @@ static void cmd_from_commit(struct branch *b, char *buf, unsigned long size) b->branch_tree.versions[1].sha1); } -static void cmd_from_existing(struct branch *b) +static void parse_from_existing(struct branch *b) { if (is_null_sha1(b->sha1)) { hashclr(b->branch_tree.versions[0].sha1); @@ -2017,12 +2031,12 @@ static void cmd_from_existing(struct branch *b) buf = read_object_with_reference(b->sha1, commit_type, &size, b->sha1); - cmd_from_commit(b, buf, size); + parse_from_commit(b, buf, size); free(buf); } } -static int cmd_from(struct branch *b) +static int parse_from(struct branch *b) { const char *from; struct branch *s; @@ -2053,12 +2067,12 @@ static int cmd_from(struct branch *b) if (oe->pack_id != MAX_PACK_ID) { unsigned long size; char *buf = gfi_unpack_entry(oe, &size); - cmd_from_commit(b, buf, size); + parse_from_commit(b, buf, size); free(buf); } else - cmd_from_existing(b); + parse_from_existing(b); } else if (!get_sha1(from, b->sha1)) - cmd_from_existing(b); + parse_from_existing(b); else die("Invalid ref name or SHA1 expression: %s", from); @@ -2066,7 +2080,7 @@ static int cmd_from(struct branch *b) return 1; } -static struct hash_list *cmd_merge(unsigned int *count) +static struct hash_list *parse_merge(unsigned int *count) { struct hash_list *list = NULL, *n, *e = e; const char *from; @@ -2107,7 +2121,7 @@ static struct hash_list *cmd_merge(unsigned int *count) return list; } -static void cmd_new_commit(void) +static void parse_new_commit(void) { static struct strbuf msg = STRBUF_INIT; struct branch *b; @@ -2124,7 +2138,7 @@ static void cmd_new_commit(void) b = new_branch(sp); read_next_command(); - cmd_mark(); + parse_mark(); if (!prefixcmp(command_buf.buf, "author ")) { author = parse_ident(command_buf.buf + 7); read_next_command(); @@ -2135,10 +2149,10 @@ static void cmd_new_commit(void) } if (!committer) die("Expected committer but didn't get one"); - cmd_data(&msg); + parse_data(&msg); read_next_command(); - cmd_from(b); - merge_list = cmd_merge(&merge_count); + parse_from(b); + merge_list = parse_merge(&merge_count); /* ensure the branch is active/loaded */ if (!b->branch_tree.tree || !max_active_branches) { @@ -2196,7 +2210,7 @@ static void cmd_new_commit(void) b->last_commit = object_count_by_type[OBJ_COMMIT]; } -static void cmd_new_tag(void) +static void parse_new_tag(void) { static struct strbuf msg = STRBUF_INIT; char *sp; @@ -2253,7 +2267,7 @@ static void cmd_new_tag(void) /* tag payload/message */ read_next_command(); - cmd_data(&msg); + parse_data(&msg); /* build the tag object */ strbuf_reset(&new_data); @@ -2273,7 +2287,7 @@ static void cmd_new_tag(void) t->pack_id = pack_id; } -static void cmd_reset_branch(void) +static void parse_reset_branch(void) { struct branch *b; char *sp; @@ -2293,12 +2307,12 @@ static void cmd_reset_branch(void) else b = new_branch(sp); read_next_command(); - cmd_from(b); + parse_from(b); if (command_buf.len > 0) unread_command_buf = 1; } -static void cmd_checkpoint(void) +static void parse_checkpoint(void) { if (object_count) { cycle_packfile(); @@ -2309,7 +2323,7 @@ static void cmd_checkpoint(void) skip_optional_lf(); } -static void cmd_progress(void) +static void parse_progress(void) { fwrite(command_buf.buf, 1, command_buf.len, stdout); fputc('\n', stdout); @@ -2352,7 +2366,7 @@ static void import_marks(const char *input_file) fclose(f); } -static int git_pack_config(const char *k, const char *v) +static int git_pack_config(const char *k, const char *v, void *cb) { if (!strcmp(k, "pack.depth")) { max_depth = git_config_int(k, v); @@ -2370,18 +2384,18 @@ static int git_pack_config(const char *k, const char *v) pack_compression_seen = 1; return 0; } - return git_default_config(k, v); + return git_default_config(k, v, cb); } static const char fast_import_usage[] = -"git-fast-import [--date-format=f] [--max-pack-size=n] [--depth=n] [--active-branches=n] [--export-marks=marks.file]"; +"git fast-import [--date-format=f] [--max-pack-size=n] [--depth=n] [--active-branches=n] [--export-marks=marks.file]"; int main(int argc, const char **argv) { unsigned int i, show_stats = 1; setup_git_directory(); - git_config(git_pack_config); + git_config(git_pack_config, NULL); if (!pack_compression_seen && core_compression_seen) pack_compression_level = core_compression_level; @@ -2449,17 +2463,17 @@ int main(int argc, const char **argv) set_die_routine(die_nicely); while (read_next_command() != EOF) { if (!strcmp("blob", command_buf.buf)) - cmd_new_blob(); + parse_new_blob(); else if (!prefixcmp(command_buf.buf, "commit ")) - cmd_new_commit(); + parse_new_commit(); else if (!prefixcmp(command_buf.buf, "tag ")) - cmd_new_tag(); + parse_new_tag(); else if (!prefixcmp(command_buf.buf, "reset ")) - cmd_reset_branch(); + parse_reset_branch(); else if (!strcmp("checkpoint", command_buf.buf)) - cmd_checkpoint(); + parse_checkpoint(); else if (!prefixcmp(command_buf.buf, "progress ")) - cmd_progress(); + parse_progress(); else die("Unsupported command: %s", command_buf.buf); }