Просмотр исходного кода

add (restore) support for detach keys

Signed-off-by: Nicolas De Loof <[email protected]>
Nicolas De Loof 1 месяц назад
Родитель
Сommit
6e55832b1c
6 измененных файлов с 34 добавлено и 19 удалено
  1. 16 13
      cmd/formatter/shortcut.go
  2. 6 5
      pkg/compose/attach.go
  3. 6 1
      pkg/compose/attach_service.go
  4. 1 0
      pkg/compose/run.go
  5. 4 0
      pkg/compose/up.go
  6. 1 0
      pkg/compose/watch.go

+ 16 - 13
cmd/formatter/shortcut.go

@@ -22,6 +22,7 @@ import (
 	"fmt"
 	"math"
 	"os"
+	"strings"
 	"syscall"
 	"time"
 
@@ -90,6 +91,7 @@ const (
 type LogKeyboard struct {
 	kError                KeyboardError
 	Watch                 *KeyboardWatch
+	Detach                func()
 	IsDockerDesktopActive bool
 	logLevel              KEYBOARD_LOG_LEVEL
 	signalChannel         chan<- os.Signal
@@ -161,29 +163,23 @@ func (lk *LogKeyboard) printNavigationMenu() {
 }
 
 func (lk *LogKeyboard) navigationMenu() string {
-	var openDDInfo string
+	var items []string
 	if lk.IsDockerDesktopActive {
-		openDDInfo = shortcutKeyColor("v") + navColor(" View in Docker Desktop")
+		items = append(items, shortcutKeyColor("v")+navColor(" View in Docker Desktop"))
 	}
 
-	var openDDUI string
-	if openDDInfo != "" {
-		openDDUI = navColor("   ")
-	}
 	if lk.IsDockerDesktopActive {
-		openDDUI = openDDUI + shortcutKeyColor("o") + navColor(" View Config")
+		items = append(items, shortcutKeyColor("o")+navColor(" View Config"))
 	}
 
-	var watchInfo string
-	if openDDInfo != "" || openDDUI != "" {
-		watchInfo = navColor("   ")
-	}
 	isEnabled := " Enable"
 	if lk.Watch != nil && lk.Watch.Watching {
 		isEnabled = " Disable"
 	}
-	watchInfo = watchInfo + shortcutKeyColor("w") + navColor(isEnabled+" Watch")
-	return openDDInfo + openDDUI + watchInfo
+	items = append(items, shortcutKeyColor("w")+navColor(isEnabled+" Watch"))
+	items = append(items, shortcutKeyColor("d")+navColor(" Detach"))
+
+	return strings.Join(items, "   ")
 }
 
 func (lk *LogKeyboard) clearNavigationMenu() {
@@ -290,6 +286,9 @@ func (lk *LogKeyboard) ToggleWatch(ctx context.Context, options api.UpOptions) {
 
 func (lk *LogKeyboard) HandleKeyEvents(ctx context.Context, event keyboard.KeyEvent, project *types.Project, options api.UpOptions) {
 	switch kRune := event.Rune; kRune {
+	case 'd':
+		lk.clearNavigationMenu()
+		lk.Detach()
 	case 'v':
 		lk.openDockerDesktop(ctx, project)
 	case 'w':
@@ -336,6 +335,10 @@ func (lk *LogKeyboard) EnableWatch(enabled bool, watcher Feature) {
 	}
 }
 
+func (lk *LogKeyboard) EnableDetach(detach func()) {
+	lk.Detach = detach
+}
+
 func allocateSpace(lines int) {
 	for i := 0; i < lines; i++ {
 		clearLine()

+ 6 - 5
pkg/compose/attach.go

@@ -152,11 +152,12 @@ func (s *composeService) getContainerStreams(ctx context.Context, container stri
 	var stdout io.ReadCloser
 	var stdin io.WriteCloser
 	cnx, err := s.apiClient().ContainerAttach(ctx, container, containerType.AttachOptions{
-		Stream: true,
-		Stdin:  true,
-		Stdout: true,
-		Stderr: true,
-		Logs:   false,
+		Stream:     true,
+		Stdin:      true,
+		Stdout:     true,
+		Stderr:     true,
+		Logs:       false,
+		DetachKeys: s.configFile().DetachKeys,
 	})
 	if err == nil {
 		stdout = ContainerStdout{HijackedResponse: cnx}

+ 6 - 1
pkg/compose/attach_service.go

@@ -31,8 +31,13 @@ func (s *composeService) Attach(ctx context.Context, projectName string, options
 		return err
 	}
 
+	detachKeys := options.DetachKeys
+	if detachKeys == "" {
+		detachKeys = s.configFile().DetachKeys
+	}
+
 	var attach container.AttachOptions
-	attach.DetachKeys = options.DetachKeys
+	attach.DetachKeys = detachKeys
 	attach.NoStdin = options.NoStdin
 	attach.Proxy = options.Proxy
 	return container.RunAttach(ctx, s.dockerCli, target.ID, &attach)

+ 1 - 0
pkg/compose/run.go

@@ -49,6 +49,7 @@ func (s *composeService) RunOneOffContainer(ctx context.Context, project *types.
 		OpenStdin:  !opts.Detach && opts.Interactive,
 		Attach:     !opts.Detach,
 		Containers: []string{containerID},
+		DetachKeys: s.configFile().DetachKeys,
 	})
 	var stErr cli.StatusError
 	if errors.As(err, &stErr) {

+ 4 - 0
pkg/compose/up.go

@@ -107,6 +107,10 @@ func (s *composeService) Up(ctx context.Context, project *types.Project, options
 	globalCtx, cancel := context.WithCancel(ctx)
 	defer cancel()
 
+	if navigationMenu != nil {
+		navigationMenu.EnableDetach(cancel)
+	}
+
 	var (
 		eg   errgroup.Group
 		mu   sync.Mutex

+ 1 - 0
pkg/compose/watch.go

@@ -597,6 +597,7 @@ func (s *composeService) exec(ctx context.Context, project *types.Project, servi
 			exec.Privileged = x.Privileged
 			exec.Command = x.Command
 			exec.Workdir = x.WorkingDir
+			exec.DetachKeys = s.configFile().DetachKeys
 			for _, v := range x.Environment.ToMapping().Values() {
 				err := exec.Env.Set(v)
 				if err != nil {