You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ds...@apache.org on 2023/07/06 20:34:52 UTC
svn commit: r1910826 - /subversion/trunk/subversion/svn/svn.c
Author: dsahlberg
Date: Thu Jul 6 20:34:52 2023
New Revision: 1910826
URL: http://svn.apache.org/viewvc?rev=1910826&view=rev
Log:
First try to document the trailing-@ trick to avoid triggering the peg-revision
parser when a path/target/url contains an @ character.
* subversion/svn/svn.c:
(svn_cl__options declaration): Add [@] and description where needed
Discussed on mailing list:
https://lists.apache.org/thread/nb8d62wgj0mhlsv39z7qjgvkvp41sslv
Modified:
subversion/trunk/subversion/svn/svn.c
Modified: subversion/trunk/subversion/svn/svn.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/svn.c?rev=1910826&r1=1910825&r2=1910826&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/svn.c (original)
+++ subversion/trunk/subversion/svn/svn.c Thu Jul 6 20:34:52 2023
@@ -424,7 +424,7 @@ svn_cl__cmd_table_main[] =
{
{ "add", svn_cl__add, {0}, {N_(
"Put new files and directories under version control.\n"
- "usage: add PATH...\n"
+ "usage: add PATH[@]...\n"
"\n"), N_(
" Schedule unversioned PATHs for addition, so they will become versioned and\n"
" be added to the repository in the next commit. Recurse into directories by\n"
@@ -444,7 +444,9 @@ svn_cl__cmd_table_main[] =
"\n"), N_(
" The selection of items to add may be influenced by the 'ignores' feature.\n"
" Properties may be attached to the items as configured by the 'auto-props'\n"
- " feature.\n"
+ " feature.\n", N_(
+ " If PATH contains an @ character, an additional @ must be specified at the\n"
+ " end of PATH to avoid interpreting the first @ as a peg revision indicator.\n"
)},
{opt_targets, 'N', opt_depth, 'q', opt_force, opt_no_ignore, opt_autoprops,
opt_no_autoprops, opt_parents },
@@ -516,8 +518,8 @@ svn_cl__cmd_table_main[] =
{ "changelist", svn_cl__changelist, {"cl"}, {N_(
"Associate (or dissociate) changelist CLNAME with the named\n"
"files.\n"
- "usage: 1. changelist CLNAME PATH...\n"
- " 2. changelist --remove PATH...\n"
+ "usage: 1. changelist CLNAME PATH[@]...\n"
+ " 2. changelist --remove PATH[@]...\n"
)},
{ 'q', 'R', opt_depth, opt_remove, opt_targets, opt_changelist} },
@@ -539,6 +541,8 @@ svn_cl__cmd_table_main[] =
" out into a sub-directory of PATH, with the name of the sub-directory\n"
" being the basename of the URL.\n"
"\n"), N_(
+ " If PATH contains an @ character, an additional @ must be specified at the\n"
+ " end of PATH to avoid interpreting the first @ as a peg revision indicator.\n", N_(
" If --force is used, unversioned obstructing paths in the working\n"
" copy destination do not automatically cause the check out to fail.\n"
" If the obstructing path is the same type (file or directory) as the\n"
@@ -560,10 +564,10 @@ svn_cl__cmd_table_main[] =
{ "cleanup", svn_cl__cleanup, {0}, {N_(
"Either recover from an interrupted operation that left the working\n"
"copy locked, or remove unwanted files.\n"
- "usage: 1. cleanup [WCPATH...]\n"
- " 2. cleanup --remove-unversioned [WCPATH...]\n"
- " cleanup --remove-ignored [WCPATH...]\n"
- " 3. cleanup --vacuum-pristines [WCPATH...]\n"
+ "usage: 1. cleanup [WCPATH[@]...]\n"
+ " 2. cleanup --remove-unversioned [WCPATH[@]...]\n"
+ " cleanup --remove-ignored [WCPATH[@]...]\n"
+ " 3. cleanup --vacuum-pristines [WCPATH[@]...]\n"
"\n"), N_(
" 1. When none of the options --remove-unversioned, --remove-ignored, and\n"
" --vacuum-pristines is specified, remove all write locks (shown as 'L' by\n"
@@ -583,7 +587,9 @@ svn_cl__cmd_table_main[] =
"\n"), N_(
" 3. If the --vacuum-pristines option is given, remove pristine copies of\n"
" files which are stored inside the .svn directory and which are no longer\n"
- " referenced by any file in the working copy.\n"
+ " referenced by any file in the working copy.\n", N_(
+ " If WCPATH contains an @ character, an additional @ must be specified at the\n"
+ " end of WCPATH to avoid interpreting the first @ as a peg revision indicator.\n"
)},
{ opt_remove_unversioned, opt_remove_ignored, opt_vacuum_pristines,
opt_include_externals, 'q', opt_merge_cmd },
@@ -591,7 +597,7 @@ svn_cl__cmd_table_main[] =
{ "commit", svn_cl__commit, {"ci"}, {N_(
"Send changes from your working copy to the repository.\n"
- "usage: commit [PATH...]\n"
+ "usage: commit [PATH[@]...]\n"
"\n"), N_(
" A log message must be provided, but it can be empty. If it is not\n"
" given by a --message or --file option, an editor will be started.\n"
@@ -601,7 +607,9 @@ svn_cl__cmd_table_main[] =
"\n"), N_(
" If --include-externals is given, also commit file and directory\n"
" externals reached by recursion. Do not commit externals with a\n"
- " fixed revision.\n"
+ " fixed revision.\n", N_(
+ " If PATH contains an @ character, an additional @ must be specified at the\n"
+ " end of PATH to avoid interpreting the first @ as a peg revision indicator.\n"
)},
{'q', 'N', opt_depth, opt_targets, opt_no_unlock, SVN_CL__LOG_MSG_OPTIONS,
opt_changelist, opt_keep_changelists, opt_include_externals},
@@ -609,7 +617,7 @@ svn_cl__cmd_table_main[] =
{ "copy", svn_cl__copy, {"cp"}, {N_(
"Copy files and directories in a working copy or repository.\n"
- "usage: copy SRC[@REV]... DST\n"
+ "usage: copy SRC[@REV]... DST[@]\n"
"\n"), N_(
" SRC and DST can each be either a working copy (WC) path or URL:\n"
" WC -> WC: copy and schedule for addition (with history)\n"
@@ -620,6 +628,8 @@ svn_cl__cmd_table_main[] =
" the sources will be added as children of DST. When copying multiple\n"
" sources, DST must be an existing directory.\n"
"\n"), N_(
+ " If DST contains an @ character, an additional @ must be specified at the\n"
+ " end of DST to avoid interpreting the first @ as a peg revision indicator.\n", N_(
" WARNING: For compatibility with previous versions of Subversion,\n"
" copies performed using two working copy paths (WC -> WC) will not\n"
" contact the repository. As such, they may not, by default, be able\n"
@@ -631,8 +641,8 @@ svn_cl__cmd_table_main[] =
{ "delete", svn_cl__delete, {"del", "remove", "rm"}, {N_(
"Remove files and directories from version control.\n"
- "usage: 1. delete PATH...\n"
- " 2. delete URL...\n"
+ "usage: 1. delete PATH[@]...\n"
+ " 2. delete URL[@]...\n"
"\n"), N_(
" 1. Each item specified by a PATH is scheduled for deletion upon\n"
" the next commit. Files, and directories that have not been\n"
@@ -642,7 +652,10 @@ svn_cl__cmd_table_main[] =
" not be removed unless the --force or --keep-local option is given.\n"
"\n"), N_(
" 2. Each item specified by a URL is deleted from the repository\n"
- " via an immediate commit.\n"
+ " via an immediate commit.\n", N_(
+ " If PATH or URL contains an @ character, an additional @ must be specified\n"
+ " at the end of PATH to avoid interpreting the first @ as a peg revision\n"
+ " indicator.\n"
)},
{opt_force, 'q', opt_targets, SVN_CL__LOG_MSG_OPTIONS, opt_keep_local} },
@@ -692,23 +705,26 @@ svn_cl__cmd_table_main[] =
{ "export", svn_cl__export, {0}, {N_(
"Create an unversioned copy of a tree.\n"
- "usage: 1. export [-r REV] URL[@PEGREV] [PATH]\n"
- " 2. export [-r REV] PATH1[@PEGREV] [PATH2]\n"
+ "usage: 1. export [-r REV] URL[@PEGREV] [UNVERSIONED_PATH[@]]\n"
+ " 2. export [-r REV] WCPATH[@PEGREV] [UNVERSIONED_PATH[@]]\n"
"\n"), N_(
" 1. Exports a clean directory tree from the repository specified by\n"
" URL, at revision REV if it is given, otherwise at HEAD, into\n"
- " PATH. If PATH is omitted, the last component of the URL is used\n"
- " for the local directory name.\n"
+ " UNVERSIONED_PATH. If UNVERSIONED_PATH is omitted, the last\n"
+ " component of the URL is used for the local directory name.\n"
"\n"), N_(
" 2. Exports a clean directory tree from the working copy specified by\n"
- " PATH1, at revision REV if it is given, otherwise at WORKING, into\n"
- " PATH2. If PATH2 is omitted, the last component of the PATH1 is used\n"
- " for the local directory name. If REV is not specified, all local\n"
- " changes will be preserved. Files not under version control will\n"
- " not be copied.\n"
+ " WCPATH, at revision REV if it is given, otherwise at WORKING, into\n"
+ " UNVERSIONED_PATH. If UNVERSIONED_PATH is omitted, the last\n
+ " component of the WCPATH is used for the local directory name. If\n"
+ " REV is not specified, all local changes will be preserved. Files\n"
+ " not under version control will not be copied.\n"
"\n"), N_(
" If specified, PEGREV determines in which revision the target is first\n"
- " looked up.\n"
+ " looked up.\n", N_(
+ " If UNVERSIONED_PATH contains an @ character, an additional @ must be\n"
+ " specified at the end of UNVERSIONED_PATH to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{'r', 'q', 'N', opt_depth, opt_force, opt_native_eol, opt_ignore_externals,
opt_ignore_keywords},
@@ -1356,8 +1372,8 @@ svn_cl__cmd_table_main[] =
{ "mkdir", svn_cl__mkdir, {0}, {N_(
"Create a new directory under version control.\n"
- "usage: 1. mkdir PATH...\n"
- " 2. mkdir URL...\n"
+ "usage: 1. mkdir PATH[@]...\n"
+ " 2. mkdir URL[@]...\n"
"\n"), N_(
" Create version controlled directories.\n"
"\n"), N_(
@@ -1369,12 +1385,16 @@ svn_cl__cmd_table_main[] =
"\n"), N_(
" In both cases, all the intermediate directories must already exist,\n"
" unless the --parents option is given.\n"
+ ), N_(
+ " If PATH or URL contains an @ character, an additional @ must be\n"
+ " specified at the end of PATH/URL to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{'q', opt_parents, SVN_CL__LOG_MSG_OPTIONS} },
{ "move", svn_cl__move, {"mv", "rename", "ren"}, {N_(
"Move (rename) an item in a working copy or repository.\n"
- "usage: move SRC... DST\n"
+ "usage: move SRC[@]... DST\n"
"\n"), N_(
" SRC and DST can both be working copy (WC) paths or URLs:\n"
" WC -> WC: move an item in a working copy, as a local change to\n"
@@ -1390,6 +1410,10 @@ svn_cl__cmd_table_main[] =
" To avoid unnecessary conflicts, it is recommended to run 'svn update'\n"
" to update the subtree to a single revision before moving it.\n"
" The --allow-mixed-revisions option is provided for backward compatibility.\n"
+ ), N_(
+ " If any SRC contains an @ character, an additional @ must be\n"
+ " specified at the end of that SRC to avoid interpreting the\n"
+ " first @ as a peg revision indicator. This does not apply to DST.\n"
)},
{'q', opt_force, opt_parents, opt_allow_mixed_revisions,
SVN_CL__LOG_MSG_OPTIONS, 'r'},
@@ -1397,7 +1421,7 @@ svn_cl__cmd_table_main[] =
{ "patch", svn_cl__patch, {0}, {N_(
"Apply a patch to a working copy.\n"
- "usage: patch PATCHFILE [WCPATH]\n"
+ "usage: patch PATCHFILE [WCPATH[@]]\n"
"\n"), N_(
" Apply a unidiff patch in PATCHFILE to the working copy WCPATH.\n"
" If WCPATH is omitted, '.' is assumed.\n"
@@ -1439,40 +1463,52 @@ svn_cl__cmd_table_main[] =
" To avoid rejects, first update to the revision N using\n"
" 'svn update -r N', apply the patch, and then update back to the\n"
" HEAD revision. This way, conflicts can be resolved interactively.\n"
+ ), N_(
+ " If WCPATH contains an @ character, an additional @ must be\n"
+ " specified at the end of WCPATH to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{'q', opt_dry_run, opt_strip, opt_reverse_diff,
opt_ignore_whitespace} },
{ "propdel", svn_cl__propdel, {"pdel", "pd"}, {N_(
"Remove a property from files, dirs, or revisions.\n"
- "usage: 1. propdel PROPNAME [PATH...]\n"
- " 2. propdel PROPNAME --revprop -r REV [TARGET]\n"
+ "usage: 1. propdel PROPNAME [PATH[@]...]\n"
+ " 2. propdel PROPNAME --revprop -r REV [TARGET[@]]\n"
"\n"), N_(
" 1. Removes versioned props in working copy.\n"
" 2. Removes unversioned remote prop on repos revision.\n"
" TARGET only determines which repository to access.\n"
"\n"), N_(
" See 'svn help propset' for descriptions of the svn:* special properties.\n"
+ ), N_(
+ " If PATH or TARGET contains an @ character, an additional @ must be\n"
+ " specified at the end of PATH or TARGET to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{'q', 'R', opt_depth, 'r', opt_revprop, opt_changelist} },
{ "propedit", svn_cl__propedit, {"pedit", "pe"}, {N_(
"Edit a property with an external editor.\n"
- "usage: 1. propedit PROPNAME TARGET...\n"
- " 2. propedit PROPNAME --revprop -r REV [TARGET]\n"
+ "usage: 1. propedit PROPNAME TARGET[@]...\n"
+ " 2. propedit PROPNAME --revprop -r REV [TARGET[@]]\n"
"\n"), N_(
" 1. Edits versioned prop in working copy or repository.\n"
" 2. Edits unversioned remote prop on repos revision.\n"
" TARGET only determines which repository to access.\n"
"\n"), N_(
" See 'svn help propset' for descriptions of the svn:* special properties.\n"
+ ), N_(
+ " If TARGET contains an @ character, an additional @ must be\n"
+ " specified at the end of TARGET to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{'r', opt_revprop, SVN_CL__LOG_MSG_OPTIONS, opt_force} },
{ "propget", svn_cl__propget, {"pget", "pg"}, {N_(
"Print the value of a property on files, dirs, or revisions.\n"
"usage: 1. propget PROPNAME [TARGET[@REV]...]\n"
- " 2. propget PROPNAME --revprop -r REV [TARGET]\n"
+ " 2. propget PROPNAME --revprop -r REV [TARGET[@]]\n"
"\n"), N_(
" 1. Prints versioned props. If specified, REV determines in which\n"
" revision the target is first looked up.\n"
@@ -1490,6 +1526,10 @@ svn_cl__cmd_table_main[] =
" (useful when redirecting a binary property value to a file, for example).\n"
"\n"), N_(
" See 'svn help propset' for descriptions of the svn:* special properties.\n"
+ ), N_(
+ " If TARGET contains an @ character, an additional @ must be\n"
+ " specified at the end of TARGET to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{'v', 'R', opt_depth, 'r', opt_revprop, opt_strict, opt_no_newline, opt_xml,
opt_changelist, opt_show_inherited_props },
@@ -1499,7 +1539,7 @@ svn_cl__cmd_table_main[] =
{ "proplist", svn_cl__proplist, {"plist", "pl"}, {N_(
"List all properties on files, dirs, or revisions.\n"
"usage: 1. proplist [TARGET[@REV]...]\n"
- " 2. proplist --revprop -r REV [TARGET]\n"
+ " 2. proplist --revprop -r REV [TARGET[@]]\n"
"\n"), N_(
" 1. Lists versioned props. If specified, REV determines in which\n"
" revision the target is first looked up.\n"
@@ -1510,6 +1550,10 @@ svn_cl__cmd_table_main[] =
" --verbose'. With --quiet, the paths are not printed.\n"
"\n"), N_(
" See 'svn help propset' for descriptions of the svn:* special properties.\n"
+ ), N_(
+ " If TARGET contains an @ character, an additional @ must be\n"
+ " specified at the end of TARGET to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{'v', 'R', opt_depth, 'r', 'q', opt_revprop, opt_xml, opt_changelist,
opt_show_inherited_props },
@@ -1518,8 +1562,8 @@ svn_cl__cmd_table_main[] =
{ "propset", svn_cl__propset, {"pset", "ps"}, {N_(
"Set the value of a property on files, dirs, or revisions.\n"
- "usage: 1. propset PROPNAME PROPVAL PATH...\n"
- " 2. propset PROPNAME --revprop -r REV PROPVAL [TARGET]\n"
+ "usage: 1. propset PROPNAME PROPVAL PATH[@]...\n"
+ " 2. propset PROPNAME --revprop -r REV PROPVAL [TARGET[@]]\n"
"\n"), N_(
" 1. Changes a versioned file or directory property in a working copy.\n"
" 2. Changes an unversioned property on a repository revision.\n"
@@ -1602,6 +1646,10 @@ svn_cl__cmd_table_main[] =
" The ambiguous format 'relative_path relative_path' is taken as\n"
" 'relative_url relative_path' with peg revision support.\n"
" Lines starting with a '#' character are ignored.\n"
+ ), N_(
+ " If PATH or TARGET contains an @ character, an additional @ must be\n"
+ " specified at the end of PATH or TARGET to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{'F', opt_encoding, 'q', 'r', opt_targets, 'R', opt_depth, opt_revprop,
opt_force, opt_changelist },
@@ -1633,7 +1681,7 @@ svn_cl__cmd_table_main[] =
{ "resolve", svn_cl__resolve, {0}, {N_(
"Resolve conflicts on working copy files or directories.\n"
- "usage: resolve [PATH...]\n"
+ "usage: resolve [PATH[@]...]\n"
"\n"), N_(
" By default, perform interactive conflict resolution on PATH.\n"
" In this mode, the command is recursive by default (depth 'infinity').\n"
@@ -1682,6 +1730,10 @@ svn_cl__cmd_table_main[] =
" files manually or with 'svn merge'. It may be necessary to discard some\n"
" local changes with 'svn revert'. Files or directories might have to be\n"
" copied, deleted, or moved.\n"
+ ), N_(
+ " If PATH contains an @ character, an additional @ must be\n"
+ " specified at the end of PATH to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{opt_targets, 'R', opt_depth, 'q', opt_accept},
{{opt_accept, N_("specify automatic conflict resolution source\n"
@@ -1692,18 +1744,22 @@ svn_cl__cmd_table_main[] =
{ "resolved", svn_cl__resolved, {0}, {N_(
"Remove 'conflicted' state on working copy files or directories.\n"
- "usage: resolved PATH...\n"
+ "usage: resolved PATH[@]...\n"
"\n"), N_(
" Note: this subcommand does not semantically resolve conflicts or\n"
" remove conflict markers; it merely removes the conflict-related\n"
" artifact files and allows PATH to be committed again. It has been\n"
" deprecated in favor of running 'svn resolve --accept working'.\n"
+ ), N_(
+ " If PATH contains an @ character, an additional @ must be\n"
+ " specified at the end of PATH to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{opt_targets, 'R', opt_depth, 'q'} },
{ "revert", svn_cl__revert, {0}, {N_(
"Restore pristine working copy state (undo local changes).\n"
- "usage: revert PATH...\n"
+ "usage: revert PATH[@]...\n"
"\n"), N_(
" Revert changes in the working copy at or within PATH, and remove\n"
" conflict markers as well, if any.\n"
@@ -1711,13 +1767,17 @@ svn_cl__cmd_table_main[] =
" This subcommand does not revert already committed changes.\n"
" For information about undoing already committed changes, search\n"
" the output of 'svn help merge' for 'undo'.\n"
+ ), N_(
+ " If PATH contains an @ character, an additional @ must be\n"
+ " specified at the end of PATH to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{opt_targets, 'R', opt_depth, 'q', opt_changelist,
opt_remove_added} },
{ "status", svn_cl__status, {"stat", "st"}, {N_(
"Print the status of working copy files and directories.\n"
- "usage: status [PATH...]\n"
+ "usage: status [PATH[@]...]\n"
"\n"), N_(
" With no args, print only locally modified items (no network access).\n"
" With -q, print only summary information about locally modified items.\n"
@@ -1807,6 +1867,10 @@ svn_cl__cmd_table_main[] =
" ! C wc/qaz.c\n"
" > local missing, incoming edit upon update\n"
" D wc/qax.c\n"
+ ), N_(
+ " If PATH contains an @ character, an additional @ must be\n"
+ " specified at the end of PATH to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{ 'u', 'v', 'N', opt_depth, 'r', 'q', opt_no_ignore, opt_incremental,
opt_xml, opt_ignore_externals, opt_changelist},
@@ -1865,16 +1929,20 @@ svn_cl__cmd_table_main[] =
{ "unlock", svn_cl__unlock, {0}, {N_(
"Unlock working copy paths or URLs.\n"
- "usage: unlock TARGET...\n"
+ "usage: unlock TARGET[@]...\n"
"\n"), N_(
" Use --force to break a lock held by another user or working copy.\n"
+ ), N_(
+ " If TARGET contains an @ character, an additional @ must be\n"
+ " specified at the end of TARGET to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{ opt_targets, opt_force, 'q' },
{{opt_force, N_("break locks")}} },
{ "update", svn_cl__update, {"up"}, {N_(
"Bring changes from the repository into the working copy.\n"
- "usage: update [PATH...]\n"
+ "usage: update [PATH[@]...]\n"
"\n"), N_(
" If no revision is given, bring working copy up-to-date with HEAD rev.\n"
" Else synchronize working copy to revision given by -r.\n"
@@ -1918,6 +1986,10 @@ svn_cl__cmd_table_main[] =
"\n"), N_(
" Use the --set-depth option to set a new working copy depth on the\n"
" targets of this operation.\n"
+ ), N_(
+ " If PATH contains an @ character, an additional @ must be\n"
+ " specified at the end of PATH to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{'r', 'N', opt_depth, opt_set_depth, 'q', opt_merge_cmd, opt_force,
opt_ignore_externals, opt_changelist, opt_editor_cmd, opt_accept,
@@ -1928,7 +2000,7 @@ svn_cl__cmd_table_main[] =
{ "upgrade", svn_cl__upgrade, {0}, {N_(
"Upgrade the metadata storage format for a working copy.\n"
- "usage: upgrade [WCPATH...]\n"
+ "usage: upgrade [WCPATH[@]...]\n"
"\n"), N_(
" The upgraded working copy will be compatible with Subversion 1.8 and\n"
" newer (this default may change in the future). To upgrade to a different\n"
@@ -1939,6 +2011,10 @@ svn_cl__cmd_table_main[] =
" Only upgrades are supported, not downgrades.\n"
"\n"), N_(
" Local modifications are preserved.\n"
+ ), N_(
+ " If WCPATH contains an @ character, an additional @ must be\n"
+ " specified at the end of WCPATH to avoid interpreting the\n"
+ " first @ as a peg revision indicator.\n"
)},
{ 'q', opt_compatible_version } },