mirror of
https://git.proxmox.com/git/pve-guest-common
synced 2025-05-01 04:32:37 +00:00
reformat code for snapshot tree into GuestHelpers
qm/pct listsnapshot lack feature parity w.r.t. showing snapshots in a tree ordered by the date. by moving this code into GuestHelpers, it can be shared. Signed-off-by: Oguz Bektas <o.bektas@proxmox.com>
This commit is contained in:
parent
1daaf2ea3f
commit
725dcadba3
@ -6,6 +6,8 @@ use warnings;
|
|||||||
use PVE::Tools;
|
use PVE::Tools;
|
||||||
use PVE::Storage;
|
use PVE::Storage;
|
||||||
|
|
||||||
|
use POSIX qw(strftime);
|
||||||
|
|
||||||
# We use a separate lock to block migration while a replication job
|
# We use a separate lock to block migration while a replication job
|
||||||
# is running.
|
# is running.
|
||||||
|
|
||||||
@ -60,4 +62,56 @@ sub exec_hookscript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub snapshot_tree {
|
||||||
|
my ($res) = @_;
|
||||||
|
|
||||||
|
my $snapshots = { map { $_->{name} => $_ } @$res };
|
||||||
|
|
||||||
|
my @roots;
|
||||||
|
foreach my $e (@$res) {
|
||||||
|
my $parent;
|
||||||
|
if (($parent = $e->{parent}) && defined $snapshots->{$parent}) {
|
||||||
|
push @{$snapshots->{$parent}->{children}}, $e->{name};
|
||||||
|
} else {
|
||||||
|
push @roots, $e->{name};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# sort the elements by snaptime - with "current" (no snaptime) highest
|
||||||
|
my $snaptimesort = sub {
|
||||||
|
return +1 if !defined $snapshots->{$a}->{snaptime};
|
||||||
|
return -1 if !defined $snapshots->{$b}->{snaptime};
|
||||||
|
return $snapshots->{$a}->{snaptime} <=> $snapshots->{$b}->{snaptime};
|
||||||
|
};
|
||||||
|
|
||||||
|
# recursion function for displaying the tree
|
||||||
|
my $snapshottree;
|
||||||
|
$snapshottree = sub {
|
||||||
|
my ($prefix, $root, $snapshots) = @_;
|
||||||
|
my $e = $snapshots->{$root};
|
||||||
|
|
||||||
|
my $description = $e->{description} || 'no-description';
|
||||||
|
($description) = $description =~ m/(.*)$/m;
|
||||||
|
|
||||||
|
my $timestring = "";
|
||||||
|
if (defined $e->{snaptime}) {
|
||||||
|
$timestring = strftime("%F %H:%M:%S", localtime($e->{snaptime}));
|
||||||
|
}
|
||||||
|
|
||||||
|
my $len = 30 - length($prefix); # for aligning the description
|
||||||
|
printf("%s %-${len}s %-23s %s\n", $prefix, $root, $timestring, $description);
|
||||||
|
|
||||||
|
if ($e->{children}) {
|
||||||
|
$prefix = " $prefix";
|
||||||
|
foreach my $child (sort $snaptimesort @{$e->{children}}) {
|
||||||
|
$snapshottree->($prefix, $child, $snapshots);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach my $root (sort $snaptimesort @roots) {
|
||||||
|
$snapshottree->('`->', $root, $snapshots);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
Loading…
Reference in New Issue
Block a user