diff options
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/docker-20180710.743/docker-container.el')
-rw-r--r-- | configs/shared/emacs/.emacs.d/elpa/docker-20180710.743/docker-container.el | 478 |
1 files changed, 478 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/docker-20180710.743/docker-container.el b/configs/shared/emacs/.emacs.d/elpa/docker-20180710.743/docker-container.el new file mode 100644 index 000000000000..ceebd82c7a09 --- /dev/null +++ b/configs/shared/emacs/.emacs.d/elpa/docker-20180710.743/docker-container.el @@ -0,0 +1,478 @@ +;;; docker-container.el --- Emacs interface to docker-container -*- lexical-binding: t -*- + +;; Author: Philippe Vaucher <philippe.vaucher@gmail.com> +;; Yuki Inoue <inouetakahiroki@gmail.com> + +;; This file is NOT part of GNU Emacs. + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. + +;;; Commentary: + +;;; Code: + +(require 'docker-process) +(require 'docker-utils) +(require 'magit-popup) +(require 'tablist) +(require 'json) + +(defcustom docker-container-show-all t + "Show non-running containers." + :group 'docker + :type 'boolean) + +(defcustom docker-container-shell-file-name shell-file-name + "Shell to use when entering containers. +For more information see the variable `shell-file-name'." + :group 'docker + :type 'string) + +(defcustom docker-container-default-sort-key '("Image" . nil) + "Sort key for docker containers. + +This should be a cons cell (NAME . FLIP) where +NAME is a string matching one of the column names +and FLIP is a boolean to specify the sort order." + :group 'docker + :type '(cons (choice (const "Id") + (const "Image") + (const "Command") + (const "Created") + (const "Status") + (const "Ports") + (const "Names")) + (choice (const :tag "Ascending" nil) + (const :tag "Descending" t)))) + +(defun docker-container-parse (line) + "Convert a LINE from \"docker ps\" to a `tabulated-list-entries' entry." + (let (data) + (condition-case nil + (setq data (json-read-from-string line)) + (json-readtable-error + (error "Could not read following string as json:\n%s" line))) + (list (aref data 6) data))) + +(defun docker-container-entries () + "Return the docker containers data for `tabulated-list-entries'." + (let* ((fmt "[{{json .ID}},{{json .Image}},{{json .Command}},{{json .RunningFor}},{{json .Status}},{{json .Ports}},{{json .Names}}]") + (data (docker-run "ps" (format "--format=\"%s\"" fmt) (when docker-container-show-all "-a "))) + (lines (s-split "\n" data t))) + (-map #'docker-container-parse lines))) + +(defun docker-container-refresh () + "Refresh the containers list." + (setq tabulated-list-entries (docker-container-entries))) + +(defun docker-container-read-name () + "Read an container name." + (completing-read "Container: " (-map #'car (docker-container-entries)))) + +;;;###autoload +(defun docker-start (name) + "Start the container named NAME." + (interactive (list (docker-container-read-name))) + (docker-run "start" name)) + +;;;###autoload +(defun docker-stop (name &optional timeout) + "Stop the container named NAME. + +TIMEOUT is the number of seconds to wait for the container to stop before killing it." + (interactive (list (docker-container-read-name) current-prefix-arg)) + (docker-run "stop" (when timeout (format "-t %d" timeout)) name)) + +;;;###autoload +(defun docker-restart (name &optional timeout) + "Restart the container named NAME. + +TIMEOUT is the number of seconds to wait for the container to stop before killing it." + (interactive (list (docker-container-read-name) current-prefix-arg)) + (docker-run "restart" (when timeout (format "-t %d" timeout)) name)) + +;;;###autoload +(defun docker-pause (name) + "Pause the container named NAME." + (interactive (list (docker-container-read-name))) + (docker-run "pause" name)) + +;;;###autoload +(defun docker-unpause (name) + "Unpause the container named NAME." + (interactive (list (docker-container-read-name))) + (docker-run "unpause" name)) + +;;;###autoload +(defun docker-rm (name &optional force link volumes) + "Remove the container named NAME. + +With prefix argument, sets FORCE to true. + +Force the removal even if the container is running when FORCE is set. +Remove the specified link and not the underlying container when LINK is set. +Remove the volumes associated with the container when VOLUMES is set." + (interactive (list (docker-container-read-name) current-prefix-arg)) + (docker-run "rm" (when force "-f") (when link "-l") (when volumes "-v") name)) + +;;;###autoload +(defun docker-kill (name &optional signal) + "Kill the container named NAME using SIGNAL." + (interactive (list (docker-container-read-name))) + (docker-run "kill" (when signal (format "-s %s" signal)) name)) + +;;;###autoload +(defun docker-inspect (name) + "Inspect the container named NAME." + (interactive (list (docker-container-read-name))) + (docker-utils-with-buffer (format "inspect %s" name) + (insert (docker-run "inspect" name)) + (json-mode))) + +;;;###autoload +(defun docker-diff (name) + "Diff the container named NAME." + (interactive (list (docker-container-read-name))) + (docker-utils-with-buffer (format "diff %s" name) + (insert (docker-run "diff" name)))) + +;;;###autoload +(defun docker-rename (container name) + "Rename CONTAINER using NAME." + (interactive (list (docker-container-read-name) (read-string "Name: "))) + (docker-run "rename" container name)) + +;;;###autoload +(defun docker-logs (name &optional follow) + "Show the logs from container NAME. + +If FOLLOW is set, run in `async-shell-command'." + (interactive (list (docker-container-read-name))) + (if follow + (async-shell-command (format "%s logs -f %s" docker-command name) (format "* docker logs %s *" name)) + (docker-utils-with-buffer (format "logs %s" name) + (insert (docker-run "logs" name))))) + +;;;###autoload +(defun docker-container-find-file (container file) + "Inside CONTAINER open FILE." + (interactive + (let* ((container-name (docker-container-read-name)) + (tramp-filename (read-file-name "File: " (format "/docker:%s:/" container-name)))) + (with-parsed-tramp-file-name tramp-filename nil + (list host localname)))) + (find-file (format "/docker:%s:%s" container file))) + +;;;###autoload +(defun docker-container-find-directory (container directory) + "Inside CONTAINER open DIRECTORY." + (interactive + (let* ((container-name (docker-container-read-name)) + (tramp-filename (read-directory-name "Directory: " (format "/docker:%s:/" container-name)))) + (with-parsed-tramp-file-name tramp-filename nil + (list host localname)))) + (dired (format "/docker:%s:%s" container directory))) + +(defalias 'docker-container-dired 'docker-container-find-directory) + +;;;###autoload +(defun docker-container-shell (container) + "Open `shell' in CONTAINER." + (interactive (list (docker-container-read-name))) + (let* ((shell-file-name docker-container-shell-file-name) + (container-address (format "docker:%s:/" container)) + (file-prefix (if (file-remote-p default-directory) + (with-parsed-tramp-file-name default-directory nil + (format "/%s:%s|" method host)) + "/")) + (default-directory (format "%s%s" file-prefix container-address))) + (shell (format "*shell %s*" default-directory)))) + +;;;###autoload +(defun docker-container-eshell (container) + "Open `eshell' in CONTAINER." + (interactive (list (docker-container-read-name))) + (let* ((container-address (format "docker:%s:/" container)) + (file-prefix (if (file-remote-p default-directory) + (with-parsed-tramp-file-name default-directory nil + (format "/%s:%s|" method host)) + "/")) + (default-directory (format "%s%s" file-prefix container-address)) + (eshell-buffer-name (format "*eshell %s*" default-directory))) + (eshell))) + +(defun docker-container-start-selection () + "Run `docker-start' on the containers selection." + (interactive) + (--each (docker-utils-get-marked-items-ids) + (docker-run "start" (docker-container-start-arguments) it)) + (tablist-revert)) + +(defun docker-container-stop-selection () + "Run `docker-stop' on the containers selection." + (interactive) + (--each (docker-utils-get-marked-items-ids) + (docker-run "stop" (docker-container-stop-arguments) it)) + (tablist-revert)) + +(defun docker-container-restart-selection () + "Run `docker-restart' on the containers selection." + (interactive) + (--each (docker-utils-get-marked-items-ids) + (docker-run "restart" (docker-container-restart-arguments) it)) + (tablist-revert)) + +(defun docker-container-pause-selection () + "Run `docker-pause' on the containers selection." + (interactive) + (--each (docker-utils-get-marked-items-ids) + (docker-run "pause" (docker-container-pause-arguments) it)) + (tablist-revert)) + +(defun docker-container-unpause-selection () + "Run `docker-unpause' on the containers selection." + (interactive) + (--each (docker-utils-get-marked-items-ids) + (docker-run "unpause" (docker-container-unpause-arguments) it)) + (tablist-revert)) + +(defun docker-container-rm-selection () + "Run `docker-rm' on the containers selection." + (interactive) + (--each (docker-utils-get-marked-items-ids) + (docker-run "rm" (docker-container-rm-arguments) it)) + (tablist-revert)) + +(defun docker-container-kill-selection () + "Run `docker-kill' on the containers selection." + (interactive) + (--each (docker-utils-get-marked-items-ids) + (docker-run "kill" (docker-container-kill-arguments) it)) + (tablist-revert)) + +(defun docker-container-inspect-selection () + "Run `docker-inspect' on the containers selection." + (interactive) + (--each (docker-utils-get-marked-items-ids) + (docker-utils-with-buffer (format "inspect %s" it) + (insert (docker-run "inspect" (docker-container-inspect-arguments) it)) + (json-mode)))) + +(defun docker-container-diff-selection () + "Run `docker-diff' on the containers selection." + (interactive) + (--each (docker-utils-get-marked-items-ids) + (docker-utils-with-buffer (format "diff %s" it) + (insert (docker-run "diff" (docker-container-diff-arguments) it))))) + +(defun docker-container-rename-selection () + "Rename containers." + (interactive) + (docker-utils-select-if-empty) + (--each (docker-utils-get-marked-items-ids) + (docker-rename it (read-string (format "New name for %s: " it)))) + (tablist-revert)) + +(defun docker-container-logs-selection () + "Run \"docker logs\" on the containers selection." + (interactive) + (--each (docker-utils-get-marked-items-ids) + (async-shell-command + (format "%s logs %s %s" docker-command (s-join " " (docker-container-logs-arguments)) it) + (format "* docker logs %s *" it)))) + +(defun docker-container-find-file-selection (path) + "Run `docker-container-find-file' on the containers selection." + (interactive "sPath: ") + (--each (docker-utils-get-marked-items-ids) + (docker-container-find-file it path))) + +(defun docker-container-shell-selection () + "Run `docker-container-shell' on the containers selection." + (interactive) + (--each (docker-utils-get-marked-items-ids) + (docker-container-shell it))) + +(defun docker-container-eshell-selection () + "Run `docker-container-eshell' on the containers selection." + (interactive) + (--each (docker-utils-get-marked-items-ids) + (docker-container-eshell it))) + +(defun docker-container-cp-from-selection (container-path host-path) + "Run \"docker cp\" from CONTAINER-PATH to HOST-PATH for selected container." + (interactive "sContainer path: \nFHost path: ") + (--each (docker-utils-get-marked-items-ids) + (docker-run "cp" (concat it ":" container-path) host-path))) + +(defun docker-container-cp-to-selection (host-path container-path) + "Run \"docker cp\" from HOST-PATH to CONTAINER-PATH for selected containers." + (interactive "fHost path: \nsContainer path: ") + (--each (docker-utils-get-marked-items-ids) + (docker-run "cp" host-path (concat it ":" container-path)))) + +(magit-define-popup docker-container-start-popup + "Popup for starting containers." + 'docker-container-popups + :man-page "docker-start" + :actions '((?S "Start" docker-container-start-selection)) + :setup-function #'docker-utils-setup-popup) + +(magit-define-popup docker-container-stop-popup + "Popup for stoping containers." + 'docker-container-popups + :man-page "docker-stop" + :options '((?t "Timeout" "-t ")) + :actions '((?O "Stop" docker-container-stop-selection)) + :setup-function #'docker-utils-setup-popup) + +(magit-define-popup docker-container-restart-popup + "Popup for restarting containers." + 'docker-container-popups + :man-page "docker-restart" + :options '((?t "Timeout" "-t ")) + :actions '((?R "Restart" docker-container-restart-selection)) + :setup-function #'docker-utils-setup-popup) + +(magit-define-popup docker-container-pause-popup + "Popup for pauseing containers." + 'docker-container-popups + :man-page "docker-pause" + :actions '((?P "Pause" docker-container-pause-selection) + (?U "Unpause" docker-container-unpause-selection)) + :setup-function #'docker-utils-setup-popup) + +(magit-define-popup docker-container-rm-popup + "Popup for removing containers." + 'docker-container-popups + :man-page "docker-rm" + :switches '((?f "Force" "-f") + (?v "Volumes" "-v")) + :actions '((?D "Remove" docker-container-rm-selection)) + :setup-function #'docker-utils-setup-popup) + +(magit-define-popup docker-container-kill-popup + "Popup for kill signaling containers" + 'docker-container-popups + :man-page "docker-kill" + :options '((?s "Signal" "-s ")) + :actions '((?K "Kill" docker-container-kill-selection)) + :setup-function #'docker-utils-setup-popup) + +(magit-define-popup docker-container-inspect-popup + "Popup for inspecting containers." + 'docker-container-popups + :man-page "docker-inspect" + :actions '((?I "Inspect" docker-container-inspect-selection)) + :setup-function #'docker-utils-setup-popup) + +(magit-define-popup docker-container-diff-popup + "Popup for showing containers diffs." + 'docker-container-popups + :man-page "docker-diff" + :actions '((?d "Diff" docker-container-diff-selection)) + :setup-function #'docker-utils-setup-popup) + +(magit-define-popup docker-container-logs-popup + "Popup for showing containers logs." + 'docker-container-popups + :man-page "docker-logs" + :switches '((?f "Follow" "-f")) + :actions '((?L "Logs" docker-container-logs-selection)) + :setup-function #'docker-utils-setup-popup) + +(magit-define-popup docker-container-find-file-popup + "Popup for opening containers files." + 'docker-container-popups + :actions '((?f "Open file" docker-container-find-file-selection)) + :setup-function #'docker-utils-setup-popup) + +(magit-define-popup docker-container-shell-popup + "Popup for doing M-x `shell'/`eshell' to containers." + 'docker-container-popups + :actions '((?b "Shell" docker-container-shell-selection) + (?e "Eshell" docker-container-eshell-selection)) + :setup-function #'docker-utils-setup-popup) + +(magit-define-popup docker-container-cp-popup + "Popup for copying files from/to containers." + 'docker-container-popups + :man-page "docker-cp" + :actions '((?F "Copy From" docker-container-cp-from-selection) + (?T "Copy To" docker-container-cp-to-selection)) + :setup-function #'docker-utils-setup-popup) + +(magit-define-popup docker-container-help-popup + "Help popup for docker containers." + :actions '("Docker containers help" + (?C "Copy" docker-container-cp-popup) + (?D "Remove" docker-container-rm-popup) + (?I "Inspect" docker-container-inspect-popup) + (?K "Kill" docker-container-kill-popup) + (?L "Logs" docker-container-logs-popup) + (?O "Stop" docker-container-stop-popup) + (?P "Pause" docker-container-pause-popup) + (?R "Restart" docker-container-restart-popup) + (?S "Start" docker-container-start-popup) + (?b "Shell" docker-container-shell-popup) + (?d "Diff" docker-container-diff-popup) + (?f "Find file" docker-container-find-file-popup) + (?r "Rename" docker-container-rename-selection) + "Switch to other parts" + (?i "Images" docker-images) + (?m "Machines" docker-machines) + (?n "Networks" docker-networks) + (?v "Volumes" docker-volumes))) + +(defvar docker-container-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "?" 'docker-container-help-popup) + (define-key map "C" 'docker-container-cp-popup) + (define-key map "D" 'docker-container-rm-popup) + (define-key map "I" 'docker-container-inspect-popup) + (define-key map "K" 'docker-container-kill-popup) + (define-key map "L" 'docker-container-logs-popup) + (define-key map "O" 'docker-container-stop-popup) + (define-key map "P" 'docker-container-pause-popup) + (define-key map "R" 'docker-container-restart-popup) + (define-key map "S" 'docker-container-start-popup) + (define-key map "b" 'docker-container-shell-popup) + (define-key map "d" 'docker-container-diff-popup) + (define-key map "f" 'docker-container-find-file-popup) + (define-key map "r" 'docker-container-rename-selection) + map) + "Keymap for `docker-container-mode'.") + +;;;###autoload +(defun docker-containers () + "List docker containers." + (interactive) + (docker-utils-pop-to-buffer "*docker-containers*") + (docker-container-mode) + (tablist-revert)) + +(define-derived-mode docker-container-mode tabulated-list-mode "Containers Menu" + "Major mode for handling a list of docker containers." + (setq tabulated-list-format [("Id" 16 t)("Image" 15 t)("Command" 30 t)("Created" 15 t)("Status" 20 t)("Ports" 10 t)("Names" 10 t)]) + (setq tabulated-list-padding 2) + (setq tabulated-list-sort-key docker-container-default-sort-key) + (add-hook 'tabulated-list-revert-hook 'docker-container-refresh nil t) + (tabulated-list-init-header) + (tablist-minor-mode)) + +(provide 'docker-container) + +;;; docker-container.el ends here |