{"thread":{"id":"19939","subject":"A few fast export fixups -- round 3","startedAt":"2009-06-26T04:48:26Z","lastAt":"2009-06-26T04:48:33Z","messageCount":8,"participants":["newren@gmail.com"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"116990","messageId":"1245991713-12782-1-git-send-email-newren@gmail.com","threadId":"19939","inReplyTo":null,"subject":"A few fast export fixups -- round 3","fromName":"","fromEmail":"newren@gmail.com","sentAt":"2009-06-26T04:48:26Z","receivedAt":"2009-06-26T04:48:26Z","isPatch":false,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"This patch series fixes a few fast-export bugs I have come across,\nplus some new testcases to verify the fixes, a testcase to document a\npre-existing failure, and finally a small addition to the\ndocumentation.\n\nChanges since v1:\n  - fixed test issues identified by Johannes Sixt and Stephen Boyd\n  - squashed patch #2 into patch #1\n\nChanges since v2:\n  - several changes and improvements suggested by Junio (moving code\n    to different functions, avoiding exporting functionality from\n    revision.c, improved commit messages)\n  - new patch to ensure invariants created by setup_revisions are\n    respected (set revs flags before calling setup_revisions, rather\n    than after)\n  - now also catches and omits tags of tags of trees, tags of tags of\n    tags of trees, etc.\n  - remove some now-obsoleted code\n  - There are two new cases I'm aware of in which fast-export produces\n    broken \"(null)\" refs; I'm not sure how/where to fix these (or even\n    what correct behavior is in one of the cases), but they are no worse\n    than before and I've at least added a test documenting that we know\n    that there's a case that is (still) broken.\n\nElijah Newren (7):\n      fast-export: Set revs.topo_order before calling setup_revisions\n      fast-export: Omit tags that tag trees\n      fast-export: Make sure we show actual ref names instead of \"(null)\"\n      fast-export: Do parent rewriting to avoid dropping relevant commits\n      fast-export: Add a --tag-of-filtered-object option for newly dangling tags\n      Add new fast-export testcases\n      fast-export: Document the fact that git-rev-list arguments are accepted\n\n Documentation/git-fast-export.txt |   17 +++++++\n builtin-fast-export.c             |   82 +++++++++++++++++++++++++++++---\n t/t9301-fast-export.sh            |   96 ++++++++++++++++++++++++++++++++++++-\n 3 files changed, 187 insertions(+), 8 deletions(-)\n"},{"id":"116991","messageId":"1245991713-12782-2-git-send-email-newren@gmail.com","threadId":"19939","inReplyTo":"1245991713-12782-1-git-send-email-newren@gmail.com","subject":"[PATCHv3 1/7] fast-export: Set revs.topo_order before calling setup_revisions","fromName":"","fromEmail":"newren@gmail.com","sentAt":"2009-06-26T04:48:27Z","receivedAt":"2009-06-26T04:48:27Z","isPatch":false,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nsetup_revisions sets a variety of flags based on the setting of other\nflags, such as setting the limited flag when topo_order is set.  To avoid\ncircumventing any invariants created by setup_revisions, we set\nrevs.topo_order before calling it rather than after.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\nThis patch is new since the last series.\n\n builtin-fast-export.c |    2 +-\n 1 files changed, 1 insertions(+), 1 deletions(-)\n\ndiff --git a/builtin-fast-export.c b/builtin-fast-export.c\nindex 6cef810..e0cfa60 100644\n--- a/builtin-fast-export.c\n+++ b/builtin-fast-export.c\n@@ -514,6 +514,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)\n \tgit_config(git_default_config, NULL);\n \n \tinit_revisions(&revs, prefix);\n+\trevs.topo_order = 1;\n \targc = setup_revisions(argc, argv, &revs, NULL);\n \targc = parse_options(argc, argv, prefix, options, fast_export_usage, 0);\n \tif (argc > 1)\n@@ -524,7 +525,6 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)\n \n \tget_tags_and_duplicates(&revs.pending, &extra_refs);\n \n-\trevs.topo_order = 1;\n \tif (prepare_revision_walk(&revs))\n \t\tdie(\"revision walk setup failed\");\n \trevs.diffopt.format_callback = show_filemodify;\n-- \n1.6.3.2.323.geb889\n"},{"id":"116994","messageId":"1245991713-12782-3-git-send-email-newren@gmail.com","threadId":"19939","inReplyTo":"1245991713-12782-1-git-send-email-newren@gmail.com","subject":"[PATCHv3 2/7] fast-export: Omit tags that tag trees","fromName":"","fromEmail":"newren@gmail.com","sentAt":"2009-06-26T04:48:28Z","receivedAt":"2009-06-26T04:48:28Z","isPatch":false,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nCommit c0582c53bcf4e83bba70e1ad23abbad31f96ebc8 introduced logic to just\nomit tags that point to tree objects.  However, these objects were still\nbeing output and were pointing at \"mark :0\", which caused fast-import to\ncrash.  This patch makes sure such tags (including deeper nestings such\nas tags of tags of trees), are omitted.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\nSince the last series, the code has been moved to the handle_tag\nfunction, as suggested by Junio.  Also, it now correctly catches and\nomits tags of tags of trees, tags of tags of tags of trees, etc.\n\n builtin-fast-export.c  |   15 +++++++++++++++\n t/t9301-fast-export.sh |    8 +++++++-\n 2 files changed, 22 insertions(+), 1 deletions(-)\n\ndiff --git a/builtin-fast-export.c b/builtin-fast-export.c\nindex e0cfa60..8c90a2d 100644\n--- a/builtin-fast-export.c\n+++ b/builtin-fast-export.c\n@@ -289,6 +289,21 @@ static void handle_tag(const char *name, struct tag *tag)\n \tchar *buf;\n \tconst char *tagger, *tagger_end, *message;\n \tsize_t message_size = 0;\n+\tstruct object *tagged;\n+\n+\t/* Trees have no identifer in fast-export output, thus we have no way\n+\t * to output tags of trees, tags of tags of trees, etc.  Simply omit\n+\t * such tags.\n+\t */\n+\ttagged = tag->tagged;\n+\twhile (tagged->type == OBJ_TAG) {\n+\t\ttagged = ((struct tag *)tagged)->tagged;\n+\t}\n+\tif (tagged->type == OBJ_TREE) {\n+\t\twarning(\"Omitting tag %s,\\nsince tags of trees (or tags of tags of trees, etc.) are not supported.\",\n+\t\t\tsha1_to_hex(tag->object.sha1));\n+\t\treturn;\n+\t}\n \n \tbuf = read_sha1_file(tag->object.sha1, &type, &size);\n \tif (!buf)\ndiff --git a/t/t9301-fast-export.sh b/t/t9301-fast-export.sh\nindex 8c8a9e6..3f13e6b 100755\n--- a/t/t9301-fast-export.sh\n+++ b/t/t9301-fast-export.sh\n@@ -271,8 +271,14 @@ test_expect_success 'set-up a few more tags for tag export tests' '\n \tgit tag -a tag-obj_tag-obj -m \"tagging a tag\" tree_tag-obj\n '\n \n+test_expect_success 'tree_tag'        '\n+\tmkdir result &&\n+\t(cd result && git init) &&\n+\tgit fast-export tree_tag > fe-stream &&\n+\t(cd result && git fast-import < ../fe-stream)\n+'\n+\n # NEEDSWORK: not just check return status, but validate the output\n-test_expect_success 'tree_tag'        'git fast-export tree_tag'\n test_expect_success 'tree_tag-obj'    'git fast-export tree_tag-obj'\n test_expect_success 'tag-obj_tag'     'git fast-export tag-obj_tag'\n test_expect_success 'tag-obj_tag-obj' 'git fast-export tag-obj_tag-obj'\n-- \n1.6.3.2.323.geb889\n"},{"id":"116992","messageId":"1245991713-12782-4-git-send-email-newren@gmail.com","threadId":"19939","inReplyTo":"1245991713-12782-1-git-send-email-newren@gmail.com","subject":"[PATCHv3 3/7] fast-export: Make sure we show actual ref names instead of \"(null)\"","fromName":"","fromEmail":"newren@gmail.com","sentAt":"2009-06-26T04:48:29Z","receivedAt":"2009-06-26T04:48:29Z","isPatch":false,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nThe code expects a ref name to be provided in commit->util.  While there\nwas some code to set commit->util, it only worked in cases where there was\nan unbroken chain of revisions from a ref to the relevant commit.  In\ncases such as running\n   git fast-export --parents master -- COPYING\ncommit->util would fail to be set.  The old method of setting commit->util\nhas been removed in favor of requesting show_source from the revision\ntraversal machinery (related to the \"--source\" option of \"git log\" family\nof commands.)\n\nHowever, this change does not fix cases like\n   git fast export master~1\nor\n   git fast export :/arguments\nsince in such cases commit->util will be \"master~1\" or \":/arguments\" while\nwe need the actual ref (e.g. \"refs/heads/master\")\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\nSince the last series, some now-obsolete code has been removed.  Also,\nthe commit message now points out two cases that continue to fail with\nthis patch.  For the second of those cases (the :/arguments one), I'm\nnot sure that I even know what correct behavior would be.\n\n builtin-fast-export.c |    5 +----\n 1 files changed, 1 insertions(+), 4 deletions(-)\n\ndiff --git a/builtin-fast-export.c b/builtin-fast-export.c\nindex 8c90a2d..43a7e17 100644\n--- a/builtin-fast-export.c\n+++ b/builtin-fast-export.c\n@@ -530,6 +530,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)\n \n \tinit_revisions(&revs, prefix);\n \trevs.topo_order = 1;\n+\trevs.show_source = 1;\n \targc = setup_revisions(argc, argv, &revs, NULL);\n \targc = parse_options(argc, argv, prefix, options, fast_export_usage, 0);\n \tif (argc > 1)\n@@ -546,11 +547,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)\n \tDIFF_OPT_SET(&revs.diffopt, RECURSIVE);\n \twhile ((commit = get_revision(&revs))) {\n \t\tif (has_unshown_parent(commit)) {\n-\t\t\tstruct commit_list *parent = commit->parents;\n \t\t\tadd_object_array(&commit->object, NULL, &commits);\n-\t\t\tfor (; parent; parent = parent->next)\n-\t\t\t\tif (!parent->item->util)\n-\t\t\t\t\tparent->item->util = commit->util;\n \t\t}\n \t\telse {\n \t\t\thandle_commit(commit, &revs);\n-- \n1.6.3.2.323.geb889\n"},{"id":"116997","messageId":"1245991713-12782-5-git-send-email-newren@gmail.com","threadId":"19939","inReplyTo":"1245991713-12782-1-git-send-email-newren@gmail.com","subject":"[PATCHv3 4/7] fast-export: Do parent rewriting to avoid dropping relevant commits","fromName":"","fromEmail":"newren@gmail.com","sentAt":"2009-06-26T04:48:30Z","receivedAt":"2009-06-26T04:48:30Z","isPatch":false,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nWhen specifying paths to export, parent rewriting must be turned on for\nfast-export to output anything at all.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\nNo change to this patch since the last series.\n\n builtin-fast-export.c |    1 +\n 1 files changed, 1 insertions(+), 0 deletions(-)\n\ndiff --git a/builtin-fast-export.c b/builtin-fast-export.c\nindex 43a7e17..9b8bd37 100644\n--- a/builtin-fast-export.c\n+++ b/builtin-fast-export.c\n@@ -531,6 +531,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)\n \tinit_revisions(&revs, prefix);\n \trevs.topo_order = 1;\n \trevs.show_source = 1;\n+\trevs.rewrite_parents = 1;\n \targc = setup_revisions(argc, argv, &revs, NULL);\n \targc = parse_options(argc, argv, prefix, options, fast_export_usage, 0);\n \tif (argc > 1)\n-- \n1.6.3.2.323.geb889\n"},{"id":"116995","messageId":"1245991713-12782-6-git-send-email-newren@gmail.com","threadId":"19939","inReplyTo":"1245991713-12782-1-git-send-email-newren@gmail.com","subject":"[PATCHv3 5/7] fast-export: Add a --tag-of-filtered-object option for newly dangling tags","fromName":"","fromEmail":"newren@gmail.com","sentAt":"2009-06-26T04:48:31Z","receivedAt":"2009-06-26T04:48:31Z","isPatch":false,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nWhen providing a list of paths to limit what is exported, the object that\na tag points to can be filtered out entirely.  This new switch allows\nthe user to specify what should happen to the tag in such a case.  The\ndefault action, 'abort' will exit with an error message.  With 'drop', the\ntag will simply be omitted from the output.  With 'rewrite', if the object\ntagged was a commit, the tag will be modified to tag an alternate commit.\nThe alternate commit is determined by treating the original commit as the\n\"parent\" of the tag and then using the parent rewriting algorithm of the\nrevision traversal machinery (related to the \"--parents\" option of \"git\nrev-list\")\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\nSince the last series, this patch was changed to simply copy the\nrelevant code from rewrite_one() rather than exporting that function\nout of revision.c, as requested by Junio.  The commit message was also\nclarified a bit.\n\n Documentation/git-fast-export.txt |   11 +++++++\n builtin-fast-export.c             |   59 +++++++++++++++++++++++++++++++++++-\n 2 files changed, 68 insertions(+), 2 deletions(-)\n\ndiff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.txt\nindex 0c9eb56..194abde 100644\n--- a/Documentation/git-fast-export.txt\n+++ b/Documentation/git-fast-export.txt\n@@ -36,6 +36,17 @@ when encountering a signed tag.  With 'strip', the tags will be made\n unsigned, with 'verbatim', they will be silently exported\n and with 'warn', they will be exported, but you will see a warning.\n \n+--tag-of-filtered-object=(abort|drop|rewrite)::\n+\tSpecify how to handle tags whose tagged objectis filtered out.\n+\tSince revisions and files to export can be limited by path,\n+\ttagged objects may be filtered completely.\n++\n+When asking to 'abort' (which is the default), this program will die\n+when encountering such a tag.  With 'drop' it will omit such tags from\n+the output.  With 'rewrite', if the tagged object is a commit, it will\n+rewrite the tag to tag an ancestor commit (via parent rewriting; see\n+linkgit:git-rev-list[1])\n+\n -M::\n -C::\n \tPerform move and/or copy detection, as described in the\ndiff --git a/builtin-fast-export.c b/builtin-fast-export.c\nindex 9b8bd37..dc2c6ab 100644\n--- a/builtin-fast-export.c\n+++ b/builtin-fast-export.c\n@@ -23,7 +23,8 @@ static const char *fast_export_usage[] = {\n };\n \n static int progress;\n-static enum { VERBATIM, WARN, STRIP, ABORT } signed_tag_mode = ABORT;\n+static enum { ABORT, VERBATIM, WARN, STRIP } signed_tag_mode = ABORT;\n+static enum { ERROR, DROP, REWRITE } tag_of_filtered_mode = ABORT;\n static int fake_missing_tagger;\n \n static int parse_opt_signed_tag_mode(const struct option *opt,\n@@ -42,6 +43,20 @@ static int parse_opt_signed_tag_mode(const struct option *opt,\n \treturn 0;\n }\n \n+static int parse_opt_tag_of_filtered_mode(const struct option *opt,\n+\t\t\t\t\t  const char *arg, int unset)\n+{\n+\tif (unset || !strcmp(arg, \"abort\"))\n+\t\ttag_of_filtered_mode = ABORT;\n+\telse if (!strcmp(arg, \"drop\"))\n+\t\ttag_of_filtered_mode = DROP;\n+\telse if (!strcmp(arg, \"rewrite\"))\n+\t\ttag_of_filtered_mode = REWRITE;\n+\telse\n+\t\treturn error(\"Unknown tag-of-filtered mode: %s\", arg);\n+\treturn 0;\n+}\n+\n static struct decoration idnums;\n static uint32_t last_idnum;\n \n@@ -290,6 +305,8 @@ static void handle_tag(const char *name, struct tag *tag)\n \tconst char *tagger, *tagger_end, *message;\n \tsize_t message_size = 0;\n \tstruct object *tagged;\n+\tint tagged_mark;\n+\tstruct commit *p;\n \n \t/* Trees have no identifer in fast-export output, thus we have no way\n \t * to output tags of trees, tags of tags of trees, etc.  Simply omit\n@@ -348,10 +365,45 @@ static void handle_tag(const char *name, struct tag *tag)\n \t\t\t}\n \t}\n \n+\t/* handle tag->tagged having been filtered out due to paths specified */\n+\ttagged = tag->tagged;\n+\ttagged_mark = get_object_mark(tagged);\n+\tif (!tagged_mark) {\n+\t\tswitch(tag_of_filtered_mode) {\n+\t\tcase ABORT:\n+\t\t\tdie (\"Tag %s tags unexported object; use \"\n+\t\t\t     \"--tag-of-filtered-object=<mode> to handle it.\",\n+\t\t\t     sha1_to_hex(tag->object.sha1));\n+\t\tcase DROP:\n+\t\t\t/* Ignore this tag altogether */\n+\t\t\treturn;\n+\t\tcase REWRITE:\n+\t\t\tif (tagged->type != OBJ_COMMIT) {\n+\t\t\t\tdie (\"Tag %s tags unexported %s!\",\n+\t\t\t\t     sha1_to_hex(tag->object.sha1),\n+\t\t\t\t     typename(tagged->type));\n+\t\t\t}\n+\t\t\tp = (struct commit *)tagged;\n+\t\t\tfor (;;) {\n+\t\t\t\tif (p->parents && p->parents->next)\n+\t\t\t\t\tbreak;\n+\t\t\t\tif (p->object.flags & UNINTERESTING)\n+\t\t\t\t\tbreak;\n+\t\t\t\tif (!(p->object.flags & TREESAME))\n+\t\t\t\t\tbreak;\n+\t\t\t\tif (!p->parents)\n+\t\t\t\t\tdie (\"Can't find replacement commit for tag %s\\n\",\n+\t\t\t\t\t     sha1_to_hex(tag->object.sha1));\n+\t\t\t\tp = p->parents->item;\n+\t\t\t}\n+\t\t\ttagged_mark = get_object_mark(&p->object);\n+\t\t}\n+\t}\n+\n \tif (!prefixcmp(name, \"refs/tags/\"))\n \t\tname += 10;\n \tprintf(\"tag %s\\nfrom :%d\\n%.*s%sdata %d\\n%.*s\\n\",\n-\t       name, get_object_mark(tag->tagged),\n+\t       name, tagged_mark,\n \t       (int)(tagger_end - tagger), tagger,\n \t       tagger == tagger_end ? \"\" : \"\\n\",\n \t       (int)message_size, (int)message_size, message ? message : \"\");\n@@ -513,6 +565,9 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)\n \t\tOPT_CALLBACK(0, \"signed-tags\", &signed_tag_mode, \"mode\",\n \t\t\t     \"select handling of signed tags\",\n \t\t\t     parse_opt_signed_tag_mode),\n+\t\tOPT_CALLBACK(0, \"tag-of-filtered-object\", &tag_of_filtered_mode, \"mode\",\n+\t\t\t     \"select handling of tags that tag filtered objects\",\n+\t\t\t     parse_opt_tag_of_filtered_mode),\n \t\tOPT_STRING(0, \"export-marks\", &export_filename, \"FILE\",\n \t\t\t     \"Dump marks to this file\"),\n \t\tOPT_STRING(0, \"import-marks\", &import_filename, \"FILE\",\n-- \n1.6.3.2.323.geb889\n"},{"id":"116996","messageId":"1245991713-12782-7-git-send-email-newren@gmail.com","threadId":"19939","inReplyTo":"1245991713-12782-1-git-send-email-newren@gmail.com","subject":"[PATCHv3 6/7] Add new fast-export testcases","fromName":"","fromEmail":"newren@gmail.com","sentAt":"2009-06-26T04:48:32Z","receivedAt":"2009-06-26T04:48:32Z","isPatch":false,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\nThe testcases test the new --tag-of-filtered-object option, the output\nwhen limiting what to export by path, and test behavior when no\nexact-ref revision is included (e.g. master~8 present on command line\nbut not master).\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\nSince the last series, one new testcase was added to document that running\nwith arguments like 'master~3' or 'master~7..master~2' are still broken.\n\n t/t9301-fast-export.sh |   88 ++++++++++++++++++++++++++++++++++++++++++++++++\n 1 files changed, 88 insertions(+), 0 deletions(-)\n\ndiff --git a/t/t9301-fast-export.sh b/t/t9301-fast-export.sh\nindex 3f13e6b..356964e 100755\n--- a/t/t9301-fast-export.sh\n+++ b/t/t9301-fast-export.sh\n@@ -262,6 +262,94 @@ test_expect_success 'cope with tagger-less tags' '\n \n '\n \n+test_expect_success 'setup for limiting exports by PATH' '\n+\tmkdir limit-by-paths &&\n+\tcd limit-by-paths &&\n+\tgit init &&\n+\techo hi > there &&\n+\tgit add there &&\n+\tgit commit -m \"First file\" &&\n+\techo foo > bar &&\n+\tgit add bar &&\n+\tgit commit -m \"Second file\" &&\n+\tgit tag -a -m msg mytag &&\n+\techo morefoo >> bar &&\n+\tgit add bar &&\n+\tgit commit -m \"Change to second file\" &&\n+\tcd ..\n+'\n+\n+cat > limit-by-paths/expected << EOF\n+blob\n+mark :1\n+data 3\n+hi\n+\n+reset refs/tags/mytag\n+commit refs/tags/mytag\n+mark :2\n+author A U Thor <author@example.com> 1112912713 -0700\n+committer C O Mitter <committer@example.com> 1112912713 -0700\n+data 11\n+First file\n+M 100644 :1 there\n+\n+EOF\n+\n+test_expect_success 'dropping tag of filtered out object' '\n+\tcd limit-by-paths &&\n+\tgit fast-export --tag-of-filtered-object=drop mytag -- there > output &&\n+\ttest_cmp output expected &&\n+\tcd ..\n+'\n+\n+cat >> limit-by-paths/expected << EOF\n+tag mytag\n+from :2\n+tagger C O Mitter <committer@example.com> 1112912713 -0700\n+data 4\n+msg\n+\n+EOF\n+\n+test_expect_success 'rewriting tag of filtered out object' '\n+\tcd limit-by-paths &&\n+\tgit fast-export --tag-of-filtered-object=rewrite mytag -- there > output &&\n+\ttest_cmp output expected &&\n+\tcd ..\n+'\n+\n+cat > limit-by-paths/expected << EOF\n+blob\n+mark :1\n+data 4\n+foo\n+\n+blob\n+mark :2\n+data 3\n+hi\n+\n+reset refs/heads/master\n+commit refs/heads/master\n+mark :3\n+author A U Thor <author@example.com> 1112912713 -0700\n+committer C O Mitter <committer@example.com> 1112912713 -0700\n+data 12\n+Second file\n+M 100644 :1 bar\n+M 100644 :2 there\n+\n+EOF\n+\n+test_expect_failure 'no exact-ref revisions included' '\n+\tcd limit-by-paths &&\n+\tgit fast-export master~2..master~1 > output &&\n+\ttest_cmp output expected &&\n+\tcd ..\n+'\n+\n+\n test_expect_success 'set-up a few more tags for tag export tests' '\n \tgit checkout -f master &&\n \tHEAD_TREE=`git show -s --pretty=raw HEAD | grep tree | sed \"s/tree //\"` &&\n-- \n1.6.3.2.323.geb889\n"},{"id":"116993","messageId":"1245991713-12782-8-git-send-email-newren@gmail.com","threadId":"19939","inReplyTo":"1245991713-12782-1-git-send-email-newren@gmail.com","subject":"[PATCHv3 7/7] fast-export: Document the fact that git-rev-list arguments are accepted","fromName":"","fromEmail":"newren@gmail.com","sentAt":"2009-06-26T04:48:33Z","receivedAt":"2009-06-26T04:48:33Z","isPatch":false,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"From: Elijah Newren <newren@gmail.com>\n\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\nNo change since the last series.\n\n Documentation/git-fast-export.txt |    6 ++++++\n 1 files changed, 6 insertions(+), 0 deletions(-)\n\ndiff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.txt\nindex 194abde..af2328d 100644\n--- a/Documentation/git-fast-export.txt\n+++ b/Documentation/git-fast-export.txt\n@@ -82,6 +82,12 @@ marks the same across runs.\n \tallow that.  So fake a tagger to be able to fast-import the\n \toutput.\n \n+[git-rev-list-args...]::\n+       A list of arguments, acceptable to 'git-rev-parse' and\n+       'git-rev-list', that specifies the specific objects and references\n+       to export.  For example, `master\\~10..master` causes the\n+       current master reference to be exported along with all objects\n+       added since its 10th ancestor commit.\n \n EXAMPLES\n --------\n-- \n1.6.3.2.323.geb889\n"}]}