[PATCH pve-storage v1 53/54] storage api: mark old public regexes for removal, bump APIVER & APIAGE

Max R. Carrara
2026-04-22T11:20:30Z

Mark all unused regular expressions that were phased out during the
previous refactors and changes for removal on the next APIAGE reset.

Instead, the parsing functions in `PVE::Storage::Common::Parse` should
be used instead.

Signed-off-by: Max R. Carrara <m.carrara@proxmox.com>
---
ApiChangeLog | 16 ++++++++++++++++
src/PVE/Storage.pm | 10 ++++++++--
src/PVE/Storage/Plugin.pm | 1 +
3 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/ApiChangeLog b/ApiChangeLog
index d1d3e1c3..efcfef14 100644
--- a/ApiChangeLog
+++ b/ApiChangeLog
@@ -6,6 +6,22 @@ without breaking anything unaware of it.)

Future changes should be documented in here.

+## Version 15:
+
+* Remove the following regular expressions:
+ * `$PVE::Storage::ISO_EXT_RE_0` (`iso` volume type)
+ * `$PVE::Storage::VZTMPL_EXT_RE_1` (`vztmpl` volume type)
+ * `$PVE::Storage::BACKUP_EXT_RE_2` (`backup` volume type)
+ * `$PVE::Storage::IMPORT_EXT_RE_1` (`import` volume type)
+ * `$PVE::Storage::UPLOAD_IMPORT_EXT_RE_1` (`import` volume type)
+ * `$PVE::Storage::OVA_CONTENT_RE_1` (`import` volume type)
+
+ These regular expressions were mostly used for parsing file paths and volume
+ names corresponding to their volume types, noted in parentheses above.
+
+ Instead, The parsing functions in `PVE::Storage::Common::Parse` should be
+ used.
+
## Version 14:

* Replace plugin helper `get_vtype_subdirs()` with standalone helper subroutine
diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index 199a6375..3db34b68 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -48,11 +48,11 @@ use PVE::Storage::BTRFSPlugin;
use PVE::Storage::ESXiPlugin;

# Storage API version. Increment it on changes in storage API interface.
-use constant APIVER => 14;
+use constant APIVER => 15;
# Age is the number of versions we're backward compatible with.
# This is like having 'current=APIVER' and age='APIAGE' in libtool,
# see https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
-use constant APIAGE => 5;
+use constant APIAGE => 6;

our $KNOWN_EXPORT_FORMATS = ['raw+size', 'tar+size', 'qcow2+size', 'vmdk+size', 'zfs', 'btrfs'];

@@ -120,19 +120,25 @@ PVE::Storage::Plugin->init();
# the following REs indicate the number or capture groups via the trailing digit
# CAUTION don't forget to update the digits accordingly after messing with the capture groups

+# FIXME: remove this regex on the next APIAGE reset.
our $ISO_EXT_RE_0 = qr/\.(?:iso|img)/i;

+# FIXME: remove this regex on the next APIAGE reset.
our $VZTMPL_EXT_RE_1 = qr/\.(?|(tar)(?!\.)|tar\.(gz|xz|zst|bz2))/i;

+# FIXME: remove this regex on the next APIAGE reset.
our $BACKUP_EXT_RE_2 = qr/\.(tgz|(?:tar|vma)(?:\.(${\PVE::Storage::Plugin::COMPRESSOR_RE}))?)/;

+# FIXME: remove this regex on the next APIAGE reset.
our $IMPORT_EXT_RE_1 = qr/\.(ova|ovf|qcow2|raw|vmdk)/;

+# FIXME: remove this regex on the next APIAGE reset.
our $UPLOAD_IMPORT_EXT_RE_1 = qr/\.(ova|qcow2|raw|vmdk)/;

our $SAFE_CHAR_CLASS_RE = qr/[a-zA-Z0-9\-\.\+\=\_]/;
our $SAFE_CHAR_WITH_WHITESPACE_CLASS_RE = qr/[ a-zA-Z0-9\-\.\+\=\_]/;

+# FIXME: remove this regex on the next APIAGE reset.
our $OVA_CONTENT_RE_1 = qr/${SAFE_CHAR_WITH_WHITESPACE_CLASS_RE}+\.(qcow2|raw|vmdk)/;

# FIXME remove with PVE 9.0, add versioned breaks for pve-manager
diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm
index 3a3e1b62..6e20c519 100644
--- a/src/PVE/Storage/Plugin.pm
+++ b/src/PVE/Storage/Plugin.pm
@@ -31,6 +31,7 @@ use base qw(PVE::SectionConfig);

# TODO: Phase out these two constants
use constant KNOWN_COMPRESSION_FORMATS => ('gz', 'lzo', 'zst', 'bz2');
+# FIXME: remove this regex on the next APIAGE reset.
use constant COMPRESSOR_RE => join('|', KNOWN_COMPRESSION_FORMATS);

use constant LOG_EXT => ".log";
--
2.47.3