* the virtual machine and block devices are reused between tests.
* So don't try testing kill_subprocess :-x
*
- * Between each test we blockdev-setrw, umount-all, lvm-remove-all
- * (except InitNone).
+ * Between each test we blockdev-setrw, umount-all, lvm-remove-all.
*
* If the appliance is running an older Linux kernel (eg. RHEL 5) then
* devices are named /dev/hda etc. To cope with this, the test suite
* skipped. Useful if testing a command which might not work on
* all variations of libguestfs builds. A test that has prerequisite
* of 'Always' is run unconditionally.
+ *
+ * In addition, packagers can skip individual tests by setting the
+ * environment variables: eg:
+ * SKIP_TEST_<CMD>_<NUM>=1 SKIP_TEST_COMMAND_3=1 (skips test #3 of command)
+ * SKIP_TEST_<CMD>=1 SKIP_TEST_ZEROFREE=1 (skips all zerofree tests)
*)
type tests = (test_init * test_prereq * test) list
and test =
and seq = cmd list
and cmd = string list
-(* Canned test prerequisites. *)
-let env_is_true env =
- sprintf "const char *str = getenv (\"%s\");
- return str && strcmp (str, \"1\") == 0;" env
-
(* Note about long descriptions: When referring to another
* action, use the format C<guestfs_other> (ie. the full name of
* the C function). This will be replaced as appropriate in other
To create a single partition occupying the whole disk, you would
pass C<lines> as a single element list, when the single element being
-the string C<,> (comma).");
+the string C<,> (comma).
+
+See also: C<guestfs_sfdisk_l>, C<guestfs_sfdisk_N>");
("write_file", (RErr, [String "path"; String "content"; Int "size"]), 44, [ProtocolLimitWarning],
[InitBasicFS, Always, TestOutput (
(the C<-b> option).");
("command", (RString "output", [StringList "arguments"]), 50, [ProtocolLimitWarning],
- [InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutput (
+ [InitBasicFS, Always, TestOutput (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command"; "/test-command 1"]], "Result1");
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutput (
+ InitBasicFS, Always, TestOutput (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command"; "/test-command 2"]], "Result2\n");
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutput (
+ InitBasicFS, Always, TestOutput (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command"; "/test-command 3"]], "\nResult3");
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutput (
+ InitBasicFS, Always, TestOutput (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command"; "/test-command 4"]], "\nResult4\n");
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutput (
+ InitBasicFS, Always, TestOutput (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command"; "/test-command 5"]], "\nResult5\n\n");
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutput (
+ InitBasicFS, Always, TestOutput (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command"; "/test-command 6"]], "\n\nResult6\n\n");
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutput (
+ InitBasicFS, Always, TestOutput (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command"; "/test-command 7"]], "");
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutput (
+ InitBasicFS, Always, TestOutput (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command"; "/test-command 8"]], "\n");
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutput (
+ InitBasicFS, Always, TestOutput (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command"; "/test-command 9"]], "\n\n");
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutput (
+ InitBasicFS, Always, TestOutput (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command"; "/test-command 10"]], "Result10-1\nResult10-2\n");
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutput (
+ InitBasicFS, Always, TestOutput (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command"; "/test-command 11"]], "Result11-1\nResult11-2");
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestLastFail (
+ InitBasicFS, Always, TestLastFail (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command"; "/test-command"]])],
locations.");
("command_lines", (RStringList "lines", [StringList "arguments"]), 51, [ProtocolLimitWarning],
- [InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutputList (
+ [InitBasicFS, Always, TestOutputList (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command_lines"; "/test-command 1"]], ["Result1"]);
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutputList (
+ InitBasicFS, Always, TestOutputList (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command_lines"; "/test-command 2"]], ["Result2"]);
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutputList (
+ InitBasicFS, Always, TestOutputList (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command_lines"; "/test-command 3"]], ["";"Result3"]);
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutputList (
+ InitBasicFS, Always, TestOutputList (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command_lines"; "/test-command 4"]], ["";"Result4"]);
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutputList (
+ InitBasicFS, Always, TestOutputList (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command_lines"; "/test-command 5"]], ["";"Result5";""]);
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutputList (
+ InitBasicFS, Always, TestOutputList (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command_lines"; "/test-command 6"]], ["";"";"Result6";""]);
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutputList (
+ InitBasicFS, Always, TestOutputList (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command_lines"; "/test-command 7"]], []);
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutputList (
+ InitBasicFS, Always, TestOutputList (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command_lines"; "/test-command 8"]], [""]);
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutputList (
+ InitBasicFS, Always, TestOutputList (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command_lines"; "/test-command 9"]], ["";""]);
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutputList (
+ InitBasicFS, Always, TestOutputList (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command_lines"; "/test-command 10"]], ["Result10-1";"Result10-2"]);
- InitBasicFS, Unless (env_is_true "SKIP_TEST_COMMAND"), TestOutputList (
+ InitBasicFS, Always, TestOutputList (
[["upload"; "test-command"; "/test-command"];
["chmod"; "493"; "/test-command"];
["command_lines"; "/test-command 11"]], ["Result11-1";"Result11-2"])],
("lvremove", (RErr, [String "device"]), 77, [],
[InitEmpty, Always, TestOutputList (
- [["pvcreate"; "/dev/sda"];
- ["vgcreate"; "VG"; "/dev/sda"];
+ [["sfdisk"; "/dev/sda"; "0"; "0"; "0"; ","];
+ ["pvcreate"; "/dev/sda1"];
+ ["vgcreate"; "VG"; "/dev/sda1"];
["lvcreate"; "LV1"; "VG"; "50"];
["lvcreate"; "LV2"; "VG"; "50"];
["lvremove"; "/dev/VG/LV1"];
["lvs"]], ["/dev/VG/LV2"]);
InitEmpty, Always, TestOutputList (
- [["pvcreate"; "/dev/sda"];
- ["vgcreate"; "VG"; "/dev/sda"];
+ [["sfdisk"; "/dev/sda"; "0"; "0"; "0"; ","];
+ ["pvcreate"; "/dev/sda1"];
+ ["vgcreate"; "VG"; "/dev/sda1"];
["lvcreate"; "LV1"; "VG"; "50"];
["lvcreate"; "LV2"; "VG"; "50"];
["lvremove"; "/dev/VG"];
["lvs"]], []);
InitEmpty, Always, TestOutputList (
- [["pvcreate"; "/dev/sda"];
- ["vgcreate"; "VG"; "/dev/sda"];
+ [["sfdisk"; "/dev/sda"; "0"; "0"; "0"; ","];
+ ["pvcreate"; "/dev/sda1"];
+ ["vgcreate"; "VG"; "/dev/sda1"];
["lvcreate"; "LV1"; "VG"; "50"];
["lvcreate"; "LV2"; "VG"; "50"];
["lvremove"; "/dev/VG"];
("vgremove", (RErr, [String "vgname"]), 78, [],
[InitEmpty, Always, TestOutputList (
- [["pvcreate"; "/dev/sda"];
- ["vgcreate"; "VG"; "/dev/sda"];
+ [["sfdisk"; "/dev/sda"; "0"; "0"; "0"; ","];
+ ["pvcreate"; "/dev/sda1"];
+ ["vgcreate"; "VG"; "/dev/sda1"];
["lvcreate"; "LV1"; "VG"; "50"];
["lvcreate"; "LV2"; "VG"; "50"];
["vgremove"; "VG"];
["lvs"]], []);
InitEmpty, Always, TestOutputList (
- [["pvcreate"; "/dev/sda"];
- ["vgcreate"; "VG"; "/dev/sda"];
+ [["sfdisk"; "/dev/sda"; "0"; "0"; "0"; ","];
+ ["pvcreate"; "/dev/sda1"];
+ ["vgcreate"; "VG"; "/dev/sda1"];
["lvcreate"; "LV1"; "VG"; "50"];
["lvcreate"; "LV2"; "VG"; "50"];
["vgremove"; "VG"];
("pvremove", (RErr, [String "device"]), 79, [],
[InitEmpty, Always, TestOutputList (
- [["pvcreate"; "/dev/sda"];
- ["vgcreate"; "VG"; "/dev/sda"];
+ [["sfdisk"; "/dev/sda"; "0"; "0"; "0"; ","];
+ ["pvcreate"; "/dev/sda1"];
+ ["vgcreate"; "VG"; "/dev/sda1"];
["lvcreate"; "LV1"; "VG"; "50"];
["lvcreate"; "LV2"; "VG"; "50"];
["vgremove"; "VG"];
- ["pvremove"; "/dev/sda"];
+ ["pvremove"; "/dev/sda1"];
["lvs"]], []);
InitEmpty, Always, TestOutputList (
- [["pvcreate"; "/dev/sda"];
- ["vgcreate"; "VG"; "/dev/sda"];
+ [["sfdisk"; "/dev/sda"; "0"; "0"; "0"; ","];
+ ["pvcreate"; "/dev/sda1"];
+ ["vgcreate"; "VG"; "/dev/sda1"];
["lvcreate"; "LV1"; "VG"; "50"];
["lvcreate"; "LV2"; "VG"; "50"];
["vgremove"; "VG"];
- ["pvremove"; "/dev/sda"];
+ ["pvremove"; "/dev/sda1"];
["vgs"]], []);
InitEmpty, Always, TestOutputList (
- [["pvcreate"; "/dev/sda"];
- ["vgcreate"; "VG"; "/dev/sda"];
+ [["sfdisk"; "/dev/sda"; "0"; "0"; "0"; ","];
+ ["pvcreate"; "/dev/sda1"];
+ ["vgcreate"; "VG"; "/dev/sda1"];
["lvcreate"; "LV1"; "VG"; "50"];
["lvcreate"; "LV2"; "VG"; "50"];
["vgremove"; "VG"];
- ["pvremove"; "/dev/sda"];
+ ["pvremove"; "/dev/sda1"];
["pvs"]], [])],
"remove an LVM physical volume",
"\
This runs C<hexdump -C> on the given C<path>. The result is
the human-readable, canonical hex dump of the file.");
+ ("zerofree", (RErr, [String "device"]), 97, [],
+ [InitNone, Always, TestOutput (
+ [["sfdisk"; "/dev/sda"; "0"; "0"; "0"; ","];
+ ["mkfs"; "ext3"; "/dev/sda1"];
+ ["mount"; "/dev/sda1"; "/"];
+ ["write_file"; "/new"; "test file"; "0"];
+ ["umount"; "/dev/sda1"];
+ ["zerofree"; "/dev/sda1"];
+ ["mount"; "/dev/sda1"; "/"];
+ ["cat"; "/new"]], "test file")],
+ "zero unused inodes and disk blocks on ext2/3 filesystem",
+ "\
+This runs the I<zerofree> program on C<device>. This program
+claims to zero unused inodes and disk blocks on an ext2/3
+filesystem, thus making it possible to compress the filesystem
+more effectively.
+
+You should B<not> run this program if the filesystem is
+mounted.
+
+It is possible that using this program can damage the filesystem
+or data on the filesystem.");
+
+ ("pvresize", (RErr, [String "device"]), 98, [],
+ [],
+ "resize an LVM physical volume",
+ "\
+This resizes (expands or shrinks) an existing LVM physical
+volume to match the new size of the underlying device.");
+
+ ("sfdisk_N", (RErr, [String "device"; Int "n";
+ Int "cyls"; Int "heads"; Int "sectors";
+ String "line"]), 99, [DangerWillRobinson],
+ [],
+ "modify a single partition on a block device",
+ "\
+This runs L<sfdisk(8)> option to modify just the single
+partition C<n> (note: C<n> counts from 1).
+
+For other parameters, see C<guestfs_sfdisk>. You should usually
+pass C<0> for the cyls/heads/sectors parameters.");
+
+ ("sfdisk_l", (RString "partitions", [String "device"]), 100, [],
+ [],
+ "display the partition table",
+ "\
+This displays the partition table on C<device>, in the
+human-readable output of the L<sfdisk(8)> command. It is
+not intended to be parsed.");
+
+ ("sfdisk_kernel_geometry", (RString "partitions", [String "device"]), 101, [],
+ [],
+ "display the kernel geometry",
+ "\
+This displays the kernel's idea of the geometry of C<device>.
+
+The result is in human-readable format, and not designed to
+be parsed.");
+
+ ("sfdisk_disk_geometry", (RString "partitions", [String "device"]), 102, [],
+ [],
+ "display the disk geometry from the partition table",
+ "\
+This displays the disk geometry of C<device> read from the
+partition table. Especially in the case where the underlying
+block device has been resized, this can be different from the
+kernel's idea of the geometry (see C<guestfs_sfdisk_kernel_geometry>).
+
+The result is in human-readable format, and not designed to
+be parsed.");
+
+ ("vg_activate_all", (RErr, [Bool "activate"]), 103, [],
+ [],
+ "activate or deactivate all volume groups",
+ "\
+This command activates or (if C<activate> is false) deactivates
+all logical volumes in all volume groups.
+If activated, then they are made known to the
+kernel, ie. they appear as C</dev/mapper> devices. If deactivated,
+then those devices disappear.
+
+This command is the same as running C<vgchange -a y|n>");
+
+ ("vg_activate", (RErr, [Bool "activate"; StringList "volgroups"]), 104, [],
+ [],
+ "activate or deactivate some volume groups",
+ "\
+This command activates or (if C<activate> is false) deactivates
+all logical volumes in the listed volume groups C<volgroups>.
+If activated, then they are made known to the
+kernel, ie. they appear as C</dev/mapper> devices. If deactivated,
+then those devices disappear.
+
+This command is the same as running C<vgchange -a y|n volgroups...>
+
+Note that if C<volgroups> is an empty list then B<all> volume groups
+are activated or deactivated.");
+
+ ("lvresize", (RErr, [String "device"; Int "mbytes"]), 105, [],
+ [InitNone, Always, TestOutput (
+ [["sfdisk"; "/dev/sda"; "0"; "0"; "0"; ","];
+ ["pvcreate"; "/dev/sda1"];
+ ["vgcreate"; "VG"; "/dev/sda1"];
+ ["lvcreate"; "LV"; "VG"; "10"];
+ ["mkfs"; "ext2"; "/dev/VG/LV"];
+ ["mount"; "/dev/VG/LV"; "/"];
+ ["write_file"; "/new"; "test content"; "0"];
+ ["umount"; "/"];
+ ["lvresize"; "/dev/VG/LV"; "20"];
+ ["e2fsck_f"; "/dev/VG/LV"];
+ ["resize2fs"; "/dev/VG/LV"];
+ ["mount"; "/dev/VG/LV"; "/"];
+ ["cat"; "/new"]], "test content")],
+ "resize an LVM logical volume",
+ "\
+This resizes (expands or shrinks) an existing LVM logical
+volume to C<mbytes>. When reducing, data in the reduced part
+is lost.");
+
+ ("resize2fs", (RErr, [String "device"]), 106, [],
+ [], (* lvresize tests this *)
+ "resize an ext2/ext3 filesystem",
+ "\
+This resizes an ext2 or ext3 filesystem to match the size of
+the underlying device.
+
+I<Note:> It is sometimes required that you run C<guestfs_e2fsck_f>
+on the C<device> before calling this command. For unknown reasons
+C<resize2fs> sometimes gives an error about this and sometimes not.
+In any case, it is always safe to call C<guestfs_e2fsck_f> before
+calling this function.");
+
+ ("find", (RStringList "names", [String "directory"]), 107, [],
+ [InitBasicFS, Always, TestOutputList (
+ [["find"; "/"]], ["lost+found"]);
+ InitBasicFS, Always, TestOutputList (
+ [["touch"; "/a"];
+ ["mkdir"; "/b"];
+ ["touch"; "/b/c"];
+ ["find"; "/"]], ["a"; "b"; "b/c"; "lost+found"]);
+ InitBasicFS, Always, TestOutputList (
+ [["mkdir_p"; "/a/b/c"];
+ ["touch"; "/a/b/c/d"];
+ ["find"; "/a/b/"]], ["c"; "c/d"])],
+ "find all files and directories",
+ "\
+This command lists out all files and directories, recursively,
+starting at C<directory>. It is essentially equivalent to
+running the shell command C<find directory -print> but some
+post-processing happens on the output, described below.
+
+This returns a list of strings I<without any prefix>. Thus
+if the directory structure was:
+
+ /tmp/a
+ /tmp/b
+ /tmp/c/d
+
+then the returned list from C<guestfs_find> C</tmp> would be
+4 elements:
+
+ a
+ b
+ c
+ c/d
+
+If C<directory> is not a directory, then this command returns
+an error.
+
+The returned list is sorted.");
+
+ ("e2fsck_f", (RErr, [String "device"]), 108, [],
+ [], (* lvresize tests this *)
+ "check an ext2/ext3 filesystem",
+ "\
+This runs C<e2fsck -p -f device>, ie. runs the ext2/ext3
+filesystem checker on C<device>, noninteractively (C<-p>),
+even if the filesystem appears to be clean (C<-f>).
+
+This command is only needed because of C<guestfs_resize2fs>
+(q.v.). Normally you should use C<guestfs_fsck>.");
+
]
let all_functions = non_daemon_functions @ daemon_functions
fun (name, _, _, _, _, _, _) ->
if String.length name >= 7 && String.sub name 0 7 = "guestfs" then
failwithf "function name %s does not need 'guestfs' prefix" name;
- if contains_uppercase name then
- failwithf "function name %s should not contain uppercase chars" name;
+ if name = "" then
+ failwithf "function name is empty";
+ if name.[0] < 'a' || name.[0] > 'z' then
+ failwithf "function name %s must start with lowercase a-z" name;
if String.contains name '-' then
failwithf "function name %s should not contain '-', use '_' instead."
name
and generate_one_test name i (init, prereq, test) =
let test_name = sprintf "test_%s_%d" name i in
+ pr "\
+static int %s_skip (void)
+{
+ const char *str;
+
+ str = getenv (\"SKIP_%s\");
+ if (str && strcmp (str, \"1\") == 0) return 1;
+ str = getenv (\"SKIP_TEST_%s\");
+ if (str && strcmp (str, \"1\") == 0) return 1;
+ return 0;
+}
+
+" test_name (String.uppercase test_name) (String.uppercase name);
+
(match prereq with
| Disabled | Always -> ()
| If code | Unless code ->
pr "\n";
);
- pr "static int %s (void)\n" test_name;
- pr "{\n";
+ pr "\
+static int %s (void)
+{
+ if (%s_skip ()) {
+ printf (\"%%s skipped (reason: SKIP_TEST_* variable set)\\n\", \"%s\");
+ return 0;
+ }
+
+" test_name test_name test_name;
(match prereq with
| Disabled ->
pr " printf (\"%%s skipped (reason: test disabled in generator)\\n\", \"%s\");\n" test_name
| If _ ->
- pr " if (%s_prereq ()) {\n" test_name;
+ pr " if (! %s_prereq ()) {\n" test_name;
+ pr " printf (\"%%s skipped (reason: test prerequisite)\\n\", \"%s\");\n" test_name;
+ pr " return 0;\n";
+ pr " }\n";
+ pr "\n";
generate_one_test_body name i test_name init test;
- pr " } else\n";
- pr " printf (\"%%s skipped (reason: test prerequisite)\\n\", \"%s\");\n" test_name
| Unless _ ->
- pr " if (! %s_prereq ()) {\n" test_name;
+ pr " if (%s_prereq ()) {\n" test_name;
+ pr " printf (\"%%s skipped (reason: test prerequisite)\\n\", \"%s\");\n" test_name;
+ pr " return 0;\n";
+ pr " }\n";
+ pr "\n";
generate_one_test_body name i test_name init test;
- pr " } else\n";
- pr " printf (\"%%s skipped (reason: test prerequisite)\\n\", \"%s\");\n" test_name
| Always ->
generate_one_test_body name i test_name init test
);
and generate_one_test_body name i test_name init test =
(match init with
- | InitNone -> ()
+ | InitNone
| InitEmpty ->
- pr " /* InitEmpty for %s (%d) */\n" name i;
+ pr " /* InitNone|InitEmpty for %s */\n" test_name;
List.iter (generate_test_command_call test_name)
[["blockdev_setrw"; "/dev/sda"];
["umount_all"];
["lvm_remove_all"]]
| InitBasicFS ->
- pr " /* InitBasicFS for %s (%d): create ext2 on /dev/sda1 */\n" name i;
+ pr " /* InitBasicFS for %s: create ext2 on /dev/sda1 */\n" test_name;
List.iter (generate_test_command_call test_name)
[["blockdev_setrw"; "/dev/sda"];
["umount_all"];
["mkfs"; "ext2"; "/dev/sda1"];
["mount"; "/dev/sda1"; "/"]]
| InitBasicFSonLVM ->
- pr " /* InitBasicFSonLVM for %s (%d): create ext2 on /dev/VG/LV */\n"
- name i;
+ pr " /* InitBasicFSonLVM for %s: create ext2 on /dev/VG/LV */\n"
+ test_name;
List.iter (generate_test_command_call test_name)
[["blockdev_setrw"; "/dev/sda"];
["umount_all"];
#ifdef HAVE_LIBREADLINE
static const char *const commands[] = {
+ BUILTIN_COMMANDS_FOR_COMPLETION,
";
- (* Get the commands and sort them, including the aliases. *)
+ (* Get the commands, including the aliases. They don't need to be
+ * sorted - the generator() function just does a dumb linear search.
+ *)
let commands =
List.map (
fun (name, _, _, flags, _, _, _) ->
if name <> alias then [name2; alias] else [name2]
) all_functions in
let commands = List.flatten commands in
- let commands = List.sort compare commands in
List.iter (pr " \"%s\",\n") commands;
doc ^ "\n\n" ^ danger_will_robinson
else doc in
let doc = pod2text ~width:60 name doc in
+ let doc = List.map ( (* RHBZ#501883 *)
+ function
+ | "" -> "<p>"
+ | nonempty -> nonempty
+ ) doc in
let doc = String.concat "\n * " doc in
pr " /**\n";
pr " * %s\n" shortdesc;
- pr " *\n";
+ pr " * <p>\n";
pr " * %s\n" doc;
pr " * @throws LibGuestFSException\n";
pr " */\n";