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