From: Andreas Gerler Date: Wed, 21 May 2025 11:58:45 +0000 (+0200) Subject: update dockerfile-mode X-Git-Url: http://git.bundesbrandschatzamt.de/?a=commitdiff_plain;h=01ec976d5659d8415c3071293f3fb9453b3c0293;p=emacsconfig.git update dockerfile-mode --- diff --git a/elpa/dockerfile-mode-20240914.1549/dockerfile-mode-autoloads.el b/elpa/dockerfile-mode-20240914.1549/dockerfile-mode-autoloads.el deleted file mode 100644 index bade491d..00000000 --- a/elpa/dockerfile-mode-20240914.1549/dockerfile-mode-autoloads.el +++ /dev/null @@ -1,57 +0,0 @@ -;;; dockerfile-mode-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- -;; Generated by the `loaddefs-generate' function. - -;; This file is part of GNU Emacs. - -;;; Code: - -(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) - - - -;;; Generated autoloads from dockerfile-mode.el - -(autoload 'dockerfile-build-buffer "dockerfile-mode" "\ -Build an image called IMAGE-NAME based upon the buffer. - -If the prefix arg NO-CACHE is set, don't cache the image. - -The shell command used to build the image is: - - sudo docker build \\ - --no-cache \\ - --force-rm \\ - --pull \\ - --tag IMAGE-NAME \\ - --build-args args \\ - --progress type \\ - -f filename \\ - directory - -(fn IMAGE-NAME &optional NO-CACHE)" t) -(autoload 'dockerfile-build-no-cache-buffer "dockerfile-mode" "\ -Build an image called IMAGE-NAME based upon the buffer without cache. - -(fn IMAGE-NAME)" t) -(autoload 'dockerfile-mode "dockerfile-mode" "\ -A major mode to edit Dockerfiles. -\\{dockerfile-mode-map} - -(fn)" t) -(add-to-list 'auto-mode-alist (cons (concat "[/\\]" "\\(?:Containerfile\\|Dockerfile\\)" "\\(?:\\.[^/\\]*\\)?\\'") 'dockerfile-mode)) -(add-to-list 'auto-mode-alist '("\\.dockerfile\\'" . dockerfile-mode)) -(register-definition-prefixes "dockerfile-mode" '("dockerfile-")) - -;;; End of scraped data - -(provide 'dockerfile-mode-autoloads) - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; no-native-compile: t -;; coding: utf-8-emacs-unix -;; End: - -;;; dockerfile-mode-autoloads.el ends here diff --git a/elpa/dockerfile-mode-20240914.1549/dockerfile-mode-pkg.el b/elpa/dockerfile-mode-20240914.1549/dockerfile-mode-pkg.el deleted file mode 100644 index 9d8ef861..00000000 --- a/elpa/dockerfile-mode-20240914.1549/dockerfile-mode-pkg.el +++ /dev/null @@ -1,8 +0,0 @@ -;; -*- no-byte-compile: t; lexical-binding: nil -*- -(define-package "dockerfile-mode" "20240914.1549" - "Major mode for editing Docker's Dockerfiles." - '((emacs "24")) - :url "https://github.com/spotify/dockerfile-mode" - :commit "4d893bd2da15833ce056332e6c972d5d93e78f04" - :revdesc "4d893bd2da15" - :keywords '("docker" "languages" "processes" "tools")) diff --git a/elpa/dockerfile-mode-20240914.1549/dockerfile-mode.el b/elpa/dockerfile-mode-20240914.1549/dockerfile-mode.el deleted file mode 100644 index 10452956..00000000 --- a/elpa/dockerfile-mode-20240914.1549/dockerfile-mode.el +++ /dev/null @@ -1,303 +0,0 @@ -;;; dockerfile-mode.el --- Major mode for editing Docker's Dockerfiles -*- lexical-binding: t -*- - -;; Copyright (c) 2013 Spotify AB -;; Package-Requires: ((emacs "24")) -;; Homepage: https://github.com/spotify/dockerfile-mode -;; URL: https://github.com/spotify/dockerfile-mode -;; Package-Version: 20240914.1549 -;; Package-Revision: 4d893bd2da15 -;; Keywords: docker languages processes tools -;; -;; 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. - -;;; Commentary: - -;; Provides a major mode `dockerfile-mode' for use with the standard -;; `Dockerfile' file format. Additional convenience functions allow -;; images to be built easily. - -;;; Code: - -(require 'sh-script) -(require 'rx) - - -(declare-function cygwin-convert-file-name-to-windows "cygw32.c" (file &optional absolute-p)) - -(defgroup dockerfile nil - "Dockerfile editing commands for Emacs." - :link '(custom-group-link :tag "Font Lock Faces group" font-lock-faces) - :prefix "dockerfile-" - :group 'languages) - -(defcustom dockerfile-mode-command "docker" - "Which binary to use to build images." - :group 'dockerfile - :type 'string) - -(defcustom dockerfile-use-sudo nil - "Runs docker builder command with sudo." - :type 'boolean - :group 'dockerfile) - -(defcustom dockerfile-build-force-rm nil - "Runs docker builder command with --force-rm switch." - :type 'boolean - :group 'dockerfile) - -(defcustom dockerfile-build-pull nil - "Runs docker builder command with --pull switch." - :type 'boolean - :group 'dockerfile) - -(defcustom dockerfile-build-args nil - "List of --build-arg to pass to docker build. - -Each element of the list will be passed as a separate - --build-arg to the docker build command." - :type '(repeat string) - :group 'dockerfile) - -(defcustom dockerfile-build-progress "auto" - "Type of --progress output (auto, plain, tty) of docker build." - :group 'dockerfile - :type 'string) - -(defcustom dockerfile-build-extra-options nil - "Extra command-line options to send to docker build. - -Use this variable to add custom command-line switches not covered by -existing dockerfile-build-* variables. - -Example: -(setq-default dockerfile-build-extra-options \"--network host\")" - :group 'dockerfile - :type 'string) - -(defcustom dockerfile-use-buildkit nil - "Use Docker buildkit for building images? - -This is the new buildsystem for docker, and in time it will replace the old one -but for now it has to be explicitly enabled to work. -It is supported from docker 18.09" - :type 'boolean) - -(defcustom dockerfile-enable-auto-indent t - "Toggles the auto indentation functionality." - :type 'boolean) - -(defcustom dockerfile-indent-offset (or standard-indent 2) - "Dockerfile number of columns for margin-changing functions to indent." - :type 'integer - :safe #'integerp - :group 'dockerfile) - -(defface dockerfile-image-name - '((t (:inherit (font-lock-type-face bold)))) - "Face to highlight the base image name after FROM instruction.") - -(defface dockerfile-image-alias - '((t (:inherit (font-lock-constant-face bold)))) - "Face to highlight the base image alias inf FROM ... AS construct.") - -(defconst dockerfile--from-regex - (rx "from " (group (+? nonl)) (or " " eol) (? "as " (group (1+ nonl))))) - -(defvar dockerfile-font-lock-keywords - `(,(cons (rx (or line-start "onbuild ") - (group (or "from" "maintainer" "run" "cmd" "expose" "env" "arg" - "add" "copy" "entrypoint" "volume" "user" "workdir" "onbuild" - "label" "stopsignal" "shell" "healthcheck")) - word-boundary) - font-lock-keyword-face) - (,dockerfile--from-regex - (1 'dockerfile-image-name) - (2 'dockerfile-image-alias nil t)) - ,@(sh-font-lock-keywords) - ,@(sh-font-lock-keywords-2) - ,@(sh-font-lock-keywords-1)) - "Default `font-lock-keywords' for `dockerfile mode'.") - -(defvar dockerfile-mode-map - (let ((map (make-sparse-keymap)) - (menu-map (make-sparse-keymap))) - (define-key map "\C-c\C-b" #'dockerfile-build-buffer) - (define-key map "\C-c\M-b" #'dockerfile-build-no-cache-buffer) - (define-key map "\C-c\C-c" #'comment-region) - (define-key map [menu-bar dockerfile-mode] (cons "Dockerfile" menu-map)) - (define-key menu-map [dfc] - '(menu-item "Comment Region" comment-region - :help "Comment Region")) - (define-key menu-map [dfb] - '(menu-item "Build" dockerfile-build-buffer - :help "Send the Dockerfile to docker build")) - (define-key menu-map [dfb] - '(menu-item "Build without cache" dockerfile-build-no-cache-buffer - :help "Send the Dockerfile to docker build without cache")) - map)) - -(defvar dockerfile-mode-syntax-table - (let ((table (make-syntax-table))) - (modify-syntax-entry ?# "<" table) - (modify-syntax-entry ?\n ">" table) - (modify-syntax-entry ?' "\"" table) - (modify-syntax-entry ?= "." table) - table) - "Syntax table for `dockerfile-mode'.") - -(define-abbrev-table 'dockerfile-mode-abbrev-table nil - "Abbrev table used while in `dockerfile-mode'.") - -(unless dockerfile-mode-abbrev-table - (define-abbrev-table 'dockerfile-mode-abbrev-table ())) - -(defun dockerfile-indent-line-function () - "Indent lines in a Dockerfile. - -Lines beginning with a keyword are ignored, and any others are -indented by one `dockerfile-indent-offset'. Functionality toggled -by `dockerfile-enable-auto-indent'." - (when dockerfile-enable-auto-indent - (unless (member (get-text-property (line-beginning-position) 'face) - '(font-lock-comment-delimiter-face font-lock-keyword-face)) - (save-excursion - (beginning-of-line) - (unless (looking-at-p "\\s-*$") ; Ignore empty lines. - (indent-line-to dockerfile-indent-offset)))))) - -(defun dockerfile-build-arg-string () - "Create a --build-arg string for each element in `dockerfile-build-args'." - (mapconcat (lambda (arg) (concat "--build-arg=" (replace-regexp-in-string "\\\\=" "=" (shell-quote-argument arg)))) - dockerfile-build-args " ")) - -(defun dockerfile-standard-filename (file) - "Convert the FILE name to OS standard. -If in Cygwin environment, uses Cygwin specific function to convert the -file name. Otherwise, uses Emacs' standard conversion function." - (if (fboundp 'cygwin-convert-file-name-to-windows) - (replace-regexp-in-string - (rx "\\") "\\\\" (cygwin-convert-file-name-to-windows file) t t) - (convert-standard-filename file))) - -(defun dockerfile-tag-string (image-name) - "Return a --tag shell-quoted IMAGE-NAME string. - -Returns an empty string if IMAGE-NAME is blank." - (if (string= image-name "") "" (format "--tag %s " (shell-quote-argument image-name)))) - -(define-obsolete-variable-alias 'docker-image-name 'dockerfile-image-name "2017-10-22") - -(defvar dockerfile-image-name nil - "Name of the dockerfile currently being used. -This can be set in file or directory-local variables.") - -(defvar dockerfile-image-name-history nil - "History of image names read by `dockerfile-read-image-name'.") - -(defun dockerfile-read-image-name () - "Read a docker image name." - (read-string "Image name: " dockerfile-image-name 'dockerfile-image-name-history)) - - -;;;###autoload -(defun dockerfile-build-buffer (image-name &optional no-cache) - "Build an image called IMAGE-NAME based upon the buffer. - -If the prefix arg NO-CACHE is set, don't cache the image. - -The shell command used to build the image is: - - sudo docker build \\ - --no-cache \\ - --force-rm \\ - --pull \\ - --tag IMAGE-NAME \\ - --build-args args \\ - --progress type \\ - -f filename \\ - directory" - - (interactive (list (dockerfile-read-image-name) prefix-arg)) - (save-buffer) - (compilation-start - (format - "%s%s%s build %s %s %s %s %s --progress %s %s -f %s %s" - (if dockerfile-use-buildkit "DOCKER_BUILDKIT=1 " "") - (if dockerfile-use-sudo "sudo " "") - dockerfile-mode-command - (if no-cache "--no-cache" "") - (if dockerfile-build-force-rm "--force-rm " "") - (if dockerfile-build-pull "--pull " "") - (dockerfile-tag-string image-name) - (dockerfile-build-arg-string) - dockerfile-build-progress - (or dockerfile-build-extra-options "") - (shell-quote-argument (dockerfile-standard-filename - (or (file-remote-p (buffer-file-name) 'localname) - (buffer-file-name)))) - (shell-quote-argument (dockerfile-standard-filename - (or (file-remote-p default-directory 'localname) - default-directory)))) - nil - (lambda (_) (format "*docker-build-output: %s *" image-name)))) - -;;;###autoload -(defun dockerfile-build-no-cache-buffer (image-name) - "Build an image called IMAGE-NAME based upon the buffer without cache." - (interactive (list (dockerfile-read-image-name))) - (dockerfile-build-buffer image-name t)) - -(defun dockerfile--imenu-function () - "Find the previous headline from point. - -Search for a FROM instruction. If an alias is used this is -returned, otherwise the base image name is used." - (when (re-search-backward dockerfile--from-regex nil t) - (let ((data (match-data))) - (when (match-string 2) - ;; we drop the first match group because - ;; imenu-generic-expression can only use one offset, so we - ;; normalize to `1'. - (set-match-data (list (nth 0 data) (nth 1 data) (nth 4 data) (nth 5 data)))) - t))) - -;;;###autoload -(define-derived-mode dockerfile-mode prog-mode "Dockerfile" - "A major mode to edit Dockerfiles. -\\{dockerfile-mode-map}" - (set-syntax-table dockerfile-mode-syntax-table) - (set (make-local-variable 'imenu-generic-expression) - `(("Stage" dockerfile--imenu-function 1))) - (set (make-local-variable 'require-final-newline) mode-require-final-newline) - (set (make-local-variable 'comment-start) "#") - (set (make-local-variable 'comment-end) "") - (set (make-local-variable 'comment-start-skip) "#+ *") - (set (make-local-variable 'parse-sexp-ignore-comments) t) - (set (make-local-variable 'font-lock-defaults) - '(dockerfile-font-lock-keywords nil t)) - (setq local-abbrev-table dockerfile-mode-abbrev-table) - (set (make-local-variable 'indent-line-function) #'dockerfile-indent-line-function)) - -;;;###autoload -(add-to-list 'auto-mode-alist - (cons (concat "[/\\]" - "\\(?:Containerfile\\|Dockerfile\\)" - "\\(?:\\.[^/\\]*\\)?\\'") - 'dockerfile-mode)) - -;;;###autoload -(add-to-list 'auto-mode-alist '("\\.dockerfile\\'" . dockerfile-mode)) - -(provide 'dockerfile-mode) - -;;; dockerfile-mode.el ends here diff --git a/elpa/dockerfile-mode-20250315.1426/dockerfile-mode-autoloads.el b/elpa/dockerfile-mode-20250315.1426/dockerfile-mode-autoloads.el new file mode 100644 index 00000000..bade491d --- /dev/null +++ b/elpa/dockerfile-mode-20250315.1426/dockerfile-mode-autoloads.el @@ -0,0 +1,57 @@ +;;; dockerfile-mode-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + +;;; Code: + +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + + + +;;; Generated autoloads from dockerfile-mode.el + +(autoload 'dockerfile-build-buffer "dockerfile-mode" "\ +Build an image called IMAGE-NAME based upon the buffer. + +If the prefix arg NO-CACHE is set, don't cache the image. + +The shell command used to build the image is: + + sudo docker build \\ + --no-cache \\ + --force-rm \\ + --pull \\ + --tag IMAGE-NAME \\ + --build-args args \\ + --progress type \\ + -f filename \\ + directory + +(fn IMAGE-NAME &optional NO-CACHE)" t) +(autoload 'dockerfile-build-no-cache-buffer "dockerfile-mode" "\ +Build an image called IMAGE-NAME based upon the buffer without cache. + +(fn IMAGE-NAME)" t) +(autoload 'dockerfile-mode "dockerfile-mode" "\ +A major mode to edit Dockerfiles. +\\{dockerfile-mode-map} + +(fn)" t) +(add-to-list 'auto-mode-alist (cons (concat "[/\\]" "\\(?:Containerfile\\|Dockerfile\\)" "\\(?:\\.[^/\\]*\\)?\\'") 'dockerfile-mode)) +(add-to-list 'auto-mode-alist '("\\.dockerfile\\'" . dockerfile-mode)) +(register-definition-prefixes "dockerfile-mode" '("dockerfile-")) + +;;; End of scraped data + +(provide 'dockerfile-mode-autoloads) + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; no-native-compile: t +;; coding: utf-8-emacs-unix +;; End: + +;;; dockerfile-mode-autoloads.el ends here diff --git a/elpa/dockerfile-mode-20250315.1426/dockerfile-mode-pkg.el b/elpa/dockerfile-mode-20250315.1426/dockerfile-mode-pkg.el new file mode 100644 index 00000000..03546dbe --- /dev/null +++ b/elpa/dockerfile-mode-20250315.1426/dockerfile-mode-pkg.el @@ -0,0 +1,8 @@ +;; -*- no-byte-compile: t; lexical-binding: nil -*- +(define-package "dockerfile-mode" "20250315.1426" + "Major mode for editing Docker's Dockerfiles." + '((emacs "24")) + :url "https://github.com/spotify/dockerfile-mode" + :commit "8135740bfc6ad96ab82d39d9fe68dbce56180f4c" + :revdesc "8135740bfc6a" + :keywords '("docker" "languages" "processes" "tools")) diff --git a/elpa/dockerfile-mode-20250315.1426/dockerfile-mode.el b/elpa/dockerfile-mode-20250315.1426/dockerfile-mode.el new file mode 100644 index 00000000..49b58b66 --- /dev/null +++ b/elpa/dockerfile-mode-20250315.1426/dockerfile-mode.el @@ -0,0 +1,303 @@ +;;; dockerfile-mode.el --- Major mode for editing Docker's Dockerfiles -*- lexical-binding: t -*- + +;; Copyright (c) 2013 Spotify AB +;; Package-Requires: ((emacs "24")) +;; Homepage: https://github.com/spotify/dockerfile-mode +;; URL: https://github.com/spotify/dockerfile-mode +;; Package-Version: 20250315.1426 +;; Package-Revision: 8135740bfc6a +;; Keywords: docker languages processes tools +;; +;; 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. + +;;; Commentary: + +;; Provides a major mode `dockerfile-mode' for use with the standard +;; `Dockerfile' file format. Additional convenience functions allow +;; images to be built easily. + +;;; Code: + +(require 'sh-script) +(require 'rx) + + +(declare-function cygwin-convert-file-name-to-windows "cygw32.c" (file &optional absolute-p)) + +(defgroup dockerfile nil + "Dockerfile editing commands for Emacs." + :link '(custom-group-link :tag "Font Lock Faces group" font-lock-faces) + :prefix "dockerfile-" + :group 'languages) + +(defcustom dockerfile-mode-command "docker" + "Which binary to use to build images." + :group 'dockerfile + :type 'string) + +(defcustom dockerfile-use-sudo nil + "Runs docker builder command with sudo." + :type 'boolean + :group 'dockerfile) + +(defcustom dockerfile-build-force-rm nil + "Runs docker builder command with --force-rm switch." + :type 'boolean + :group 'dockerfile) + +(defcustom dockerfile-build-pull nil + "Runs docker builder command with --pull switch." + :type 'boolean + :group 'dockerfile) + +(defcustom dockerfile-build-args nil + "List of --build-arg to pass to docker build. + +Each element of the list will be passed as a separate + --build-arg to the docker build command." + :type '(repeat string) + :group 'dockerfile) + +(defcustom dockerfile-build-progress "auto" + "Type of --progress output (auto, plain, tty) of docker build." + :group 'dockerfile + :type 'string) + +(defcustom dockerfile-build-extra-options nil + "Extra command-line options to send to docker build. + +Use this variable to add custom command-line switches not covered by +existing dockerfile-build-* variables. + +Example: +(setq-default dockerfile-build-extra-options \"--network host\")" + :group 'dockerfile + :type 'string) + +(defcustom dockerfile-use-buildkit nil + "Use Docker buildkit for building images? + +This is the new buildsystem for docker, and in time it will replace the old one +but for now it has to be explicitly enabled to work. +It is supported from docker 18.09" + :type 'boolean) + +(defcustom dockerfile-enable-auto-indent t + "Toggles the auto indentation functionality." + :type 'boolean) + +(defcustom dockerfile-indent-offset (or standard-indent 2) + "Dockerfile number of columns for margin-changing functions to indent." + :type 'integer + :safe #'integerp + :group 'dockerfile) + +(defface dockerfile-image-name + '((t (:inherit (font-lock-type-face bold)))) + "Face to highlight the base image name after FROM instruction.") + +(defface dockerfile-image-alias + '((t (:inherit (font-lock-constant-face bold)))) + "Face to highlight the base image alias inf FROM ... AS construct.") + +(defconst dockerfile--from-regex + (rx "from " (group (+? nonl)) (or " " eol) (? "as " (group (1+ nonl))))) + +(defvar dockerfile-font-lock-keywords + `(,(cons (rx (or line-start "onbuild ") + (group (or "from" "maintainer" "run" "cmd" "expose" "env" "arg" + "add" "copy" "entrypoint" "volume" "user" "workdir" "onbuild" + "label" "stopsignal" "shell" "healthcheck")) + word-boundary) + 'font-lock-keyword-face) + (,dockerfile--from-regex + (1 'dockerfile-image-name) + (2 'dockerfile-image-alias nil t)) + ,@(sh-font-lock-keywords) + ,@(sh-font-lock-keywords-2) + ,@(sh-font-lock-keywords-1)) + "Default `font-lock-keywords' for `dockerfile mode'.") + +(defvar dockerfile-mode-map + (let ((map (make-sparse-keymap)) + (menu-map (make-sparse-keymap))) + (define-key map "\C-c\C-b" #'dockerfile-build-buffer) + (define-key map "\C-c\M-b" #'dockerfile-build-no-cache-buffer) + (define-key map "\C-c\C-c" #'comment-region) + (define-key map [menu-bar dockerfile-mode] (cons "Dockerfile" menu-map)) + (define-key menu-map [dfc] + '(menu-item "Comment Region" comment-region + :help "Comment Region")) + (define-key menu-map [dfb] + '(menu-item "Build" dockerfile-build-buffer + :help "Send the Dockerfile to docker build")) + (define-key menu-map [dfb] + '(menu-item "Build without cache" dockerfile-build-no-cache-buffer + :help "Send the Dockerfile to docker build without cache")) + map)) + +(defvar dockerfile-mode-syntax-table + (let ((table (make-syntax-table))) + (modify-syntax-entry ?# "<" table) + (modify-syntax-entry ?\n ">" table) + (modify-syntax-entry ?' "\"" table) + (modify-syntax-entry ?= "." table) + table) + "Syntax table for `dockerfile-mode'.") + +(define-abbrev-table 'dockerfile-mode-abbrev-table nil + "Abbrev table used while in `dockerfile-mode'.") + +(unless dockerfile-mode-abbrev-table + (define-abbrev-table 'dockerfile-mode-abbrev-table ())) + +(defun dockerfile-indent-line-function () + "Indent lines in a Dockerfile. + +Lines beginning with a keyword are ignored, and any others are +indented by one `dockerfile-indent-offset'. Functionality toggled +by `dockerfile-enable-auto-indent'." + (when dockerfile-enable-auto-indent + (unless (member (get-text-property (line-beginning-position) 'face) + '(font-lock-comment-delimiter-face font-lock-keyword-face)) + (save-excursion + (beginning-of-line) + (unless (looking-at-p "\\s-*$") ; Ignore empty lines. + (indent-line-to dockerfile-indent-offset)))))) + +(defun dockerfile-build-arg-string () + "Create a --build-arg string for each element in `dockerfile-build-args'." + (mapconcat (lambda (arg) (concat "--build-arg=" (replace-regexp-in-string "\\\\=" "=" (shell-quote-argument arg)))) + dockerfile-build-args " ")) + +(defun dockerfile-standard-filename (file) + "Convert the FILE name to OS standard. +If in Cygwin environment, uses Cygwin specific function to convert the +file name. Otherwise, uses Emacs' standard conversion function." + (if (fboundp 'cygwin-convert-file-name-to-windows) + (replace-regexp-in-string + (rx "\\") "\\\\" (cygwin-convert-file-name-to-windows file) t t) + (convert-standard-filename file))) + +(defun dockerfile-tag-string (image-name) + "Return a --tag shell-quoted IMAGE-NAME string. + +Returns an empty string if IMAGE-NAME is blank." + (if (string= image-name "") "" (format "--tag %s " (shell-quote-argument image-name)))) + +(define-obsolete-variable-alias 'docker-image-name 'dockerfile-image-name "2017-10-22") + +(defvar dockerfile-image-name nil + "Name of the dockerfile currently being used. +This can be set in file or directory-local variables.") + +(defvar dockerfile-image-name-history nil + "History of image names read by `dockerfile-read-image-name'.") + +(defun dockerfile-read-image-name () + "Read a docker image name." + (read-string "Image name: " dockerfile-image-name 'dockerfile-image-name-history)) + + +;;;###autoload +(defun dockerfile-build-buffer (image-name &optional no-cache) + "Build an image called IMAGE-NAME based upon the buffer. + +If the prefix arg NO-CACHE is set, don't cache the image. + +The shell command used to build the image is: + + sudo docker build \\ + --no-cache \\ + --force-rm \\ + --pull \\ + --tag IMAGE-NAME \\ + --build-args args \\ + --progress type \\ + -f filename \\ + directory" + + (interactive (list (dockerfile-read-image-name) prefix-arg)) + (save-buffer) + (compilation-start + (format + "%s%s%s build %s %s %s %s %s --progress %s %s -f %s %s" + (if dockerfile-use-buildkit "DOCKER_BUILDKIT=1 " "") + (if dockerfile-use-sudo "sudo " "") + dockerfile-mode-command + (if no-cache "--no-cache" "") + (if dockerfile-build-force-rm "--force-rm " "") + (if dockerfile-build-pull "--pull " "") + (dockerfile-tag-string image-name) + (dockerfile-build-arg-string) + dockerfile-build-progress + (or dockerfile-build-extra-options "") + (shell-quote-argument (dockerfile-standard-filename + (or (file-remote-p (buffer-file-name) 'localname) + (buffer-file-name)))) + (shell-quote-argument (dockerfile-standard-filename + (or (file-remote-p default-directory 'localname) + default-directory)))) + nil + (lambda (_) (format "*docker-build-output: %s *" image-name)))) + +;;;###autoload +(defun dockerfile-build-no-cache-buffer (image-name) + "Build an image called IMAGE-NAME based upon the buffer without cache." + (interactive (list (dockerfile-read-image-name))) + (dockerfile-build-buffer image-name t)) + +(defun dockerfile--imenu-function () + "Find the previous headline from point. + +Search for a FROM instruction. If an alias is used this is +returned, otherwise the base image name is used." + (when (re-search-backward dockerfile--from-regex nil t) + (let ((data (match-data))) + (when (match-string 2) + ;; we drop the first match group because + ;; imenu-generic-expression can only use one offset, so we + ;; normalize to `1'. + (set-match-data (list (nth 0 data) (nth 1 data) (nth 4 data) (nth 5 data)))) + t))) + +;;;###autoload +(define-derived-mode dockerfile-mode prog-mode "Dockerfile" + "A major mode to edit Dockerfiles. +\\{dockerfile-mode-map}" + (set-syntax-table dockerfile-mode-syntax-table) + (set (make-local-variable 'imenu-generic-expression) + `(("Stage" dockerfile--imenu-function 1))) + (set (make-local-variable 'require-final-newline) mode-require-final-newline) + (set (make-local-variable 'comment-start) "#") + (set (make-local-variable 'comment-end) "") + (set (make-local-variable 'comment-start-skip) "#+ *") + (set (make-local-variable 'parse-sexp-ignore-comments) t) + (set (make-local-variable 'font-lock-defaults) + '(dockerfile-font-lock-keywords nil t)) + (setq local-abbrev-table dockerfile-mode-abbrev-table) + (set (make-local-variable 'indent-line-function) #'dockerfile-indent-line-function)) + +;;;###autoload +(add-to-list 'auto-mode-alist + (cons (concat "[/\\]" + "\\(?:Containerfile\\|Dockerfile\\)" + "\\(?:\\.[^/\\]*\\)?\\'") + 'dockerfile-mode)) + +;;;###autoload +(add-to-list 'auto-mode-alist '("\\.dockerfile\\'" . dockerfile-mode)) + +(provide 'dockerfile-mode) + +;;; dockerfile-mode.el ends here