[Libguestfs] [PATCH] generator: Allow actions to be deprecated with no replacement.

Richard W.M. Jones rjones at redhat.com
Fri Mar 3 10:18:26 UTC 2017


There is precisely one such function at the moment
(guestfs_wait_ready).
---
 generator/GObject.ml                       |   6 +-
 generator/OCaml.ml                         |   7 +-
 generator/actions_core_deprecated.ml       | 102 ++++++++++++++---------------
 generator/actions_inspection_deprecated.ml |   2 +-
 generator/actions_properties_deprecated.ml |  12 ++--
 generator/c.ml                             |  27 +++++---
 generator/checks.ml                        |   4 +-
 generator/docstrings.ml                    |  14 +++-
 generator/java.ml                          |  11 ++--
 generator/ruby.ml                          |   9 ++-
 generator/types.ml                         |   9 ++-
 11 files changed, 118 insertions(+), 85 deletions(-)

diff --git a/generator/GObject.ml b/generator/GObject.ml
index eada33c..fd2c07c 100644
--- a/generator/GObject.ml
+++ b/generator/GObject.ml
@@ -1118,9 +1118,11 @@ guestfs_session_close (GuestfsSession *session, GError **err)
       );
       pr "\n";
       (match deprecated_by with
-      | None -> ()
-      | Some alt ->
+      | Not_deprecated -> ()
+      | Replaced_by alt ->
         pr " * Deprecated: In new code, use guestfs_session_%s() instead\n" alt
+      | Deprecated_no_replacement ->
+        pr " * Deprecated\n"
       );
       (match version_added f with
       | None -> ()
diff --git a/generator/OCaml.ml b/generator/OCaml.ml
index 083e505..38b254d 100644
--- a/generator/OCaml.ml
+++ b/generator/OCaml.ml
@@ -186,10 +186,13 @@ end
             opt
       );
       (match f.deprecated_by with
-       | None -> ()
-       | Some replacement ->
+       | Not_deprecated -> ()
+       | Replaced_by replacement ->
           has_tags := true;
           pr "\n\n    @deprecated Use {!%s} instead" replacement
+       | Deprecated_no_replacement ->
+          has_tags := true;
+          pr "\n\n    @deprecated"
       );
       (match version_added f with
        | None -> ()
diff --git a/generator/actions_core_deprecated.ml b/generator/actions_core_deprecated.ml
index b8cca79..ae93f29 100644
--- a/generator/actions_core_deprecated.ml
+++ b/generator/actions_core_deprecated.ml
@@ -28,7 +28,7 @@ let non_daemon_functions = [
     name = "wait_ready"; added = (0, 0, 3);
     style = RErr, [], [];
     visibility = VStateTest;
-    deprecated_by = Some "launch";
+    deprecated_by = Deprecated_no_replacement;
     blocking = false;
     shortdesc = "wait until the hypervisor launches (no op)";
     longdesc = "\
@@ -46,7 +46,7 @@ versions of the API." };
   { defaults with
     name = "kill_subprocess"; added = (0, 0, 3);
     style = RErr, [], [];
-    deprecated_by = Some "shutdown";
+    deprecated_by = Replaced_by "shutdown";
     shortdesc = "kill the hypervisor";
     longdesc = "\
 This kills the hypervisor.
@@ -56,7 +56,7 @@ Do not call this.  See: C<guestfs_shutdown> instead." };
   { defaults with
     name = "add_cdrom"; added = (0, 0, 3);
     style = RErr, [String "filename"], [];
-    deprecated_by = Some "add_drive_ro"; config_only = true;
+    deprecated_by = Replaced_by "add_drive_ro"; config_only = true;
     blocking = false;
     shortdesc = "add a CD-ROM disk image to examine";
     longdesc = "\
@@ -68,7 +68,7 @@ of C<guestfs_add_drive_ro>." };
   { defaults with
     name = "add_drive_with_if"; added = (1, 0, 84);
     style = RErr, [String "filename"; String "iface"], [];
-    deprecated_by = Some "add_drive"; config_only = true;
+    deprecated_by = Replaced_by "add_drive"; config_only = true;
     blocking = false;
     shortdesc = "add a drive specifying the QEMU block emulation to use";
     longdesc = "\
@@ -79,7 +79,7 @@ to specify the QEMU interface emulation to use at run time." };
     name = "add_drive_ro_with_if"; added = (1, 0, 84);
     style = RErr, [String "filename"; String "iface"], [];
     blocking = false;
-    deprecated_by = Some "add_drive"; config_only = true;
+    deprecated_by = Replaced_by "add_drive"; config_only = true;
     shortdesc = "add a drive read-only specifying the QEMU block emulation to use";
     longdesc = "\
 This is the same as C<guestfs_add_drive_ro> but it allows you
@@ -88,7 +88,7 @@ to specify the QEMU interface emulation to use at run time." };
   { defaults with
     name = "lstatlist"; added = (1, 0, 77);
     style = RStructList ("statbufs", "stat"), [Pathname "path"; FilenameList "names"], [];
-    deprecated_by = Some "lstatnslist";
+    deprecated_by = Replaced_by "lstatnslist";
     shortdesc = "lstat on multiple files";
     longdesc = "\
 This call allows you to perform the C<guestfs_lstat> operation
@@ -108,7 +108,7 @@ for getting extended attributes." };
   { defaults with
     name = "stat"; added = (1, 9, 2);
     style = RStruct ("statbuf", "stat"), [Pathname "path"], [];
-    deprecated_by = Some "statns";
+    deprecated_by = Replaced_by "statns";
     tests = [
       InitISOFS, Always, TestResult (
         [["stat"; "/empty"]], "ret->size == 0"), []
@@ -122,7 +122,7 @@ This is the same as the L<stat(2)> system call." };
   { defaults with
     name = "lstat"; added = (1, 9, 2);
     style = RStruct ("statbuf", "stat"), [Pathname "path"], [];
-    deprecated_by = Some "lstatns";
+    deprecated_by = Replaced_by "lstatns";
     tests = [
       InitISOFS, Always, TestResult (
         [["lstat"; "/empty"]], "ret->size == 0"), []
@@ -145,7 +145,7 @@ let daemon_functions = [
     style = RErr, [Device "device";
                    Int "cyls"; Int "heads"; Int "sectors";
                    StringList "lines"], [];
-    deprecated_by = Some "part_add";
+    deprecated_by = Replaced_by "part_add";
     shortdesc = "create partitions on a block device";
     longdesc = "\
 This is a direct interface to the L<sfdisk(8)> program for creating
@@ -174,7 +174,7 @@ C<guestfs_part_init>" };
   { defaults with
     name = "blockdev_setbsz"; added = (1, 9, 3);
     style = RErr, [Device "device"; Int "blocksize"], [];
-    deprecated_by = Some "mkfs";
+    deprecated_by = Replaced_by "mkfs";
     shortdesc = "set blocksize of block device";
     longdesc = "\
 This call does nothing and has never done anything
@@ -186,7 +186,7 @@ C<blocksize> option of C<guestfs_mkfs>." };
   { defaults with
     name = "tgz_in"; added = (1, 0, 3);
     style = RErr, [FileIn "tarball"; Pathname "directory"], [];
-    deprecated_by = Some "tar_in";
+    deprecated_by = Replaced_by "tar_in";
     cancellable = true;
     tests = [
       InitScratchFS, Always, TestResultString (
@@ -202,7 +202,7 @@ I<gzip compressed> tar file) into F<directory>." };
   { defaults with
     name = "tgz_out"; added = (1, 0, 3);
     style = RErr, [Pathname "directory"; FileOut "tarball"], [];
-    deprecated_by = Some "tar_out";
+    deprecated_by = Replaced_by "tar_out";
     cancellable = true;
     shortdesc = "pack directory into compressed tarball";
     longdesc = "\
@@ -212,7 +212,7 @@ it to local file C<tarball>." };
   { defaults with
     name = "set_e2label"; added = (1, 0, 15);
     style = RErr, [Device "device"; String "label"], [];
-    deprecated_by = Some "set_label";
+    deprecated_by = Replaced_by "set_label";
     tests = [
       InitBasicFS, Always, TestResultString (
         [["set_e2label"; "/dev/sda1"; "testlabel"];
@@ -230,7 +230,7 @@ to return the existing label on a filesystem." };
   { defaults with
     name = "get_e2label"; added = (1, 0, 15);
     style = RString "label", [Device "device"], [];
-    deprecated_by = Some "vfs_label";
+    deprecated_by = Replaced_by "vfs_label";
     shortdesc = "get the ext2/3/4 filesystem label";
     longdesc = "\
 This returns the ext2/3/4 filesystem label of the filesystem on
@@ -239,7 +239,7 @@ C<device>." };
   { defaults with
     name = "set_e2uuid"; added = (1, 0, 15);
     style = RErr, [Device "device"; String "uuid"], [];
-    deprecated_by = Some "set_uuid";
+    deprecated_by = Replaced_by "set_uuid";
     tests = [
         InitBasicFS, Always, TestResultString (
           [["set_e2uuid"; "/dev/sda1"; stable_uuid];
@@ -267,7 +267,7 @@ of a filesystem." };
   { defaults with
     name = "get_e2uuid"; added = (1, 0, 15);
     style = RString "uuid", [Device "device"], [];
-    deprecated_by = Some "vfs_uuid";
+    deprecated_by = Replaced_by "vfs_uuid";
     tests = [
       (* We can't predict what UUID will be, so just check
          the command run; regression test for RHBZ#597112. *)
@@ -285,7 +285,7 @@ C<device>." };
     style = RErr, [Device "device"; Int "partnum";
                    Int "cyls"; Int "heads"; Int "sectors";
                    String "line"], [];
-    deprecated_by = Some "part_add";
+    deprecated_by = Replaced_by "part_add";
     shortdesc = "modify a single partition on a block device";
     longdesc = "\
 This runs L<sfdisk(8)> option to modify just the single
@@ -299,7 +299,7 @@ See also: C<guestfs_part_add>" };
   { defaults with
     name = "sfdisk_l"; added = (1, 0, 26);
     style = RString "partitions", [Device "device"], [];
-    deprecated_by = Some "part_list";
+    deprecated_by = Replaced_by "part_list";
     shortdesc = "display the partition table";
     longdesc = "\
 This displays the partition table on C<device>, in the
@@ -311,7 +311,7 @@ See also: C<guestfs_part_list>" };
   { defaults with
     name = "e2fsck_f"; added = (1, 0, 29);
     style = RErr, [Device "device"], [];
-    deprecated_by = Some "e2fsck";
+    deprecated_by = Replaced_by "e2fsck";
     shortdesc = "check an ext2/ext3 filesystem";
     longdesc = "\
 This runs C<e2fsck -p -f device>, ie. runs the ext2/ext3
@@ -321,7 +321,7 @@ even if the filesystem appears to be clean (I<-f>)." };
   { defaults with
     name = "mkswap_L"; added = (1, 0, 55);
     style = RErr, [String "label"; Device "device"], [];
-    deprecated_by = Some "mkswap";
+    deprecated_by = Replaced_by "mkswap";
     tests = [
       InitEmpty, Always, TestRun (
         [["part_disk"; "/dev/sda"; "mbr"];
@@ -338,7 +338,7 @@ a limitation of the kernel or swap tools." };
   { defaults with
     name = "mkswap_U"; added = (1, 0, 55);
     style = RErr, [String "uuid"; Device "device"], [];
-    deprecated_by = Some "mkswap";
+    deprecated_by = Replaced_by "mkswap";
     optional = Some "linuxfsuuid";
     tests = [
         InitEmpty, Always, TestRun (
@@ -352,7 +352,7 @@ Create a swap partition on C<device> with UUID C<uuid>." };
   { defaults with
     name = "sfdiskM"; added = (1, 0, 55);
     style = RErr, [Device "device"; StringList "lines"], [];
-    deprecated_by = Some "part_add";
+    deprecated_by = Replaced_by "part_add";
     shortdesc = "create partitions on a block device";
     longdesc = "\
 This is a simplified interface to the C<guestfs_sfdisk>
@@ -367,7 +367,7 @@ and C<guestfs_part_disk>" };
   { defaults with
     name = "zfile"; added = (1, 0, 59);
     style = RString "description", [String "meth"; Pathname "path"], [];
-    deprecated_by = Some "file";
+    deprecated_by = Replaced_by "file";
     shortdesc = "determine file type inside a compressed file";
     longdesc = "\
 This command runs F<file> after first decompressing C<path>
@@ -382,7 +382,7 @@ process compressed files." };
     name = "egrep"; added = (1, 0, 66);
     style = RStringList "lines", [String "regex"; Pathname "path"], [];
     protocol_limit_warning = true;
-    deprecated_by = Some "grep";
+    deprecated_by = Replaced_by "grep";
     tests = [
       InitISOFS, Always, TestResult (
         [["egrep"; "abc"; "/test-grep.txt"]],
@@ -397,7 +397,7 @@ matching lines." };
     name = "fgrep"; added = (1, 0, 66);
     style = RStringList "lines", [String "pattern"; Pathname "path"], [];
     protocol_limit_warning = true;
-    deprecated_by = Some "grep";
+    deprecated_by = Replaced_by "grep";
     tests = [
       InitISOFS, Always, TestResult (
         [["fgrep"; "abc"; "/test-grep.txt"]],
@@ -412,7 +412,7 @@ matching lines." };
     name = "grepi"; added = (1, 0, 66);
     style = RStringList "lines", [String "regex"; Pathname "path"], [];
     protocol_limit_warning = true;
-    deprecated_by = Some "grep";
+    deprecated_by = Replaced_by "grep";
     tests = [
       InitISOFS, Always, TestResult (
         [["grepi"; "abc"; "/test-grep.txt"]],
@@ -427,7 +427,7 @@ matching lines." };
     name = "egrepi"; added = (1, 0, 66);
     style = RStringList "lines", [String "regex"; Pathname "path"], [];
     protocol_limit_warning = true;
-    deprecated_by = Some "grep";
+    deprecated_by = Replaced_by "grep";
     tests = [
       InitISOFS, Always, TestResult (
         [["egrepi"; "abc"; "/test-grep.txt"]],
@@ -442,7 +442,7 @@ matching lines." };
     name = "fgrepi"; added = (1, 0, 66);
     style = RStringList "lines", [String "pattern"; Pathname "path"], [];
     protocol_limit_warning = true;
-    deprecated_by = Some "grep";
+    deprecated_by = Replaced_by "grep";
     tests = [
       InitISOFS, Always, TestResult (
         [["fgrepi"; "abc"; "/test-grep.txt"]],
@@ -457,7 +457,7 @@ matching lines." };
     name = "zgrep"; added = (1, 0, 66);
     style = RStringList "lines", [String "regex"; Pathname "path"], [];
     protocol_limit_warning = true;
-    deprecated_by = Some "grep";
+    deprecated_by = Replaced_by "grep";
     tests = [
       InitISOFS, Always, TestResult (
         [["zgrep"; "abc"; "/test-grep.txt.gz"]],
@@ -472,7 +472,7 @@ matching lines." };
     name = "zegrep"; added = (1, 0, 66);
     style = RStringList "lines", [String "regex"; Pathname "path"], [];
     protocol_limit_warning = true;
-    deprecated_by = Some "grep";
+    deprecated_by = Replaced_by "grep";
     tests = [
       InitISOFS, Always, TestResult (
         [["zegrep"; "abc"; "/test-grep.txt.gz"]],
@@ -487,7 +487,7 @@ matching lines." };
     name = "zfgrep"; added = (1, 0, 66);
     style = RStringList "lines", [String "pattern"; Pathname "path"], [];
     protocol_limit_warning = true;
-    deprecated_by = Some "grep";
+    deprecated_by = Replaced_by "grep";
     tests = [
       InitISOFS, Always, TestResult (
         [["zfgrep"; "abc"; "/test-grep.txt.gz"]],
@@ -503,7 +503,7 @@ matching lines." };
     style = RStringList "lines", [String "regex"; Pathname "path"], [];
 
     protocol_limit_warning = true;
-    deprecated_by = Some "grep";
+    deprecated_by = Replaced_by "grep";
     tests = [
       InitISOFS, Always, TestResult (
         [["zgrepi"; "abc"; "/test-grep.txt.gz"]],
@@ -518,7 +518,7 @@ matching lines." };
     name = "zegrepi"; added = (1, 0, 66);
     style = RStringList "lines", [String "regex"; Pathname "path"], [];
     protocol_limit_warning = true;
-    deprecated_by = Some "grep";
+    deprecated_by = Replaced_by "grep";
     tests = [
       InitISOFS, Always, TestResult (
         [["zegrepi"; "abc"; "/test-grep.txt.gz"]],
@@ -533,7 +533,7 @@ matching lines." };
     name = "zfgrepi"; added = (1, 0, 66);
     style = RStringList "lines", [String "pattern"; Pathname "path"], [];
     protocol_limit_warning = true;
-    deprecated_by = Some "grep";
+    deprecated_by = Replaced_by "grep";
     tests = [
       InitISOFS, Always, TestResult (
         [["zfgrepi"; "abc"; "/test-grep.txt.gz"]],
@@ -547,7 +547,7 @@ matching lines." };
   { defaults with
     name = "fallocate"; added = (1, 0, 66);
     style = RErr, [Pathname "path"; Int "len"], [];
-    deprecated_by = Some "fallocate64";
+    deprecated_by = Replaced_by "fallocate64";
     tests = [
       InitScratchFS, Always, TestResult (
         [["fallocate"; "/fallocate"; "1000000"];
@@ -567,7 +567,7 @@ attaches it as a device." };
     name = "setcon"; added = (1, 0, 67);
     style = RErr, [String "context"], [];
     optional = Some "selinux";
-    deprecated_by = Some "selinux_relabel";
+    deprecated_by = Replaced_by "selinux_relabel";
     shortdesc = "set SELinux security context";
     longdesc = "\
 This sets the SELinux security context of the daemon
@@ -579,7 +579,7 @@ See the documentation about SELINUX in L<guestfs(3)>." };
     name = "getcon"; added = (1, 0, 67);
     style = RString "context", [], [];
     optional = Some "selinux";
-    deprecated_by = Some "selinux_relabel";
+    deprecated_by = Replaced_by "selinux_relabel";
     shortdesc = "get SELinux security context";
     longdesc = "\
 This gets the SELinux security context of the daemon.
@@ -590,7 +590,7 @@ and C<guestfs_setcon>" };
   { defaults with
     name = "mkfs_b"; added = (1, 0, 68);
     style = RErr, [String "fstype"; Int "blocksize"; Device "device"], [];
-    deprecated_by = Some "mkfs";
+    deprecated_by = Replaced_by "mkfs";
     tests = [
       InitEmpty, Always, TestResultString (
         [["part_disk"; "/dev/sda"; "mbr"];
@@ -627,7 +627,7 @@ the requested cluster size." };
   { defaults with
     name = "mke2journal"; added = (1, 0, 68);
     style = RErr, [Int "blocksize"; Device "device"], [];
-    deprecated_by = Some "mke2fs";
+    deprecated_by = Replaced_by "mke2fs";
     tests = [
       InitEmpty, Always, TestResultString (
         [["part_init"; "/dev/sda"; "mbr"];
@@ -649,7 +649,7 @@ to the command:
   { defaults with
     name = "mke2journal_L"; added = (1, 0, 68);
     style = RErr, [Int "blocksize"; String "label"; Device "device"], [];
-    deprecated_by = Some "mke2fs";
+    deprecated_by = Replaced_by "mke2fs";
     tests = [
       InitEmpty, Always, TestResultString (
         [["part_init"; "/dev/sda"; "mbr"];
@@ -668,7 +668,7 @@ This creates an ext2 external journal on C<device> with label C<label>." };
   { defaults with
     name = "mke2journal_U"; added = (1, 0, 68);
     style = RErr, [Int "blocksize"; String "uuid"; Device "device"], [];
-    deprecated_by = Some "mke2fs";
+    deprecated_by = Replaced_by "mke2fs";
     optional = Some "linuxfsuuid";
     tests = [
         InitEmpty, Always, TestResultString (
@@ -688,7 +688,7 @@ This creates an ext2 external journal on C<device> with UUID C<uuid>." };
   { defaults with
     name = "mke2fs_J"; added = (1, 0, 68);
     style = RErr, [String "fstype"; Int "blocksize"; Device "device"; Device "journal"], [];
-    deprecated_by = Some "mke2fs";
+    deprecated_by = Replaced_by "mke2fs";
     shortdesc = "make ext2/3/4 filesystem with external journal";
     longdesc = "\
 This creates an ext2/3/4 filesystem on C<device> with
@@ -702,7 +702,7 @@ See also C<guestfs_mke2journal>." };
   { defaults with
     name = "mke2fs_JL"; added = (1, 0, 68);
     style = RErr, [String "fstype"; Int "blocksize"; Device "device"; String "label"], [];
-    deprecated_by = Some "mke2fs";
+    deprecated_by = Replaced_by "mke2fs";
     shortdesc = "make ext2/3/4 filesystem with external journal";
     longdesc = "\
 This creates an ext2/3/4 filesystem on C<device> with
@@ -713,7 +713,7 @@ See also C<guestfs_mke2journal_L>." };
   { defaults with
     name = "mke2fs_JU"; added = (1, 0, 68);
     style = RErr, [String "fstype"; Int "blocksize"; Device "device"; String "uuid"], [];
-    deprecated_by = Some "mke2fs";
+    deprecated_by = Replaced_by "mke2fs";
     optional = Some "linuxfsuuid";
     shortdesc = "make ext2/3/4 filesystem with external journal";
     longdesc = "\
@@ -725,7 +725,7 @@ See also C<guestfs_mke2journal_U>." };
   { defaults with
     name = "dd"; added = (1, 0, 80);
     style = RErr, [Dev_or_Path "src"; Dev_or_Path "dest"], [];
-    deprecated_by = Some "copy_device_to_device";
+    deprecated_by = Replaced_by "copy_device_to_device";
     tests = [
       InitScratchFS, Always, TestResult (
         [["mkdir"; "/dd"];
@@ -749,7 +749,7 @@ This command cannot do partial copies
   { defaults with
     name = "txz_in"; added = (1, 3, 2);
     style = RErr, [FileIn "tarball"; Pathname "directory"], [];
-    deprecated_by = Some "tar_in";
+    deprecated_by = Replaced_by "tar_in";
     optional = Some "xz"; cancellable = true;
     tests = [
       InitScratchFS, Always, TestResultString (
@@ -765,7 +765,7 @@ I<xz compressed> tar file) into F<directory>." };
   { defaults with
     name = "txz_out"; added = (1, 3, 2);
     style = RErr, [Pathname "directory"; FileOut "tarball"], [];
-    deprecated_by = Some "tar_out";
+    deprecated_by = Replaced_by "tar_out";
     optional = Some "xz"; cancellable = true;
     shortdesc = "pack directory into compressed tarball";
     longdesc = "\
@@ -775,7 +775,7 @@ it to local file C<tarball> (as an xz compressed tar archive)." };
   { defaults with
     name = "llz"; added = (1, 17, 6);
     style = RString "listing", [Pathname "directory"], [];
-    deprecated_by = Some "lgetxattrs";
+    deprecated_by = Replaced_by "lgetxattrs";
     shortdesc = "list the files in a directory (long format with SELinux contexts)";
     longdesc = "\
 List the files in F<directory> in the format of 'ls -laZ'.
@@ -786,7 +786,7 @@ is I<not> intended that you try to parse the output string." };
   { defaults with
     name = "write_file"; added = (0, 0, 8);
     style = RErr, [Pathname "path"; String "content"; Int "size"], [];
-    protocol_limit_warning = true; deprecated_by = Some "write";
+    protocol_limit_warning = true; deprecated_by = Replaced_by "write";
     (* Regression test for RHBZ#597135. *)
     tests = [
       InitScratchFS, Always, TestLastFail
@@ -808,7 +808,7 @@ characters does I<not> work, even if the length is specified." };
   { defaults with
     name = "copy_size"; added = (1, 0, 87);
     style = RErr, [Dev_or_Path "src"; Dev_or_Path "dest"; Int64 "size"], [];
-    progress = true; deprecated_by = Some "copy_device_to_device";
+    progress = true; deprecated_by = Replaced_by "copy_device_to_device";
     tests = [
       InitScratchFS, Always, TestResult (
         [["mkdir"; "/copy_size"];
@@ -828,7 +828,7 @@ is not large enough." };
   { defaults with
     name = "ntfsresize_size"; added = (1, 3, 14);
     style = RErr, [Device "device"; Int64 "size"], [];
-    optional = Some "ntfsprogs"; deprecated_by = Some "ntfsresize";
+    optional = Some "ntfsprogs"; deprecated_by = Replaced_by "ntfsresize";
     shortdesc = "resize an NTFS filesystem (with size)";
     longdesc = "\
 This command is the same as C<guestfs_ntfsresize> except that it
diff --git a/generator/actions_inspection_deprecated.ml b/generator/actions_inspection_deprecated.ml
index 04fb143..5ca062c 100644
--- a/generator/actions_inspection_deprecated.ml
+++ b/generator/actions_inspection_deprecated.ml
@@ -26,7 +26,7 @@ let non_daemon_functions = [
   { defaults with
     name = "inspect_list_applications"; added = (1, 7, 8);
     style = RStructList ("applications", "application"), [Mountable "root"], [];
-    deprecated_by = Some "inspect_list_applications2";
+    deprecated_by = Replaced_by "inspect_list_applications2";
     shortdesc = "get list of applications installed in the operating system";
     longdesc = "\
 Return the list of applications installed in the operating system.
diff --git a/generator/actions_properties_deprecated.ml b/generator/actions_properties_deprecated.ml
index 3fe8fef..def17b9 100644
--- a/generator/actions_properties_deprecated.ml
+++ b/generator/actions_properties_deprecated.ml
@@ -30,7 +30,7 @@ let non_daemon_functions = [
     style = RErr, [OptString "hv"], [];
     fish_alias = ["qemu"]; config_only = true;
     blocking = false;
-    deprecated_by = Some "set_hv";
+    deprecated_by = Replaced_by "set_hv";
     shortdesc = "set the hypervisor binary (usually qemu)";
     longdesc = "\
 Set the hypervisor binary (usually qemu) that we will use.
@@ -55,7 +55,7 @@ the qemu binary at the same time as the handle is created." };
     name = "get_qemu"; added = (1, 0, 6);
     style = RConstString "hv", [], [];
     blocking = false;
-    deprecated_by = Some "get_hv";
+    deprecated_by = Replaced_by "get_hv";
     tests = [
       InitNone, Always, TestRun (
         [["get_qemu"]]), []
@@ -72,7 +72,7 @@ return the default qemu binary name." };
     style = RErr, [Bool "selinux"], [];
     fish_alias = ["selinux"]; config_only = true;
     blocking = false;
-    deprecated_by = Some "selinux_relabel";
+    deprecated_by = Replaced_by "selinux_relabel";
     shortdesc = "set SELinux enabled or disabled at appliance boot";
     longdesc = "\
 This sets the selinux flag that is passed to the appliance
@@ -88,7 +88,7 @@ see L<guestfs(3)>." };
     name = "get_selinux"; added = (1, 0, 67);
     style = RBool "selinux", [], [];
     blocking = false;
-    deprecated_by = Some "selinux_relabel";
+    deprecated_by = Replaced_by "selinux_relabel";
     shortdesc = "get SELinux enabled flag";
     longdesc = "\
 This returns the current setting of the selinux flag which
@@ -102,7 +102,7 @@ see L<guestfs(3)>." };
     style = RErr, [String "backend"], [];
     fish_alias = ["attach-method"]; config_only = true;
     blocking = false;
-    deprecated_by = Some "set_backend";
+    deprecated_by = Replaced_by "set_backend";
     shortdesc = "set the backend";
     longdesc = "\
 Set the method that libguestfs uses to connect to the backend
@@ -114,7 +114,7 @@ See L<guestfs(3)/BACKEND>." };
     name = "get_attach_method"; added = (1, 9, 8);
     style = RString "backend", [], [];
     blocking = false;
-    deprecated_by = Some "get_backend";
+    deprecated_by = Replaced_by "get_backend";
     tests = [
       InitNone, Always, TestRun (
         [["get_attach_method"]]), []
diff --git a/generator/c.ml b/generator/c.ml
index 1cb0880..606c898 100644
--- a/generator/c.ml
+++ b/generator/c.ml
@@ -445,11 +445,14 @@ extern \"C\" {
 #endif
 
 /* Define GUESTFS_WARN_DEPRECATED=1 to warn about deprecated API functions. */
-#define GUESTFS_DEPRECATED_BY(s)
+#define GUESTFS_DEPRECATED_NO_REPLACEMENT
+#define GUESTFS_DEPRECATED_REPLACED_BY(s)
 #if GUESTFS_WARN_DEPRECATED
 #  if defined(__GNUC__) && GUESTFS_GCC_VERSION >= 40500 /* gcc >= 4.5 */
-#    undef GUESTFS_DEPRECATED_BY
-#    define GUESTFS_DEPRECATED_BY(s) __attribute__((__deprecated__(\"change the program to use guestfs_\" s \" instead of this deprecated function\")))
+#    undef GUESTFS_DEPRECATED_NO_REPLACEMENT
+#    undef GUESTFS_DEPRECATED_REPLACED_BY
+#    define GUESTFS_DEPRECATED_NO_REPLACEMENT __attribute__((__deprecated__))
+#    define GUESTFS_DEPRECATED_REPLACED_BY(s) __attribute__((__deprecated__(\"change the program to use guestfs_\" s \" instead of this deprecated function\")))
 #  endif
 #endif /* GUESTFS_WARN_DEPRECATED */
 
@@ -562,17 +565,17 @@ typedef void (*guestfs_progress_cb) (guestfs_h *g, void *opaque, int proc_nr, in
 #endif
 
 extern GUESTFS_DLL_PUBLIC void guestfs_set_log_message_callback (guestfs_h *g, guestfs_log_message_cb cb, void *opaque)
-  GUESTFS_DEPRECATED_BY(\"set_event_callback\");
+  GUESTFS_DEPRECATED_REPLACED_BY(\"set_event_callback\");
 extern GUESTFS_DLL_PUBLIC void guestfs_set_subprocess_quit_callback (guestfs_h *g, guestfs_subprocess_quit_cb cb, void *opaque)
-  GUESTFS_DEPRECATED_BY(\"set_event_callback\");
+  GUESTFS_DEPRECATED_REPLACED_BY(\"set_event_callback\");
 extern GUESTFS_DLL_PUBLIC void guestfs_set_launch_done_callback (guestfs_h *g, guestfs_launch_done_cb cb, void *opaque)
-  GUESTFS_DEPRECATED_BY(\"set_event_callback\");
+  GUESTFS_DEPRECATED_REPLACED_BY(\"set_event_callback\");
 #define GUESTFS_HAVE_SET_CLOSE_CALLBACK 1
 extern GUESTFS_DLL_PUBLIC void guestfs_set_close_callback (guestfs_h *g, guestfs_close_cb cb, void *opaque)
-  GUESTFS_DEPRECATED_BY(\"set_event_callback\");
+  GUESTFS_DEPRECATED_REPLACED_BY(\"set_event_callback\");
 #define GUESTFS_HAVE_SET_PROGRESS_CALLBACK 1
 extern GUESTFS_DLL_PUBLIC void guestfs_set_progress_callback (guestfs_h *g, guestfs_progress_cb cb, void *opaque)
-  GUESTFS_DEPRECATED_BY(\"set_event_callback\");
+  GUESTFS_DEPRECATED_REPLACED_BY(\"set_event_callback\");
 
 /* Private data area. */
 #define GUESTFS_HAVE_SET_PRIVATE 1
@@ -662,8 +665,12 @@ extern GUESTFS_DLL_PUBLIC void *guestfs_next_private (guestfs_h *g, const char *
     generate_prototype ~single_line:true ~semicolon:false ~dll_public:true
       ~handle:"g" ~prefix:"guestfs_" shortname style;
     (match deprecated_by with
-    | Some fn -> pr "\n  GUESTFS_DEPRECATED_BY (%S);\n" fn
-    | None -> pr ";\n"
+    | Not_deprecated ->
+       pr ";\n"
+    | Replaced_by fn ->
+       pr "\n  GUESTFS_DEPRECATED_REPLACED_BY (%S);\n" fn
+    | Deprecated_no_replacement ->
+       pr "\n  GUESTFS_DEPRECATED_NO_REPLACEMENT;\n"
     );
 
     if optargs <> [] then (
diff --git a/generator/checks.ml b/generator/checks.ml
index 63536e5..788a116 100644
--- a/generator/checks.ml
+++ b/generator/checks.ml
@@ -184,7 +184,7 @@ let () =
             failwithf "%s: guestfish alias %s should not contain '_'" name n
       ) f.fish_alias;
       (match f.deprecated_by with
-      | Some n ->
+      | Replaced_by n ->
         (* 'n' must be a cross-ref to the name of another action. *)
         if not (List.exists (
           function
@@ -192,7 +192,7 @@ let () =
           | _ -> false
         ) actions) then
           failwithf "%s: deprecated_by flag must be cross-reference to another action" name
-      | None -> ()
+      | Not_deprecated | Deprecated_no_replacement -> ()
       );
       (match f.optional with
       | Some n ->
diff --git a/generator/docstrings.ml b/generator/docstrings.ml
index acfdb53..2ce595d 100644
--- a/generator/docstrings.ml
+++ b/generator/docstrings.ml
@@ -39,8 +39,9 @@ of somewhere between 2MB and 4MB.  See L<guestfs(3)/PROTOCOL LIMITS>."
 
 let deprecation_notice ?(prefix = "") ?(replace_underscores = false) =
   function
-  | { deprecated_by = None } -> None
-  | { deprecated_by = Some alt } ->
+  | { deprecated_by = Not_deprecated } -> None
+
+  | { deprecated_by = Replaced_by alt } ->
     let alt =
       if replace_underscores then String.replace_char alt '_' '-' else alt in
     let txt =
@@ -52,6 +53,15 @@ fact that they are deprecated indicates that there are problems
 with correct use of these functions." prefix alt in
     Some txt
 
+  | { deprecated_by = Deprecated_no_replacement } ->
+     Some "I<This function is deprecated.>
+There is no replacement.  Consult the API documentation in
+L<guestfs(3)> for further information.
+
+Deprecated functions will not be removed from the API, but the
+fact that they are deprecated indicates that there are problems
+with correct use of these functions."
+
 let version_added = function
   | { added = (0, 0, release) } -> Some (sprintf "0.%d" release)
   | { added = ((0|1) as major, minor, release) } ->
diff --git a/generator/java.ml b/generator/java.ml
index 8f71feb..83f2e65 100644
--- a/generator/java.ml
+++ b/generator/java.ml
@@ -297,9 +297,11 @@ public class GuestFS {
         | Some version -> pr "   * @since %s\n" version
         );
         (match f with
-        | { deprecated_by = None } -> ()
-        | { deprecated_by = Some alt } ->
+        | { deprecated_by = Not_deprecated } -> ()
+        | { deprecated_by = Replaced_by alt } ->
           pr "   * @deprecated In new code, use {@link #%s} instead\n" alt
+        | { deprecated_by = Deprecated_no_replacement } ->
+          pr "   * @deprecated\n"
         );
         pr "   * @throws LibGuestFSException If there is a libguestfs error.\n";
         pr "   */\n";
@@ -307,8 +309,9 @@ public class GuestFS {
       pr "  ";
       let deprecated =
         match f with
-        | { deprecated_by = None } -> false
-        | { deprecated_by = Some _ } -> true in
+        | { deprecated_by = Not_deprecated } -> false
+        | { deprecated_by = Replaced_by _ | Deprecated_no_replacement } ->
+           true in
       generate_java_prototype ~public:true ~semicolon:false ~deprecated f.name f.style;
       pr "\n";
       pr "  {\n";
diff --git a/generator/ruby.ml b/generator/ruby.ml
index c938bc9..594036d 100644
--- a/generator/ruby.ml
+++ b/generator/ruby.ml
@@ -146,9 +146,12 @@ and generate_ruby_c actions () =
           | Some version -> doc ^ (sprintf "\n *\n * [Since] Added in version %s." version) in
         let doc =
           match f with
-          | { deprecated_by = None } -> doc
-          | { deprecated_by = Some alt } ->
-            doc ^ (sprintf "\n *\n * [Deprecated] In new code, use rdoc-ref:%s instead." alt) in
+          | { deprecated_by = Not_deprecated } -> doc
+          | { deprecated_by = Replaced_by alt } ->
+            doc ^
+              sprintf "\n *\n * [Deprecated] In new code, use rdoc-ref:%s instead." alt
+          | { deprecated_by = Deprecated_no_replacement } ->
+            doc ^ "\n *\n * [Deprecated]" in
         let doc =
           match f.optional with
           | None -> doc
diff --git a/generator/types.ml b/generator/types.ml
index fd9f215..3fa96fd 100644
--- a/generator/types.ml
+++ b/generator/types.ml
@@ -342,6 +342,11 @@ type visibility =
 
 type version = int * int * int
 
+type deprecated_by =
+  | Not_deprecated                (* function not deprecated *)
+  | Replaced_by of string         (* replaced by another function *)
+  | Deprecated_no_replacement     (* deprecated with no replacement *)
+
 (* Type of an action as declared in Actions module. *)
 type action = {
   name : string;                  (* name, not including "guestfs_" *)
@@ -358,7 +363,7 @@ type action = {
   fish_alias : string list;       (* alias(es) for this cmd in guestfish *)
   fish_output : fish_output_t option; (* how to display output in guestfish *)
   visibility: visibility;         (* The visbility of function *)
-  deprecated_by : string option;  (* function is deprecated, use .. instead *)
+  deprecated_by : deprecated_by;  (* function is deprecated *)
   optional : string option;       (* function is part of an optional group *)
   progress : bool;                (* function can generate progress messages *)
   camel_name : string;            (* Pretty camel case name of
@@ -407,7 +412,7 @@ let defaults = { name = "";
                  shortdesc = ""; longdesc = "";
                  protocol_limit_warning = false; fish_alias = [];
                  fish_output = None; visibility = VPublic;
-                 deprecated_by = None; optional = None;
+                 deprecated_by = Not_deprecated; optional = None;
                  progress = false; camel_name = "";
                  cancellable = false; config_only = false;
                  once_had_no_optargs = false; blocking = true; wrapper = true;
-- 
2.9.3




More information about the Libguestfs mailing list