From 928667689d1c27074a96110de10224c8eb5f69fc Mon Sep 17 00:00:00 2001 From: "mkanat%bugzilla.org" Date: Wed, 6 Apr 2011 02:32:20 +0000 Subject: [PATCH] Bug 313726: When searching by relative dates, don't make them go to the "beginning" of the specified period unless the user explicitly requests that. r=mkanat, a=mkanat git-svn-id: svn://10.0.0.236/trunk@262140 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/webtools/bugzilla/.bzrrev | 2 +- mozilla/webtools/bugzilla/Bugzilla/Search.pm | 48 ++++++++++++++------ 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/mozilla/webtools/bugzilla/.bzrrev b/mozilla/webtools/bugzilla/.bzrrev index 1b3f0a5391d..c5f38f568b2 100644 --- a/mozilla/webtools/bugzilla/.bzrrev +++ b/mozilla/webtools/bugzilla/.bzrrev @@ -1 +1 @@ -7771 \ No newline at end of file +7772 \ No newline at end of file diff --git a/mozilla/webtools/bugzilla/Bugzilla/Search.pm b/mozilla/webtools/bugzilla/Bugzilla/Search.pm index fddb1819461..4b0260137f0 100644 --- a/mozilla/webtools/bugzilla/Bugzilla/Search.pm +++ b/mozilla/webtools/bugzilla/Bugzilla/Search.pm @@ -1880,40 +1880,58 @@ sub _timestamp_translate { sub SqlifyDate { my ($str) = @_; + my $fmt = "%Y-%m-%d %H:%M:%S"; $str = "" if !defined $str; if ($str eq "") { my ($sec, $min, $hour, $mday, $month, $year, $wday) = localtime(time()); return sprintf("%4d-%02d-%02d 00:00:00", $year+1900, $month+1, $mday); } - if ($str =~ /^(-|\+)?(\d+)([hHdDwWmMyY])$/) { # relative date - my ($sign, $amount, $unit, $date) = ($1, $2, lc $3, time); + if ($str =~ /^(-|\+)?(\d+)([hdwmy])(s?)$/i) { # relative date + my ($sign, $amount, $unit, $startof, $date) = ($1, $2, lc $3, lc $4, time); my ($sec, $min, $hour, $mday, $month, $year, $wday) = localtime($date); if ($sign && $sign eq '+') { $amount = -$amount; } + $startof = 1 if $amount == 0; if ($unit eq 'w') { # convert weeks to days - $amount = 7*$amount + $wday; + $amount = 7*$amount; + $amount += $wday if $startof; $unit = 'd'; } if ($unit eq 'd') { - $date -= $sec + 60*$min + 3600*$hour + 24*3600*$amount; - return time2str("%Y-%m-%d %H:%M:%S", $date); + if ($startof) { + $fmt = "%Y-%m-%d 00:00:00"; + $date -= $sec + 60*$min + 3600*$hour; + } + $date -= 24*3600*$amount; + return time2str($fmt, $date); } elsif ($unit eq 'y') { - return sprintf("%4d-01-01 00:00:00", $year+1900-$amount); + if ($startof) { + return sprintf("%4d-01-01 00:00:00", $year+1900-$amount); + } + else { + return sprintf("%4d-%02d-%02d %02d:%02d:%02d", + $year+1900-$amount, $month+1, $mday, $hour, $min, $sec); + } } elsif ($unit eq 'm') { $month -= $amount; while ($month<0) { $year--; $month += 12; } - return sprintf("%4d-%02d-01 00:00:00", $year+1900, $month+1); + if ($startof) { + return sprintf("%4d-%02d-01 00:00:00", $year+1900, $month+1); + } + else { + return sprintf("%4d-%02d-%02d %02d:%02d:%02d", + $year+1900, $month+1, $mday, $hour, $min, $sec); + } } elsif ($unit eq 'h') { - # Special case 0h for 'beginning of this hour' - if ($amount == 0) { - $date -= $sec + 60*$min; - } else { - $date -= 3600*$amount; - } - return time2str("%Y-%m-%d %H:%M:%S", $date); + # Special case for 'beginning of an hour' + if ($startof) { + $fmt = "%Y-%m-%d %H:00:00"; + } + $date -= 3600*$amount; + return time2str($fmt, $date); } return undef; # should not happen due to regexp at top } @@ -1921,7 +1939,7 @@ sub SqlifyDate { if (!defined($date)) { ThrowUserError("illegal_date", { date => $str }); } - return time2str("%Y-%m-%d %H:%M:%S", $date); + return time2str($fmt, $date); } ######################################