mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-01 00:23:56 +08:00 
			
		
		
		
	build: display build details link
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
		
							
								
								
									
										86
									
								
								util/desktop/desktop.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								util/desktop/desktop.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | ||||
| package desktop | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/containerd/console" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	bbEnabledOnce sync.Once | ||||
| 	bbEnabled     bool | ||||
| ) | ||||
|  | ||||
| func BuildBackendEnabled() bool { | ||||
| 	bbEnabledOnce.Do(func() { | ||||
| 		home, err := os.UserHomeDir() | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 		_, err = os.Stat(filepath.Join(home, ".docker", "desktop-build", ".lastaccess")) | ||||
| 		bbEnabled = err == nil | ||||
| 	}) | ||||
| 	return bbEnabled | ||||
| } | ||||
|  | ||||
| func BuildDetailsOutput(refs map[string]string, term bool) string { | ||||
| 	if len(refs) == 0 { | ||||
| 		return "" | ||||
| 	} | ||||
| 	refURL := func(ref string) string { | ||||
| 		return fmt.Sprintf("docker-desktop://dashboard/build/%s", ref) | ||||
| 	} | ||||
| 	var out bytes.Buffer | ||||
| 	out.WriteString("View build details: ") | ||||
| 	multiTargets := len(refs) > 1 | ||||
| 	for target, ref := range refs { | ||||
| 		if multiTargets { | ||||
| 			out.WriteString(fmt.Sprintf("\n  %s: ", target)) | ||||
| 		} | ||||
| 		if term { | ||||
| 			out.WriteString(hyperlink(refURL(ref))) | ||||
| 		} else { | ||||
| 			out.WriteString(refURL(ref)) | ||||
| 		} | ||||
| 	} | ||||
| 	return out.String() | ||||
| } | ||||
|  | ||||
| func PrintBuildDetails(w io.Writer, refs map[string]string, term bool) { | ||||
| 	if out := BuildDetailsOutput(refs, term); out != "" { | ||||
| 		fmt.Fprintf(w, "\n%s\n", out) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func hyperlink(url string) string { | ||||
| 	// create an escape sequence using the OSC 8 format: https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda | ||||
| 	return fmt.Sprintf("\033]8;;%s\033\\%s\033]8;;\033\\", url, url) | ||||
| } | ||||
|  | ||||
| type ErrorWithBuildRef struct { | ||||
| 	Ref string | ||||
| 	Err error | ||||
| 	Msg string | ||||
| } | ||||
|  | ||||
| func (e *ErrorWithBuildRef) Error() string { | ||||
| 	return e.Err.Error() | ||||
| } | ||||
|  | ||||
| func (e *ErrorWithBuildRef) Unwrap() error { | ||||
| 	return e.Err | ||||
| } | ||||
|  | ||||
| func (e *ErrorWithBuildRef) Print(w io.Writer) error { | ||||
| 	var term bool | ||||
| 	if _, err := console.ConsoleFromFile(os.Stderr); err == nil { | ||||
| 		term = true | ||||
| 	} | ||||
| 	fmt.Fprintf(w, "\n%s", BuildDetailsOutput(map[string]string{"default": e.Ref}, term)) | ||||
| 	return nil | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 CrazyMax
					CrazyMax