From 5ef2b5ebc4779068ae42853eb40da876156c19f4 Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Wed, 14 Aug 2024 11:33:11 +0200 Subject: [PATCH] Consider buffer-local context+namespace in all display commands * kubed-transient.el (kubed-transient-infix): Remove. (kubed-transient-read-context): New function. (kubed-transient-read-namespace): Take into account value of "--context=" infix argument. (kubed-transient-display): Add "--context=" infix argument. * kubed.el (kubed-display-resource): Update interactive spec. (kubed--static-if): Simplify empty "else" parts. (kubed-define-resource): Update interactive spec for generated 'kubed-display-RESOURCE' commands. (kubed-local-context, kubed-local-namespace) (kubed-local-context-and-namespace): New functions. --- kubed-transient.el | 15 ++++-- kubed.el | 124 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 108 insertions(+), 31 deletions(-) diff --git a/kubed-transient.el b/kubed-transient.el index 51781b6..e70d4c1 100644 --- a/kubed-transient.el +++ b/kubed-transient.el @@ -15,11 +15,18 @@ (require 'kubed) (require 'transient) -(defclass kubed-transient-infix (transient-infix) ()) +(defun kubed-transient-read-context (prompt _initial-input _history) + "Prompt with PROMPT for Kubernetes context." + (kubed-read-context prompt (kubed-local-context))) (defun kubed-transient-read-namespace (prompt _initial-input _history) "Prompt with PROMPT for Kubernetes namespace." - (kubed-read-namespace prompt (kubed-current-namespace))) + (let ((context (seq-some (lambda (s) + (and (cl-typep s 'transient-infix) + (equal (oref s argument) "--context=") + (oref s value))) + transient--suffixes))) + (kubed-read-namespace prompt (kubed-current-namespace context) nil context))) (defun kubed-transient-read-ingressclass (prompt _initial-input _history) "Prompt with PROMPT for Kubernetes ingress class." @@ -224,7 +231,9 @@ ("!" "Command line" kubed-kubectl-command)] ["Options" ("-n" "Namespace" "--namespace=" - :prompt "Namespace" :reader kubed-transient-read-namespace)]] + :prompt "Namespace" :reader kubed-transient-read-namespace) + ("-C" "Context" "--context=" + :prompt "Context" :reader kubed-transient-read-context)]] (interactive) (transient-setup 'kubed-transient-display nil nil :scope '("get"))) diff --git a/kubed.el b/kubed.el index a75e394..b01442c 100644 --- a/kubed.el +++ b/kubed.el @@ -226,20 +226,31 @@ the namespace of the resource, or nil if TYPE is not namespaced.") (type resource context &optional namespace) "Display Kubernetes RESOURCE of type TYPE in BUFFER." (interactive - (let* ((type (kubed-read-resource-type "Resource type to display")) - (namespace - (when (kubed-namespaced-p type) - (or (seq-some - (lambda (arg) - (when (string-match "--namespace=\\(.+\\)" arg) - (match-string 1 arg))) - (kubed-transient-args 'kubed-transient-display)) - (let ((cur (kubed-current-namespace))) - (if current-prefix-arg - (kubed-read-namespace "Namespace" cur) - cur)))))) - (list type (kubed-read-resource-name type "Display" nil namespace) - (kubed-current-context) namespace))) + (let ((type nil) (context nil) (namespace nil)) + (dolist (arg (kubed-transient-args 'kubed-transient-display)) + (cond + ((string-match "--namespace=\\(.+\\)" arg) + (setq namespace (match-string 1 arg))) + ((string-match "--context=\\(.+\\)" arg) + (setq context (match-string 1 arg))))) + (unless context + (setq context + (let ((cxt (kubed-local-context))) + (if (equal current-prefix-arg '(16)) + (kubed-read-context "Context" cxt) + cxt)))) + (unless type + (setq type (kubed-read-resource-type "Type of resource to display" + nil context))) + (unless namespace + (setq namespace + (let ((cur (kubed-local-namespace context))) + (if current-prefix-arg + (kubed-read-namespace "Namespace" cur nil context) + cur)))) + (list type (kubed-read-resource-name type "Display" nil nil + context namespace) + context namespace))) (display-buffer (kubed-display-resource-in-buffer (concat "*Kubed " @@ -1028,7 +1039,7 @@ compatibility with earlier Emacs versions." (debug (sexp sexp &rest sexp))) (if (eval condition lexical-binding) then-form - (cons 'progn else-forms))) + (when else-forms (cons 'progn else-forms)))) (defun kubed-edit-resource (type resource &optional context namespace) "Edit Kubernetes RESOURCE of type TYPE." @@ -1184,19 +1195,42 @@ of %S, instead of just one." resource plrl-var) resource (upcase (symbol-name resource))) (interactive ,(if namespaced - `(let ((namespace - ;; Consult transient for --namespace. - (or (seq-some - (lambda (arg) - (when (string-match "--namespace=\\(.+\\)" arg) - (match-string 1 arg))) - (kubed-transient-args 'kubed-transient-display)) - (and current-prefix-arg (kubed-read-namespace "Namespace" (kubed-current-namespace)))))) - (list (,read-fun "Display" nil nil nil namespace) nil namespace)) - `(list (,read-fun "Display")))) - (kubed-display-resource - ,(symbol-name plrl-var) ,resource (or context (kubed-current-context)) - . ,(when namespaced '(namespace)))) + `(let ((context nil) (namespace nil)) + (dolist (arg (kubed-transient-args 'kubed-transient-display)) + (cond + ((string-match "--namespace=\\(.+\\)" arg) + (setq namespace (match-string 1 arg))) + ((string-match "--context=\\(.+\\)" arg) + (setq context (match-string 1 arg))))) + (unless context + (setq context + (let ((cxt (kubed-local-context))) + (if (equal current-prefix-arg '(16)) + (kubed-read-context "Context" cxt) + cxt)))) + (unless namespace + (setq namespace + (let ((cur (kubed-local-namespace context))) + (if current-prefix-arg + (kubed-read-namespace "Namespace" cur nil context) + cur)))) + (list (,read-fun "Display" nil nil context namespace) context namespace)) + `(let ((context nil)) + (dolist (arg (kubed-transient-args 'kubed-transient-display)) + (cond + ((string-match "--context=\\(.+\\)" arg) + (setq context (match-string 1 arg))))) + (unless context + (setq context + (let ((cxt (kubed-local-context))) + (if current-prefix-arg + (kubed-read-context "Context" cxt) + cxt)))) + (list (,read-fun "Display" nil nil context) context)))) + (let ((context (or context (kubed-local-context)))) + (kubed-display-resource + ,(symbol-name plrl-var) ,resource context + . ,(when namespaced '((or namespace (kubed-local-namespace context))))))) (defun ,edt-name (,resource &optional context . ,(when namespaced '(namespace))) ,(format "Edit Kubernetes %S %s." resource (upcase (symbol-name resource))) @@ -1957,6 +1991,12 @@ DEFAULT-BACKEND is the service to use as a backend for unhandled URLs." "Return current Kubernetes context." (car (process-lines kubed-kubectl-program "config" "current-context"))) +(defun kubed-local-context () + "Return Kubernetes context local to the current buffer." + (or kubed-list-context + (nth 2 kubed-display-resource-info) + (kubed-current-context))) + (defvar kubed-context-history nil "History list for `kubed-read-context'.") @@ -2028,6 +2068,34 @@ Optional argument DEFAULT is the minibuffer default argument." (format "jsonpath={.contexts[?(.name==\"%s\")].context.namespace}" (or context (kubed-current-context)))))) +(defun kubed-local-namespace (&optional context) + "Return Kubernetes namespace in CONTEXT local to the current buffer." + (or kubed-list-namespace + (nth 3 kubed-display-resource-info) + (kubed--static-if (<= 31 emacs-major-version) + (and (string-match "[/:]kubernetes:.*%\\([a-z0-9-]+\\):" + default-directory) + (match-string 1 default-directory))) + (kubed-current-namespace (or context (kubed-local-context))))) + +(defun kubed-local-context-and-namespace () + "Return (CONTEXT . NAMESPACE) pair local to the current buffer." + (or (when-let ((context kubed-list-context)) + (cons context + (or kubed-list-namespace + (kubed-current-namespace context)))) + (when-let ((context (nth 2 kubed-display-resource-info))) + (cons context + (or (nth 3 kubed-display-resource-info) + (kubed-current-namespace context)))) + (let ((context (kubed-current-context))) + (cons context + (or (kubed--static-if (<= 31 emacs-major-version) + (and (string-match "[/:]kubernetes:.*%\\([a-z0-9-]+\\):" + default-directory) + (match-string 1 default-directory))) + (kubed-current-namespace context)))))) + ;;;###autoload (defun kubed-set-namespace (ns &optional context) "Set default Kubernetes namespace in CONTEXT to NS." -- 2.39.2