update: Change update notifier for new style banner. (#3289)
For binary releases and operating systems it would be All operating systems. ``` ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Minio is 25 days 12 hours 30 minutes old ┃ ┃ Update: https://dl.minio.io/server/minio/release/linux-amd64/minio ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ``` On docker. ``` ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Minio is 25 days 12 hours 32 minutes old ┃ ┃ Update: docker pull minio/minio ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ```master
parent
1c47365445
commit
2c3a2241e7
@ -0,0 +1,88 @@ |
|||||||
|
/* |
||||||
|
* Minio Cloud Storage, (C) 2016 Minio, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package cmd |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"math" |
||||||
|
"time" |
||||||
|
) |
||||||
|
|
||||||
|
// humanizedDuration container to capture humanized time.
|
||||||
|
type humanizedDuration struct { |
||||||
|
Days int64 `json:"days,omitempty"` |
||||||
|
Hours int64 `json:"hours,omitempty"` |
||||||
|
Minutes int64 `json:"minutes,omitempty"` |
||||||
|
Seconds int64 `json:"seconds,omitempty"` |
||||||
|
} |
||||||
|
|
||||||
|
// StringShort() humanizes humanizedDuration to human readable short format.
|
||||||
|
// This does not print at seconds.
|
||||||
|
func (r humanizedDuration) StringShort() string { |
||||||
|
if r.Days == 0 && r.Hours == 0 { |
||||||
|
return fmt.Sprintf("%d minutes", r.Minutes) |
||||||
|
} |
||||||
|
if r.Days == 0 { |
||||||
|
return fmt.Sprintf("%d hours %d minutes", r.Hours, r.Minutes) |
||||||
|
} |
||||||
|
return fmt.Sprintf("%d days %d hours %d minutes", r.Days, r.Hours, r.Minutes) |
||||||
|
} |
||||||
|
|
||||||
|
// String() humanizes humanizedDuration to human readable,
|
||||||
|
func (r humanizedDuration) String() string { |
||||||
|
if r.Days == 0 && r.Hours == 0 && r.Minutes == 0 { |
||||||
|
return fmt.Sprintf("%d seconds", r.Seconds) |
||||||
|
} |
||||||
|
if r.Days == 0 && r.Hours == 0 { |
||||||
|
return fmt.Sprintf("%d minutes %d seconds", r.Minutes, r.Seconds) |
||||||
|
} |
||||||
|
if r.Days == 0 { |
||||||
|
return fmt.Sprintf("%d hours %d minutes %d seconds", r.Hours, r.Minutes, r.Seconds) |
||||||
|
} |
||||||
|
return fmt.Sprintf("%d days %d hours %d minutes %d seconds", r.Days, r.Hours, r.Minutes, r.Seconds) |
||||||
|
} |
||||||
|
|
||||||
|
// timeDurationToHumanizedDuration convert golang time.Duration to a custom more readable humanizedDuration.
|
||||||
|
func timeDurationToHumanizedDuration(duration time.Duration) humanizedDuration { |
||||||
|
r := humanizedDuration{} |
||||||
|
if duration.Seconds() < 60.0 { |
||||||
|
r.Seconds = int64(duration.Seconds()) |
||||||
|
return r |
||||||
|
} |
||||||
|
if duration.Minutes() < 60.0 { |
||||||
|
remainingSeconds := math.Mod(duration.Seconds(), 60) |
||||||
|
r.Seconds = int64(remainingSeconds) |
||||||
|
r.Minutes = int64(duration.Minutes()) |
||||||
|
return r |
||||||
|
} |
||||||
|
if duration.Hours() < 24.0 { |
||||||
|
remainingMinutes := math.Mod(duration.Minutes(), 60) |
||||||
|
remainingSeconds := math.Mod(duration.Seconds(), 60) |
||||||
|
r.Seconds = int64(remainingSeconds) |
||||||
|
r.Minutes = int64(remainingMinutes) |
||||||
|
r.Hours = int64(duration.Hours()) |
||||||
|
return r |
||||||
|
} |
||||||
|
remainingHours := math.Mod(duration.Hours(), 24) |
||||||
|
remainingMinutes := math.Mod(duration.Minutes(), 60) |
||||||
|
remainingSeconds := math.Mod(duration.Seconds(), 60) |
||||||
|
r.Hours = int64(remainingHours) |
||||||
|
r.Minutes = int64(remainingMinutes) |
||||||
|
r.Seconds = int64(remainingSeconds) |
||||||
|
r.Days = int64(duration.Hours() / 24) |
||||||
|
return r |
||||||
|
} |
@ -0,0 +1,76 @@ |
|||||||
|
/* |
||||||
|
* Minio Cloud Storage, (C) 2016 Minio, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package cmd |
||||||
|
|
||||||
|
import ( |
||||||
|
"strings" |
||||||
|
"testing" |
||||||
|
"time" |
||||||
|
) |
||||||
|
|
||||||
|
// Test humanized duration.
|
||||||
|
func TestHumanizedDuration(t *testing.T) { |
||||||
|
duration := time.Duration(90487000000000) |
||||||
|
humanDuration := timeDurationToHumanizedDuration(duration) |
||||||
|
if !strings.HasSuffix(humanDuration.String(), "seconds") { |
||||||
|
t.Fatal("Stringer method for humanized duration should have seconds.", humanDuration.String()) |
||||||
|
} |
||||||
|
if strings.HasSuffix(humanDuration.StringShort(), "seconds") { |
||||||
|
t.Fatal("StringShorter method for humanized duration should not have seconds.", humanDuration.StringShort()) |
||||||
|
} |
||||||
|
|
||||||
|
// Test humanized duration for seconds.
|
||||||
|
humanSecDuration := timeDurationToHumanizedDuration(time.Duration(5 * time.Second)) |
||||||
|
expectedHumanSecDuration := humanizedDuration{ |
||||||
|
Seconds: 5, |
||||||
|
} |
||||||
|
if humanSecDuration != expectedHumanSecDuration { |
||||||
|
t.Fatalf("Expected %#v, got %#v incorrect conversion of duration to humanized form", |
||||||
|
expectedHumanSecDuration, humanSecDuration) |
||||||
|
} |
||||||
|
if strings.HasSuffix(humanSecDuration.String(), "days") || |
||||||
|
strings.HasSuffix(humanSecDuration.String(), "hours") || |
||||||
|
strings.HasSuffix(humanSecDuration.String(), "minutes") { |
||||||
|
t.Fatal("Stringer method for humanized duration should have only seconds.", humanSecDuration.String()) |
||||||
|
} |
||||||
|
|
||||||
|
// Test humanized duration for minutes.
|
||||||
|
humanMinDuration := timeDurationToHumanizedDuration(10 * time.Minute) |
||||||
|
expectedHumanMinDuration := humanizedDuration{ |
||||||
|
Minutes: 10, |
||||||
|
} |
||||||
|
if humanMinDuration != expectedHumanMinDuration { |
||||||
|
t.Fatalf("Expected %#v, got %#v incorrect conversion of duration to humanized form", |
||||||
|
expectedHumanMinDuration, humanMinDuration) |
||||||
|
} |
||||||
|
if strings.HasSuffix(humanMinDuration.String(), "hours") { |
||||||
|
t.Fatal("Stringer method for humanized duration should have only minutes.", humanMinDuration.String()) |
||||||
|
} |
||||||
|
|
||||||
|
// Test humanized duration for hours.
|
||||||
|
humanHourDuration := timeDurationToHumanizedDuration(10 * time.Hour) |
||||||
|
expectedHumanHourDuration := humanizedDuration{ |
||||||
|
Hours: 10, |
||||||
|
} |
||||||
|
if humanHourDuration != expectedHumanHourDuration { |
||||||
|
t.Fatalf("Expected %#v, got %#v incorrect conversion of duration to humanized form", |
||||||
|
expectedHumanHourDuration, humanHourDuration) |
||||||
|
} |
||||||
|
if strings.HasSuffix(humanHourDuration.String(), "days") { |
||||||
|
t.Fatal("Stringer method for humanized duration should have hours.", humanHourDuration.String()) |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
/* |
||||||
|
* Minio Cloud Storage, (C) 2015 Minio, Inc. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package cmd |
||||||
|
|
||||||
|
import ( |
||||||
|
"strings" |
||||||
|
"testing" |
||||||
|
"time" |
||||||
|
) |
||||||
|
|
||||||
|
// Tests update notifier string builder.
|
||||||
|
func TestUpdateNotifier(t *testing.T) { |
||||||
|
updateMsg := minioUpdateStableURL |
||||||
|
colorUpdateMsg := colorizeUpdateMessage(updateMsg, time.Duration(72*time.Hour)) |
||||||
|
if strings.Index(colorUpdateMsg, "minutes") == -1 { |
||||||
|
t.Fatal("Duration string not found in colorized update message", colorUpdateMsg) |
||||||
|
} |
||||||
|
if strings.Index(colorUpdateMsg, updateMsg) == -1 { |
||||||
|
t.Fatal("Update message not found in colorized update message", updateMsg) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue