mirror of https://github.com/minio/minio.git
				
				
				
			
		
			
	
	
		
			93 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | /* | ||
|  |  * 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" | ||
|  | 	"runtime" | ||
|  | 	"strings" | ||
|  | 
 | ||
|  | 	"github.com/cheggaaa/pb" | ||
|  | 	"github.com/dustin/go-humanize" | ||
|  | 	"github.com/minio/mc/pkg/console" | ||
|  | ) | ||
|  | 
 | ||
|  | // fixateScanBar truncates or stretches text to fit within the terminal size.
 | ||
|  | func fixateScanBar(text string, width int) string { | ||
|  | 	if len([]rune(text)) > width { | ||
|  | 		// Trim text to fit within the screen
 | ||
|  | 		trimSize := len([]rune(text)) - width + 3 //"..."
 | ||
|  | 		if trimSize < len([]rune(text)) { | ||
|  | 			text = "..." + text[trimSize:] | ||
|  | 		} | ||
|  | 	} else { | ||
|  | 		text += strings.Repeat(" ", width-len([]rune(text))) | ||
|  | 	} | ||
|  | 	return text | ||
|  | } | ||
|  | 
 | ||
|  | // Progress bar function report objects being scaned.
 | ||
|  | type scanBarFunc func(string) | ||
|  | 
 | ||
|  | // scanBarFactory returns a progress bar function to report URL scanning.
 | ||
|  | func scanBarFactory() scanBarFunc { | ||
|  | 	fileCount := 0 | ||
|  | 	termWidth, err := pb.GetTerminalWidth() | ||
|  | 	if err != nil { | ||
|  | 		termWidth = 80 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// Cursor animate channel.
 | ||
|  | 	cursorCh := cursorAnimate() | ||
|  | 	return func(source string) { | ||
|  | 		scanPrefix := fmt.Sprintf("[%s] %s ", humanize.Comma(int64(fileCount)), string(<-cursorCh)) | ||
|  | 		source = fixateScanBar(source, termWidth-len([]rune(scanPrefix))) | ||
|  | 		barText := scanPrefix + source | ||
|  | 		console.PrintC("\r" + barText + "\r") | ||
|  | 		fileCount++ | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | // cursorAnimate - returns a animated rune through read channel for every read.
 | ||
|  | func cursorAnimate() <-chan rune { | ||
|  | 	cursorCh := make(chan rune) | ||
|  | 	var cursors string | ||
|  | 
 | ||
|  | 	switch runtime.GOOS { | ||
|  | 	case "linux": | ||
|  | 		// cursors = "➩➪➫➬➭➮➯➱"
 | ||
|  | 		// cursors = "▁▃▄▅▆▇█▇▆▅▄▃"
 | ||
|  | 		cursors = "◐◓◑◒" | ||
|  | 		// cursors = "←↖↑↗→↘↓↙"
 | ||
|  | 		// cursors = "◴◷◶◵"
 | ||
|  | 		// cursors = "◰◳◲◱"
 | ||
|  | 		//cursors = "⣾⣽⣻⢿⡿⣟⣯⣷"
 | ||
|  | 	case "darwin": | ||
|  | 		cursors = "◐◓◑◒" | ||
|  | 	default: | ||
|  | 		cursors = "|/-\\" | ||
|  | 	} | ||
|  | 	go func() { | ||
|  | 		for { | ||
|  | 			for _, cursor := range cursors { | ||
|  | 				cursorCh <- cursor | ||
|  | 			} | ||
|  | 		} | ||
|  | 	}() | ||
|  | 	return cursorCh | ||
|  | } |