This series improves the incremental export story for fast-export and fast-import (--export-marks and --import-marks fell a bit short), fixes a couple small export/import bugs, and enables handling nested tags. In particular, the nested tags handling makes it so that fast-export and fast-import can finally handle the git.git repo. Changes since v2 (full range-diff below): - Code cleanup of patch 2 suggested by René Elijah Newren (8): fast-export: fix exporting a tag and nothing else fast-import: fix handling of deleted tags fast-import: allow tags to be identified by mark labels fast-import: add support for new 'alias' command fast-export: add support for --import-marks-if-exists fast-export: allow user to request tags be marked with --mark-tags t9350: add tests for tags of things other than a commit fast-export: handle nested tags Documentation/git-fast-export.txt | 17 ++++-- Documentation/git-fast-import.txt | 23 ++++++++ builtin/fast-export.c | 67 ++++++++++++++++------ fast-import.c | 92 +++++++++++++++++++++++++++---- t/t9300-fast-import.sh | 37 +++++++++++++ t/t9350-fast-export.sh | 68 +++++++++++++++++++++-- 6 files changed, 266 insertions(+), 38 deletions(-) Range-diff: 1: a30cfbbb50 = 1: a30cfbbb50 fast-export: fix exporting a tag and nothing else 2: 1d19498bc6 ! 2: 36fbf15134 fast-import: fix handling of deleted tags @@ Commit message So, either way nested tags imply the need to delete temporary inner tag references. + Helped-by: René Scharfe <l.s.r@xxxxxx> Signed-off-by: Elijah Newren <newren@xxxxxxxxx> ## fast-import.c ## +@@ fast-import.c: static void parse_new_tag(const char *arg) + static void parse_reset_branch(const char *arg) + { + struct branch *b; ++ const char *tag_name; + + b = lookup_branch(arg); + if (b) { @@ fast-import.c: static void parse_reset_branch(const char *arg) b = new_branch(arg); read_next_command(); parse_from(b); -+ if (b->delete && !strncmp(b->name, "refs/tags/", 10)) { ++ if (b->delete && skip_prefix(b->name, "refs/tags/", &tag_name)) { + /* + * Elsewhere, we call dump_branches() before dump_tags(), + * and dump_branches() will handle ref deletions first, so @@ fast-import.c: static void parse_reset_branch(const char *arg) + * NEEDSWORK: replace list of tags with hashmap for faster + * deletion? + */ -+ struct strbuf tag_name = STRBUF_INIT; + struct tag *t, *prev = NULL; + for (t = first_tag; t; t = t->next_tag) { -+ strbuf_reset(&tag_name); -+ strbuf_addf(&tag_name, "refs/tags/%s", t->name); -+ if (!strcmp(b->name, tag_name.buf)) ++ if (!strcmp(t->name, tag_name)) + break; + prev = t; + } 3: e1fd888e4a = 3: 3b5f4270f8 fast-import: allow tags to be identified by mark labels 4: 93175f28d9 = 4: 489c7fd854 fast-import: add support for new 'alias' command 5: 8c8743395c = 5: 38fd19caee fast-export: add support for --import-marks-if-exists 6: eebc40df33 = 6: 2017b8d9f9 fast-export: allow user to request tags be marked with --mark-tags 7: de39f703c6 = 7: 0efdbb81b1 t9350: add tests for tags of things other than a commit 8: ac739dbb79 = 8: fe7c27d786 fast-export: handle nested tags -- 2.23.0.264.g3b9f7f2fc6