From 654740fd9cecce9921d274246791eb0cbc723af0 Mon Sep 17 00:00:00 2001 From: Florian Pritz Date: Tue, 21 Nov 2017 19:53:31 +0100 Subject: borg_list_time: Use JSON when possible Signed-off-by: Florian Pritz --- META.json | 3 +++ cpanfile | 3 +++ lib/App/BorgRestore/Borg.pm | 39 +++++++++++++++++++++++++++------------ 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/META.json b/META.json index be02fbb..cba2f5d 100644 --- a/META.json +++ b/META.json @@ -45,12 +45,14 @@ "requires" : { "DBD::SQLite" : "0", "DBI" : "0", + "Date::Parse" : "0", "File::Path" : "0", "File::Temp" : "0", "File::pushd" : "0", "Function::Parameters" : "0", "Getopt::Long" : "0", "IPC::Run" : "0", + "JSON" : "0", "List::Util" : "0", "Log::Any" : "0", "Log::Any::Adapter::Log4perl" : "0", @@ -60,6 +62,7 @@ "Log::Log4perl::Layout::PatternLayout" : "0", "Log::Log4perl::Level" : "0", "Pod::Usage" : "0", + "Version::Compare" : "0", "autodie" : "0", "perl" : "v5.14.0" } diff --git a/cpanfile b/cpanfile index f1c0770..548434a 100644 --- a/cpanfile +++ b/cpanfile @@ -17,6 +17,9 @@ requires 'Log::Log4perl::Level'; requires 'Pod::Usage'; requires 'autodie'; requires 'perl', 'v5.14.0'; +requires 'Version::Compare'; +requires 'JSON'; +requires 'Date::Parse'; on configure => sub { requires 'Devel::CheckBin'; diff --git a/lib/App/BorgRestore/Borg.pm b/lib/App/BorgRestore/Borg.pm index 9807700..bd9ac3c 100644 --- a/lib/App/BorgRestore/Borg.pm +++ b/lib/App/BorgRestore/Borg.pm @@ -6,9 +6,12 @@ use strict; use App::BorgRestore::Helper; use autodie; +use Date::Parse; use Function::Parameters; use IPC::Run qw(run start new_chunker); +use JSON; use Log::Any qw($log); +use Version::Compare; =encoding utf-8 @@ -66,18 +69,30 @@ method borg_list() { method borg_list_time() { my @archives; - $log->debug("Getting archive list"); - run [qw(borg list), $self->{borg_repo}], '>', \my $output or die $log->error("borg list returned $?")."\n"; - - for (split/^/, $output) { - # example timestamp: "Wed, 2016-01-27 10:31:59" = 24 chars - if (m/^([^\s]+)\s+(.{24})/) { - my $time = App::BorgRestore::Helper::parse_borg_time($2); - if ($time) { - push @archives, { - "archive" => $1, - "modification_time" => $time, - }; + if (Version::Compare::version_compare($self->{borg_version}, "1.1") >= 0) { + $log->debug("Getting archive list via json"); + run [qw(borg list --json), $self->{borg_repo}], '>', \my $output or die $log->error("borg list returned $?")."\n"; + my $json = decode_json($output); + for my $archive (@{$json->{archives}}) { + push @archives, { + "archive" => $archive->{archive}, + "modification_time" => str2time($archive->{time}), + }; + } + } else { + $log->debug("Getting archive list"); + run [qw(borg list), $self->{borg_repo}], '>', \my $output or die $log->error("borg list returned $?")."\n"; + + for (split/^/, $output) { + # example timestamp: "Wed, 2016-01-27 10:31:59" = 24 chars + if (m/^([^\s]+)\s+(.{24})/) { + my $time = App::BorgRestore::Helper::parse_borg_time($2); + if ($time) { + push @archives, { + "archive" => $1, + "modification_time" => $time, + }; + } } } } -- cgit v1.2.3-24-g4f1b