btrbk: ignore "preserve_hour_of_day" on snapshots/backups having "timestamp_format=short"

Snapshots and backups having no exact time information (created with
"timestamp_format=short") are set to 00:00, which would be regarded as
"previous day" if preserve_hour_of_day is greater than 0. Fix this by
ignoring preserve_hour_of_day in this case.
pull/219/head
Axel Burri 2018-04-05 00:17:12 +02:00
parent c89ffd4213
commit e4a0938712
1 changed files with 13 additions and 11 deletions

24
btrbk
View File

@ -2378,6 +2378,7 @@ sub add_btrbk_filename_info($;$)
my @tm = ( ($+{ss} // 0), ($+{mm} // 0), ($+{hh} // 0), $+{DD}, ($+{MM} - 1), ($+{YYYY} - 1900) );
my $NN = $+{NN} // 0;
my $zz = $+{zz};
my $has_exact_time = defined($+{hh}); # false if timestamp_format=short
my $time;
if(defined($zz)) {
@ -2409,7 +2410,7 @@ sub add_btrbk_filename_info($;$)
}
$node->{BTRBK_BASENAME} = $name;
$node->{BTRBK_DATE} = [ $time, $NN ];
$node->{BTRBK_DATE} = [ $time, $NN, $has_exact_time ];
$node->{BTRBK_RAW} = $raw_info if($raw_info);
return $node;
}
@ -3743,16 +3744,16 @@ sub schedule(@)
DEBUG "Scheduler reference time: " . timestamp(\@tm_now, 'debug-iso');
# first, do our calendar calculations
# - days start on $preserve_hour_of_day (or 00:00 if timestamp_format=short)
# - weeks start on $preserve_day_of_week
# - days start on $preserve_hour_of_day
# - leap hours are NOT taken into account for $delta_hours
my $now_h = timegm_nocheck( 0, 0, $tm_now[2], $tm_now[3], $tm_now[4], $tm_now[5] ); # use timelocal() here (and below) if you want to honor leap hours
foreach my $href (@sorted_schedule)
{
my $time = $href->{btrbk_date}->[0];
my @tm = localtime($time);
my $delta_hours_from_hod = $tm[2] - $preserve_hour_of_day;
my @tm = localtime($href->{btrbk_date}->[0]);
my $has_exact_time = $href->{btrbk_date}->[2];
my $delta_hours_from_hod = $tm[2] - ($has_exact_time ? $preserve_hour_of_day : 0);
my $delta_days_from_eow = $tm[6] - $day_of_week_map{$preserve_day_of_week};
if($delta_hours_from_hod < 0) {
$delta_hours_from_hod += 24;
@ -3780,6 +3781,7 @@ sub schedule(@)
$href->{month} = $tm[4] + 1;
$href->{delta_hours_from_hod} = $delta_hours_from_hod;
$href->{delta_days_from_eow} = $delta_days_from_eow;
$href->{real_hod} = $preserve_hour_of_day if($has_exact_time);
if($preserve_date_in_future && ($delta_hours < 0)) {
$href->{preserve} = "preserve forced: " . -($delta_hours) . " hours in the future";
@ -3827,28 +3829,29 @@ sub schedule(@)
foreach (sort {$b <=> $a} keys %first_in_delta_days) {
my $href = $first_in_delta_days{$_} || die;
if($preserve_daily && (($preserve_daily eq 'all') || ($href->{delta_days} <= $preserve_daily))) {
$href->{preserve} = "preserve daily: first of day" . ($preserve_hour_of_day ? sprintf(" (starting at %02u:00)", $preserve_hour_of_day) : "") . ", $href->{delta_days} days ago, " . ($href->{delta_hours_from_hod} ? "$href->{delta_hours_from_hod}h after " : "at ") . sprintf("%02u:00", $preserve_hour_of_day);
$href->{preserve} = "preserve daily: first of day" . ($href->{real_hod} ? sprintf(" (starting at %02u:00)", $href->{real_hod}) : "") . ", $href->{delta_days} days ago"
. (defined($href->{real_hod}) ? ($href->{delta_hours_from_hod} ? ", $href->{delta_hours_from_hod}h after " : ", at ") . sprintf("%02u:00", $href->{real_hod}) : "");
}
$first_in_delta_weeks{$href->{delta_weeks}} //= $href;
}
foreach (sort {$b <=> $a} keys %first_in_delta_weeks) {
my $href = $first_in_delta_weeks{$_} || die;
if($preserve_weekly && (($preserve_weekly eq 'all') || ($href->{delta_weeks} <= $preserve_weekly))) {
$href->{preserve} = "preserve weekly: $href->{delta_weeks} weeks ago," . _format_preserve_delta($href, $preserve_hour_of_day, $preserve_day_of_week);
$href->{preserve} = "preserve weekly: $href->{delta_weeks} weeks ago," . _format_preserve_delta($href, $preserve_day_of_week);
}
$first_weekly_in_delta_months{$href->{delta_months}} //= $href;
}
foreach (sort {$b <=> $a} keys %first_weekly_in_delta_months) {
my $href = $first_weekly_in_delta_months{$_} || die;
if($preserve_monthly && (($preserve_monthly eq 'all') || ($href->{delta_months} <= $preserve_monthly))) {
$href->{preserve} = "preserve monthly: first weekly of month $href->{year}-" . sprintf("%02u", $href->{month}) . " ($href->{delta_months} months ago," . _format_preserve_delta($href, $preserve_hour_of_day, $preserve_day_of_week) . ")";
$href->{preserve} = "preserve monthly: first weekly of month $href->{year}-" . sprintf("%02u", $href->{month}) . " ($href->{delta_months} months ago," . _format_preserve_delta($href, $preserve_day_of_week) . ")";
}
$first_monthly_in_delta_years{$href->{delta_years}} //= $href;
}
foreach (sort {$b <=> $a} keys %first_monthly_in_delta_years) {
my $href = $first_monthly_in_delta_years{$_} || die;
if($preserve_yearly && (($preserve_yearly eq 'all') || ($href->{delta_years} <= $preserve_yearly))) {
$href->{preserve} = "preserve yearly: first weekly of year $href->{year} ($href->{delta_years} years ago," . _format_preserve_delta($href, $preserve_hour_of_day, $preserve_day_of_week) . ")";
$href->{preserve} = "preserve yearly: first weekly of year $href->{year} ($href->{delta_years} years ago," . _format_preserve_delta($href, $preserve_day_of_week) . ")";
}
}
@ -3889,12 +3892,11 @@ sub schedule(@)
sub _format_preserve_delta($$$)
{
my $href = shift;
my $preserve_hour_of_day = shift;
my $preserve_day_of_week = shift;
my $s = "";
$s .= " $href->{delta_days_from_eow}d" if($href->{delta_days_from_eow});
$s .= " $href->{delta_hours_from_hod}h" if($href->{delta_hours_from_hod});
return ($s ? "$s after" : " at") . " $preserve_day_of_week " . sprintf("%02u:00", $preserve_hour_of_day);
return ($s ? "$s after " : " at ") . $preserve_day_of_week . (defined($href->{real_hod}) ? sprintf(" %02u:00", $href->{real_hod}) : "");
}