From 9a159c55495546e1ef7bcb5423e0d9a0ebd87491 Mon Sep 17 00:00:00 2001 From: Andreas Gerler Date: Sun, 22 Dec 2024 13:21:03 +0100 Subject: [PATCH] update terraform-mode Signed-off-by: Andreas Gerler --- .../terraform-mode-autoloads.el | 34 -------- .../terraform-mode-pkg.el | 14 ---- .../terraform-mode-autoloads.el | 33 ++++++++ .../terraform-mode-pkg.el | 11 +++ .../terraform-mode.el | 77 +++++++++++++++---- elpa/terraform-mode-readme.txt | 6 -- 6 files changed, 108 insertions(+), 67 deletions(-) delete mode 100644 elpa/terraform-mode-20230607.1923/terraform-mode-autoloads.el delete mode 100644 elpa/terraform-mode-20230607.1923/terraform-mode-pkg.el create mode 100644 elpa/terraform-mode-20241217.1628/terraform-mode-autoloads.el create mode 100644 elpa/terraform-mode-20241217.1628/terraform-mode-pkg.el rename elpa/{terraform-mode-20230607.1923 => terraform-mode-20241217.1628}/terraform-mode.el (79%) delete mode 100644 elpa/terraform-mode-readme.txt diff --git a/elpa/terraform-mode-20230607.1923/terraform-mode-autoloads.el b/elpa/terraform-mode-20230607.1923/terraform-mode-autoloads.el deleted file mode 100644 index e749752d..00000000 --- a/elpa/terraform-mode-20230607.1923/terraform-mode-autoloads.el +++ /dev/null @@ -1,34 +0,0 @@ -;;; terraform-mode-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; -;;; Code: - -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) - - -;;;### (autoloads nil "terraform-mode" "terraform-mode.el" (0 0 0 -;;;;;; 0)) -;;; Generated autoloads from terraform-mode.el - -(autoload 'terraform-mode "terraform-mode" "\ -Major mode for editing terraform configuration file - -\(fn)" t nil) - -(add-to-list 'auto-mode-alist '("\\.tf\\(vars\\)?\\'" . terraform-mode)) - -(register-definition-prefixes "terraform-mode" '("terraform-")) - -;;;*** - -;;;### (autoloads nil nil ("terraform-mode-pkg.el") (0 0 0 0)) - -;;;*** - -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; terraform-mode-autoloads.el ends here diff --git a/elpa/terraform-mode-20230607.1923/terraform-mode-pkg.el b/elpa/terraform-mode-20230607.1923/terraform-mode-pkg.el deleted file mode 100644 index 30b94e09..00000000 --- a/elpa/terraform-mode-20230607.1923/terraform-mode-pkg.el +++ /dev/null @@ -1,14 +0,0 @@ -(define-package "terraform-mode" "20230607.1923" "Major mode for terraform configuration file" - '((emacs "24.3") - (hcl-mode "0.3") - (dash "2.17.0")) - :commit "25a22a66f81e35c75f2fdaaab89aad7f9940fe06" :authors - '(("Syohei YOSHIDA" . "syohex@gmail.com")) - :maintainers - '(("Syohei YOSHIDA" . "syohex@gmail.com")) - :maintainer - '("Syohei YOSHIDA" . "syohex@gmail.com") - :url "https://github.com/syohex/emacs-terraform-mode") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/terraform-mode-20241217.1628/terraform-mode-autoloads.el b/elpa/terraform-mode-20241217.1628/terraform-mode-autoloads.el new file mode 100644 index 00000000..f7c32175 --- /dev/null +++ b/elpa/terraform-mode-20241217.1628/terraform-mode-autoloads.el @@ -0,0 +1,33 @@ +;;; terraform-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 terraform-mode.el + +(autoload 'terraform-mode "terraform-mode" "\ +Major mode for editing terraform configuration file + +(fn)" t) +(add-to-list 'auto-mode-alist '("\\.t\\(f\\(vars\\)?\\|ofu\\)\\'" . terraform-mode)) +(register-definition-prefixes "terraform-mode" '("terraform-")) + +;;; End of scraped data + +(provide 'terraform-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: + +;;; terraform-mode-autoloads.el ends here diff --git a/elpa/terraform-mode-20241217.1628/terraform-mode-pkg.el b/elpa/terraform-mode-20241217.1628/terraform-mode-pkg.el new file mode 100644 index 00000000..2d4ff5e3 --- /dev/null +++ b/elpa/terraform-mode-20241217.1628/terraform-mode-pkg.el @@ -0,0 +1,11 @@ +;; -*- no-byte-compile: t; lexical-binding: nil -*- +(define-package "terraform-mode" "20241217.1628" + "Major mode for terraform configuration file." + '((emacs "24.3") + (hcl-mode "0.03") + (dash "2.17.0")) + :url "https://github.com/hcl-emacs/terraform-mode" + :commit "5bdd734a87f67f6574664f63eb4d02a0bc74c0d0" + :revdesc "5bdd734a87f6" + :authors '(("Syohei YOSHIDA" . "syohex@gmail.com")) + :maintainers '(("Syohei YOSHIDA" . "syohex@gmail.com"))) diff --git a/elpa/terraform-mode-20230607.1923/terraform-mode.el b/elpa/terraform-mode-20241217.1628/terraform-mode.el similarity index 79% rename from elpa/terraform-mode-20230607.1923/terraform-mode.el rename to elpa/terraform-mode-20241217.1628/terraform-mode.el index 4c0182a2..794f596b 100644 --- a/elpa/terraform-mode-20230607.1923/terraform-mode.el +++ b/elpa/terraform-mode-20241217.1628/terraform-mode.el @@ -4,7 +4,8 @@ ;; Author: Syohei YOSHIDA ;; URL: https://github.com/syohex/emacs-terraform-mode -;; Version: 0.06 +;; Package-Version: 20241217.1628 +;; Package-Revision: 5bdd734a87f6 ;; Package-Requires: ((emacs "24.3") (hcl-mode "0.03") (dash "2.17.0")) ;; This program is free software; you can redistribute it and/or modify @@ -51,6 +52,11 @@ :type 'boolean :group 'terraform-mode) +(defcustom terraform-command "terraform" + "Command used to invoke terraform" + :type 'string + :group 'terraform-mode) + (defface terraform-resource-type-face '((t :inherit font-lock-type-face)) "Face for resource names." @@ -77,6 +83,9 @@ "Face for varriables." :group 'terraform-mode) +(defconst terraform--constants-regexp + (concat "\\(?:^\\|[^.]\\)" (regexp-opt '("null") 'words))) + (defconst terraform--block-builtins-without-name-or-type-regexp (rx line-start (zero-or-more space) @@ -154,6 +163,7 @@ (1 'terraform-builtin-face) (2 'terraform-resource-type-face t) (3 'terraform-resource-name-face t)) + (,terraform--constants-regexp 1 'font-lock-constant-face) ,@hcl-font-lock-keywords)) (defun terraform-format-buffer () @@ -161,7 +171,7 @@ (interactive) (let ((buf (get-buffer-create "*terraform-fmt*"))) (if (zerop (call-process-region (point-min) (point-max) - "terraform" nil buf nil "fmt" "-no-color" "-")) + terraform-command nil buf nil "fmt" "-no-color" "-")) (let ((point (point)) (window-start (window-start))) (erase-buffer) @@ -179,7 +189,7 @@ (let ((buf (get-buffer-create "*terraform-fmt*"))) (when (use-region-p) (if (zerop (call-process-region (region-beginning) (region-end) - "terraform" nil buf nil "fmt" "-")) + terraform-command nil buf nil "fmt" "-")) (let ((point (region-end)) (window-start (region-beginning))) (delete-region window-start point) @@ -245,25 +255,66 @@ (defun terraform--get-resource-provider-namespace (provider) "Return provider namespace for PROVIDER." - (let ((provider-info (shell-command-to-string "terraform providers"))) + (let ((provider-info (shell-command-to-string (concat terraform-command " providers")))) (with-temp-buffer (insert provider-info) (goto-char (point-min)) (when (re-search-forward (concat "/\\(.*?\\)/" provider "\\]") nil t) (match-string 1))))) +(defun terraform--get-resource-provider-source (provider &optional dir) + "Return Terraform provider source for PROVIDER located in DIR. +Terraform provider source is searched in `required_provider' declaration +in current buffer or in other Terraform files located in the same directory +of the file of current buffer. If still not found, the provider source is +searched by running command `terraform providers'. +The DIR parameter is optional and used only for tests." + (goto-char (point-min)) + ;; find current directory if it's not specified in arguments + (if (and (not dir) buffer-file-name) (setq dir (file-name-directory buffer-file-name))) + (let (tf-files + ;; try to find provider source in current buffer + (provider-source (terraform--get-resource-provider-source-in-buffer provider))) + ;; check if terraform provider-source was found + (when (and (= (length provider-source) 0) dir) + ;; find all terraform files of this project. One of them + ;; should contain required_provider declaration + (setq tf-files (directory-files dir nil "^[[:alnum:][:blank:]_.-]+\\.tf$"))) + ;; iterate on terraform files until a provider source is found + (while (and (= (length provider-source) 0) tf-files) + (with-temp-buffer + (let* ((file (pop tf-files)) + (file-path (if dir (concat dir "/" file) file))) + (insert-file-contents file-path) + ;; look for provider source in a terraform file + (setq provider-source (terraform--get-resource-provider-source-in-buffer provider))))) + provider-source)) + +(defun terraform--get-resource-provider-source-in-buffer (provider) + "Search and return provider namespace for PROVIDER in current buffer. +Return nil if not found." + (goto-char (point-min)) + (if (and (re-search-forward "^terraform[[:blank:]]*{" nil t) + (re-search-forward "^[[:blank:]]*required_providers[[:blank:]]*{" nil t) + (re-search-forward (concat "^[[:blank:]]*" provider "[[:blank:]]*=[[:blank:]]*{") nil t) + (re-search-forward "^[[:blank:]]*source[[:blank:]]*=[[:blank:]]*\"\\([a-z/]+\\)\"" nil t)) + (match-string 1))) + (defun terraform--resource-url (resource doc-dir) "Return the url containing the documentation for RESOURCE using DOC-DIR." (let* ((provider (terraform--extract-provider resource)) - (provider-ns (terraform--get-resource-provider-namespace provider)) + ;; search provider source in terraform files + (provider-source (terraform--get-resource-provider-source provider)) (resource-name (terraform--extract-resource resource))) - (if provider-ns - (format "https://registry.terraform.io/providers/%s/%s/latest/docs/%s/%s" - provider-ns - provider - doc-dir - resource-name) - (user-error "Can not determine the provider namespace for %s" provider)))) + (when (= (length provider-source) 0) + ;; fallback to old method with terraform providers command + (setq provider-source (concat + (terraform--get-resource-provider-namespace provider) + "/" provider))) + (if (> (length provider-source) 0) + (format "https://registry.terraform.io/providers/%s/latest/docs/%s/%s" + provider-source doc-dir resource-name) + (user-error "Can not determine the provider source for %s" provider)))) (defun terraform--resource-url-at-point () (save-excursion @@ -359,7 +410,7 @@ If the point is not at the heading, call (imenu-add-to-menubar "Terraform")) ;;;###autoload -(add-to-list 'auto-mode-alist '("\\.tf\\(vars\\)?\\'" . terraform-mode)) +(add-to-list 'auto-mode-alist '("\\.t\\(f\\(vars\\)?\\|ofu\\)\\'" . terraform-mode)) (provide 'terraform-mode) diff --git a/elpa/terraform-mode-readme.txt b/elpa/terraform-mode-readme.txt deleted file mode 100644 index 5dceb5fb..00000000 --- a/elpa/terraform-mode-readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -Major mode of terraform configuration file. terraform-mode provides -syntax highlighting, indentation function and formatting. - -Format the current buffer with terraform-format-buffer. To always -format terraform buffers when saving, use: - (add-hook 'terraform-mode-hook #'terraform-format-on-save-mode) -- 2.47.3