Skip to content

Commit

Permalink
feat(opentofu): add plugin for OpenTofu (ohmyzsh#12285)
Browse files Browse the repository at this point in the history
- Adds aliases
- Sets up autocompletion
- Adds promp functions to show workspace and `tofu` version

Co-authored-by: Marc Cornellà <[email protected]>
  • Loading branch information
chenzejun and mcornella authored Jul 13, 2024
1 parent 0b27b15 commit fd8f72b
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 0 deletions.
58 changes: 58 additions & 0 deletions plugins/opentofu/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# OpenTofu plugin

Plugin for OpenTofu, a fork of Terraform that is open-source, community-driven, and managed by the Linux Foundation. It adds
completion for `tofu` command, as well as aliases and a prompt function.

To use it, add `opentofu` to the plugins array of your `~/.zshrc` file:

```shell
plugins=(... opentofu)
```

## Requirements

- [OpenTofu](https://opentofu.org/)

## Aliases

| Alias | Command |
| ----- | --------------- |
| `tt` | `tofu` |
| `tta` | `tofu apply` |
| `ttc` | `tofu console` |
| `ttd` | `tofu destroy` |
| `ttf` | `tofu fmt` |
| `tti` | `tofu init` |
| `tto` | `tofu output` |
| `ttp` | `tofu plan` |
| `ttv` | `tofu validate` |
| `tts` | `tofu state` |
| `ttsh`| `tofu show` |
| `ttr` | `tofu refresh` |
| `ttt` | `tofu test` |
| `ttws`| `tofu workspace`|


## Prompt functions

- `tofu_prompt_info`: shows the current workspace when in an OpenTofu project directory.

- `tofu_version_prompt_info`: shows the current version of the `tofu` commmand.

To use them, add them to a `PROMPT` variable in your theme or `.zshrc` file:

```sh
PROMPT='$(tofu_prompt_info)'
RPROMPT='$(tofu_version_prompt_info)'
```

You can also specify the PREFIX and SUFFIX strings for both functions, with the following variables:

```sh
# for tofu_prompt_info
ZSH_THEME_TOFU_PROMPT_PREFIX="%{$fg[white]%}"
ZSH_THEME_TOFU_PROMPT_SUFFIX="%{$reset_color%}"
# for tofu_version_prompt_info
ZSH_THEME_TOFU_VERSION_PROMPT_PREFIX="%{$fg[white]%}"
ZSH_THEME_TOFU_VERSION_PROMPT_SUFFIX="%{$reset_color%}"
```
43 changes: 43 additions & 0 deletions plugins/opentofu/opentofu.plugin.zsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# set up the tofu completion (compatible for zsh)
autoload -Uz bashcompinit && bashcompinit
complete -C tofu tofu

# tofu workspace prompt function
function tofu_prompt_info() {
# only show the workspace name if we're in an opentofu project
# i.e. if a .terraform directory exists within the hierarchy
local dir="$PWD"
while [[ ! -d "${dir}/.terraform" ]]; do
[[ "$dir" != / ]] || return 0 # stop at the root directory
dir="${dir:h}" # get the parent directory
done

# workspace might be different than the .terraform/environment file
# for example, if set with the TF_WORKSPACE environment variable
local workspace="$(tofu workspace show)"
# make sure to escape % signs in the workspace name to prevent command injection
echo "${ZSH_THEME_TOFU_PROMPT_PREFIX-[}${workspace:gs/%/%%}${ZSH_THEME_TOFU_PROMPT_SUFFIX-]}"
}

# tofu version prompt function
function tofu_version_prompt_info() {
# get the output of `tofu --version` in a single line, and get the second word after splitting by a space
local tofu_version=${${(s: :)$(tofu --version)}[2]}
# make sure to escape % signs in the version string to prevent command injection
echo "${ZSH_THEME_TOFU_VERSION_PROMPT_PREFIX-[}${tofu_version:gs/%/%%}${ZSH_THEME_TOFU_VERSION_PROMPT_SUFFIX-]}"
}

alias tt='tofu'
alias tta='tofu apply'
alias ttc='tofu console'
alias ttd='tofu destroy'
alias ttf='tofu fmt'
alias tti='tofu init'
alias tto='tofu output'
alias ttp='tofu plan'
alias ttv='tofu validate'
alias tts='tofu state'
alias ttsh='tofu show'
alias ttr='tofu refresh'
alias ttt='tofu test'
alias ttws='tofu workspace'

0 comments on commit fd8f72b

Please sign in to comment.