diff options
121 files changed, 1916 insertions, 9398 deletions
diff --git a/.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md deleted file mode 100644 index 5070d714..00000000 --- a/.github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -Thanks for opening an issue! For a project that deals with as many different things as P9k, debugging problems can be difficult. Please follow the guide, below, to create a bug report that will help us help you! - -### Before Opening a Bug -P9k is lovingly maintained by volunteers, and we are happy to help you! You can help us by first making sure your issue hasn't already been solved before opening a new one. Please check the [Troubleshooting Guide](https://github.com/bhilburn/powerlevel9k/wiki/Troubleshooting) first. Many issues are actually local configuration problems, which may have previously been solved by another user - be sure to also [search the existing issues](https://github.com/bhilburn/powerlevel9k/issues?utf8=%E2%9C%93&q=is%3Aissue) before opening a new one. - -Once you've done these things, you can delete this section and proceed `=)` - ------ - -#### Describe Your Issue -What is happening? - -Most issues are best explained with a screenshot. Please share one if you can! - -#### Have you tried to debug or fix it? - -Have you tinkered with your settings, and what happened when you did? Did you find a bit of code that you think might be the culprit? Let us know what you've done so far! - -#### Environment Information - -This information will help us understand your configuration. - - - What version of ZSH are you using? You can use `zsh --version` to see this. - - Do you use a ZSH framework (e.g., Oh-My-ZSH, Antigen)? - - How did you install P9k (cloning the repo, by tarball, a package from your OS, etc.,)? - - What version of P9k are you using? - - Which terminal emulator do you use? - -#### Issues with Fonts & Icons -You may delete this section if your issue is not font / icon related. - - - Which font do you use? - - Which [font configuration mode](https://github.com/bhilburn/powerlevel9k/wiki/About-Fonts) are you using? You can check this with (`echo $POWERLEVEL9K_MODE`). - - Please share the contents of `$P9k/debug/font-issues.zsh`. - - If this is an icon problem, does the output of `$ get_icon_names` look correct? diff --git a/.github/ISSUE_TEMPLATE/PERFORMANCE_ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE/PERFORMANCE_ISSUE_TEMPLATE.md deleted file mode 100644 index 9d852db0..00000000 --- a/.github/ISSUE_TEMPLATE/PERFORMANCE_ISSUE_TEMPLATE.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Performance Issue -about: For performance Issues -title: "[Performance]" -labels: performance -assignees: '' - ---- - -Sorry to hear that the performance of P9K is not adequate. To fix this, please provide us with some hints. - -### Your Hardware - -Disk I/O is critical for P9K, so do you use a spinning disk, or a SSD? - -### Virtualization - -Do you use P9K in some sort of virtualization? This is also the case, if you use WSL on Windows.. - -### How Fast is Fast - -Could you quantify how fast the specific segment is, that you think is slow? -For example, if you think the `vcs` segment is slow, could you execute this command in the directory, where the segment is slow: - -```zsh -time (repeat 10; do; prompt_vcs left 1 false >/dev/null; done;) -``` - -Also, please provide us with some context around the segment. In the `vcs` example: - -- How big is the repo? -- Does it contain a lot of untracked files? -- Does it contain a lot of git submodules? -- Does it contain a lot of files in general? - -Additionally, you could install [zsh-prompt-benchmark](https://github.com/romkatv/zsh-prompt-benchmark), to benchmark the general performance of ZSH and P9K. - -If you don't know which segment is slow, could you remove one by one, and spot the one that made the greatest impact?
\ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 76b1fac9..00000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,33 +0,0 @@ -Thank you so much for opening a PR for P9k! Many of our best features and segments have come from the community, and we are excited to see your contribution. - -To help you make the best PR, here are some guidelines: - - - The `master` branch is our *stable* branch, and the `next` branch is our development branch. If you are submitting a bug fix, please file your PR against `master`. If it is a new feature, enhancement, segment, or something similar, please submit it against `next`. For more information, please see our [Developer's Guide](https://github.com/bhilburn/powerlevel9k/wiki/Developer's-Guide). - - We maintain unit tests for segments and features in the `test` directory. Please add unit tests for anything new you have developed! If you aren't sure how to do this, go ahead and file your PR and ask for help! - - For running manual tests in different environments, we have Vagrant and Docker configurations. Please see the [Test README](https://github.com/bhilburn/powerlevel9k/blob/next/TESTS.md) and make sure your new feature is working as expected! - - If your PR requires user configuration, please make sure that it includes an update to the README describing this. - - P9k maintains a lot of useful information in our [Wiki](https://github.com/bhilburn/powerlevel9k/wiki). Depending on the content of your PR, we might ask you to update the Wiki (or provide text for us to use) to document your work. Most PRs don't require this. - - Please make your commit messages useful! Here is a [great short guide on useful commit messages](https://code.likeagirl.io/useful-tips-for-writing-better-git-commit-messages-808770609503). - -Once you have submitted your PR, P9k core contributors will review the code and work with you to get it merged. During this process, we might request changes to your code and discuss different ways of doing things. This is all part of the open source process, and our goal is to help you create the best contribution possible for P9k `=)`. - -Please follow this template for creating your PR: - -#### Title - -Please make the title of your PR descriptive! If appropriate, please prefix the title with one of these tags: - -- [Bugfix] -- [New Segment] -- [Docs] -- [Enhancement] - -#### Description - -Please describe the contribution your PR makes! Screenshots are especially helpful, here, if it's a new segment. - -If your PR is addressing an issue, please reference the Issue number here. - -#### Questions - -Is there something in your PR you're not sure about or need help with? Is there a particular piece of code you would like feedback on? Let us know here! diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 83a62462..00000000 --- a/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -test-vm/.vagrant -*.swp -.idea
\ No newline at end of file diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 743b8e91..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "shunit2"] - path = shunit2 - url = https://github.com/kward/shunit2.git diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 30631ea8..00000000 --- a/.travis.yml +++ /dev/null @@ -1,77 +0,0 @@ -language: sh - -os: - - linux - - osx - -osx_image: xcode9.4 - -addons: - apt: - packages: - - build-essential - - git - - mercurial - - subversion - - jq - - node - - golang - - ruby - - python - - python-virtualenv - -before_install: - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - -env: - global: - - ZSH_DIST=$HOME/.zshdist - matrix: - # Use _ZSH_VERSION since if ZSH_VERSION is present, travis cacher thinks it - # is running in zsh and tries to use zsh specific functions. - - _ZSH_VERSION=5.5.1 - - _ZSH_VERSION=5.5 - - _ZSH_VERSION=5.4.2 - - _ZSH_VERSION=5.4.1 - - _ZSH_VERSION=5.3.1 - - _ZSH_VERSION=5.3 - - _ZSH_VERSION=5.2 - - _ZSH_VERSION=5.1.1 - -cache: - directories: - - $ZSH_DIST - -before_script: - - > - setup_zsh() { - dest="$ZSH_DIST/$1" - if [[ ! -d $dest/bin ]]; then - coreutils_mktemp="mktemp" - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then - coreutils_mktemp="gmktemp" - fi - tmp="$(${coreutils_mktemp} --directory --tmpdir="${TMPDIR:/tmp}" zshbuild.XXXXXX)" - ( - cd "$tmp" && - curl -L http://downloads.sourceforge.net/zsh/zsh-${1}.tar.gz | tar zx && - cd zsh-$1 && - ./configure --prefix="$dest" && - make && - mkdir -p "$dest" && - make install || - echo "Failed to build zsh-${1}!" - ) - fi - export PATH="$dest/bin:$PATH" - } - - setup_zsh $_ZSH_VERSION - # Show the git version being used to test. - - "git --version" - # Show the mercurial version being used to test. - - "hg --version" - # Show the zsh version being used to test. - - "zsh --version" - -script: - - test/suite.spec diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 271ae9ed..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,476 +0,0 @@ -## v0.6.7 - -- PR #1175 - Fix home dir shortening when using package_name truncation strategy -- PR #1158 - [Bugfix] dir: Fix package name path truncation inside home dir -- PR #1157 - Hide stderr from git ls-files -- PR #1154 - Fix issues with debug/fonts script in Konsole -- PR #1151 - [Bugfix] Only abbreviate $HOME at the beginning of cwd -- PR #1148 - Remove checking for NODEENV_DISABLE_PROMPT -- PR #1147 - Fix newlines in ZSH 5.7 -- PR #1149 - Fix RVM -- PR #1128 - [Bugfix] virtualenv prompt displaying -- PR #981 - [Bugfix] Fix for #974 -- PR #1126 - Use ip command for VPN segment -- PR #1079 - [Bugfix] Update VIRTUAL_ENV_DISABLE_PROMPT value -- PR #1080 - [Bugfix] Port #1071 to `master` (Fix fatal errors emitted by untracked file check in vcs.zsh) -- PR #1074 - Add vcs vulnerability tests master -- PR #1070 - [Docs] Uniformly apply inline code formatting in README -- PR #1065 - Protect locale -- PR #1048 - Speedup Improvements in `vcs` segment -- PR #1037 - Fix vpn_ip segment -- PR #1036 - Make truncate with package name work without setting shorten length -- PR #1020 - Fix context spec -- PR #990 - [Docs] Add forgotten backtick -- PR #981 - Avoid error if `/etc/os-release` does not exist -- PR #966 - [Bugfix] Fix icons cut off in RPROMPT segments - -## v0.6.6 - -- The `rbenv` segment is no longer a default segment in the LPROMPT. -- PR #959 - Fixing issue in v0.6.5 where we changed some color codes. -- PR #934 - Add Tests -- PR #884 - test-in-docker: fix with newer ZSH versions -- PR #928 - [Docs] Add etc state description in dir docs -- PR #937 - Use SUDO_COMMAND to check for sudo -- PR #925 - [Bugfix] Resolve #918 Transparent background -- PR #923 - Fix font issue debugging script -- PR #921 - Add missing colors to fix color comparison -- PR #951 - Add fallback icon for missing linux distro icons -- PR #956 - Fix broken link in readme -- Fixed #936 - fallback icons for Linux distros -- Fixed #926 - `etc` state for `dir` segment in docs -- Fixed #852 - `sudo` detection got crazy, there. sorry, everyone. -- Fixed #927 - more default color issues. - -## v0.6.5 - -- Multiple PRs: General fixes to README, improved documentation. -- Multiple PRs: Improvements to icons / glyphs. -- PR #777: now possible to always show the Ruby env segment. -- PR #773: Fixed issue with home abbreviation in directory segment. -- PR #789: Now properly working around some odd ZSH status return codes. -- PR #716: Now possible to configure the colors of the VCS segment in rebase mode. -- PR #722: Removed dependency on `bc` for `load` segment. -- PR #686: Fixed issue where whitespaces in path occasionally broke `dir` segment. -- PR #685: No longer accidentally invoking user `grep` aliases. -- PR #680: Using env variable for `PYENV` properly, now. -- PR #676, #611: Fixes for Kubernetes segment. -- PR #667: Supporting multiple AWS profiles. -- PR #660: Fixing directory parsing issue with PYTHONPATH. -- PR #663: Fixed silly issues causing ZSH warnings. -- PR #647: Fixing `public_ip` segment for macOS. -- PR #643: Fixing `vpn_ip` segment naming. -- PR #636: `context` segment now grabs user with command rather than env. -- PR #618: Fix issue where `su -` didn't change context segment. -- PR #608: Load average selection in `load` segment. - -### New Segment: `laravel_version` - -Displays the current laravel version. - -## v0.6.4 - -- `load` segment now has configurable averages. -- Update to `dir` segment to add `dir_writable` feature. -- `status` segment can now display POSIX signal name of exit code. -- Added `teardown` command to turn off P9k prompt. -- Fixes for P9k in Cygwin and 32-bit systems. -- Better colors in virtualization segments. -- Added 'Gopher' icon to the `go_version` segment. -- Improved detection in `nvm` -- Added option to support command status reading from piped command sequences. -- Fixed issue with visual artifacts with quick consecutive commands. -- Updated 'ananconda' segment for more uniform styling. -- `rvm` segment can now support usernames with dashes. -- Fixed Python icon reference in some font configurations. -- Vi mode indicator fixed. -- Fixes for Docker segment. -- Added new Docker-based testing system. -- Significant enhancements to the `battery` segment. Check out the README to - read more! -- New truncation strategy that truncates until the path becomes unique. - -### New Segments: `host` and `user` - -Provides two separate segments for `host` and `user` in case you don't wont both -in one (per the `context` segment). - -### New Segment: `newline` - -Allows you to split segments across multiple lines. - -### New Segment: `kubecontext` - -Shows the current context of your `kubectl` configuration. - -### New Segment: `vpn` - -Shows current `vpn` interface. - -## v0.6.3 - -- Fixed susceptibility to [pw3nage exploit](https://github.com/njhartwell/pw3nage). -- Added support for Android -- The abbreviation for $HOME is now configurable (doesn't have to be `~`). -- Fixed colorization of VCS segment in Subversion repos. -- Improved handling of symlinks in installation paths. - -## v0.6.2 - -- Fixed some issues with the new `nerdfont-fontconfig` option. -- Fixed typo in README. -- The `get_icon_names` function can now print sorted output, and show which - icons users have overridden. -- Added a FreeBSD VM for testing. - -### Add debug script for iTerm2 issues - -A new script `debug/iterm.zsh` was added for easier spotting problems with your iTerm2 configuration. - -### Add debug script for font issues - -A new script `debug/font-issues.zsh` was added, so that problems with your font could be spotted easier. - -### `ram` changes - -The `ram` segment now shows the available ram instead of free. - -### Add new segments `host` and `user` - -The user and host segments allow you to have different icons and colors for both the user and host segments -depending on their state. - -## v0.6.0 - -- Fixed a bug where the tag display was broken on detached HEADs. -- Fixed a bug where SVN detection sometimes failed. -- Fixed the `load` and `ram` segments for BSD. -- Fixed code-points that changed in Awesome fonts. -- Fixed display of "OK_ICON" in `status` segment in non-verbose mode. -- Fixed an issue where dir name truncation that was very short sometimes failed. -- Speed & accuracy improvements to the battery segment. -- Added Github syntax highlighting to README. -- Various documentation cleanup. - -### New Font Option: nerd-fonts - -There is now an option to use [nerd-fonts](https://github.com/ryanoasis/nerd-fonts) with P9k. Simply configure the `nerdfont-fontconfig`, and you'll be set! - -### `vcs` changes - -The VCS segment can now display icons for remote repo hosting services, including Github, Gitlab, and 'other'. - -### `dir` changes - -Added an option to configure the path separator. If you want something -else than an ordinary slash, you could set -`POWERLEVEL9K_DIR_PATH_SEPARATOR` to whatever you want. - -#### `truncate_with_package_name` now searches for `composer.json` as well - -Now `composer.json` files are searched as well. By default `package.json` still takes -precedence. If you want to change that, set `POWERLEVEL9K_DIR_PACKAGE_FILES=(composer.json package.json)`. - -### New segment `command_execution_time` added - -Shows the duration a command needed to run. By default only durations over 3 seconds -are shown (can be adjusted by setting POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD). - -### New segment `dir_writable` added - -This segment displays a lock icon if your user has no write permissions in the current folder. - -### New segment `disk_usage` added - -This segment will show the usage level of your current partition. - -### New segment `public_ip` added - -Fetches your Public IP (using ident.me) and displays it in your prompt. - -### New segment `swift_version` added - -This segment displays the version of Swift that is installed / in your path. - -### New segment `detect_virt` added - -Detects and reports if you are in a virtualized session using `systemd`. - -## v0.5.0 - -### `load` and `ram` changes - -These two segments now support BSD. - -### `vcs` changes - -- We implemented a huge speed improvement for this segment. -- Now this segment supports Subversion repositories. -- Add ability to hide tags by setting `POWERLEVEL9K_VCS_HIDE_TAGS` to true. - -## `anaconda` changes - -Speed improvements for `anaconda` segment. - -## v0.4.0 - -### Development changes - -From now on, development makes use of a CI system "travis". - -### `vcs` changes - -The default state was renamed to `clean`. If you overrode foreground -or background color in the past, you need to rename your variables to: - -```zsh -POWERLEVEL9K_VCS_CLEAN_FOREGROUND='cyan' -POWERLEVEL9K_VCS_CLEAN_BACKGROUND='white' -``` - -Additionaly the vcs segment now has an `untracked` state which -indicates that you have untracked files in your repository. - -The foreground color of actionformat is now configurable via: -```zsh -POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND='green' -``` - -Also, the vcs segment uses the foreground color it was configured to. -That said, the variables `POWERLEVEL9K_VCS_FOREGROUND` and -`POWERLEVEL9K_VCS_DARK_FOREGROUND` are no longer used. Instead use -the proper variable `POWERLEVEL9K_VCS_<STATE>_FOREGROUND` to change -foreground color. - -### `dir` Shortening Strategies - -There is now a path shortening strategy that will use the `package.json` file to -shorten your directory path. See the documentation for the `dir` segment for more -details. - -Also, the shorten delimiter was changed to an unicode ellipsis. It is configurable -via `POWERLEVEL9K_SHORTEN_DELIMITER`. - -### `rbenv` changes - -The `rbenv` segment now makes use of the full rbenv command, so the correct -ruby version is now shown if it differs from the globally one. - -### `node`, `nvm` Segments - -Improvements to speed / reliability. - -### `ram` changes - -The `ram` segment was split up into `ram` and `swap`. The -`POWERLEVEL9K_RAM_ELEMENTS` variable is obsolete. - -### New segment `swap` added - -Due to the split up of the ram segment, this one was created. It -shows the currently used swap size. - -### New segment `nodeenv` added - -Added new `nodeenv` segment that shows the currently used node environment. - -### New segment `aws_eb_env` added - -This segment displays the current Elastic Beanstalk environment. - -### New segment `chruby` added - -Added new `chruby` segment to support this version manager. - -### New segment `docker_machine` added - -Added new `docker_machine` segment that will show your Docker machine. - -### New segment `anaconda` added - -A new segment `anaconda` was added that shows the current used -anaconda environment. - -## New segment `pyenv` added - -This segment shows your active python version as reported by `pyenv`. - - -## v0.3.2 - -### `vcs` changes - -A new state `UNTRACKED` was added to the `vcs` segment. So we now -have 3 states for repositories: `UNTRACKED`, `MODIFIED`, and the -default state. The `UNTRACKED` state is active when there are files -in the repository directory which have not been added to the repo -(the same as when the `+` icon appears). The default color for the -`UNTRACKED` state is now yellow, and the default color for the -`MODIFIED` state is now read, but those colors can be changed by -setting these variables, for example: - -```zsh -POWERLEVEL9K_VCS_MODIFIED_FOREGROUND='black' -POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='white' -POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND='green' -POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND='blue' -``` - -## v0.3.1 - -### `dir` changes - -A new state `HOME_SUBFOLDER` was added. So if you want to overwrite -colors for this segment, also set this variables: -```zsh -POWERLEVEL9K_DIR_HOME_SUBFOLDER_BACKGROUND='black' -POWERLEVEL9K_DIR_HOME_SUBFOLDER_FOREGROUND='white' -``` - -### `background_jobs` changes -Now displays the number of background jobs if there's more than 1. -You can disable it by setting : -```zsh -POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false -``` - -## v0.3.0 - -### Introduced "visual identifiers" to the segments - -Now almost every segment can have a visual identifier, which is an -icon whose color could be adjusted by users. - -### Added ability for "joined" segments - -You can now merge segments together by suffixing the segment name with "_joined". -For Developers: Be aware that the order of parameters in left/right_prompt_segment -has changed. Now a boolean parameter must be set as second parameter (true if joined). - -### `dir` changes - -This segment now has "state", which means you now can change the colors seperatly -depending if you are in your homefolder or not. -Your variables for that should now look like: -```zsh -POWERLEVEL9K_DIR_HOME_BACKGROUND='green' -POWERLEVEL9K_DIR_HOME_FOREGROUND='cyan' -POWERLEVEL9K_DIR_DEFAULT_BACKGROUND='red' -POWERLEVEL9K_DIR_DEFAULT_FOREGROUND='yellow' -``` - -### `status` changes - -The `status` segment was split up into three segments. `background_jobs` prints -an icon if there are background jobs. `root_indicator` prints an icon if the user -is root. The `status` segment focuses now on the status only. -The `status` segment also now has "state". If you want to overwrite the colors, -you have to add the state to your variables: -```zsh -POWERLEVEL9K_STATUS_ERROR_BACKGROUND='green' -POWERLEVEL9K_STATUS_ERROR_FOREGROUND='cyan' -POWERLEVEL9K_STATUS_OK_BACKGROUND='red' -POWERLEVEL9K_STATUS_OK_FOREGROUND='yellow' -``` - -### New segment `custom_command` added - -A new segment that allows users to define a custom command was added. - -### `virtualenv` changes - -This segment now respects `VIRTUAL_ENV_DISABLE_PROMPT`. If this variable is set -to `true`, the segments does not get rendered. - -### `load` changes - -The `load` segement was split and a new segment `ram` was extracted. This new -segment is able to show the free ram and used swap. - -### `vcs` changes - -This prompt uses the `VCS_INFO` subsystem by ZSH. From now on this subsystem -is only invoked if a `vcs` segment was configured. - -### `rvm` changes - -This segment now does not invoke RVM directly anymore. Instead, is relys on the -circumstance that RVM was invoked beforehand and just reads the environment -variables '$GEM_HOME' and '$MY_RUBY_HOME'. It also now displays the used gemset. - -### New segment `battery` added - -A new segment that shows the battery status of your laptop was added. - -### New segment `go_version` added - -This segment shows the GO version. - -### New segment `nvm` added - -This segment shows your NodeJS version by using NVM (and if it is not 'default'). - -### New segment `todo` added - -This segment shows your ToDos from [todo.sh](http://todotxt.com/). - -### New segment `rust_version` added - -This segment shows your local rust version. - -## v0.2.0 - -### `longstatus` is now `status` - -The segments got merged together. To show the segment only if an error occurred, -set `POWERLEVEL9K_STATUS_VERBOSE=false` (this is the same behavior as the old -`status` segment. - -### Icon overriding mechanism added - -All icons can now be overridden by setting a variable named by the internal icon -name. You can get a full list of icon name by calling `get_icon_names`. - -### Same color segements get visual separator - -This separator can be controlled by setting `POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR` -or `POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR`. By default this separator is -printed in the foreground color. - -### `dir` segment has different strategies for truncation - -Now you can choose between `truncate_middle` or `truncate_from_right` by setting -`POWERLEVEL9K_SHORTEN_STRATEGY`. Default behavior is unchanged (truncate whole -directories). `POWERLEVEL9K_SHORTEN_DIR_LENGTH` can be used to influence how -much will be truncated (either direcories or chars). - -### New segment `ip` added - -This segment shows your internal IP address. You can define which interfaces IP -will be shown by specifying it via `POWERLEVEL9K_IP_INTERFACE`. - -### New segment `load` added - -This segment shows your computers 5min load average. - -### New segment `os_icon` added - -This segment shows a little indicator which OS you are running. - -### New segment `php_version` added - -This segment shows your PHP version. - -### New segment `vi_mode` added - -This segment gives you a hint in which VI-mode you currently are. This -segment requires a proper configured VI-mode. - -### Added the ability to have empty left or right prompts - -By setting the according variable to an empty array, the left or right -prompt will be empty. - -## v0.1.0 - -This is the first release diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 22c9ebb4..00000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at bhilburn@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ @@ -1,4 +1,5 @@ Copyright (c) 2014-2017 Ben Hilburn <bhilburn@gmail.com> +Copyright (c) 2019 Roman Perepelitsa <roman.perepelitsa@gmail.com> MIT LICENSE @@ -1,778 +1,200 @@ -![](https://raw.githubusercontent.com/bhilburn/powerlevel9k-logo/master/logo-banner.png) ---- -[![Build Status](https://travis-ci.org/bhilburn/powerlevel9k.svg?branch=master)](https://travis-ci.org/bhilburn/powerlevel9k) -[![Join the chat at https://gitter.im/bhilburn/powerlevel9k](https://badges.gitter.im/bhilburn/powerlevel9k.svg)](https://gitter.im/bhilburn/powerlevel9k?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +# Powerlevel10k -Powerlevel9k is a theme for ZSH which uses [Powerline -Fonts](https://github.com/powerline/fonts). It can be used with vanilla ZSH or -ZSH frameworks such as [Oh-My-Zsh](https://github.com/robbyrussell/oh-my-zsh), -[Prezto](https://github.com/sorin-ionescu/prezto), -[Antigen](https://github.com/zsh-users/antigen), and [many -others](https://github.com/bhilburn/powerlevel9k/wiki/Install-Instructions). +Powerlevel10k is a theme for ZSH. It's a backward-compatible fork of +[Powerlevel9k](https://github.com/bhilburn/powerlevel9k) with lower latency and better +prompt responsiveness. -Get more out of your terminal. Be a badass. Impress everyone in 'Screenshot Your -Desktop' threads. Use powerlevel9k. +If you like the looks of Powerlevel9k but feeling frustrated by its slow prompt, +simply replace your `powerlevel9k` theme with `powerlevel10k` and enjoy responsive +shell like it's 80's again! -![](http://bhilburn.org/content/images/2015/01/pl9k-improved.png) +Powerlevel10k uses the same configuration options as Powerlevel9k and produces the +same results. It's simply faster. There is no catch. -You can check out some other users' configurations in our wiki: [Show Off Your -Config](https://github.com/bhilburn/powerlevel9k/wiki/Show-Off-Your-Config). +## Table of Contents -There are a number of Powerline ZSH themes available, now. The developers of -this theme focus on four primary goals: +1. [Installation and configuration](#installation-and-configuration) + 1. [Manual installation](#manual-installation) + 2. [Extra configuration](#extra-configuration) +2. [Try it out](#try-it-out) + 1. [For Powerlevel9k users](#for-powerlevel9k-users) + 2. [For new users](#for-new-users) + 3. [Docker playground](#docker-playground) +3. [How fast is it?](#how-fast-is-it) +4. [What's the catch?](#whats-the-catch) -1. Give users a great out-of-the-box configuration with no additional - configuration required. -2. Make customization easy for users who do want to tweak their prompt. -3. Provide useful segments that you can enable to make your prompt even more - effective and helpful. We have prompt segments for everything from unit test - coverage to your AWS instance. -4. Optimize the code for execution speed as much as possible. A snappy terminal - is a happy terminal. +## Installation and configuration -Powerlevel9k can be used to create both very useful and beautiful terminal environments: +For installation and configuration instructions see +[Powerlevel9k](https://github.com/bhilburn/powerlevel9k). Everything in there applies to +Powerlevel10k as well. Follow the official installation guide, make sure everything works +and you like the way prompt looks. Then simply replace Powerlevel9k with Powerlevel10k. Once +you restart zsh, your prompt will be faster. No configuration changes are needed. -![](https://camo.githubusercontent.com/b5d7eb49a30bfe6bdb5706fa3c9be95fe8e5956e/687474703a2f2f67696679752e636f6d2f696d616765732f70396b6e65772e676966) +### Manual installation -### Table of Contents - -1. [Installation](#installation) -2. [Customization](#prompt-customization) - 1. [Stylizing Your Prompt](https://github.com/bhilburn/powerlevel9k/wiki/Stylizing-Your-Prompt) - 2. [Customizing Prompt Segments](#customizing-prompt-segments) - 3. [Available Prompt Segments](#available-prompt-segments) -3. [Troubleshooting](https://github.com/bhilburn/powerlevel9k/wiki/Troubleshooting) - -Be sure to also [check out the Wiki](https://github.com/bhilburn/powerlevel9k/wiki)! - -### Installation -There are two installation steps to go from a vanilla terminal to a PL9k -terminal. Once you are done, you can optionally customize your prompt. - -[Installation Instructions](https://github.com/bhilburn/powerlevel9k/wiki/Install-Instructions) - -1. [Install the Powerlevel9k Theme](https://github.com/bhilburn/powerlevel9k/wiki/Install-Instructions#step-1-install-powerlevel9k) -2. [Install Powerline Fonts](https://github.com/bhilburn/powerlevel9k/wiki/Install-Instructions#step-2-install-a-powerline-font) - -No configuration is necessary post-installation if you like the default -settings, but there are plenty of segment customization options available if you -are interested. - -### Prompt Customization - -Be sure to check out the wiki page on the additional prompt customization -options, including color and icon settings: [Stylizing Your Prompt](https://github.com/bhilburn/powerlevel9k/wiki/Stylizing-Your-Prompt) - -#### Customizing Prompt Segments -Customizing your prompt is easy! Select the segments you want to have displayed, -and then assign them to either the left or right prompt by adding the following -variables to your `~/.zshrc`. - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_LEFT_PROMPT_ELEMENTS`|`(context dir vcs)`|Segment list for left prompt| -|`POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS`|`(status root_indicator background_jobs history time)`|Segment list for right prompt| - - -The table above shows the default values, so if you wanted to set these -variables manually, you would put the following in -your `~/.zshrc`: -```zsh -POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context dir vcs) -POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status root_indicator background_jobs history time) -``` -#### Available Prompt Segments -The segments that are currently available are: - -**System Status Segments:** -* [`background_jobs`](#background_jobs) - Indicator for background jobs. -* [`battery`](#battery) - Current battery status. -* [`context`](#context) - Your username and host, conditionalized based on $USER and SSH status. -* [`date`](#date) - System date. -* [`dir`](#dir) - Your current working directory. -* `dir_writable` - Displays a lock icon, if you do not have write permissions on the current folder. -* [`disk_usage`](#disk_usage) - Disk usage of your current partition. -* `history` - The command number for the current line. -* [`host`](#host) - Your current host name -* [`ip`](#ip) - Shows the current IP address. -* [`vpn_ip`](#vpn_ip) - Shows the current VPN IP address. -* [`public_ip`](#public_ip) - Shows your public IP address. -* [`load`](#load) - Your machine's load averages. -* `os_icon` - Display a nice little icon, depending on your operating system. -* `ram` - Show free RAM. -* `root_indicator` - An indicator if the user has superuser status. -* [`status`](#status) - The return code of the previous command. -* `swap` - Prints the current swap size. -* [`time`](#time) - System time. -* [`user`](#user) - Your current username -* [`vi_mode`](#vi_mode)- Your prompt's Vi editing mode (NORMAL|INSERT). -* `ssh` - Indicates whether or not you are in an SSH session. - -**Development Environment Segments:** -* [`vcs`](#vcs) - Information about this `git` or `hg` repository (if you are in one). - -**Language Segments:** -* **GoLang Segments:** - * `go_version` - Show the current GO version. -* **Javascript / Node.js Segments:** - * `node_version` - Show the version number of the installed Node.js. - * [`nodeenv`](#nodeenv) - [nodeenv](https://github.com/ekalinin/nodeenv) prompt for displaying node version and environment name. - * `nvm` - Show the version of Node that is currently active, if it differs from the version used by NVM -* **PHP Segments:** - * `php_version` - Show the current PHP version. - * `laravel_version` - Show the current Laravel version. - * [`symfony2_tests`](#symfony2_tests) - Show a ratio of test classes vs code classes for Symfony2. - * `symfony2_version` - Show the current Symfony2 version, if you are in a Symfony2-Project dir. -* **Python Segments:** - * [`virtualenv`](#virtualenv) - Your Python [VirtualEnv](https://virtualenv.pypa.io/en/latest/). - * [`anaconda`](#anaconda) - Your active [Anaconda](https://www.continuum.io/why-anaconda) environment. - * `pyenv` - Your active python version as reported by the first word of [`pyenv version`](https://github.com/yyuu/pyenv). Note that the segment is not displayed if that word is _system_ i.e. the segment is inactive if you are using system python. -* **Ruby Segments:** - * [`chruby`](#chruby) - Ruby environment information using `chruby` (if one is active). - * [`rbenv`](#rbenv) - Ruby environment information using `rbenv` (if one is active). - * [`rspec_stats`](#rspec_stats) - Show a ratio of test classes vs code classes for RSpec. - * `rvm` - Ruby environment information using `$GEM_HOME` and `$MY_RUBY_HOME` (if one is active). -* **Rust Segments:** - * `rust_version` - Display the current rust version and [logo](https://www.rust-lang.org/logos/rust-logo-blk.svg). -* **Swift Segments:** - * `swift_version` - Show the version number of the installed Swift. -* **Java Segments:** - * `java_version` - Show the current Java version. - -**Cloud Segments:** -* **AWS Segments:** - * [`aws`](#aws) - The current AWS profile, if active. - * `aws_eb_env` - The current Elastic Beanstalk Environment. -* `docker_machine` - The current Docker Machine. -* `kubecontext` - The current context of your `kubectl` configuration. -* `dropbox` - Indicates Dropbox directory and syncing status using `dropbox-cli` - -**Other:** -* [`custom_command`](#custom_command) - Create a custom segment to display the - output of an arbitrary command. -* [`command_execution_time`](#command_execution_time) - Display the time the current command took to execute. -* [`todo`](http://todotxt.com/) - Shows the number of tasks in your todo.txt tasks file. -* `detect_virt` - Virtualization detection with systemd -* `newline` - Continues the prompt on a new line. -* `openfoam` - Shows the currently sourced [OpenFOAM](https://openfoam.org/) environment. - ---------------------------------------------------------------------------------- - - -##### anaconda - -This segment shows your active anaconda environment. It relies on either the -`CONDA_ENV_PATH` or the `CONDA_PREFIX` (depending on the `conda` version) -environment variable to be set which happens when you properly `source -activate` an environment. - -Special configuration variables: - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_ANACONDA_LEFT_DELIMITER`|"("|The left delimiter just before the environment name.| -|`POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER`|")"|The right delimiter just after the environment name.| - -Additionally the following segment specific parameters can be used to customize -it: `POWERLEVEL9K_PYTHON_ICON`, `POWERLEVEL9K_ANACONDA_BACKGROUND`, and -`POWERLEVEL9K_ANACONDA_FOREGROUND`. - -##### aws - -If you would like to display the [current AWS -profile](http://docs.aws.amazon.com/cli/latest/userguide/installing.html), add -the `aws` segment to one of the prompts, and define `AWS_DEFAULT_PROFILE` in -your `~/.zshrc`: - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`AWS_DEFAULT_PROFILE`|None|Your AWS profile name| - -##### background_jobs - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE`|`true`|If there is more than one background job, this segment will show the number of jobs. Set this to `false` to turn this feature off.| -`POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS`|`false`|Always show the jobs count (even if it's zero).| - -##### battery - -The default settings for this segment will display your current battery status (fails gracefully on -systems without a battery). It is supported on both OSX and Linux (note that it requires `acpi` on Linux). - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_BATTERY_CHARGING`|`"yellow"`|Color to indicate a charging battery.| -|`POWERLEVEL9K_BATTERY_CHARGED`|`"green"`|Color to indicate a charged battery.| -|`POWERLEVEL9K_BATTERY_DISCONNECTED`|`$DEFAULT_COLOR`|Color to indicate absence of battery.| -|`POWERLEVEL9K_BATTERY_LOW_THRESHOLD`|`10`|Threshold to consider battery level critical.| -|`POWERLEVEL9K_BATTERY_LOW_COLOR`|`"red"`|Color to indicate critically low charge level.| -|`POWERLEVEL9K_BATTERY_VERBOSE`|`true`|Display time remaining next to battery level.| -|`POWERLEVEL9K_BATTERY_HIDE_ABOVE_THRESHOLD`|`unset`|Threshold from which the battery segment should not be displayed.| - -Note that you can [modify the `_FOREGROUND` -color](https://github.com/bhilburn/powerlevel9k/wiki/Stylizing-Your-Prompt#segment-color-customization) -without affecting the icon color. - -You can also change the battery icon automatically depending on the battery -level. This will override the default battery icon. In order to do this, you -need to define the `POWERLEVEL9k_BATTERY_STAGES` variable. - - -| Variable | Default Value | Description | -|-------------------------------|---------------|---------------------------------------------------------------| -| `POWERLEVEL9K_BATTERY_STAGES` | Unset | A string or array, which each index indicates a charge level. | - -Powerlevel9k will use each index of the string or array as a stage to indicate battery -charge level, progressing from left to right. You can provide any number of -stages. The setting below, for example, provides 8 stages for Powerlevel9k to use. -```zsh -POWERLEVEL9K_BATTERY_STAGES="▁▂▃▄▅▆▇█" -``` - -If you require extra spacing after the icon, you will have to set it as an array, -since spaces in the string will be used as one of the stages and you will get a -missing icon. To do this, declare the variable as follows: -```zsh -POWERLEVEL9K_BATTERY_STAGES=($'\u2581 ' $'\u2582 ' $'\u2583 ' $'\u2584 ' $'\u2585 ' $'\u2586 ' $'\u2587 ' $'\u2588 ') -``` - -Using the array syntax, you can create stages comprised of multiple characters. -The below setting provides 40 battery stages. -```zsh -POWERLEVEL9K_BATTERY_STAGES=( - $'▏ ▏' $'▎ ▏' $'▍ ▏' $'▌ ▏' $'▋ ▏' $'▊ ▏' $'▉ ▏' $'█ ▏' - $'█▏ ▏' $'█▎ ▏' $'█▍ ▏' $'█▌ ▏' $'█▋ ▏' $'█▊ ▏' $'█▉ ▏' $'██ ▏' - $'██ ▏' $'██▎ ▏' $'██▍ ▏' $'██▌ ▏' $'██▋ ▏' $'██▊ ▏' $'██▉ ▏' $'███ ▏' - $'███ ▏' $'███▎ ▏' $'███▍ ▏' $'███▌ ▏' $'███▋ ▏' $'███▊ ▏' $'███▉ ▏' $'████ ▏' - $'████ ▏' $'████▎▏' $'████▍▏' $'████▌▏' $'████▋▏' $'████▊▏' $'████▉▏' $'█████▏' ) -``` - -You can also change the background of the segment automatically depending on the -battery level. This will override the following variables: -`POWERLEVEL9K_BATTERY_CHARGING`, `POWERLEVEL9K_BATTERY_CHARGED`, -`POWERLEVEL9K_BATTERY_DISCONNECTED`, and `POWERLEVEL9K_BATTERY_LOW_COLOR`. In -order to do this, define a color array, from low to high, as shown below: ```zsh -POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND=(red1 orangered1 darkorange orange1 gold1 yellow1 yellow2 greenyellow chartreuse1 chartreuse2 green1) +git clone https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k +echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>! ~/.zshrc ``` -As with the battery stages, you can use any number of colors and Powerlevel9k -will automatically use all of them appropriately. +Make sure to disable your current theme. -Some example settings: +### Extra configuration -| Brightness | Possible Array | -|----------------|---------------------------------------------------------------------------------------------------------------| -| Bright Colors | `(red1 orangered1 darkorange orange1 gold1 yellow1 yellow2 greenyellow chartreuse1 chartreuse2 green1)` | -| Normal Colors | `(red3 darkorange3 darkgoldenrod gold3 yellow3 chartreuse2 mediumspringgreen green3 green3 green4 darkgreen)` | -| Subdued Colors | `(darkred orange4 yellow4 yellow4 chartreuse3 green3 green4 darkgreen)` | +Powerlevel10k has a handful of configuration options that Powerlevel9k doesn't have. They +are still using the `POWERLEVEL9K` prefix though. -##### chruby + * `POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS (FLOAT) [default=0.05]` -This segment shows the version of Ruby being used when using `chruby` to change your current Ruby stack. + If it takes longer than this to fetch git repo status, display the prompt with a greyed out + vcs segment and fix it asynchronously when the results come it. + * `POWERLEVEL9K_VCS_BACKENDS (ARRAY) [default=(git)]` + + The list of VCS backends to use. Supported values are `git`, `svn` and `hg`. Note that adding + anything other than git will make prompt slower even when your current directory isn't a repo. -It uses `$RUBY_ENGINE` and `$RUBY_VERSION` as set by `chruby`. + * `POWERLEVEL9K_GITSTATUS_DIR (STRING) [default=$POWERLEVEL9K_INSTALLATION_DIR/gitstatus]` -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_CHRUBY_SHOW_ENGINE`|true|Show the currently selected Ruby engine (e.g. `ruby`, `jruby`, `rbx`, etc) -|`POWERLEVEL9K_CHRUBY_SHOW_VERSION`|true|Shows the currently selected engine's version (e.g. `2.5.1`) + Directory with gitstatus plugin. By default uses a copy bundled with Powerlevel10k. + * `POWERLEVEL9K_DISABLE_GITSTATUS (STRING) [default="false"]` + + If set to `"true"`, Powerlevel10k won't use its fast git backend and will fall back to + `vcs_info` like Powerlevel9k. + * `POWERLEVEL9K_MAX_CACHE_SIZE (INT) [default=10000]` -##### command_execution_time + The maximum number of elements that can be stored in the cache. When the cache grows over this + limit, it gets cleared. + * `POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY (INT) [default=-1]` -Display the time the previous command took to execute if the time is above -`POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD`. The time is formatted to be -"human readable", and so scales the units based on the length of execution time. -If you want more precision, just set the -`POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION` field. - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD`|3|Threshold above which to print this segment. Can be set to `0` to always print.| -|`POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION`|2|Number of digits to use in the fractional part of the time value.| - -##### custom_command - -The `custom_...` segment allows you to turn the output of a custom command into -a prompt segment. As an example, if you wanted to create a custom segment to -display your WiFi signal strength, you might define a custom segment called -`custom_wifi_signal` like this: -```zsh -POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context time battery dir vcs virtualenv custom_wifi_signal) -POWERLEVEL9K_CUSTOM_WIFI_SIGNAL="echo signal: \$(nmcli device wifi | grep yes | awk '{print \$8}')" -POWERLEVEL9K_CUSTOM_WIFI_SIGNAL_BACKGROUND="blue" -POWERLEVEL9K_CUSTOM_WIFI_SIGNAL_FOREGROUND="yellow" -``` -If you prefer, you can also define the function in your `.zshrc` rather than -putting it in-line with the variable export, as shown above. Just don't forget -to invoke your function from your segment! Example code that achieves the same -result as the above: -```zsh -zsh_wifi_signal(){ - local signal=$(nmcli device wifi | grep yes | awk '{print $8}') - local color='%F{yellow}' - [[ $signal -gt 75 ]] && color='%F{green}' - [[ $signal -lt 50 ]] && color='%F{red}' - echo -n "%{$color%}\uf230 $signal%{%f%}" # \uf230 is -} - -POWERLEVEL9K_CUSTOM_WIFI_SIGNAL="zsh_wifi_signal" -POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context time battery dir vcs virtualenv custom_wifi_signal) -``` -The command, above, gives you the wireless signal segment shown below: + Don't scan for dirty files in git repos with more files in the index than this. Instead, show + them with the "dirty" color (yellow by default) whether they are dirty or not. This makes git + prompt much faster on huge repositories. -![signal](http://i.imgur.com/hviMATC.png) + * `POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME (STRING) [default="false"]` -You can define as many custom segments as you wish. If you think you have -a segment that others would find useful, please consider upstreaming it to the -main theme distribution so that everyone can use it! + If set to `"true"`, `time` segment will update every second, turning into a realtime clock. -##### context +## Try it out -The `context` segment (user@host string) is conditional. By default, it will -only print if you are not your 'normal' user (including if you are root), or if -you are SSH'd to a remote host. `SUDO` and `REMOTE_SUDO` states are also available to show whether the current user or remote user has superuser privileges. +Try Powerlevel10k without making any changes to your setup. If you like it, see +[Installation and configuration](#installation-and-configuration) for how to make a permanent +switch. -To use this feature, make sure the `context` segment is enabled in your prompt -elements (it is by default), and define a `DEFAULT_USER` in your `~/.zshrc`. +### For Powerlevel9k users -You can customize the `context` segment. For example, you can make it to print the -full hostname by setting +If you are currently using Powerlevel9k, you can try Powerlevel10k in a temporary zsh shell. The +prompt will look exactly like what you are used to but it'll be faster. -``` -POWERLEVEL9K_CONTEXT_TEMPLATE="%n@`hostname -f`" -``` - -You can set the `POWERLEVEL9K_CONTEXT_HOST_DEPTH` variable to change how the -hostname is displayed. See [ZSH Manual](http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Login-information) -for details. The default is set to %m which will show the hostname up to the first ‘.’ -You can set it to %{N}m where N is an integer to show that many segments of system -hostname. Setting N to a negative integer will show that many segments from the -end of the hostname. - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`DEFAULT_USER`|None|Username to consider a "default context" (you can also set `$USER`).| -|`POWERLEVEL9K_ALWAYS_SHOW_CONTEXT`|false|Always show this segment, including $USER and hostname.| -|`POWERLEVEL9K_ALWAYS_SHOW_USER`|false|Always show the username, but conditionalize the hostname.| -|`POWERLEVEL9K_CONTEXT_TEMPLATE`|%n@%m|Default context prompt (username@machine). Refer to the [ZSH Documentation](http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html) for all possible expansions, including deeper host depths.| - -This segment can have different states. They might help you to visualize your -different privileges. Read more about styling with states [here](https://github.com/bhilburn/powerlevel9k/wiki/Stylizing-Your-Prompt#special-segment-colors). - -| State | Meaning | -|---------------|----------------------------------------------------------| -| `DEFAULT` | You are a normal user | -| `ROOT` | You are the root user | -| `SUDO` | You are using elevated rights | -| `REMOTE_SUDO` | You are SSH'ed into the machine and have elevated rights | -| `REMOTE` | You are SSH'ed into the machine | - -##### date - -The `date` segment shows the current system date. - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_DATE_FORMAT`|`%D{%d.%m.%y}`|[ZSH time format](http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Date-and-time) to use in this segment.| - -##### dir - -The `dir` segment shows the current working directory. When using the "Awesome -Powerline" fonts, there are additional glyphs, as well: - -| `Compatible` | `Powerline` | `Awesome Powerline` | Situation -|------------|-----------|-------------------|---------------------------- -| None | None | ![](https://cloud.githubusercontent.com/assets/1544760/12183451/40ec4016-b58f-11e5-9b9e-74e2b2f0b8b3.png) | At the root of your home folder | -| None | None | ![](https://cloud.githubusercontent.com/assets/1544760/12369315/8a5d762c-bbf5-11e5-8a20-ca1179f48d6c.png) | Within a subfolder of your home directory | -| None | None | ![](https://cloud.githubusercontent.com/assets/1544760/12183452/40f79286-b58f-11e5-9b8c-ed1343a07b08.png) | Outside of your home folder | -| None | None | ⚙ | Within the `/etc` directory | - -To turn off these icons you could set these variables to an empty string. -```zsh -POWERLEVEL9K_HOME_ICON='' -POWERLEVEL9K_HOME_SUB_ICON='' -POWERLEVEL9K_FOLDER_ICON='' -POWERLEVEL9K_ETC_ICON='' -``` -You can limit the output to a certain length by truncating long paths. -Customizations available are: - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_DIR_PATH_ABSOLUTE`|None|If set to `true`, will use absolute paths instead of home folder abbreviation `~`| -|`POWERLEVEL9K_SHORTEN_DIR_LENGTH`|`2`|If your shorten strategy, below, is entire directories, this field determines how many directories to leave at the end. If your shorten strategy is by character count, this field determines how many characters to allow per directory string.| -|`POWERLEVEL9K_SHORTEN_STRATEGY`|None|How the directory strings should be truncated. See the table below for more informations.| -|`POWERLEVEL9K_SHORTEN_DELIMITER`|`..`|Delimiter to use in truncated strings. This can be any string you choose, including an empty string if you wish to have no delimiter.| - -| Strategy Name | Description | -|---------------|-------------| -|Default|Truncate whole directories from left. How many is defined by `POWERLEVEL9K_SHORTEN_DIR_LENGTH`| -|`truncate_absolute_chars`|Truncates an absolute number of characters from the left such that the number of characters that your path displays (with or without `POWERLEVEL9K_SHORTEN_DELIMITER`) is no more than `POWERLEVEL9K_SHORTEN_DIR_LENGTH` + the length of `POWERLEVEL9K_SHORTEN_DELIMITER` | -|`truncate_middle`|Truncates the middle part of a folder. E.g. you are in a folder named `~/MySuperProjects/AwesomeFiles/BoringOffice`, then it will truncated to `~/MyS..cts/Awe..les/BoringOffice`, if `POWERLEVEL9K_SHORTEN_DIR_LENGTH=3` is also set (controls the amount of characters to be left).| -|`truncate_from_right`|Just leaves the beginning of a folder name untouched. E.g. your folders will be truncated like so: `/ro../Pr../office`. How many characters will be untouched is controlled by `POWERLEVEL9K_SHORTEN_DIR_LENGTH`.| -|`truncate_absolute`|Truncates everything exept the last few characters in the path. E.g. if you are in a folder named `~/Projects/powerlevel9k` and you have set `POWERLEVEL9K_SHORTEN_DIR_LENGTH=3`, you will get `..l9k`.| -|`truncate_to_last`|Truncates everything before the last folder in the path.| -|`truncate_to_first_and_last`|Truncate middle directories from the path. How many directories will be untouched is controlled by `POWERLEVEL9K_SHORTEN_DIR_LENGTH`. E.g. if you are in a folder named `~/Projects/powerlevel9k` and you have set `POWERLEVEL9K_SHORTEN_DIR_LENGTH=1`, you will get `~/../powerlevel9k`.|| -|`truncate_to_unique`|Parse all parent path components and truncate them to the shortest unique length. If you copy & paste the result to a shell, after hitting `TAB` it should expand to the original path unambiguously.| -|`truncate_with_package_name`|Search for a `package.json` or `composer.json` and prints the `name` field to abbreviate the directory path. The precedence and/or files could be set by `POWERLEVEL9K_DIR_PACKAGE_FILES=(package.json composer.json)`. If you have [jq](https://stedolan.github.io/jq/) installed, it will dramatically improve the speed of this strategy.| -|`truncate_with_folder_marker`|Search for a file that is specified by `POWERLEVEL9K_SHORTEN_FOLDER_MARKER` and truncate everything before that (if found, otherwise stop on $HOME and ROOT).| - -For example, if you wanted the truncation behavior of the `fish` shell, which -truncates `/usr/share/plasma` to `/u/s/plasma`, you would use the following: ```zsh -POWERLEVEL9K_SHORTEN_DIR_LENGTH=1 -POWERLEVEL9K_SHORTEN_DELIMITER="" -POWERLEVEL9K_SHORTEN_STRATEGY="truncate_from_right" +git clone https://github.com/romkatv/powerlevel10k.git /tmp/powerlevel10k +source /tmp/powerlevel10k/powerlevel10k.zsh-theme ``` -In each case you have to specify the length you want to shorten the directory -to. So in some cases `POWERLEVEL9K_SHORTEN_DIR_LENGTH` means characters, in -others whole directories. -The `truncate_with_package_name` strategy gives your directory path relative to the root of your project. For example, if you have a project inside `$HOME/projects/my-project` with a `package.json` that looks like: +When you are done playing, `rm -rf /tmp/powerlevel10k` and exit zsh. -```json -{ - "name": "my-cool-project" -} -``` - -The path shown would be `my-cool-project`. If you navigate to `$HOME/projects/my-project/src`, then the path shown would be `my-cool-project/src`. Please note that this currently looks for `.git` directory to determine the root of the project. +### For new users -If you want to customize the directory separator, you could set: ```zsh -# Double quotes are important here! -POWERLEVEL9K_DIR_PATH_SEPARATOR="%F{red} $(print_icon 'LEFT_SUBSEGMENT_SEPARATOR') %F{black}" +git clone https://github.com/romkatv/powerlevel10k.git /tmp/powerlevel10k +echo " + # Your prompt configuration goes here. + POWERLEVEL9K_PROMPT_ON_NEWLINE=true + POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(root_indicator dir_writable dir vcs) + POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status command_execution_time background_jobs time) + source /tmp/powerlevel10k/powerlevel10k.zsh-theme" >/tmp/powerlevel10k/.zshrc +ZDOTDIR=/tmp/powerlevel10k zsh ``` -To omit the first character (usually a slash that gets replaced if you set `POWERLEVEL9K_DIR_PATH_SEPARATOR`), -you could set `POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true`. - -You can also customize the leading tilde character when you are in `$HOME` using: -```zsh -# Double quotes are important here! -POWERLEVEL9K_HOME_FOLDER_ABBREVIATION="%F{red} $(print_icon 'HOME_ICON') %F{black}" -``` -You can also configure the `dir` segment to show when you are in a directory without write permissions, using the variable below. - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_DIR_SHOW_WRITABLE`|`false`|If set to `true` and you are in a directory that you do not have write permissions for, this segment will display a lock icon and enter the `NOT_WRITABLE` state (which can be customized per [our usual process](https://github.com/bhilburn/powerlevel9k/wiki/Stylizing-Your-Prompt#segment-color-customization)). Note that this functionality is also available in a separate segment, `dir_writable`.| - -If you want to customize the last directory of the path, you can now set `POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND` to a custom color and/or `POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true` to display that part in bold. -You can also color the separator separately by setting the color using `POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND`. +When you are done playing, `rm -rf /tmp/powerlevel10k` and exit zsh. -##### disk_usage +### Docker playground -The `disk_usage` segment will show the usage level of the partition that your current working directory resides in. It can be configured with the following variables. - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_DISK_USAGE_ONLY_WARNING`|false|Hide the segment except when usage levels have hit warning or critical levels.| -|`POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL`|90|The usage level that triggers a warning state.| -|`POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL`|95|The usage level that triggers a critical state.| - -##### host - -The `host` segment will print the hostname. - -You can set the `POWERLEVEL9K_HOST_TEMPLATE` variable to change how the hostname -is displayed. See (ZSH Manual)[http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Login-information] -for details. The default is set to `%m` which will show the hostname up to the -first `.`. You can set it to `%{N}m` where N is an integer to show that many -segments of system hostname. Setting `N` to a negative integer will show that many -segments from the end of the hostname. - -``` -POWERLEVEL9K_HOST_TEMPLATE="%2m" -``` +You can try Powerlevel10k in Docker (Linux only). Once you exit zsh, the image is deleted. -By default, LOCAL hosts will show the host icon and remote hosts will show the SSH icon. You can override them by setting -``` -POWERLEVEL9K_HOST_ICON="\uF109 " -POWERLEVEL9K_SSH_ICON="\uF489 " -``` - - -##### ip - -This segment tries to examine all currently used network interfaces and prints -the first address it finds. In the case that this is not the right NIC, you can -specify the correct network interface by setting: - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_IP_INTERFACE`|None|The NIC for which you wish to display the IP address. Example: `eth0`.| - -##### vpn_ip - -This segment tries to extract the VPN related IP addresses from nmcli, based on the NIC type: - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_VPN_IP_INTERFACE`|`tun`|The VPN interface.| - -##### public_ip - -This segment will display your public IP address. There are several methods of obtaining this -information and by default it will try all of them starting with the most efficient. You can -also specify which method you would like it to use. The methods available are dig using opendns, -curl, or wget. The host used for wget and curl is http://ident.me by default but can be set to -another host if you prefer. - -If you activate a VPN, the icon for this segment will change to the defined VPN icon. - -The public_ip segment will attempt to update your public IP address every 5 minutes by default(also -configurable by the user). If you lose connection your cached IP address will be displayed until -your timeout expires at which point every time your prompt is generated a new attempt will be made. -Until an IP is successfully pulled the value of $POWERLEVEL9K_PUBLIC_IP_NONE will be displayed for -this segment. If this value is empty(the default)and $POWERLEVEL9K_PUBLIC_IP_FILE is empty the -segment will not be displayed. - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_PUBLIC_IP_FILE`|'/tmp/p9k_public_ip'|This is the file your public IP is cached in.| -|`POWERLEVEL9K_PUBLIC_IP_HOST`|'http://ident.me'|This is the default host to get your public IP.| -|`POWERLEVEL9K_PUBLIC_IP_TIMEOUT`|300|The amount of time in seconds between refreshing your cached IP.| -|`POWERLEVEL9K_PUBLIC_IP_METHODS`|(dig curl wget)| These methods in that order are used to refresh your IP.| -|`POWERLEVEL9K_PUBLIC_IP_NONE`|None|The string displayed when an IP was not obtained| - -##### load - -Displays one of your load averages with appropriate state coloring. The thresholds are: -- `0.7 * NUM_CORES <`: critical -- `0.5 * NUM_CORES <`: warning -- `less`: normal - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_LOAD_WHICH`|5|Which average to show. Possible values: 1, 5 or 15| - -##### newline - -Puts a newline in your prompt so you can continue using segments on the next -line. This allows you to use segments on both lines, unlike -`POWERLEVEL9K_PROMPT_ON_NEWLINE`, which simply separates segments from the -prompt itself. - -This only works on the left side. On the right side it does nothing. - -##### nodeenv - -Shows the currently used [nodeenv](https://github.com/ekalinin/nodeenv). To avoid -Nodeenvs activate command from interfering with Powerlevel9k, you should set -`NODE_VIRTUAL_ENV_DISABLE_PROMPT=1` in your `~/.zshrc`. - -##### rbenv - -This segment shows the version of Ruby being used when using `rbenv` to change your current Ruby stack. - -It figures out the version being used by taking the output of the `rbenv version-name` command. - -* If `rbenv` is not in $PATH, nothing will be shown. -* By default, if the current local Ruby version is the same as the global Ruby version, nothing will be shown. See the configuration variable, below, to modify this behavior. - -Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_RBENV_ALWAYS`|'false'|Always show the `rbenv` segment, even if the local version matches the global.| - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW`|`false`|Set to true if you wish to show the rbenv segment even if the current Ruby version is the same as the global Ruby version| - -##### pyenv - -This segment shows the version of Python being used when using `pyenv` to change your current Python stack. - -The `PYENV_VERSION` environment variable will be used if specified. Otherwise it figures out the version being used by taking the output of the `pyenv version-name` command. - -* If `pyenv` is not in $PATH, nothing will be shown. -* If the current Python version is the same as the global Python version, nothing will be shown. - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW`|`false`|Set to true if you wish to show the pyenv segment even if the current Python version is the same as the global Python version| - -##### rspec_stats - -See [Unit Test Ratios](#unit-test-ratios), below. - -##### status - -This segment shows the return code of the last command. - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_STATUS_CROSS`|`false`|Set to true if you wish not to show the error code when the last command returned an error and optionally hide this segment when the last command completed successfully by setting `POWERLEVEL9K_STATUS_OK` to false.| -|`POWERLEVEL9K_STATUS_OK`|`true`|Set to true if you wish to show this segment when the last command completed successfully, false to hide it.| -|`POWERLEVEL9K_STATUS_SHOW_PIPESTATUS`|`true`|Set to true if you wish to show the exit status for all piped commands.| -|`POWERLEVEL9K_STATUS_HIDE_SIGNAME`|`false`|Set to true return the raw exit code (`1-255`). When set to false, values over 128 are shown as `SIGNAME(-n)` (e.g. `KILL(-9)`)| - -##### ram - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_RAM_ELEMENTS`|Both|Specify `ram_free` or `swap_used` to only show one or the other rather than both.| - -##### symfony2_tests - -See [Unit Test Ratios](#unit-test-ratios), below. - -##### time - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_TIME_FORMAT`|`'H:M:S'`|ZSH time format to use in this segment.| - -As an example, if you wanted a reversed time format, you would use this: -```zsh -# Reversed time format -POWERLEVEL9K_TIME_FORMAT='%D{%S:%M:%H}' -``` -If you are using an "Awesome Powerline Font", you can add a time symbol to this -segment, as well: ```zsh -# Output time, date, and a symbol from the "Awesome Powerline Font" set -POWERLEVEL9K_TIME_FORMAT="%D{%H:%M:%S \uE868 %d.%m.%y}" -``` -##### user - -The `user` segment will print the username. - -You can also override the icons by setting: - -``` -POWERLEVEL9K_USER_ICON="\uF415" # -POWERLEVEL9K_ROOT_ICON="#" -POWERLEVEL9K_SUDO_ICON=$'\uF09C' # +docker run -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -e TERM=$TERM -it --rm ubuntu bash -c ' + set -uex + apt update + apt install -y zsh git + cd + git clone https://github.com/romkatv/powerlevel10k.git + echo " + # Your prompt configuration goes here. + POWERLEVEL9K_PROMPT_ON_NEWLINE=true + POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(root_indicator dir_writable dir vcs) + POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status command_execution_time background_jobs time) + source ~/powerlevel10k/powerlevel10k.zsh-theme" >~/.zshrc + cd powerlevel10k + zsh -i' ``` -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`DEFAULT_USER`|None|Username to consider a "default context".| -|`POWERLEVEL9K_ALWAYS_SHOW_USER`|`false`|Always print this segment.| -|`POWERLEVEL9K_USER_TEMPLATE`|`%n`|Default username prompt. Refer to the [ZSH Documentation](http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html) for all possible expansions| - -##### vcs - -By default, the `vcs` segment will provide quite a bit of information. Further -customization is provided via: - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_HIDE_BRANCH_ICON`|`false`|Set to `true` to hide the branch icon from the segment.| -|`POWERLEVEL9K_SHOW_CHANGESET`|`false`|Set to `true` to display the hash / changeset in the segment.| -|`POWERLEVEL9K_CHANGESET_HASH_LENGTH`|`12`|How many characters of the hash / changeset to display in the segment.| -|`POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY`|`true`|Set to `false` to not reflect submodule status in the top-level repository prompt.| -|`POWERLEVEL9K_VCS_HIDE_TAGS`|`false`|Set to `true` to stop tags being displayed in the segment.| -|`POWERLEVEL9K_VCS_GIT_HOOKS`|`(vcs-detect-changes git-untracked git-aheadbehind git-stash git-remotebranch git-tagname)`|Layout of the segment for git repositories.| -|`POWERLEVEL9K_VCS_HG_HOOKS`|`(vcs-detect-changes)`|Layout of the segment for Mercurial repositories.| -|`POWERLEVEL9K_VCS_SVN_HOOKS`|`(vcs-detect-changes svn-detect-changes)`|Layout of the segment for SVN repositories.| -|`POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND`|`red`|The color of the foreground font during actions (e.g., `REBASE`).| - - -##### vcs symbols - -The `vcs` segment uses various symbols to tell you the state of your repository. -These symbols depend on your installed font and selected `POWERLEVEL9K_MODE` -from the [Installation](#Installation) section above. - -| `Compatible` | `Powerline` | `Awesome Powerline` | Explanation -|--------------|---------------------|-------------------|-------------------------- -| `↑4` | `↑4` | ![icon_outgoing](https://cloud.githubusercontent.com/assets/1544760/7976089/b5904d6e-0a76-11e5-8147-5e873ac52d79.gif)4 | Number of commits your repository is ahead of your remote branch -| `↓5` | `↓5` | ![icon_incoming](https://cloud.githubusercontent.com/assets/1544760/7976091/b5909c9c-0a76-11e5-9cad-9bf0a28a897c.gif)5 | Number of commits your repository is behind of your remote branch -| `⍟3` | `⍟3` | ![icon_stash](https://cloud.githubusercontent.com/assets/1544760/7976094/b5ae9346-0a76-11e5-8cc7-e98b81824118.gif)3 | Number of stashes, here 3. -| `●` | `●` | ![icon_unstaged](https://cloud.githubusercontent.com/assets/1544760/7976096/b5aefa98-0a76-11e5-9408-985440471215.gif) | There are unstaged changes in your working copy -| `✚` | `✚` | ![icon_staged](https://cloud.githubusercontent.com/assets/1544760/7976095/b5aecc8a-0a76-11e5-8988-221afc6e8982.gif) | There are staged changes in your working copy -| `?` | `?` | ![icon_untracked](https://cloud.githubusercontent.com/assets/1544760/7976098/b5c7a2e6-0a76-11e5-8c5b-315b595b2bc4.gif) | There are files in your working copy, that are unknown to your repository -| `→` | `→` | ![icon_remote_tracking_branch](https://cloud.githubusercontent.com/assets/1544760/7976093/b5ad2c0e-0a76-11e5-9cd3-62a077b1b0c7.gif) | The name of your branch differs from its tracking branch. -| `☿` | `☿` | ![icon_bookmark](https://cloud.githubusercontent.com/assets/1544760/7976197/546cfac6-0a78-11e5-88a6-ce3a1e0a174e.gif) | A mercurial bookmark is active. -| `@` | ![icon_branch_powerline](https://cloud.githubusercontent.com/assets/1544760/8000852/e7e8d8a0-0b5f-11e5-9834-de9b25c92284.gif) | ![](https://cloud.githubusercontent.com/assets/1544760/7976087/b58bbe3e-0a76-11e5-8d0d-7a5c1bc7f730.gif) | Branch Icon -| None | None | ![icon_commit](https://cloud.githubusercontent.com/assets/1544760/7976088/b58f4e50-0a76-11e5-9e70-86450d937030.gif)2c3705 | The current commit hash. Here "2c3705" -| None | None | ![icon_git](https://cloud.githubusercontent.com/assets/1544760/7976092/b5909f80-0a76-11e5-9950-1438b9d72465.gif) | Repository is a git repository -| None | None | ![icon_mercurial](https://cloud.githubusercontent.com/assets/1544760/7976090/b5908da6-0a76-11e5-8c91-452b6e73f631.gif) | Repository is a Mercurial repository - -##### vcs truncation - -You can limit the branch name to a certain length by truncating long names. -Customizations available are: - -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_VCS_SHORTEN_LENGTH`|None|This field determines how many characters to show.| -|`POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH`|None|This field determines minimum branch length. Branch name will be truncated if its length greater than this field.| -|`POWERLEVEL9K_VCS_SHORTEN_STRATEGY`|None|This field determines how branch name should be truncated. See the table below for more information.| -|`POWERLEVEL9K_SHORTEN_DELIMITER`|`...`|Delimiter to use in truncated strings. This can be any string you choose, including an empty string if you wish to have no delimiter.| - -| Strategy Name | Description | -|---------------|-------------| -|`truncate_middle`|Truncates the middle part of a branch. E.g. branch name is `1234-super_super_long_branch_name`, then it will truncated to `1234-..._name`, if `POWERLEVEL9K_VCS_SHORTEN_LENGTH=5` is also set (controls the amount of characters to be left).| -|`truncate_from_right`|Just leaves the beginning of a branch name untouched. E.g. branch name will be truncated like so: `1234-...`. How many characters will be untouched is controlled by `POWERLEVEL9K_VCS_SHORTEN_LENGTH`.| - -For example, if you want to truncate `1234-super_super_long_branch_name` to `1234-..` and don't do it with `development`: -```zsh -POWERLEVEL9K_VCS_SHORTEN_LENGTH=4 -POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH=11 -POWERLEVEL9K_VCS_SHORTEN_STRATEGY="truncate_from_right" -POWERLEVEL9K_VCS_SHORTEN_DELIMITER=".." -``` +## How fast is it? -##### vi_mode +Powerlevel10k renders prompt between 10 and 100 times faster than powerlevel9k. -This segment shows ZSH's current input mode. Note that this is only useful if -you are using the [ZSH Line Editor](http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html) -(VI mode). You can enable this either by `.zshrc` configuration or using a plugin, like -[Oh-My-Zsh's vi-mode plugin](https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/vi-mode/vi-mode.plugin.zsh). +Here are benchmark results obtained with +[zsh-prompt-benchmark](https://github.com/romkatv/zsh-prompt-benchmark) on Intel i9-7900X +running Ubuntu 18.04. -| Variable | Default Value | Description | -|----------|---------------|-------------| -|`POWERLEVEL9K_VI_INSERT_MODE_STRING`|`"INSERT"`|String to display while in 'Insert' mode.| -|`POWERLEVEL9K_VI_COMMAND_MODE_STRING`|`"NORMAL"`|String to display while in 'Command' mode.| +| Theme | / | ~/linux | +|---------------------|----------:| ---------:| +| powerlevel9k/master | 101 ms | 280 ms | +| powerlevel9k/next | 26 ms | 255 ms | +| **powerlevel10k** | **1 ms** | **22 ms** | +| naked zsh | 0.05 ms | 0.05 ms | -To hide the segment entirely when in `INSERT` mode, set `POWERLEVEL9K_VI_INSERT_MODE_STRING=''` +Columns define the current directory where the prompt was rendered. -##### virtualenv + * `/` -- root directory, not a git repo. + * `~/linux` -- [linux](https://github.com/torvalds/linux) git repo with 60k files. It was checked + out to an M.2 SSD. -This segment shows your Python [VirtualEnv](https://virtualenv.pypa.io/en/latest/). To avoid -VirtualEnvs activate command from interfering with Powerlevel9k, you should set -`VIRTUAL_ENV_DISABLE_PROMPT=1` in your `~/.zshrc`. +powerlevel9k/master is the stable branch of powerlevel9k, the one that virtually everyone uses. +powerlevel9k/next is the development branch for the next release. -#### Unit Test Ratios +Here's how the prompt looked like during benchmarking. -The `symfony2_tests` and `rspec_stats` segments both show a ratio of "real" -classes vs test classes in your source code. This is just a very simple ratio, -and does not show your code coverage or any sophisticated stats. All this does -is count your source files and test files, and calculate the ratio between them. -Just enough to give you a quick overview about the test situation of the project -you are dealing with. +![](https://raw.githubusercontent.com/romkatv/powerlevel10k/master/prompt.png) -### Disabling / Enabling Powerlevel9k +It was identical in Powerlevel10k and Powerlevel9k. Even though Powerlevel10k can dynamically +switch to async prompts, it wasn't happening during the benchmark because latencies were low. +Prompts with both themes were essentially synchronous, with every prompt having up-to-date git info +(no greyed-out vcs/git segments). -You can disable P9k and return to a very basic prompt at any time simply by -calling: +Configuration that was used: ```zsh -$ prompt_powerlevel9k_teardown -``` +POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir_writable dir vcs) +POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status time) -You can then re-enable it by calling: - -```zsh -$ prompt_powerlevel9k_setup +POWERLEVEL9K_MODE=nerdfont-complete +POWERLEVEL9K_PROMPT_ON_NEWLINE=true +POWERLEVEL9K_ROOT_ICON=\\uF09C +POWERLEVEL9K_TIME_ICON=\\uF017 +POWERLEVEL9K_TIME_BACKGROUND=magenta +POWERLEVEL9K_STATUS_OK_BACKGROUND=grey53 ``` -### tl; dr +Powerlevel10k shows similar performance advantage over Powerlevel9k on Mac OS, FreeBSD, WSL, and +Raspberry Pie. + +## What's the catch? -Want to just get a quick start? Check out the [Show Off Your -Config](https://github.com/bhilburn/powerlevel9k/wiki/Show-Off-Your-Config) -portion of the wiki to get going. +Really, there is no catch. It's literally the same prompt with the same flexibility +configuration format as Powerlevel9k. But **much faster**. -[The Wiki also has a ton of other useful -information!](https://github.com/bhilburn/powerlevel9k/wiki) +If you really need to know, here's where Powerlevel10k differs from Powerlevel9k: -### License + * Git prompt doesn't show tags and revisions. Open an issue if you need them. + * By default only git vcs backend is enabled. If you need svn and hg, you'll need to set + `POWERLEVEL9K_VCS_BACKENDS`. See [Extra configuration](#extra-configuration). + * Fewer configuration options can be changed after the theme is loaded. For example, if you + decide to change background color of some segment in the middle of an interactive session, + it may not work. -Project: MIT +## Known bugs -Logo: CC-BY-SA. Source repository: https://github.com/bhilburn/powerlevel9k-logo +When a notification about an exiting job is displayed, prompt content doesn't get refreshed. +In Powerlevel9k it does. This could be fixed but the fix will add non-trivial complexity and +extra prompt latency. diff --git a/TESTS.md b/TESTS.md deleted file mode 100644 index b57c4d6d..00000000 --- a/TESTS.md +++ /dev/null @@ -1,69 +0,0 @@ -# Tests - -## Automated Tests - -The Unit-Tests do not follow exactly the file structure of Powerlevel9k itself, -but we try to reflect the structure as much as possible. All tests are located -under `test/`. Segment specific tests under `test/segments/` (one file per -segment). - -### Installation - -In order to execute the tests you need to install `shunit2`, which is a -submodule. To install the submodule, you can execute -`git submodule init && git submodule update`. - -### Executing tests - -The tests are shell scripts on their own. So you can execute them right away. -To execute all tests you could just execute `./test/suite.spec`. - -### General Test Structure - -The tests usually have a `setUp()` function which is executed before every -test function. Speaking of, test functions must be prefixed with `test`. In -the tests, you can do [different Assertions](https://github.com/kward/shunit2#-asserts). -It is always a good idea to mock the program you want to test (just have a -look at other tests), so that the testrunner does not have to have all -programs installed. - -### Travis - -We use [Travis](https://travis-ci.org/) for Continuous Integration. This -service executes our tests after every push. For now, we need to tell travis -where to find the tests, which is what happens in the `.travis.yml` file. - -## Manual Testing - -If unit tests are not sufficient (e.g. you have an issue with your prompt that -occurs only in a specific ZSH framework) then you can use either Docker or -or our Vagrant. - -### Docker - -This is the easiest to use _if_ you have Docker already installed and running. - -The command `./test-in-docker` should make it fairly easy to get into a running -container with the framework of your choice. - -Examples: - -``` zsh -# Test Antigen with the oldest version of ZSH -$ ./test-in-docker antigen -``` - -``` zsh -# Test Prezto with ZSH version 5.2 -$ ./test-in-docker --zsh 5.2 prezto -``` - -You can get Docker at <https://www.docker.com/community-edition>. - -**Note:** Not all frameworks work with all versions of ZSH (or the underlying OS). - -### Vagrant - -Currently there are two test VMs. `test-vm` is an Ubuntu machine with several -pre-installed ZSH frameworks. And there is `test-bsd-vm` which is a FreeBSD! -For how to run the machines see [here](test-vm/README.md). diff --git a/debug/font-issues.zsh b/debug/font-issues.zsh deleted file mode 100755 index 5712fc6d..00000000 --- a/debug/font-issues.zsh +++ /dev/null @@ -1,421 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -source functions/colors.zsh -source functions/icons.zsh -source functions/utilities.zsh -# Map our $OS to neofetch $os -os="$OS" - - -trim() { - set -f - # shellcheck disable=2048,2086 - set -- $* - printf '%s\n' "${*//[[:space:]]/}" - set +f -} - -trim_quotes() { - trim_output="${1//\'}" - trim_output="${trim_output//\"}" - printf "%s" "$trim_output" -} - -get_ppid() { - # Get parent process ID of PID. - case "$os" in - "Windows") - ppid="$(ps -p "${1:-$PPID}" | awk '{printf $2}')" - ppid="${ppid/PPID}" - ;; - - "Linux") - ppid="$(grep -i -F "PPid:" "/proc/${1:-$PPID}/status")" - ppid="$(trim "${ppid/PPid:}")" - ;; - - *) - ppid="$(ps -p "${1:-$PPID}" -o ppid=)" - ;; - esac - - printf "%s" "$ppid" -} - -get_process_name() { - # Get PID name. - case "$os" in - "Windows") - name="$(ps -p "${1:-$PPID}" | awk '{printf $8}')" - name="${name/COMMAND}" - name="${name/*\/}" - ;; - - "Linux") - name="$(< "/proc/${1:-$PPID}/comm")" - ;; - - *) - name="$(ps -p "${1:-$PPID}" -o comm=)" - ;; - esac - - printf "%s" "$name" -} - -# Taken from NeoFetch (slightly modified) -get_term() { - local term - - # If function was run, stop here. - # ((term_run == 1)) && return - - # Workaround for macOS systems that - # don't support the block below. - case "$TERM_PROGRAM" in - "iTerm.app") term="iTerm2" ;; - "Terminal.app") term="Apple Terminal" ;; - "Hyper") term="HyperTerm" ;; - *) term="${TERM_PROGRAM/\.app}" ;; - esac - - # Most likely TosWin2 on FreeMiNT - quick check - [[ "$TERM" == "tw52" || "$TERM" == "tw100" ]] && \ - term="TosWin2" - - [[ "$SSH_CONNECTION" ]] && \ - term="$SSH_TTY" - - # Check $PPID for terminal emulator. - while [[ -z "$term" ]]; do - parent="$(get_ppid "$parent")" - [[ -z "$parent" ]] && break - name="$(get_process_name "$parent")" - - case "${name// }" in - "${SHELL/*\/}"|*"sh"|"screen"|"su"*) ;; - - "login"*|*"Login"*|"init"|"(init)") - term="$(tty)" - ;; - - "ruby"|"1"|"tmux"*|"systemd"|"sshd"*|"python"*|"USER"*"PID"*|"kdeinit"*|"launchd"*) - break - ;; - - "gnome-terminal-") term="gnome-terminal" ;; - "urxvtd") term="urxvt" ;; - *"nvim") term="Neovim Terminal" ;; - *"NeoVimServer"*) term="VimR Terminal" ;; - *) term="${name##*/}" ;; - esac - done - - # Log that the function was run. - # term_run=1 - - echo "${term}" -} - -get_term_font() { - local confs term_font mateterm_config role profile xrdb child profile_filename - local term="${1}" - # ((term_run != 1)) && get_term - - case "$term" in - "alacritty"*) - setopt nullglob - confs=({$XDG_CONFIG_HOME,$HOME}/{alacritty,}/{.,}alacritty.ym?) - unsetopt nullglob - - [[ -f "${confs[1]}" ]] || return - - term_font="$(awk -F ':|#' '/normal:/ {getline; print}' "${confs[1]}")" - term_font="${term_font/*family:}" - term_font="${term_font/$'\n'*}" - term_font="${term_font/\#*}" - ;; - - "Apple_Terminal") - term_font="$(osascript <<END - tell application "Terminal" to font name of window frontmost -END -)" - ;; - - "iTerm2") - # Unfortunately the profile name is not unique, but it seems to be the only thing - # that identifies an active profile. There is the "id of current session of current win- - # dow" though, but that does not match to a guid in the plist. - # So, be warned, collisions may occur! - # See: https://groups.google.com/forum/#!topic/iterm2-discuss/0tO3xZ4Zlwg - local current_profile_name profiles_count profile_name diff_font - - current_profile_name="$(osascript <<END - tell application "iTerm2" to profile name \ - of current session of current window -END -)" - - # Warning: Dynamic profiles are not taken into account here! - # https://www.iterm2.com/documentation-dynamic-profiles.html - font_file="${HOME}/Library/Preferences/com.googlecode.iterm2.plist" - - # Count Guids in "New Bookmarks"; they should be unique - profiles_count="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:'" "$font_file" 2>/dev/null | \ - grep -w -c "Guid")" - - for ((i=0; i<profiles_count; i++)); do - profile_name="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:${i}:Name:'" "$font_file" 2>/dev/null)" - - if [[ "$profile_name" == "$current_profile_name" ]]; then - # "Normal Font" - term_font="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:${i}:Normal Font:'" \ - "$font_file" 2>/dev/null)" - - # Font for non-ascii characters - # Only check for a different non-ascii font, if the user checked - # the "use a different font for non-ascii text" switch. - diff_font="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:${i}:Use Non-ASCII Font:'" \ - "$font_file" 2>/dev/null)" - - if [[ "$diff_font" == "true" ]]; then - non_ascii="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:${i}:Non Ascii Font:'" \ - "$font_file" 2>/dev/null)" - - [[ "$term_font" != "$non_ascii" ]] && \ - term_font="$term_font (normal) / $non_ascii (non-ascii)" - fi - fi - done - ;; - - "deepin-terminal"*) - term_font="$(awk -F '=' '/font=/ {a=$2} /font_size/ {b=$2} END {print a,b}' \ - "${XDG_CONFIG_HOME}/deepin/deepin-terminal/config.conf")" - ;; - - "GNUstep_Terminal") - term_font="$(awk -F '>|<' '/>TerminalFont</ {getline; f=$3} - />TerminalFontSize</ {getline; s=$3} END {print f,s}' \ - "${HOME}/GNUstep/Defaults/Terminal.plist")" - ;; - - "Hyper"*) - term_font="$(awk -F':|,' '/fontFamily/ {print $2; exit}' "${HOME}/.hyper.js")" - term_font="$(trim_quotes "$term_font")" - ;; - - "kitty"*) - kitty_config="$(kitty --debug-config)" - [[ "$kitty_config" != *font_family* ]] && return - - term_font_size="${kitty_config/*font_size}" - term_font_size="${term_font_size/$'\n'*}" - term_font="${kitty_config/*font_family}" - term_font="${term_font/$'\n'*} $term_font_size" - ;; - - "konsole" | "yakuake") - # Get Process ID of current konsole window / tab - child="$(get_ppid "$$")" - - declare -a konsole_instances; konsole_instances=( "${(@f)"$(qdbus | grep -F 'org.kde.konsole')"/ /}" ) - - for i in "${konsole_instances[@]}"; do - declare -a konsole_sessions; konsole_sessions=( "${(@f)"$(qdbus "$i" | grep -F '/Sessions/')"}" ) - - for session in "${konsole_sessions[@]}"; do - if ((child == $(qdbus "$i" "$session" processId))); then - profile="$(qdbus "$i" "$session" environment |\ - awk -F '=' '/KONSOLE_PROFILE_NAME/ {print $2}')" - break - fi - done - [[ "$profile" ]] && break - done - - # We could have two profile files for the same profile name, take first match - profile_filename="$(grep -l "Name=${profile}" "$HOME"/.local/share/konsole/*.profile)" - profile_filename="${profile_filename/$'\n'*}" - - [[ "$profile_filename" ]] && \ - term_font="$(awk -F '=|,' '/Font=/ {print $2,$3}' "$profile_filename")" - ;; - - "lxterminal"*) - term_font="$(awk -F '=' '/fontname=/ {print $2; exit}' \ - "${XDG_CONFIG_HOME}/lxterminal/lxterminal.conf")" - ;; - - "mate-terminal") - # To get the actual config we have to create a temporarily file with the - # --save-config option. - mateterm_config="/tmp/mateterm.cfg" - - # Ensure /tmp exists and we do not overwrite anything. - if [[ -d "/tmp" && ! -f "$mateterm_config" ]]; then - mate-terminal --save-config="$mateterm_config" - - role="$(xprop -id "${WINDOWID}" WM_WINDOW_ROLE)" - role="${role##* }" - role="${role//\"}" - - profile="$(awk -F '=' -v r="$role" \ - '$0~r { - getline; - if(/Maximized/) getline; - if(/Fullscreen/) getline; - id=$2"]" - } $0~id {if(id) {getline; print $2; exit}}' \ - "$mateterm_config")" - - rm -f "$mateterm_config" - - mate_get() { - gsettings get org.mate.terminal.profile:/org/mate/terminal/profiles/"$1"/ "$2" - } - - if [[ "$(mate_get "$profile" "use-system-font")" == "true" ]]; then - term_font="$(gsettings get org.mate.interface monospace-font-name)" - else - term_font="$(mate_get "$profile" "font")" - fi - term_font="$(trim_quotes "$term_font")" - fi - ;; - - "mintty") - term_font="$(awk -F '=' '!/^($|#)/ && /Font/ {printf $2; exit}' "${HOME}/.minttyrc")" - ;; - - "pantheon"*) - term_font="$(gsettings get org.pantheon.terminal.settings font)" - - [[ -z "${term_font//\'}" ]] && \ - term_font="$(gsettings get org.gnome.desktop.interface monospace-font-name)" - - term_font="$(trim_quotes "$term_font")" - ;; - - "qterminal") - term_font="$(awk -F '=' '/fontFamily=/ {a=$2} /fontSize=/ {b=$2} END {print a,b}' \ - "${XDG_CONFIG_HOME}/qterminal.org/qterminal.ini")" - ;; - - "sakura"*) - term_font="$(awk -F '=' '/^font=/ {print $2; exit}' \ - "${XDG_CONFIG_HOME}/sakura/sakura.conf")" - ;; - - "st") - term_font="$(ps -o command= -p "$parent" | grep -F -- "-f")" - - if [[ "$term_font" ]]; then - term_font="${term_font/*-f/}" - term_font="${term_font/ -*/}" - - else - # On Linux we can get the exact path to the running binary through the procfs - # (in case `st` is launched from outside of $PATH) on other systems we just - # have to guess and assume `st` is invoked from somewhere in the users $PATH - [[ -L "/proc/$parent/exe" ]] && binary="/proc/$parent/exe" || binary="$(type -p st)" - - # Grep the output of strings on the `st` binary for anything that looks vaguely - # like a font definition. NOTE: There is a slight limitation in this approach. - # Technically "Font Name" is a valid font. As it doesn't specify any font options - # though it is hard to match it correctly amongst the rest of the noise. - [[ -n "$binary" ]] && \ - term_font="$(strings "$binary" | grep -F -m 1 \ - -e "pixelsize=" \ - -e "size=" \ - -e "antialias=" \ - -e "autohint=")" - fi - - term_font="${term_font/xft:}" - term_font="${term_font/:*}" - ;; - - "terminology") - term_font="$(strings "${XDG_CONFIG_HOME}/terminology/config/standard/base.cfg" |\ - awk '/^font\.name$/{print a}{a=$0}')" - term_font="${term_font/.pcf}" - term_font="${term_font/:*}" - ;; - - "termite") - [[ -f "${XDG_CONFIG_HOME}/termite/config" ]] && \ - termite_config="${XDG_CONFIG_HOME}/termite/config" - - term_font="$(awk -F '= ' '/\[options\]/ { - opt=1 - } - /^\s*font/ { - if(opt==1) a=$2; - opt=0 - } END {print a}' "/etc/xdg/termite/config" \ - "$termite_config")" - ;; - - "urxvt" | "urxvtd" | "rxvt-unicode" | "xterm") - xrdb="$(xrdb -query)" - term_font="$(grep -im 1 -e "^${term/d}"'\**\.*font' -e '^\*font' <<< "$xrdb")" - term_font="${term_font/*"*font:"}" - term_font="${term_font/*".font:"}" - term_font="${term_font/*"*.font:"}" - term_font="$(trim "$term_font")" - - [[ -z "$term_font" && "$term" == "xterm" ]] && \ - term_font="$(grep '^XTerm.vt100.faceName' <<< "$xrdb")" - - term_font="$(trim "${term_font/*"faceName:"}")" - - # xft: isn't required at the beginning so we prepend it if it's missing - [[ "${term_font:0:1}" != "-" && "${term_font:0:4}" != "xft:" ]] && \ - term_font="xft:$term_font" - - # Xresources has two different font formats, this checks which - # one is in use and formats it accordingly. - case "$term_font" in - *"xft:"*) - term_font="${term_font/xft:}" - term_font="${term_font/:*}" - ;; - - "-"*) - IFS=- read -r _ _ term_font _ <<< "$term_font" - ;; - esac - ;; - - "xfce4-terminal") - term_font="$(awk -F '=' '/^FontName/{a=$2}/^FontUseSystem=TRUE/{a=$0} END {print a}' \ - "${XDG_CONFIG_HOME}/xfce4/terminal/terminalrc")" - - [[ "$term_font" == "FontUseSystem=TRUE" ]] && \ - term_font="$(gsettings get org.gnome.desktop.interface monospace-font-name)" - - term_font="$(trim_quotes "$term_font")" - - # Default fallback font hardcoded in terminal-preferences.c - [[ -z "$term_font" ]] && term_font="Monospace 12" - ;; - esac - - echo "${term_font}" -} - -local currentTerminal=$(get_term) -local currentFont=$(get_term_font "${currentTerminal}") -print -P "===== Font debugging =====" -print -P "You are using %F{blue}${currentTerminal}%f with Font %F{blue}${currentFont}%f\n" - -if [[ $(echo "${currentFont}" | grep -c -E "Powerline|Awesome|Nerd") -eq 0 ]]; then - print -P "%F{yellow}WARNING%f It does not seem like you use an Powerline-enabled or Awesome Terminal Font!" - print -P "Please make sure that your font settings are correct!" -else - print -P "Your font settings seem to be all right. If you still have issues," - print -P "it is more likely to be a font issue than a Powerlevel9k related one." -fi diff --git a/debug/iterm.zsh b/debug/iterm.zsh deleted file mode 100755 index 702175ff..00000000 --- a/debug/iterm.zsh +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -if [[ "$TERM_PROGRAM" != "iTerm.app" ]]; then - print "Your Terminal Emulator does not appear to be iTerm2!" - print "This debug script is intended only for iTerm2 terminals." - exit 1 -fi - -if [[ ! -x "/usr/libexec/PlistBuddy" ]]; then - print "To use this debug script, you need to install XCode!" - exit 2 -fi - -local normalFont -local type -local command -local ambiguousDoubleWidth -local minimumContrast -local useDifferentFont - -# Unfortunately the profile name is not unique, but it seems to be the only -# thing that identifies an active profile. There is the "ID of current session -# of current window" though, but that does not match to a `guid` in the plist. -# So, be warned - collisions may occur! -# See: https://groups.google.com/forum/#!topic/iterm2-discuss/0tO3xZ4Zlwg -local currentProfileName=$(osascript -e 'tell application "iTerm2" to profile name of current session of current window') - -# Warning: Dynamic profiles are not taken into account here! -# https://www.iterm2.com/documentation-dynamic-profiles.html - -# Count `guids` in "New Bookmarks"; they should be unique -local profilesCount=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:" ~/Library/Preferences/com.googlecode.iterm2.plist 2>/dev/null | grep -c "Guid") -for idx in $(seq 0 "${profilesCount}"); do - local profileName=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Name:" ~/Library/Preferences/com.googlecode.iterm2.plist 2>/dev/null) - if [[ "${profileName}" == "${currentProfileName}" ]]; then - # "Normal Font" - normalFont=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Normal\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist) - type=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Terminal\ Type:" ~/Library/Preferences/com.googlecode.iterm2.plist) - command=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Command:" ~/Library/Preferences/com.googlecode.iterm2.plist) - ambiguousDoubleWidth=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Ambiguous\ Double\ Width:" ~/Library/Preferences/com.googlecode.iterm2.plist) - minimumContrast=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Minimum\ Contrast:" ~/Library/Preferences/com.googlecode.iterm2.plist) - - # Font for non-ascii characters - # Only check for a different non-ASCII font, if the user checked - # the "use a different font for non-ascii text" switch. - useDifferentFont=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Use\ Non-ASCII\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist) - if [[ "$useDifferentFont" == "true" ]]; then - nonAsciiFont=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Non\ Ascii\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist) - if [[ "$normalFont" != "$nonAsciiFont" ]]; then - normalFont="$normalFont (normal) / $nonAsciiFont (non-ascii)" - fi - fi - break - fi -done - -print -P "You use %F{blue}iTerm2%f with the following settings:" -print -P " Font: ${normalFont}" -print -P " Terminal-Type: ${type}" -print -P " Command: ${command}" - -############################# -# Analyse possible problems # -############################# -local problemsFound -if [[ "${ambiguousDoubleWidth}" == "true" ]]; then - problemsFound="${problemsFound}\n * Please uncheck 'Treat ambiguous characters as double-width'." -fi -if (( minimumContrast > 0 )); then - problemsFound="${problemsFound}\n * Please set minimum contrast to zero." -fi -if [[ $(echo "${normalFont}" | grep -c -E "Powerline|Awesome|Nerd|Source Code Pro") -eq 0 ]]; then - problemsFound="${problemsFound}\n * It does not seem like you use an Powerline-enabled or Awesome Terminal Font!" -fi - -############################# -# Output problems # -############################# -if [[ -n "${problemsFound}" ]]; then - print -P "\n" - print -P "%F{yellow}Possible Problems found:%f" - print -P "${problemsFound}" -else - print -P "%F{green}No Problems found%f. Yay!" -fi diff --git a/docker/antibody/Dockerfile b/docker/antibody/Dockerfile deleted file mode 100644 index 84a60a89..00000000 --- a/docker/antibody/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -ARG base -FROM p9k:${base} - -COPY docker/antibody/install.zsh /tmp/ -RUN zsh /tmp/install.zsh - -COPY ./ p9k/ -COPY docker/antibody/zshrc .zshrc diff --git a/docker/antibody/install.zsh b/docker/antibody/install.zsh deleted file mode 100644 index 4c54fa68..00000000 --- a/docker/antibody/install.zsh +++ /dev/null @@ -1 +0,0 @@ -curl -sL https://git.io/antibody | bash -s diff --git a/docker/antibody/zshrc b/docker/antibody/zshrc deleted file mode 100644 index d516b679..00000000 --- a/docker/antibody/zshrc +++ /dev/null @@ -1,2 +0,0 @@ -source <(antibody init) -antibody bundle ~/p9k/ diff --git a/docker/antigen/Dockerfile b/docker/antigen/Dockerfile deleted file mode 100644 index d8d0a4bc..00000000 --- a/docker/antigen/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -ARG base -FROM p9k:${base} - -COPY docker/antigen/install.zsh /tmp/ -RUN zsh /tmp/install.zsh - -COPY ./ p9k/ -COPY docker/antigen/zshrc .zshrc diff --git a/docker/antigen/install.zsh b/docker/antigen/install.zsh deleted file mode 100644 index 6bab8ab3..00000000 --- a/docker/antigen/install.zsh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/zsh - -mkdir ~/antigen - -curl \ - -qLsSf \ - -o ~/antigen/antigen.zsh \ - https://git.io/antigen - -source ~/antigen/antigen.zsh - -# EOF diff --git a/docker/antigen/zshrc b/docker/antigen/zshrc deleted file mode 100644 index 0f8d4da4..00000000 --- a/docker/antigen/zshrc +++ /dev/null @@ -1,4 +0,0 @@ -source ~/antigen/antigen.zsh - -antigen theme "${HOME}/p9k" powerlevel9k --no-local-clone -antigen apply diff --git a/docker/base-4.3.11/Dockerfile b/docker/base-4.3.11/Dockerfile deleted file mode 100644 index 805a7ae1..00000000 --- a/docker/base-4.3.11/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -FROM centos:6 - -RUN \ - yum install -y \ - curl \ - git \ - zsh \ - mercurial \ - subversion \ - golang \ - jq \ - node \ - ruby \ - python \ - python-virtualenv \ - sudo - -RUN adduser --shell /bin/zsh --comment 'fred' --user-group fred - -COPY docker/fred-sudoers /etc/sudoers.d/fred - -USER fred -WORKDIR /home/fred -ENV LANG=en_US.UTF-8 -ENV TERM=xterm-256color -ENV DEFAULT_USER=fred -ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true - -RUN touch .zshrc - -CMD ["/bin/zsh", "-l"] diff --git a/docker/base-5.0.3/Dockerfile b/docker/base-5.0.3/Dockerfile deleted file mode 100644 index b1b85fcb..00000000 --- a/docker/base-5.0.3/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM ubuntu:14.04 - -RUN \ - apt-get update && \ - echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y \ - curl \ - git \ - zsh=5.0.2-3ubuntu6.2 \ - mercurial \ - subversion \ - golang \ - jq \ - node \ - ruby \ - python \ - python-virtualenv - -RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred -RUN locale-gen "en_US.UTF-8" - -COPY docker/fred-sudoers /etc/sudoers.d/fred - -USER fred -WORKDIR /home/fred -ENV LANG=en_US.UTF-8 -ENV TERM=xterm-256color -ENV DEFAULT_USER=fred -ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true - -RUN touch .zshrc - -CMD ["/bin/zsh", "-l"] diff --git a/docker/base-5.1.1/Dockerfile b/docker/base-5.1.1/Dockerfile deleted file mode 100644 index c4fb6424..00000000 --- a/docker/base-5.1.1/Dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -FROM ubuntu:16.04 - -RUN \ - apt-get update && \ - echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y \ - curl \ - git \ - zsh=5.1.1-1ubuntu2.2 \ - mercurial \ - subversion \ - golang \ - jq \ - nodejs \ - ruby \ - python \ - python-virtualenv \ - sudo \ - locales - -RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred -RUN locale-gen "en_US.UTF-8" - -COPY docker/fred-sudoers /etc/sudoers.d/fred - -USER fred -WORKDIR /home/fred -ENV LANG=en_US.UTF-8 -ENV TERM=xterm-256color -ENV DEFAULT_USER=fred -ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true - -RUN touch .zshrc - -CMD ["/bin/zsh", "-l"] diff --git a/docker/base-5.2/Dockerfile b/docker/base-5.2/Dockerfile deleted file mode 100644 index 2ec096fc..00000000 --- a/docker/base-5.2/Dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -FROM ubuntu:17.10 - -RUN \ - apt-get update && \ - echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y \ - curl \ - git \ - zsh=5.2-5ubuntu1.2 \ - mercurial \ - subversion \ - golang \ - jq \ - nodejs \ - ruby \ - python \ - python-virtualenv \ - sudo \ - locales - -RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred -RUN locale-gen "en_US.UTF-8" - -COPY docker/fred-sudoers /etc/sudoers.d/fred - -USER fred -WORKDIR /home/fred -ENV LANG=en_US.UTF-8 -ENV TERM=xterm-256color -ENV DEFAULT_USER=fred -ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true - -RUN touch .zshrc - -CMD ["/bin/zsh", "-l"] diff --git a/docker/base-5.3.1/Dockerfile b/docker/base-5.3.1/Dockerfile deleted file mode 100644 index 0294cf25..00000000 --- a/docker/base-5.3.1/Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -FROM debian:stretch - -# We switched here to debian, as there seems no ZSH 5.3 in ubuntu. - -RUN \ - apt-get update && \ - echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y \ - curl \ - git \ - zsh=5.3.1-4+b2 \ - mercurial \ - subversion \ - golang \ - jq \ - nodejs \ - ruby \ - python \ - python-virtualenv \ - sudo \ - locales - -RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred -# Locale generation is different in debian. We need to enable en_US -# locale and then regenerate locales. -RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen -RUN locale-gen "en_US.UTF-8" - -COPY docker/fred-sudoers /etc/sudoers.d/fred - -USER fred -WORKDIR /home/fred -ENV LANG=en_US.UTF-8 -ENV TERM=xterm-256color -ENV DEFAULT_USER=fred -ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true - -RUN touch .zshrc - -CMD ["/bin/zsh", "-l"] diff --git a/docker/base-5.4.2/Dockerfile b/docker/base-5.4.2/Dockerfile deleted file mode 100644 index 8984c105..00000000 --- a/docker/base-5.4.2/Dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -FROM ubuntu:18.04 - -RUN \ - apt-get update && \ - echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y \ - curl \ - git \ - zsh=5.4.2-3ubuntu3 \ - mercurial \ - subversion \ - golang \ - jq \ - nodejs \ - ruby \ - python \ - python-virtualenv \ - sudo \ - locales - -RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred -RUN locale-gen "en_US.UTF-8" - -COPY docker/fred-sudoers /etc/sudoers.d/fred - -USER fred -WORKDIR /home/fred -ENV LANG=en_US.UTF-8 -ENV TERM=xterm-256color -ENV DEFAULT_USER=fred -ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true - -RUN touch .zshrc - -CMD ["/bin/zsh", "-l"] diff --git a/docker/base-5.5.1/Dockerfile b/docker/base-5.5.1/Dockerfile deleted file mode 100644 index 85fc570c..00000000 --- a/docker/base-5.5.1/Dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -FROM ubuntu:18.10 - -RUN \ - apt-get update && \ - echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \ - DEBIAN_FRONTEND=noninteractive apt-get install -y \ - curl \ - git \ - zsh=5.5.1-1ubuntu1 \ - mercurial \ - subversion \ - golang \ - jq \ - nodejs \ - ruby \ - python \ - python-virtualenv \ - sudo \ - locales - -RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred -RUN locale-gen "en_US.UTF-8" - -COPY docker/fred-sudoers /etc/sudoers.d/fred - -USER fred -WORKDIR /home/fred -ENV LANG=en_US.UTF-8 -ENV TERM=xterm-256color -ENV DEFAULT_USER=fred -ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true - -RUN touch .zshrc - -CMD ["/bin/zsh", "-l"] diff --git a/docker/dotfile/Dockerfile b/docker/dotfile/Dockerfile deleted file mode 100644 index f29c4d56..00000000 --- a/docker/dotfile/Dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -ARG base -FROM p9k:${base} - -COPY ./ p9k/ -COPY docker/dotfile/zshrc .zshrc diff --git a/docker/dotfile/zshrc b/docker/dotfile/zshrc deleted file mode 100644 index 382b84a8..00000000 --- a/docker/dotfile/zshrc +++ /dev/null @@ -1 +0,0 @@ -source "${HOME}/p9k/prompt_powerlevel9k_setup" diff --git a/docker/fred-sudoers b/docker/fred-sudoers deleted file mode 100644 index 5fcd646f..00000000 --- a/docker/fred-sudoers +++ /dev/null @@ -1,2 +0,0 @@ -Defaults:fred !requiretty -fred ALL=(ALL) NOPASSWD: ALL diff --git a/docker/omz/Dockerfile b/docker/omz/Dockerfile deleted file mode 100644 index 1a417b9f..00000000 --- a/docker/omz/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -ARG base -FROM p9k:${base} - -COPY docker/omz/install.zsh /tmp/ -RUN zsh /tmp/install.zsh - -COPY docker/omz/zshrc .zshrc -COPY ./ p9k/ diff --git a/docker/omz/install.zsh b/docker/omz/install.zsh deleted file mode 100644 index e2cdfa96..00000000 --- a/docker/omz/install.zsh +++ /dev/null @@ -1,4 +0,0 @@ -sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" - -mkdir -p ~/.oh-my-zsh/custom/themes -ln -nsf ~/p9k/ ~/.oh-my-zsh/custom/themes/powerlevel9k diff --git a/docker/omz/zshrc b/docker/omz/zshrc deleted file mode 100644 index 9e798e2d..00000000 --- a/docker/omz/zshrc +++ /dev/null @@ -1,5 +0,0 @@ -export ZSH=$HOME/.oh-my-zsh -ZSH_THEME="powerlevel9k/powerlevel9k" -plugins=(git rake ruby) - -source $ZSH/oh-my-zsh.sh diff --git a/docker/prezto/Dockerfile b/docker/prezto/Dockerfile deleted file mode 100644 index 70f3b65d..00000000 --- a/docker/prezto/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -ARG base -FROM p9k:${base} - -COPY docker/prezto/install.zsh /tmp/ -RUN zsh /tmp/install.zsh - -COPY ./ p9k/ diff --git a/docker/prezto/install.zsh b/docker/prezto/install.zsh deleted file mode 100644 index 2b2e878c..00000000 --- a/docker/prezto/install.zsh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/zsh - -set -eu - -git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto" - -setopt EXTENDED_GLOB -for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do - ln -nsf "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}" -done - -ln -snf "${HOME}/p9k/powerlevel9k.zsh-theme" \ - "${HOME}/.zprezto/modules/prompt/functions/prompt_powerlevel9k_setup" - -echo "zstyle ':prezto:module:prompt' theme 'powerlevel9k'" \ - >> "${HOME}/.zpreztorc" - -# EOF diff --git a/docker/zgen/Dockerfile b/docker/zgen/Dockerfile deleted file mode 100644 index 48e44c77..00000000 --- a/docker/zgen/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -ARG base -FROM p9k:${base} - -COPY docker/zgen/install.zsh /tmp/ -RUN zsh /tmp/install.zsh - -COPY ./ p9k/ -COPY docker/zgen/zshrc .zshrc diff --git a/docker/zgen/install.zsh b/docker/zgen/install.zsh deleted file mode 100644 index 5cdc6181..00000000 --- a/docker/zgen/install.zsh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/zsh - -git clone https://github.com/tarjoilija/zgen.git "${HOME}/.zgen" - -# EOF diff --git a/docker/zgen/zshrc b/docker/zgen/zshrc deleted file mode 100644 index 1fcb75b9..00000000 --- a/docker/zgen/zshrc +++ /dev/null @@ -1,10 +0,0 @@ -# load zgen -source ~/.zgen/zgen.zsh - -# if the init scipt doesn't exist -if ! zgen saved; then - zgen load ~/p9k/powerlevel9k.zsh-theme - - # generate the init script from plugins above - zgen save -fi diff --git a/docker/zim/Dockerfile b/docker/zim/Dockerfile deleted file mode 100644 index cfe0fc93..00000000 --- a/docker/zim/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -ARG base -FROM p9k:${base} - -COPY docker/zim/install.zsh /tmp/ -RUN zsh /tmp/install.zsh - -COPY ./ p9k/ diff --git a/docker/zim/install.zsh b/docker/zim/install.zsh deleted file mode 100644 index d6c6006a..00000000 --- a/docker/zim/install.zsh +++ /dev/null @@ -1,21 +0,0 @@ -#!zsh - -git clone --recursive https://github.com/Eriner/zim.git "${ZDOTDIR:-${HOME}}/.zim" - -setopt EXTENDED_GLOB -for template_file ( ${ZDOTDIR:-${HOME}}/.zim/templates/* ); do - user_file="${ZDOTDIR:-${HOME}}/.${template_file:t}" - touch ${user_file} - ( print -rn "$(<${template_file})$(<${user_file})" >! ${user_file} ) 2>/dev/null -done - -source "${ZDOTDIR:-${HOME}}/.zlogin" - -ln -nsf \ - ~/p9k/ \ - ~/.zim/modules/prompt/external-themes/powerlevel9k -ln -nsf \ - ~/.zim/modules/prompt/external-themes/powerlevel9k/powerlevel9k.zsh-theme \ - ~/.zim/modules/prompt/functions/prompt_powerlevel9k_setup - -sed -i "s/zprompt_theme='steeef'/zprompt_theme='powerlevel9k'/g" ~/.zimrc diff --git a/docker/zplug/Dockerfile b/docker/zplug/Dockerfile deleted file mode 100644 index 89c23d54..00000000 --- a/docker/zplug/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -ARG base -FROM p9k:${base} - -COPY docker/zplug/install.zsh /tmp/ -RUN zsh /tmp/install.zsh - -COPY ./ p9k/ -COPY docker/zplug/zshrc .zshrc diff --git a/docker/zplug/install.zsh b/docker/zplug/install.zsh deleted file mode 100644 index b01ff6ee..00000000 --- a/docker/zplug/install.zsh +++ /dev/null @@ -1,5 +0,0 @@ -#!zsh - -curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh| zsh - -# git clone https://github.com/zplug/zplug "${HOME}/.zplug" diff --git a/docker/zplug/zshrc b/docker/zplug/zshrc deleted file mode 100644 index 0a4ceb83..00000000 --- a/docker/zplug/zshrc +++ /dev/null @@ -1,5 +0,0 @@ -#!zsh - -source ~/.zplug/init.zsh -zplug "${HOME}/p9k", use:"powerlevel9k.zsh-theme", from:local, as:theme -zplug load --verbose diff --git a/docker/zplugin/Dockerfile b/docker/zplugin/Dockerfile deleted file mode 100644 index 90c35c0e..00000000 --- a/docker/zplugin/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -ARG base -FROM p9k:${base} - -COPY docker/zplugin/install.zsh /tmp/ -RUN zsh /tmp/install.zsh - -COPY ./ p9k/ -COPY docker/zplugin/zshrc.plugins .zshrc.plugins diff --git a/docker/zplugin/install.zsh b/docker/zplugin/install.zsh deleted file mode 100644 index fec4249d..00000000 --- a/docker/zplugin/install.zsh +++ /dev/null @@ -1,12 +0,0 @@ -sh -c "$(curl -fsSL https://raw.githubusercontent.com/psprint/zplugin/master/doc/install.sh)" - -# The 'zplugin snippet' only copies the .zsh-theme file, not everything else. -mkdir -p ~/.zplugin/snippets -ln -nsf \ - ~/p9k/ \ -~/.zplugin/snippets/--SLASH--home--SLASH--fred--SLASH--p9k--SLASH--powerlevel9k--DOT--zsh-theme - -{ - echo - echo "source ~/.zshrc.plugins" -} >> ~/.zshrc diff --git a/docker/zplugin/zshrc.plugins b/docker/zplugin/zshrc.plugins deleted file mode 100644 index 2e9ba7a3..00000000 --- a/docker/zplugin/zshrc.plugins +++ /dev/null @@ -1,5 +0,0 @@ -#!zsh - -zplugin load psprint zsh-navigation-tools -zplugin load psprint---zprompts -zplugin snippet ~/p9k/powerlevel9k.zsh-theme diff --git a/docker/zpm/Dockerfile b/docker/zpm/Dockerfile deleted file mode 100644 index c1c44e38..00000000 --- a/docker/zpm/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -ARG base -FROM p9k:${base} - -COPY docker/zpm/install.zsh /tmp/ -RUN zsh /tmp/install.zsh - -COPY ./ p9k/ -COPY docker/zpm/zshrc .zshrc diff --git a/docker/zpm/install.zsh b/docker/zpm/install.zsh deleted file mode 100644 index 6f74e8e0..00000000 --- a/docker/zpm/install.zsh +++ /dev/null @@ -1,6 +0,0 @@ -# install zpm -git clone --recursive https://github.com/zpm-zsh/zpm.git ~/.zpm - -# Install powerlevel9k -mkdir ~/.zpm/plugins/powerlevel9k -ln -s ~/p9k/powerlevel9k.zsh-theme ~/.zpm/plugins/powerlevel9k/powerlevel9k.plugin.zsh diff --git a/docker/zpm/zshrc b/docker/zpm/zshrc deleted file mode 100644 index b107976e..00000000 --- a/docker/zpm/zshrc +++ /dev/null @@ -1,3 +0,0 @@ -source ~/.zpm/zpm.zsh - -zpm load powerlevel9k diff --git a/docker/zshing/Dockerfile b/docker/zshing/Dockerfile deleted file mode 100644 index a51a3067..00000000 --- a/docker/zshing/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -ARG base -FROM p9k:${base} - -COPY docker/zshing/install.zsh /tmp/ -RUN zsh /tmp/install.zsh - -COPY ./ p9k/ diff --git a/docker/zshing/install.zsh b/docker/zshing/install.zsh deleted file mode 100644 index 8f926992..00000000 --- a/docker/zshing/install.zsh +++ /dev/null @@ -1,16 +0,0 @@ -#!zsh - -# install zshing https://github.com/zakariaGatter/zshing -git clone https://github.com/zakariaGatter/zshing.git ~/.zshing/zshing - -# Link P9K in zshing directory -ln -nsf ~/p9k ~/.zshing/powerlevel9k - -{ - echo - echo 'ZSHING_PLUGINS=( - "bhilburn/powerlevel9k" - )' - echo - echo "source ~/.zshing/zshing/zshing.zsh" -} >> ~/.zshrc diff --git a/docker/zulu/Dockerfile b/docker/zulu/Dockerfile deleted file mode 100644 index 880a07d0..00000000 --- a/docker/zulu/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -ARG base -FROM p9k:${base} - -COPY docker/zulu/install.zsh /tmp/ -RUN zsh /tmp/install.zsh - -COPY ./ p9k/ diff --git a/docker/zulu/install.zsh b/docker/zulu/install.zsh deleted file mode 100644 index 0ad6aae3..00000000 --- a/docker/zulu/install.zsh +++ /dev/null @@ -1,10 +0,0 @@ -#!zsh - -# install zulu https://github.com/zulu-zsh/zulu -curl -L https://git.io/zulu-install | zsh && zsh - -{ -echo 'zulu fpath add ~/p9k' -echo 'zulu fpath add ~/p9k/functions' -echo 'zulu theme powerlevel9k' -} >> ~/.zshrc diff --git a/gitstatus/LICENSE b/gitstatus/LICENSE new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/gitstatus/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + 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 of the License, 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 this program. If not, see <https://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<https://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<https://www.gnu.org/licenses/why-not-lgpl.html>. diff --git a/gitstatus/README.md b/gitstatus/README.md new file mode 100644 index 00000000..2196d30f --- /dev/null +++ b/gitstatus/README.md @@ -0,0 +1,2 @@ +This is a bundled copy of [gitstatus](https://github.com/romkatv/gitstatus) ZSH plugin. + diff --git a/gitstatus/bin/gitstatusd-darwin-x86_64 b/gitstatus/bin/gitstatusd-darwin-x86_64 Binary files differnew file mode 100755 index 00000000..55a30723 --- /dev/null +++ b/gitstatus/bin/gitstatusd-darwin-x86_64 diff --git a/gitstatus/bin/gitstatusd-freebsd-amd64 b/gitstatus/bin/gitstatusd-freebsd-amd64 Binary files differnew file mode 100755 index 00000000..6e4483f6 --- /dev/null +++ b/gitstatus/bin/gitstatusd-freebsd-amd64 diff --git a/gitstatus/bin/gitstatusd-freebsd-x86_64 b/gitstatus/bin/gitstatusd-freebsd-x86_64 new file mode 120000 index 00000000..ce481223 --- /dev/null +++ b/gitstatus/bin/gitstatusd-freebsd-x86_64 @@ -0,0 +1 @@ +gitstatusd-freebsd-amd64
\ No newline at end of file diff --git a/gitstatus/bin/gitstatusd-linux-armv6l b/gitstatus/bin/gitstatusd-linux-armv6l new file mode 120000 index 00000000..1990676d --- /dev/null +++ b/gitstatus/bin/gitstatusd-linux-armv6l @@ -0,0 +1 @@ +gitstatusd-linux-armv7l
\ No newline at end of file diff --git a/gitstatus/bin/gitstatusd-linux-armv7l b/gitstatus/bin/gitstatusd-linux-armv7l Binary files differnew file mode 100755 index 00000000..6cac661d --- /dev/null +++ b/gitstatus/bin/gitstatusd-linux-armv7l diff --git a/gitstatus/bin/gitstatusd-linux-x86_64 b/gitstatus/bin/gitstatusd-linux-x86_64 Binary files differnew file mode 100755 index 00000000..a107c9d4 --- /dev/null +++ b/gitstatus/bin/gitstatusd-linux-x86_64 diff --git a/gitstatus/gitstatus.plugin.zsh b/gitstatus/gitstatus.plugin.zsh new file mode 100644 index 00000000..b55aa1d6 --- /dev/null +++ b/gitstatus/gitstatus.plugin.zsh @@ -0,0 +1,265 @@ +[[ -o interactive ]] || return + +zmodload zsh/datetime || return + +# Retrives status of a git repo from a directory under its working tree. +# +# -d STR Directory to query. Defaults to $PWD. Must be absolute. +# -c STR Callback function to call once the results are available. Called only after +# gitstatus_query returns 0 with VCS_STATUS_RESULT=tout. +# -t FLOAT Timeout in seconds. Will block for at most this long. If no results are +# available by then: if -c isn't specified, will return 1; otherwise will set +# VCS_STATUS_RESULT=tout and return 0. +# +# On success sets VCS_STATUS_RESULT to one of the following values: +# +# tout Timed out waiting for data; will call the user-specified callback later. +# norepo-sync The directory isn't a git repo. +# ok-sync The directory is a git repo. +# +# When the callback is called VCS_STATUS_RESULT s set to one of the following values: +# +# norepo-async The directory isn't a git repo. +# ok-async The directory is a git repo. +# +# If VCS_STATUS_RESULT is ok-sync or ok-async, additional variables are set: +# +# VCS_STATUS_LOCAL_BRANCH Local branch name. Not empty. +# VCS_STATUS_REMOTE_BRANCH Upstream branch name. Can be empty. +# VCS_STATUS_REMOTE_URL Remote URL. Can be empty. +# VCS_STATUS_ACTION Repository state, A.K.A. action. Can be empty. +# VCS_STATUS_HAS_STAGED 1 if there are staged changes, 0 otherwise. +# VCS_STATUS_HAS_UNSTAGED 1 if there are unstaged changes, 0 if there aren't, -1 if unknown. +# VCS_STATUS_HAS_UNTRACKED 1 if there are untracked files, 0 if there aren't, -1 if unknown. +# VCS_STATUS_COMMITS_AHEAD Number of commits the current branch is ahead of upstream. +# Non-negative integer. +# VCS_STATUS_COMMITS_BEHIND Number of commits the current branch is behind upstream. Non-negative +# integer. +# VCS_STATUS_STASHES Number of stashes. Non-negative integer. +# VCS_STATUS_WORKDIR Git repo working directory. Not empty. +# VCS_STATUS_ALL All of the above in an array. The order of elements is unspecified. +# More elements can be added in the future. +# +# The point of reporting -1 as unstaged and untracked is to allow the command to skip scanning +# files in large repos. See -m flag of gitstatus_start. +# +# !!!!! WARNING: CONCURRENT CALLS WITH THE SAME NAME ARE NOT ALLOWED !!!!! +# +# It's illegal to call `gitstatus_query NAME` if `gitstatus_query NAME` is running concurrently in +# the same interactive shell or its child, or if the callback for the last timed out request hasn't +# fired yet. If you need to issue concurrent requests, use different NAME arguments. +function gitstatus_query() { + emulate -L zsh + setopt err_return no_unset + + local opt + local dir=$PWD + local callback='' + local -F timeout=-1 + while true; do + getopts "d:c:t:" opt || break + case $opt in + d) dir=$OPTARG;; + c) callback=$OPTARG;; + t) timeout=$OPTARG;; + ?) return 1;; + done) break;; + esac + done + (( OPTIND == ARGC )) || { echo "usage: gitstatus_query [OPTION]... NAME" >&2; return 1 } + local name=${*[$OPTIND]} + + [[ -v GITSTATUS_DAEMON_PID_${name} ]] + + local -i req_fd + local req_fd_var=_GITSTATUS_REQ_FD_${name} + local client_pid_var=_GITSTATUS_CLIENT_PID_${name} + + [[ ${(P)client_pid_var} == $$ ]] && { + req_fd=${(P)req_fd_var} + } || { + local req_fifo_var=_GITSTATUS_REQ_FIFO_${name} + local resp_fifo_var=_GITSTATUS_RESP_FIFO_${name} + local resp_fd_var=_GITSTATUS_RESP_FD_${name} + local -i resp_fd + exec {req_fd}<>${(P)req_fifo_var} + exec {resp_fd}<>${(P)resp_fifo_var} + typeset -g $client_pid_var=$$ + typeset -g $req_fd_var=$req_fd + typeset -g $resp_fd_var=$resp_fd + typeset -giH $client_pid_var=$client_pid + typeset -gfH _gitstatus_process_response_${name}() { + _gitstatus_process_response ${0#_gitstatus_process_response_} 0 '' + } + zle -F $resp_fd _gitstatus_process_response_${name} + } + + local -r req_id="$EPOCHREALTIME" + echo -nE "${req_id} ${callback}"$'\x1f'"${dir}"$'\x1e' >&$req_fd + + while true; do + _gitstatus_process_response $name $timeout $req_id + [[ $VCS_STATUS_RESULT == *-async ]] || break + done + + [[ $VCS_STATUS_RESULT != tout || -n $callback ]] +} + +typeset -fH _gitstatus_process_response() { + emulate -L zsh + setopt err_return no_unset + + local name=$1 + local -F timeout=$2 + local req_id=$3 + local resp_fd_var=_GITSTATUS_RESP_FD_${name} + + typeset -ga VCS_STATUS_ALL + typeset -g VCS_STATUS_RESULT + (( timeout >= 0 )) && local -a t=(-t $timeout) || local -a t=() + IFS=$'\x1f' read -rd $'\x1e' -u ${(P)resp_fd_var} $t -A VCS_STATUS_ALL || { + VCS_STATUS_RESULT=tout + unset VCS_STATUS_ALL + return + } + + local -a header=("${(@Q)${(z)VCS_STATUS_ALL[1]}}") + [[ ${header[1]} == $req_id ]] && local -i ours=1 || local -i ours=0 + shift header + [[ ${VCS_STATUS_ALL[2]} == 1 ]] && { + shift 2 VCS_STATUS_ALL + (( ours )) && VCS_STATUS_RESULT=ok-sync || VCS_STATUS_RESULT=ok-async + typeset -g VCS_STATUS_LOCAL_BRANCH="${VCS_STATUS_ALL[1]}" + typeset -g VCS_STATUS_REMOTE_BRANCH="${VCS_STATUS_ALL[2]}" + typeset -g VCS_STATUS_REMOTE_URL="${VCS_STATUS_ALL[3]}" + typeset -g VCS_STATUS_ACTION="${VCS_STATUS_ALL[4]}" + typeset -gi VCS_STATUS_HAS_STAGED="${VCS_STATUS_ALL[5]}" + typeset -gi VCS_STATUS_HAS_UNSTAGED="${VCS_STATUS_ALL[6]}" + typeset -gi VCS_STATUS_HAS_UNTRACKED="${VCS_STATUS_ALL[7]}" + typeset -gi VCS_STATUS_COMMITS_AHEAD="${VCS_STATUS_ALL[8]}" + typeset -gi VCS_STATUS_COMMITS_BEHIND="${VCS_STATUS_ALL[9]}" + typeset -gi VCS_STATUS_STASHES="${VCS_STATUS_ALL[10]}" + typeset -g VCS_STATUS_WORKDIR="${VCS_STATUS_ALL[11]}" + } || { + (( ours )) && VCS_STATUS_RESULT=norepo-sync || VCS_STATUS_RESULT=norepo-async + unset VCS_STATUS_ALL + unset VCS_STATUS_LOCAL_BRANCH + unset VCS_STATUS_REMOTE_BRANCH + unset VCS_STATUS_REMOTE_URL + unset VCS_STATUS_ACTION + unset VCS_STATUS_HAS_STAGED + unset VCS_STATUS_HAS_UNSTAGED + unset VCS_STATUS_HAS_UNTRACKED + unset VCS_STATUS_COMMITS_AHEAD + unset VCS_STATUS_COMMITS_BEHIND + unset VCS_STATUS_STASHES + unset VCS_STATUS_WORKDIR + } + + (( ! ours )) && (( #header )) && emulate -L zsh && "${header[@]}" || true +} + +# Usage: gitstatus_start [OPTION]... NAME +# +# -t FLOAT Fail the self-check on initialization if not getting a response from gitstatusd for +# this this many seconds. Defaults to 5. +# -m INT Report -1 unstaged and untracked if there are more than this many files in the index. +# Negative value means infinity. Defaults to -1. +function gitstatus_start() { + emulate -L zsh + setopt err_return no_unset + unsetopt bg_nice + + local opt + local -F timeout=5 + local -i max_dirty=-1 + while true; do + getopts "t:m:" opt || break + case $opt in + t) timeout=$OPTARG;; + m) max_dirty=$OPTARG;; + ?) return 1;; + done) break;; + esac + done + + (( timeout > 0 )) || { echo "invalid -t: $timeout" >&2; return 1 } + (( OPTIND == ARGC )) || { echo "usage: gitstatus_start [OPTION]... NAME" >&2; return 1 } + local name=${*[$OPTIND]} + + [[ ! -v GITSTATUS_DAEMON_PID_${name} ]] || return 0 + + local os && os=$(uname -s) && [[ -n $os ]] + local arch && arch=$(uname -m) && [[ -n $arch ]] + + local daemon && daemon=${GITSTATUS_DAEMON:-${${(%):-%x}:A:h}/bin/gitstatusd-${os:l}-${arch:l}} + [[ -f $daemon ]] || { echo "file not found: $daemon" >&2 && return 1 } + + local req_fifo resp_fifo log + local -i req_fd resp_fd daemon_pid + + function start() { + req_fifo=$(mktemp -u "${TMPDIR:-/tmp}"/gitstatus.$$.pipe.req.XXXXXXXXXX) + resp_fifo=$(mktemp -u "${TMPDIR:-/tmp}"/gitstatus.$$.pipe.resp.XXXXXXXXXX) + mkfifo $req_fifo + mkfifo $resp_fifo + exec {req_fd}<>$req_fifo + exec {resp_fd}<>$resp_fifo + typeset -gfH _gitstatus_process_response_${name}() { + _gitstatus_process_response ${0#_gitstatus_process_response_} 0 '' + } + zle -F $resp_fd _gitstatus_process_response_${name} + + [[ ${GITSTATUS_ENABLE_LOGGING:-0} == 1 ]] && + log=$(mktemp "${TMPDIR:-/tmp}"/gitstatus.$$.log.XXXXXXXXXX) || + log=/dev/null + + local -i threads=${GITSTATUS_NUM_THREADS:-0} + (( threads > 0)) || { + case $os in + FreeBSD) threads=$(sysctl -n hw.ncpu);; + *) threads=$(getconf _NPROCESSORS_ONLN);; + esac + } + + # We use `zsh -c` instead of plain {} or () to work around bugs in zplug. It hangs on startup. + zsh -c " + ${(q)daemon} --parent-pid=$$ --dirty-max-index-size=${(q)max_dirty} --num-threads=$threads + echo -nE $'bye\x1f0\x1e' + rm -f ${(q)req_fifo} ${(q)resp_fifo} + " <&$req_fd >&$resp_fd 2>$log &! + + daemon_pid=$! + + local reply + echo -nE $'hello\x1f\x1e' >&$req_fd + IFS='' read -r -d $'\x1e' -u $resp_fd -t $timeout reply + [[ $reply == $'hello\x1f0' ]] + } + + start && { + typeset -g GITSTATUS_DAEMON_LOG_${name}=$log + typeset -gi GITSTATUS_DAEMON_PID_${name}=$daemon_pid + typeset -gH _GITSTATUS_REQ_FIFO_${name}=$req_fifo + typeset -gH _GITSTATUS_RESP_FIFO_${name}=$resp_fifo + typeset -giH _GITSTATUS_REQ_FD_${name}=$req_fd + typeset -giH _GITSTATUS_RESP_FD_${name}=$resp_fd + typeset -giH _GITSTATUS_CLIENT_PID_${name}=$$ + } || { + echo "gitstatus failed to initialize" >&2 + [[ -n $daemon_pid ]] && kill $daemon_pid &>/dev/null || true + [[ -n $req_fd ]] && exec {req_fd}>&- || true + [[ -n $resp_fd ]] && { zle -F $resp_fd || true } && { exec {resp_fd}>&- || true} + rm -f $req_fifo $resp_fifo + return 1 + } +} + +# Usage: gitstatus_check NAME. +# +# Returns 0 if and only if `gitstatus_start NAME` has succeeded previously. +# If it returns non-zero, gitstatus_query NAME is guaranteed to return non-zero. +function gitstatus_check() { + local name=$1 + [[ -v GITSTATUS_DAEMON_PID_${name} ]] +} diff --git a/gitstatus/pull-upstream.zsh b/gitstatus/pull-upstream.zsh new file mode 100755 index 00000000..2cb758a5 --- /dev/null +++ b/gitstatus/pull-upstream.zsh @@ -0,0 +1,30 @@ +#!/usr/bin/zsh + +emulate -L zsh +setopt err_exit no_unset pipe_fail extended_glob xtrace + +: ${GITSTATUS_DIR:=${${(%):-%x}:A:h}} +: ${GITSTATUS_URL:=https://github.com/romkatv/gitstatus.git} + +readonly GITSTATUS_DIR GITSTATUS_URL +readonly -a IGNORE=(pull-upstream.zsh README.md) + +function pull() { + local repo && repo=$(mktemp -d ${TMPDIR:-/tmp}/gitstatus-pull-upstream.XXXXXXXXXX) + trap "rm -rf ${(q)repo}" EXIT + git clone $GITSTATUS_URL $repo + + local dst + for dst in $GITSTATUS_DIR/**/*(.,@); do + local f=${dst#$GITSTATUS_DIR/} + (( ! ${IGNORE[(I)$f]} )) || continue + local src=$repo/$f + [[ -f $src ]] && { + mkdir -p ${dst:h} && cp -f $src $dst || return + } || { + rm $dst + } + done +} + +pull diff --git a/powerlevel10k.zsh-theme b/powerlevel10k.zsh-theme new file mode 120000 index 00000000..311575f4 --- /dev/null +++ b/powerlevel10k.zsh-theme @@ -0,0 +1 @@ +powerlevel9k.zsh-theme
\ No newline at end of file diff --git a/powerlevel9k.zsh-theme b/powerlevel9k.zsh-theme index 4939cb35..c022984f 100755 --- a/powerlevel9k.zsh-theme +++ b/powerlevel9k.zsh-theme @@ -1,19 +1,18 @@ # vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 ################################################################ -# powerlevel9k Theme +# powerlevel10k Theme +# https://github.com/romkatv/powerlevel10k +# +# Forked from powerlevel9k Theme # https://github.com/bhilburn/powerlevel9k # -# This theme was inspired by agnoster's Theme: +# Which was inspired by agnoster's Theme: # https://gist.github.com/3712874 ################################################################ ################################################################ -# For basic documentation, please refer to the README.md in the top-level -# directory. For more detailed documentation, refer to the project wiki, hosted -# on Github: https://github.com/bhilburn/powerlevel9k/wiki -# -# There are a lot of easy ways you can customize your prompt segments and -# theming with simple variables defined in your `~/.zshrc`. +# For basic documentation, please refer to the README.md in the +# top-level directory. ################################################################ ## Turn on for Debugging @@ -66,9 +65,16 @@ source "${p9k_directory}/functions/colors.zsh" source "${p9k_directory}/functions/vcs.zsh" +if [[ $POWERLEVEL9K_DISABLE_GITSTATUS != true ]]; then + source ${POWERLEVEL9K_GITSTATUS_DIR:-${p9k_directory}/gitstatus}/gitstatus.plugin.zsh +fi + # cleanup temporary variables. unset p9k_directory +[[ -v POWERLEVEL9K_LEFT_PROMPT_ELEMENTS ]] || POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context dir vcs) +[[ -v POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS ]] || POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status root_indicator background_jobs history time) + ################################################################ # Color Scheme ################################################################ @@ -93,10 +99,100 @@ fi # this naming convention. ################################################################ -# The `CURRENT_BG` variable is used to remember what the last BG color used was -# when building the left-hand prompt. Because the RPROMPT is created from -# right-left but reads the opposite, this isn't necessary for the other side. -CURRENT_BG='NONE' +# Specifies the maximum number of elements in the cache. When the cache grows over this limit, +# it gets cleared. This is meant to avoid memory leaks when a rogue prompt is filling the cache +# with data. +[ -v POWERLEVEL9K_MAX_CACHE_SIZE ] || typeset -gi POWERLEVEL9K_MAX_CACHE_SIZE=10000 + +typeset -gH _P9K_RETVAL +typeset -gH _P9K_CACHE_KEY +typeset -gaH _P9K_CACHE_VAL +typeset -gAH _P9K_CACHE=() + +# Note: Several performance-critical functions return results to the caller via global +# variabls rather than stdout. This is faster. + +# Caching allows storing array-to-array associations. It should be used like this: +# +# if ! _p9k_cache_get "$key1" "$key2"; then +# # Compute val1 and val2 and then store them in the cache. +# _p9k_cache_set "$val1" "$val2" +# fi +# # Here ${_P9K_CACHE_VAL[1]} and ${_P9K_CACHE_VAL[2]} are $val1 and $val2 respectively. +# +# Limitations: +# +# * Calling _p9k_cache_set without arguments clears the cache entry. Subsequent calls to +# _p9k_cache_get for the same key will return an error. +# * There must be no intervening _p9k_cache_get calls between the associated _p9k_cache_get +# and _p9k_cache_set. +_p9k_cache_set() { + # Uncomment to see cache misses. + # echo "caching: ${(@0q)_P9K_CACHE_KEY} => (${(q)@})" >&2 + _P9K_CACHE[$_P9K_CACHE_KEY]="${(pj:\0:)*}" + _P9K_CACHE_VAL=("$@") + (( #_P9K_CACHE < POWERLEVEL9K_MAX_CACHE_SIZE )) || typeset -gAH _P9K_CACHE=() +} + +_p9k_cache_get() { + _P9K_CACHE_KEY="${(pj:\0:)*}" + _P9K_CACHE_VAL=("${(@0)${_P9K_CACHE[$_P9K_CACHE_KEY]}}") + (( #_P9K_CACHE_VAL )) +} + +# Sets _P9K_RETVAL to the icon whose name is supplied via $1. +_p9k_get_icon() { + local var_name=POWERLEVEL9K_$1 + _P9K_RETVAL=${(g::)${${(P)var_name}-$icons[$1]}} +} + +typeset -gaH _P9K_LEFT_JOIN=(1) +() { + local i + for ((i = 2; i <= $#POWERLEVEL9K_LEFT_PROMPT_ELEMENTS; ++i)); do + local elem=$POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[$i] + if [[ ${elem[-7,-1]} == '_joined' ]]; then + _P9K_LEFT_JOIN+=$_P9K_LEFT_JOIN[((i-1))] + else + _P9K_LEFT_JOIN+=$i + fi + done + + typeset -gaH _P9K_RIGHT_JOIN=(1) + for ((i = 2; i <= $#POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS; ++i)); do + local elem=$POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[$i] + if [[ ${elem[-7,-1]} == '_joined' ]]; then + _P9K_RIGHT_JOIN+=$_P9K_RIGHT_JOIN[((i-1))] + else + _P9K_RIGHT_JOIN+=$i + fi + done +} + +_p9k_should_join_left() [[ $_P9K_LAST_SEGMENT_INDEX -ge ${_P9K_LEFT_JOIN[$1]:-$1} ]] +_p9k_should_join_right() [[ $_P9K_LAST_SEGMENT_INDEX -ge ${_P9K_RIGHT_JOIN[$1]:-$1} ]] + +# Resolves a color to its numerical value, or an empty string. Communicates the result back +# by setting _P9K_RETVAL. +_p9k_color() { + local user_var=POWERLEVEL9K_${(U)${2}#prompt_}_${3} + local color=${${(P)user_var}:-${1}} + # Check if given value is already numerical. + if [[ $color == <-> ]]; then + _P9K_RETVAL=${(l:3::0:)color} + else + # Strip prifices if there are any. + _P9K_RETVAL=$__P9K_COLORS[${${${color#bg-}#fg-}#br}] + fi +} + +_p9k_background() { + [[ -n $1 ]] && _P9K_RETVAL="%K{$1}" || _P9K_RETVAL="%k" +} + +_p9k_foreground() { + [[ -n $1 ]] && _P9K_RETVAL="%F{$1}" || _P9K_RETVAL="%f" +} # Begin a left prompt segment # Takes four arguments: @@ -108,97 +204,83 @@ CURRENT_BG='NONE' # * $5: The segment content # * $6: An identifying icon (must be a key of the icons array) # The latter three can be omitted, -set_default last_left_element_index 1 set_default POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS " " left_prompt_segment() { - local segment_name="${1}" - local current_index=$2 - # Check if the segment should be joined with the previous one - local joined - segmentShouldBeJoined $current_index $last_left_element_index "$POWERLEVEL9K_LEFT_PROMPT_ELEMENTS" && joined=true || joined=false - - # Colors - local backgroundColor="${3}" - local foregroundColor="${4}" - - # Overwrite given background-color by user defined variable for this segment. - local BACKGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)${segment_name}#prompt_}_BACKGROUND - local BG_COLOR_MODIFIER=${(P)BACKGROUND_USER_VARIABLE} - [[ -n $BG_COLOR_MODIFIER ]] && backgroundColor="$BG_COLOR_MODIFIER" - - # Overwrite given foreground-color by user defined variable for this segment. - local FOREGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)${segment_name}#prompt_}_FOREGROUND - local FG_COLOR_MODIFIER=${(P)FOREGROUND_USER_VARIABLE} - [[ -n $FG_COLOR_MODIFIER ]] && foregroundColor="$FG_COLOR_MODIFIER" - - # Get color codes here to save some calls later on - backgroundColor="$(getColorCode ${backgroundColor})" - foregroundColor="$(getColorCode ${foregroundColor})" - - local background foreground - [[ -n "${backgroundColor}" ]] && background="$(backgroundColor ${backgroundColor})" || background="%k" - [[ -n "${foregroundColor}" ]] && foreground="$(foregroundColor ${foregroundColor})" || foreground="%f" - - if [[ $CURRENT_BG != 'NONE' ]] && ! isSameColor "${backgroundColor}" "$CURRENT_BG"; then - echo -n "${background}%F{$CURRENT_BG}" - if [[ $joined == false ]]; then - # Middle segment - echo -n "$(print_icon 'LEFT_SEGMENT_SEPARATOR')$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS" - fi - elif isSameColor "$CURRENT_BG" "${backgroundColor}"; then - # Middle segment with same color as previous segment - # We take the current foreground color as color for our - # subsegment (or the default color). This should have - # enough contrast. - local complement - [[ -n "${foregroundColor}" ]] && complement="${foreground}" || complement="$(foregroundColor $DEFAULT_COLOR)" - echo -n "${background}${complement}" - if [[ $joined == false ]]; then - echo -n "$(print_icon 'LEFT_SUBSEGMENT_SEPARATOR')$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS" + _p9k_should_join_left $2 && local join=true || local join=false + if ! _p9k_cache_get "$0" "$1" "$3" "$4" "${5:+1}" "$6" "$_P9K_CURRENT_BG" "$join"; then + _p9k_color $3 $1 BACKGROUND + local background_color=$_P9K_RETVAL + + _p9k_color $4 $1 FOREGROUND + local foreground_color=$_P9K_RETVAL + _p9k_foreground $foreground_color + local foreground=$_P9K_RETVAL + + _p9k_background $background_color + local output=$_P9K_RETVAL + + if [[ $_P9K_CURRENT_BG == NONE ]]; then + # The first segment on the line. + output+=$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS + elif [[ $join == false ]]; then + if [[ $background_color == $_P9K_CURRENT_BG ]]; then + # Middle segment with same color as previous segment + # We take the current foreground color as color for our + # subsegment (or the default color). This should have + # enough contrast. + if [[ $foreground == "%f" ]]; then + _p9k_foreground $DEFAULT_COLOR + output+=$_P9K_RETVAL + else + output+=$foreground + fi + _p9k_get_icon LEFT_SUBSEGMENT_SEPARATOR + output+="${_P9K_RETVAL}${POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS}" + else + output+="%F{$_P9K_CURRENT_BG}" + _p9k_get_icon LEFT_SEGMENT_SEPARATOR + output+="${_P9K_RETVAL}${POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS}" + fi fi - else - # First segment - echo -n "${background}$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS" - fi - - local visual_identifier - if [[ -n $6 ]]; then - visual_identifier="$(print_icon $6)" - if [[ -n "$visual_identifier" ]]; then - # Add an whitespace if we print more than just the visual identifier. - # To avoid cutting off the visual identifier in some terminal emulators (e.g., Konsole, st), - # we need to color both the visual identifier and the whitespace. - [[ -n "$5" ]] && visual_identifier="$visual_identifier " - # Allow users to overwrite the color for the visual identifier only. - local visual_identifier_color_variable=POWERLEVEL9K_${(U)${segment_name}#prompt_}_VISUAL_IDENTIFIER_COLOR - set_default $visual_identifier_color_variable "${foregroundColor}" - visual_identifier="$(foregroundColor ${(P)visual_identifier_color_variable})${visual_identifier}" + if [[ -n $6 ]]; then + _p9k_get_icon $6 + if [[ -n $_P9K_RETVAL ]]; then + local icon=$_P9K_RETVAL + _p9k_color $foreground_color $1 VISUAL_IDENTIFIER_COLOR + _p9k_foreground $_P9K_RETVAL + + # Add an whitespace if we print more than just the visual identifier. + # To avoid cutting off the visual identifier in some terminal emulators (e.g., Konsole, st), + # we need to color both the visual identifier and the whitespace. + output+="${_P9K_RETVAL}${icon}${5:+ }" + fi fi + output+=$foreground + _p9k_cache_set "$output" "$background_color" fi - # Print the visual identifier - echo -n "${visual_identifier}" - # Print the content of the segment, if there is any - [[ -n "$5" ]] && echo -n "${foreground}${5}" - echo -n "${POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS}" - - CURRENT_BG="${backgroundColor}" - last_left_element_index=$current_index + _P9K_PROMPT+="${_P9K_CACHE_VAL[1]}${5}${POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS}" + _P9K_LAST_SEGMENT_INDEX=$2 + _P9K_CURRENT_BG=$_P9K_CACHE_VAL[2] } # End the left prompt, closes the final segment. left_prompt_end() { - if [[ -n $CURRENT_BG ]]; then - echo -n "%k$(foregroundColor ${CURRENT_BG})$(print_icon 'LEFT_SEGMENT_SEPARATOR')" - else - echo -n "%k" + if ! _p9k_cache_get "$0" "$_P9K_CURRENT_BG"; then + local output="%k" + if [[ $_P9K_CURRENT_BG != NONE ]]; then + _p9k_foreground $_P9K_CURRENT_BG + output+=$_P9K_RETVAL + _p9k_get_icon LEFT_SEGMENT_SEPARATOR + output+="${_P9K_RETVAL}" + fi + _p9k_get_icon LEFT_SEGMENT_END_SEPARATOR + output+="%f${_P9K_RETVAL}" + _p9k_cache_set "$output" fi - echo -n "%f$(print_icon 'LEFT_SEGMENT_END_SEPARATOR')" - CURRENT_BG='' + _P9K_PROMPT+="${_P9K_CACHE_VAL[1]}" } -CURRENT_RIGHT_BG='NONE' - # Begin a right prompt segment # Takes four arguments: # * $1: Name of the function that was originally invoked (mandatory). @@ -209,87 +291,68 @@ CURRENT_RIGHT_BG='NONE' # * $5: The segment content # * $6: An identifying icon (must be a key of the icons array) # No ending for the right prompt segment is needed (unlike the left prompt, above). -set_default last_right_element_index 1 set_default POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS " " right_prompt_segment() { - local segment_name="${1}" - local current_index=$2 - - # Check if the segment should be joined with the previous one - local joined - segmentShouldBeJoined $current_index $last_right_element_index "$POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS" && joined=true || joined=false - - # Colors - local backgroundColor="${3}" - local foregroundColor="${4}" - - # Overwrite given background-color by user defined variable for this segment. - local BACKGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)${segment_name}#prompt_}_BACKGROUND - local BG_COLOR_MODIFIER=${(P)BACKGROUND_USER_VARIABLE} - [[ -n $BG_COLOR_MODIFIER ]] && backgroundColor="$BG_COLOR_MODIFIER" - - # Overwrite given foreground-color by user defined variable for this segment. - local FOREGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)${segment_name}#prompt_}_FOREGROUND - local FG_COLOR_MODIFIER=${(P)FOREGROUND_USER_VARIABLE} - [[ -n $FG_COLOR_MODIFIER ]] && foregroundColor="$FG_COLOR_MODIFIER" - - # Get color codes here to save some calls later on - backgroundColor="$(getColorCode ${backgroundColor})" - foregroundColor="$(getColorCode ${foregroundColor})" - - local background foreground - [[ -n "${backgroundColor}" ]] && background="$(backgroundColor ${backgroundColor})" || background="%k" - [[ -n "${foregroundColor}" ]] && foreground="$(foregroundColor ${foregroundColor})" || foreground="%f" - - # If CURRENT_RIGHT_BG is "NONE", we are the first right segment. - - if [[ "$CURRENT_RIGHT_BG" != "NONE" ]]; then - # This is the closing whitespace for the previous segment - echo -n "${POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS}%f" - fi - - if [[ $joined == false ]] || [[ "$CURRENT_RIGHT_BG" == "NONE" ]]; then - if isSameColor "$CURRENT_RIGHT_BG" "${backgroundColor}"; then - # Middle segment with same color as previous segment - # We take the current foreground color as color for our - # subsegment (or the default color). This should have - # enough contrast. - local complement - [[ -n "${foregroundColor}" ]] && complement="${foreground}" || complement="$(foregroundColor $DEFAULT_COLOR)" - echo -n "$complement$(print_icon 'RIGHT_SUBSEGMENT_SEPARATOR')%f" + _p9k_should_join_right $2 && local join=true || local join=false + if ! _p9k_cache_get "$0" "$1" "$3" "$4" "$6" "$_P9K_CURRENT_BG" "$join"; then + _p9k_color $3 $1 BACKGROUND + local background_color=$_P9K_RETVAL + _p9k_background $background_color + local background=$_P9K_RETVAL + + _p9k_color $4 $1 FOREGROUND + local foreground_color=$_P9K_RETVAL + _p9k_foreground $foreground_color + local foreground=$_P9K_RETVAL + + local output='' + + if [[ $_P9K_CURRENT_BG == NONE || $join == false ]]; then + if [[ $background_color == $_P9K_CURRENT_BG ]]; then + # Middle segment with same color as previous segment + # We take the current foreground color as color for our + # subsegment (or the default color). This should have + # enough contrast. + if [[ $foreground == "%f" ]]; then + _p9k_foreground $DEFAULT_COLOR + output+=$_P9K_RETVAL + else + output+=$foreground + fi + _p9k_get_icon RIGHT_SUBSEGMENT_SEPARATOR + output+=$_P9K_RETVAL + else + output+="%F{$background_color}" + _p9k_get_icon RIGHT_SEGMENT_SEPARATOR + output+=$_P9K_RETVAL + fi + output+="${background}${POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS}" else - # Use the new Background Color as the foreground of the segment separator - echo -n "$(foregroundColor ${backgroundColor})$(print_icon 'RIGHT_SEGMENT_SEPARATOR')%f" + output+=$background fi - fi - local visual_identifier - if [[ -n "$6" ]]; then - visual_identifier="$(print_icon $6)" - if [[ -n "$visual_identifier" ]]; then - # Add an whitespace if we print more than just the visual identifier. - # To avoid cutting off the visual identifier in some terminal emulators (e.g., Konsole, st), - # we need to color both the visual identifier and the whitespace. - [[ -n "$5" ]] && visual_identifier=" $visual_identifier" - # Allow users to overwrite the color for the visual identifier only. - local visual_identifier_color_variable=POWERLEVEL9K_${(U)${segment_name}#prompt_}_VISUAL_IDENTIFIER_COLOR - set_default $visual_identifier_color_variable "${foregroundColor}" - visual_identifier="$(foregroundColor ${(P)visual_identifier_color_variable})${visual_identifier}" + output+=$foreground + + local icon='' + if [[ -n $6 ]]; then + _p9k_get_icon $6 + if [[ -n $_P9K_RETVAL ]]; then + local icon=$_P9K_RETVAL + _p9k_color $foreground_color $1 VISUAL_IDENTIFIER_COLOR + _p9k_foreground $_P9K_RETVAL + # Add an whitespace if we print more than just the visual identifier. + # To avoid cutting off the visual identifier in some terminal emulators (e.g., Konsole, st), + # we need to color both the visual identifier and the whitespace. + icon="${_P9K_RETVAL}${icon} " + fi fi - fi - - echo -n "${background}${foreground}" - # Print whitespace only if segment is not joined or first right segment - [[ $joined == false ]] || [[ "$CURRENT_RIGHT_BG" == "NONE" ]] && echo -n "${POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS}" - - # Print segment content if there is any - [[ -n "$5" ]] && echo -n "${5}" - # Print the visual identifier - echo -n "${visual_identifier}" + _p9k_cache_set "$output" "$background_color" "$icon" + fi - CURRENT_RIGHT_BG="${backgroundColor}" - last_right_element_index=$current_index + _P9K_PROMPT+="${_P9K_CACHE_VAL[1]}${5}${5:+ }${_P9K_CACHE_VAL[3]}" + _P9K_CURRENT_BG=$_P9K_CACHE_VAL[2] + _P9K_LAST_SEGMENT_INDEX=$2 } ################################################################ @@ -335,18 +398,15 @@ prompt_aws_eb_env() { set_default POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE true set_default POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS false prompt_background_jobs() { - local background_jobs_number=${$(jobs -l | wc -l)// /} - local wrong_lines=`jobs -l | awk '/pwd now/{ count++ } END {print count}'` - if [[ wrong_lines -gt 0 ]]; then - background_jobs_number=$(( $background_jobs_number - $wrong_lines )) - fi - if [[ background_jobs_number -gt 0 ]]; then - local background_jobs_number_print="" - if [[ "$POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE" == "true" ]] && ([[ "$background_jobs_number" -gt 1 ]] || [[ "$POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS" == "true" ]]); then - background_jobs_number_print="$background_jobs_number" - fi - "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR" "cyan" "$background_jobs_number_print" 'BACKGROUND_JOBS_ICON' + local n && n="${(fw)#$(jobs -rd)}" && ((n > 1)) || return + (( n /= 2 )) + + local prompt='' + if [[ "$POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE" == "true" && + ("$n" -gt 1 || "$POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS" == "true") ]]; then + prompt=$n fi + "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR" "cyan" "$prompt" 'BACKGROUND_JOBS_ICON' } ################################################################ @@ -357,14 +417,15 @@ prompt_newline() { newline=$'\n' lws=$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS if [[ "$POWERLEVEL9K_PROMPT_ON_NEWLINE" == true ]]; then - newline="${newline}$(print_icon 'MULTILINE_NEWLINE_PROMPT_PREFIX')" + _p9k_get_icon MULTILINE_NEWLINE_PROMPT_PREFIX + newline="${newline}${_P9K_RETVAL}" fi POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS= "$1_prompt_segment" \ "$0" \ "$2" \ "" "" "${newline}" - CURRENT_BG='NONE' + _P9K_CURRENT_BG=NONE POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS=$lws } @@ -617,15 +678,6 @@ set_default POWERLEVEL9K_ALWAYS_SHOW_USER false set_default POWERLEVEL9K_CONTEXT_TEMPLATE "%n@%m" prompt_context() { local current_state="DEFAULT" - typeset -AH context_states - context_states=( - "ROOT" "yellow" - "SUDO" "yellow" - "DEFAULT" "yellow" - "REMOTE" "yellow" - "REMOTE_SUDO" "yellow" - ) - local content="" if [[ "$POWERLEVEL9K_ALWAYS_SHOW_CONTEXT" == true ]] || [[ "$(whoami)" != "$DEFAULT_USER" ]] || [[ -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then @@ -648,7 +700,7 @@ prompt_context() { current_state="SUDO" fi - "$1_prompt_segment" "${0}_${current_state}" "$2" "$DEFAULT_COLOR" "${context_states[$current_state]}" "${content}" + "$1_prompt_segment" "${0}_${current_state}" "$2" "$DEFAULT_COLOR" yellow "${content}" } ################################################################ @@ -722,6 +774,9 @@ prompt_custom() { # Get content of custom segment local command="POWERLEVEL9K_CUSTOM_${segment_name}" local segment_content="$(eval ${(P)command})" + # Note: this would be a better implementation. I'm keeping the old one in case anyone + # relies on its quirks. + # local segment_content=$("${(@Q)${(z)${(P)command}}}") if [[ -n $segment_content ]]; then "$1_prompt_segment" "${0}_${3:u}" "$2" $DEFAULT_COLOR_INVERTED $DEFAULT_COLOR "$segment_content" "CUSTOM_${segment_name}_ICON" @@ -798,249 +853,251 @@ set_default POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD false prompt_dir() { # using $PWD instead of "$(print -P '%~')" to allow use of POWERLEVEL9K_DIR_PATH_ABSOLUTE local current_path=$PWD # WAS: local current_path="$(print -P '%~')" - # check if the user wants to use absolute paths or "~" paths - [[ ${(L)POWERLEVEL9K_DIR_PATH_ABSOLUTE} != "true" ]] && current_path=${current_path/#$HOME/"~"} - # declare all local variables - local paths directory test_dir test_dir_length trunc_path threshhold - # if we are not in "~" or "/", split the paths into an array and exclude "~" - (( ${#current_path} > 1 )) && paths=(${(s:/:)${current_path//"~\/"/}}) || paths=() - # only run the code if SHORTEN_DIR_LENGTH is set, or we are using the two strategies that don't rely on it. - if [[ -n "$POWERLEVEL9K_SHORTEN_DIR_LENGTH" || "$POWERLEVEL9K_SHORTEN_STRATEGY" == "truncate_with_folder_marker" || "$POWERLEVEL9K_SHORTEN_STRATEGY" == "truncate_to_last" || "$POWERLEVEL9K_SHORTEN_STRATEGY" == "truncate_with_package_name" ]]; then - set_default POWERLEVEL9K_SHORTEN_DELIMITER "\u2026" - # convert delimiter from unicode to literal character, so that we can get the correct length later - local delim=$(echo -n $POWERLEVEL9K_SHORTEN_DELIMITER) - - case "$POWERLEVEL9K_SHORTEN_STRATEGY" in - truncate_absolute_chars) - if [ ${#current_path} -gt $(( $POWERLEVEL9K_SHORTEN_DIR_LENGTH + ${#POWERLEVEL9K_SHORTEN_DELIMITER} )) ]; then - current_path=$POWERLEVEL9K_SHORTEN_DELIMITER${current_path:(-POWERLEVEL9K_SHORTEN_DIR_LENGTH)} - fi - ;; - truncate_middle) - # truncate characters from the middle of the path - current_path=$(truncatePath $current_path $POWERLEVEL9K_SHORTEN_DIR_LENGTH $POWERLEVEL9K_SHORTEN_DELIMITER "middle") - ;; - truncate_from_right) - # truncate characters from the right of the path - current_path=$(truncatePath "$current_path" $POWERLEVEL9K_SHORTEN_DIR_LENGTH $POWERLEVEL9K_SHORTEN_DELIMITER) - ;; - truncate_absolute) - # truncate all characters except the last POWERLEVEL9K_SHORTEN_DIR_LENGTH characters - if [ ${#current_path} -gt $(( $POWERLEVEL9K_SHORTEN_DIR_LENGTH + ${#POWERLEVEL9K_SHORTEN_DELIMITER} )) ]; then - current_path=$POWERLEVEL9K_SHORTEN_DELIMITER${current_path:(-POWERLEVEL9K_SHORTEN_DIR_LENGTH)} - fi - ;; - truncate_to_last) - # truncate all characters before the current directory - current_path=${current_path##*/} - ;; - truncate_to_first_and_last) - if (( ${#current_path} > 1 )) && (( ${POWERLEVEL9K_SHORTEN_DIR_LENGTH} > 0 )); then - threshhold=$(( ${POWERLEVEL9K_SHORTEN_DIR_LENGTH} * 2)) - # if we are in "~", add it back into the paths array - [[ $current_path == '~'* ]] && paths=("~" "${paths[@]}") - if (( ${#paths} > $threshhold )); then - local num=$(( ${#paths} - ${POWERLEVEL9K_SHORTEN_DIR_LENGTH} )) - # repace the middle elements - for (( i=$POWERLEVEL9K_SHORTEN_DIR_LENGTH; i<$num; i++ )); do - paths[$i+1]=$POWERLEVEL9K_SHORTEN_DELIMITER - done - [[ $current_path != '~'* ]] && current_path="/" || current_path="" - current_path+="${(j:/:)paths}" + [[ "${POWERLEVEL9K_DIR_SHOW_WRITABLE}" == true && ! -w "$PWD" ]] && + local -i not_writable=1 || local -i not_writable=0 + if ! _p9k_cache_get "$0" "$2" "$current_path" "$not_writable"; then + # check if the user wants to use absolute paths or "~" paths + [[ ${(L)POWERLEVEL9K_DIR_PATH_ABSOLUTE} != "true" ]] && current_path=${current_path/#$HOME/"~"} + # declare all local variables + local paths directory test_dir test_dir_length trunc_path threshhold + # if we are not in "~" or "/", split the paths into an array and exclude "~" + (( ${#current_path} > 1 )) && paths=(${(s:/:)${current_path//"~\/"/}}) || paths=() + # only run the code if SHORTEN_DIR_LENGTH is set, or we are using the two strategies that don't rely on it. + if [[ -n "$POWERLEVEL9K_SHORTEN_DIR_LENGTH" || "$POWERLEVEL9K_SHORTEN_STRATEGY" == "truncate_with_folder_marker" || "$POWERLEVEL9K_SHORTEN_STRATEGY" == "truncate_to_last" || "$POWERLEVEL9K_SHORTEN_STRATEGY" == "truncate_with_package_name" ]]; then + set_default POWERLEVEL9K_SHORTEN_DELIMITER "\u2026" + # convert delimiter from unicode to literal character, so that we can get the correct length later + local delim=$(echo -n $POWERLEVEL9K_SHORTEN_DELIMITER) + + case "$POWERLEVEL9K_SHORTEN_STRATEGY" in + truncate_absolute_chars) + if [ ${#current_path} -gt $(( $POWERLEVEL9K_SHORTEN_DIR_LENGTH + ${#POWERLEVEL9K_SHORTEN_DELIMITER} )) ]; then + current_path=$POWERLEVEL9K_SHORTEN_DELIMITER${current_path:(-POWERLEVEL9K_SHORTEN_DIR_LENGTH)} fi - fi - ;; - truncate_to_unique) - # for each parent path component find the shortest unique beginning - # characters sequence. Source: https://stackoverflow.com/a/45336078 - if (( ${#current_path} > 1 )); then # root and home are exceptions and won't have paths - # cheating here to retain ~ as home folder - local home_path="$(getUniqueFolder $HOME)" - trunc_path="$(getUniqueFolder $PWD)" - [[ $current_path == "~"* ]] && current_path="~${trunc_path//${home_path}/}" || current_path="/${trunc_path}" - fi - ;; - truncate_with_folder_marker) - if (( ${#paths} > 0 )); then # root and home are exceptions and won't have paths, so skip this - local last_marked_folder marked_folder - set_default POWERLEVEL9K_SHORTEN_FOLDER_MARKER ".shorten_folder_marker" - - # Search for the folder marker in the parent directories and - # buildup a pattern that is removed from the current path - # later on. - for marked_folder in $(upsearch $POWERLEVEL9K_SHORTEN_FOLDER_MARKER); do - if [[ "$marked_folder" == "/" ]]; then - # If we reached root folder, stop upsearch. - trunc_path="/" - elif [[ "$marked_folder" == "$HOME" ]]; then - # If we reached home folder, stop upsearch. - trunc_path="~" - elif [[ "${marked_folder%/*}" == $last_marked_folder ]]; then - trunc_path="${trunc_path%/}/${marked_folder##*/}" - else - trunc_path="${trunc_path%/}/$POWERLEVEL9K_SHORTEN_DELIMITER/${marked_folder##*/}" + ;; + truncate_middle) + # truncate characters from the middle of the path + current_path=$(truncatePath $current_path $POWERLEVEL9K_SHORTEN_DIR_LENGTH $POWERLEVEL9K_SHORTEN_DELIMITER "middle") + ;; + truncate_from_right) + # truncate characters from the right of the path + current_path=$(truncatePath "$current_path" $POWERLEVEL9K_SHORTEN_DIR_LENGTH $POWERLEVEL9K_SHORTEN_DELIMITER) + ;; + truncate_absolute) + # truncate all characters except the last POWERLEVEL9K_SHORTEN_DIR_LENGTH characters + if [ ${#current_path} -gt $(( $POWERLEVEL9K_SHORTEN_DIR_LENGTH + ${#POWERLEVEL9K_SHORTEN_DELIMITER} )) ]; then + current_path=$POWERLEVEL9K_SHORTEN_DELIMITER${current_path:(-POWERLEVEL9K_SHORTEN_DIR_LENGTH)} + fi + ;; + truncate_to_last) + # truncate all characters before the current directory + current_path=${current_path##*/} + ;; + truncate_to_first_and_last) + if (( ${#current_path} > 1 )) && (( ${POWERLEVEL9K_SHORTEN_DIR_LENGTH} > 0 )); then + threshhold=$(( ${POWERLEVEL9K_SHORTEN_DIR_LENGTH} * 2)) + # if we are in "~", add it back into the paths array + [[ $current_path == '~'* ]] && paths=("~" "${paths[@]}") + if (( ${#paths} > $threshhold )); then + local num=$(( ${#paths} - ${POWERLEVEL9K_SHORTEN_DIR_LENGTH} )) + # repace the middle elements + for (( i=$POWERLEVEL9K_SHORTEN_DIR_LENGTH; i<$num; i++ )); do + paths[$i+1]=$POWERLEVEL9K_SHORTEN_DELIMITER + done + [[ $current_path != '~'* ]] && current_path="/" || current_path="" + current_path+="${(j:/:)paths}" fi - last_marked_folder=$marked_folder - done + fi + ;; + truncate_to_unique) + # for each parent path component find the shortest unique beginning + # characters sequence. Source: https://stackoverflow.com/a/45336078 + if (( ${#current_path} > 1 )); then # root and home are exceptions and won't have paths + # cheating here to retain ~ as home folder + local home_path="$(getUniqueFolder $HOME)" + trunc_path="$(getUniqueFolder $PWD)" + [[ $current_path == "~"* ]] && current_path="~${trunc_path//${home_path}/}" || current_path="/${trunc_path}" + fi + ;; + truncate_with_folder_marker) + if (( ${#paths} > 0 )); then # root and home are exceptions and won't have paths, so skip this + local last_marked_folder marked_folder + set_default POWERLEVEL9K_SHORTEN_FOLDER_MARKER ".shorten_folder_marker" + + # Search for the folder marker in the parent directories and + # buildup a pattern that is removed from the current path + # later on. + for marked_folder in $(upsearch $POWERLEVEL9K_SHORTEN_FOLDER_MARKER); do + if [[ "$marked_folder" == "/" ]]; then + # If we reached root folder, stop upsearch. + trunc_path="/" + elif [[ "$marked_folder" == "$HOME" ]]; then + # If we reached home folder, stop upsearch. + trunc_path="~" + elif [[ "${marked_folder%/*}" == $last_marked_folder ]]; then + trunc_path="${trunc_path%/}/${marked_folder##*/}" + else + trunc_path="${trunc_path%/}/$POWERLEVEL9K_SHORTEN_DELIMITER/${marked_folder##*/}" + fi + last_marked_folder=$marked_folder + done + + # Replace the shortest possible match of the marked folder from + # the current path. + current_path=$trunc_path${current_path#${last_marked_folder}*} + fi + ;; + truncate_with_package_name) + local name repo_path package_path current_dir zero + + # Get the path of the Git repo, which should have the package.json file + if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == "true" ]]; then + # Get path from the root of the git repository to the current dir + local gitPath=$(git rev-parse --show-prefix) + # Remove trailing slash from git path, so that we can + # remove that git path from the pwd. + gitPath=${gitPath%/} + package_path=${$(pwd)%%$gitPath} + # Remove trailing slash + package_path=${package_path%/} + elif [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) == "true" ]]; then + package_path=${$(pwd)%%/.git*} + fi + + [[ ${(L)POWERLEVEL9K_DIR_PATH_ABSOLUTE} != "true" ]] && package_path=${package_path/$HOME/"~"} # Replace the shortest possible match of the marked folder from - # the current path. - current_path=$trunc_path${current_path#${last_marked_folder}*} - fi - ;; - truncate_with_package_name) - local name repo_path package_path current_dir zero - - # Get the path of the Git repo, which should have the package.json file - if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == "true" ]]; then - # Get path from the root of the git repository to the current dir - local gitPath=$(git rev-parse --show-prefix) - # Remove trailing slash from git path, so that we can - # remove that git path from the pwd. - gitPath=${gitPath%/} - package_path=${$(pwd)%%$gitPath} - # Remove trailing slash - package_path=${package_path%/} - elif [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) == "true" ]]; then - package_path=${$(pwd)%%/.git*} - fi + # the current path. Remove the amount of characters up to the + # folder marker from the left. Count only the visible characters + # in the path (this is done by the "zero" pattern; see + # http://stackoverflow.com/a/40855342/5586433). + local zero='%([BSUbfksu]|([FB]|){*})' + trunc_path=$(pwd) + # Then, find the length of the package_path string, and save the + # subdirectory path as a substring of the current directory's path from 0 + # to the length of the package path's string + subdirectory_path=$(truncatePath "${trunc_path:${#${(S%%)package_path//$~zero/}}}" $POWERLEVEL9K_SHORTEN_DIR_LENGTH $POWERLEVEL9K_SHORTEN_DELIMITER) + # Parse the 'name' from the package.json; if there are any problems, just + # print the file path + defined POWERLEVEL9K_DIR_PACKAGE_FILES || POWERLEVEL9K_DIR_PACKAGE_FILES=(package.json composer.json) + + local pkgFile="unknown" + for file in "${POWERLEVEL9K_DIR_PACKAGE_FILES[@]}"; do + if [[ -f "${package_path}/${file}" ]]; then + pkgFile="${package_path}/${file}" + break; + fi + done - [[ ${(L)POWERLEVEL9K_DIR_PATH_ABSOLUTE} != "true" ]] && package_path=${package_path/$HOME/"~"} - - # Replace the shortest possible match of the marked folder from - # the current path. Remove the amount of characters up to the - # folder marker from the left. Count only the visible characters - # in the path (this is done by the "zero" pattern; see - # http://stackoverflow.com/a/40855342/5586433). - local zero='%([BSUbfksu]|([FB]|){*})' - trunc_path=$(pwd) - # Then, find the length of the package_path string, and save the - # subdirectory path as a substring of the current directory's path from 0 - # to the length of the package path's string - subdirectory_path=$(truncatePath "${trunc_path:${#${(S%%)package_path//$~zero/}}}" $POWERLEVEL9K_SHORTEN_DIR_LENGTH $POWERLEVEL9K_SHORTEN_DELIMITER) - # Parse the 'name' from the package.json; if there are any problems, just - # print the file path - defined POWERLEVEL9K_DIR_PACKAGE_FILES || POWERLEVEL9K_DIR_PACKAGE_FILES=(package.json composer.json) - - local pkgFile="unknown" - for file in "${POWERLEVEL9K_DIR_PACKAGE_FILES[@]}"; do - if [[ -f "${package_path}/${file}" ]]; then - pkgFile="${package_path}/${file}" - break; + local packageName=$(jq '.name' ${pkgFile} 2> /dev/null \ + || node -e 'console.log(require(process.argv[1]).name);' ${pkgFile} 2>/dev/null \ + || cat "${pkgFile}" 2> /dev/null | grep -m 1 "\"name\"" | awk -F ':' '{print $2}' | awk -F '"' '{print $2}' 2>/dev/null \ + ) + if [[ -n "${packageName}" ]]; then + # Instead of printing out the full path, print out the name of the package + # from the package.json and append the current subdirectory + current_path="`echo $packageName | tr -d '"'`$subdirectory_path" fi - done - - local packageName=$(jq '.name' ${pkgFile} 2> /dev/null \ - || node -e 'console.log(require(process.argv[1]).name);' ${pkgFile} 2>/dev/null \ - || cat "${pkgFile}" 2> /dev/null | grep -m 1 "\"name\"" | awk -F ':' '{print $2}' | awk -F '"' '{print $2}' 2>/dev/null \ - ) - if [[ -n "${packageName}" ]]; then - # Instead of printing out the full path, print out the name of the package - # from the package.json and append the current subdirectory - current_path="`echo $packageName | tr -d '"'`$subdirectory_path" - fi - ;; - *) - if [[ $current_path != "~" ]]; then - current_path="$(print -P "%$((POWERLEVEL9K_SHORTEN_DIR_LENGTH+1))(c:$POWERLEVEL9K_SHORTEN_DELIMITER/:)%${POWERLEVEL9K_SHORTEN_DIR_LENGTH}c")" - fi - ;; - esac - fi + ;; + *) + if [[ $current_path != "~" ]]; then + current_path="$(print -P "%$((POWERLEVEL9K_SHORTEN_DIR_LENGTH+1))(c:$POWERLEVEL9K_SHORTEN_DELIMITER/:)%${POWERLEVEL9K_SHORTEN_DIR_LENGTH}c")" + fi + ;; + esac + fi - # save state of path for highlighting and bold options - local path_opt=$current_path + # save state of path for highlighting and bold options + local path_opt=$current_path + local state_path="$(print -P '%~')" + local current_state="DEFAULT" + local icon="FOLDER_ICON" + if [[ $state_path == '/etc'* ]]; then + current_state='ETC' + icon='ETC_ICON' + elif (( not_writable )); then + current_state="NOT_WRITABLE" + icon='LOCK_ICON' + elif [[ $state_path == '~' ]]; then + current_state="HOME" + icon='HOME_ICON' + elif [[ $state_path == '~'* ]]; then + current_state="HOME_SUBFOLDER" + icon='HOME_SUB_ICON' + fi - typeset -AH dir_states - dir_states=( - "DEFAULT" "FOLDER_ICON" - "HOME" "HOME_ICON" - "HOME_SUBFOLDER" "HOME_SUB_ICON" - "NOT_WRITABLE" "LOCK_ICON" - "ETC" "ETC_ICON" - ) - local state_path="$(print -P '%~')" - local current_state="DEFAULT" - if [[ $state_path == '/etc'* ]]; then - current_state='ETC' - elif [[ "${POWERLEVEL9K_DIR_SHOW_WRITABLE}" == true && ! -w "$PWD" ]]; then - current_state="NOT_WRITABLE" - elif [[ $state_path == '~' ]]; then - current_state="HOME" - elif [[ $state_path == '~'* ]]; then - current_state="HOME_SUBFOLDER" - fi - - # declare variables used for bold and state colors - local bld_on bld_off dir_state_foreground dir_state_user_foreground - # test if user wants the last directory printed in bold - if [[ "${(L)POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD}" == "true" ]]; then - bld_on="%B" - bld_off="%b" - else - bld_on="" - bld_off="" - fi - # determine is the user has set a last directory color - local dir_state_user_foreground=POWERLEVEL9K_DIR_${current_state}_FOREGROUND - local dir_state_foreground=${(P)dir_state_user_foreground} - [[ -z ${dir_state_foreground} ]] && dir_state_foreground="${DEFAULT_COLOR}" - - local dir_name base_name - # use ZSH substitution to get the dirname and basename instead of calling external functions - dir_name=${path_opt%/*} - base_name=${path_opt##*/} - - # if the user wants the last directory colored... - if [[ -n ${POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND} ]]; then - # it the path is "/" or "~" - if [[ $path_opt == "/" || $path_opt == "~" ]]; then - current_path="${bld_on}%F{$POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND}${current_path}${bld_off}" - else # has a subfolder - # test if dirname != basename - they are equal if we use truncate_to_last or truncate_absolute - if [[ $dir_name != $base_name ]]; then - current_path="${dir_name}/${bld_on}%F{$POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND}${base_name}${bld_off}" - else - current_path="${bld_on}%F{$POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND}${base_name}${bld_off}" - fi + # declare variables used for bold and state colors + local bld_on bld_off dir_state_foreground dir_state_user_foreground + # test if user wants the last directory printed in bold + if [[ "${(L)POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD}" == "true" ]]; then + bld_on="%B" + bld_off="%b" + else + bld_on="" + bld_off="" fi - else # no coloring - # it the path is "/" or "~" - if [[ $path_opt == "/" || $path_opt == "~" ]]; then - current_path="${bld_on}${current_path}${bld_off}" - else # has a subfolder - # test if dirname != basename - they are equal if we use truncate_to_last or truncate_absolute - if [[ $dir_name != $base_name ]]; then - current_path="${dir_name}/${bld_on}${base_name}${bld_off}" - else - current_path="${bld_on}${base_name}${bld_off}" + # determine is the user has set a last directory color + local dir_state_user_foreground=POWERLEVEL9K_DIR_${current_state}_FOREGROUND + local dir_state_foreground=${(P)dir_state_user_foreground} + [[ -z ${dir_state_foreground} ]] && dir_state_foreground="${DEFAULT_COLOR}" + + local dir_name base_name + # use ZSH substitution to get the dirname and basename instead of calling external functions + dir_name=${path_opt%/*} + base_name=${path_opt##*/} + + # if the user wants the last directory colored... + if [[ -n ${POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND} ]]; then + # it the path is "/" or "~" + if [[ $path_opt == "/" || $path_opt == "~" ]]; then + current_path="${bld_on}%F{$POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND}${current_path}${bld_off}" + else # has a subfolder + # test if dirname != basename - they are equal if we use truncate_to_last or truncate_absolute + if [[ $dir_name != $base_name ]]; then + current_path="${dir_name}/${bld_on}%F{$POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND}${base_name}${bld_off}" + else + current_path="${bld_on}%F{$POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND}${base_name}${bld_off}" + fi + fi + else # no coloring + # it the path is "/" or "~" + if [[ $path_opt == "/" || $path_opt == "~" ]]; then + current_path="${bld_on}${current_path}${bld_off}" + else # has a subfolder + # test if dirname != basename - they are equal if we use truncate_to_last or truncate_absolute + if [[ $dir_name != $base_name ]]; then + current_path="${dir_name}/${bld_on}${base_name}${bld_off}" + else + current_path="${bld_on}${base_name}${bld_off}" + fi fi fi - fi - # check if we need to omit the first character and only do it if we are not in "~" or "/" - if [[ "${POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER}" == "true" && $path_opt != "/" && $path_opt != "~" ]]; then - current_path="${current_path[2,-1]}" - fi + # check if we need to omit the first character and only do it if we are not in "~" or "/" + if [[ "${POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER}" == "true" && $path_opt != "/" && $path_opt != "~" ]]; then + current_path="${current_path[2,-1]}" + fi - # check if the user wants the separator colored. - if [[ -n ${POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND} && $path_opt != "/" ]]; then - # because this contains color changing codes, it is easier to set a variable for what should be replaced - local repl="%F{$POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND}/%F{$dir_state_foreground}" - # escape the / with a \ - current_path=${current_path//\//$repl} - fi + # check if the user wants the separator colored. + if [[ -n ${POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND} && $path_opt != "/" ]]; then + # because this contains color changing codes, it is easier to set a variable for what should be replaced + local repl="%F{$POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND}/%F{$dir_state_foreground}" + # escape the / with a \ + current_path=${current_path//\//$repl} + fi - if [[ "${POWERLEVEL9K_DIR_PATH_SEPARATOR}" != "/" && $path_opt != "/" ]]; then - current_path=${current_path//\//$POWERLEVEL9K_DIR_PATH_SEPARATOR} - fi + if [[ "${POWERLEVEL9K_DIR_PATH_SEPARATOR}" != "/" && $path_opt != "/" ]]; then + current_path=${current_path//\//$POWERLEVEL9K_DIR_PATH_SEPARATOR} + fi + + if [[ "${POWERLEVEL9K_HOME_FOLDER_ABBREVIATION}" != "~" && ! "${(L)POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER}" == "true" ]]; then + # use :s to only replace the first occurance + current_path=${current_path:s/~/$POWERLEVEL9K_HOME_FOLDER_ABBREVIATION} + fi - if [[ "${POWERLEVEL9K_HOME_FOLDER_ABBREVIATION}" != "~" && ! "${(L)POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER}" == "true" ]]; then - # use :s to only replace the first occurance - current_path=${current_path:s/~/$POWERLEVEL9K_HOME_FOLDER_ABBREVIATION} + _p9k_cache_set "$current_state" "$current_path" "$icon" fi - "$1_prompt_segment" "$0_${current_state}" "$2" "blue" "$DEFAULT_COLOR" "${current_path}" "${dir_states[$current_state]}" + "$1_prompt_segment" "$0_${_P9K_CACHE_VAL[1]}" "$2" blue "$DEFAULT_COLOR" "${_P9K_CACHE_VAL[2]}" "${_P9K_CACHE_VAL[3]}" } ################################################################ @@ -1377,51 +1434,58 @@ set_default POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE false exit_code_or_status() { local ec=$1 - if [[ "$POWERLEVEL9K_STATUS_HIDE_SIGNAME" = true ]]; then - echo "$ec" - elif (( ec <= 128 )); then - echo "$ec" + if [[ "$POWERLEVEL9K_STATUS_HIDE_SIGNAME" = true ]] || (( ec <= 128 )); then + _P9K_RETVAL=$ec else - local sig=$(( ec - 128 )) - local idx=$(( sig + 1 )) - echo "SIG${signals[$idx]}(${sig})" + _P9K_RETVAL="SIG${signals[$((sig + 1))]}($((ec - 128)))" fi } prompt_status() { - local ec_text - local ec_sum - local ec - - if [[ $POWERLEVEL9K_STATUS_SHOW_PIPESTATUS == true ]]; then - if (( $#RETVALS > 1 )); then - ec_text=$(exit_code_or_status "${RETVALS[1]}") - ec_sum=${RETVALS[1]} + if ! _p9k_cache_get "$0" "$2" "$RETVAL" "${(@)RETVALS}"; then + local ec_text + local ec_sum + local ec + + if [[ $POWERLEVEL9K_STATUS_SHOW_PIPESTATUS == true ]]; then + if (( $#RETVALS > 1 )); then + ec_sum=${RETVALS[1]} + exit_code_or_status "${RETVALS[1]}" + + else + ec_sum=${RETVAL} + exit_code_or_status "${RETVAL}" + fi + ec_text=$_P9K_RETVAL + for ec in "${(@)RETVALS[2,-1]}"; do + (( ec_sum += ec )) + exit_code_or_status "$ec" + ec_text+="|$_P9K_RETVAL" + done else - ec_text=$(exit_code_or_status "${RETVAL}") ec_sum=${RETVAL} + # We use RETVAL instead of the right-most RETVALS item because + # PIPE_FAIL may be set. + exit_code_or_status "${RETVAL}" + ec_text=$_P9K_RETVAL fi - for ec in "${(@)RETVALS[2,-1]}"; do - ec_text="${ec_text}|$(exit_code_or_status "$ec")" - ec_sum=$(( $ec_sum + $ec )) - done - else - # We use RETVAL instead of the right-most RETVALS item because - # PIPE_FAIL may be set. - ec_text=$(exit_code_or_status "${RETVAL}") - ec_sum=${RETVAL} - fi - - if (( ec_sum > 0 )); then - if [[ "$POWERLEVEL9K_STATUS_CROSS" == false && "$POWERLEVEL9K_STATUS_VERBOSE" == true ]]; then - "$1_prompt_segment" "$0_ERROR" "$2" "red" "yellow1" "$ec_text" 'CARRIAGE_RETURN_ICON' + if (( ec_sum > 0 )); then + if [[ "$POWERLEVEL9K_STATUS_CROSS" == false && "$POWERLEVEL9K_STATUS_VERBOSE" == true ]]; then + _P9K_CACHE_VAL=("$0_ERROR" "$2" red yellow1 "$ec_text" CARRIAGE_RETURN_ICON) + else + _P9K_CACHE_VAL=("$0_ERROR" "$2" "$DEFAULT_COLOR" red "" FAIL_ICON) + fi + elif [[ "$POWERLEVEL9K_STATUS_OK" == true ]] && [[ "$POWERLEVEL9K_STATUS_VERBOSE" == true || "$POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE" == true ]]; then + _P9K_CACHE_VAL=("$0_OK" "$2" "$DEFAULT_COLOR" green "" OK_ICON) else - "$1_prompt_segment" "$0_ERROR" "$2" "$DEFAULT_COLOR" "red" "" 'FAIL_ICON' + return + fi + if (( $#RETVALS < 3 )); then + _p9k_cache_set "${(@)_P9K_CACHE_VAL}" fi - elif [[ "$POWERLEVEL9K_STATUS_OK" == true ]] && [[ "$POWERLEVEL9K_STATUS_VERBOSE" == true || "$POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE" == true ]]; then - "$1_prompt_segment" "$0_OK" "$2" "$DEFAULT_COLOR" "green" "" 'OK_ICON' fi + "$1_prompt_segment" "${(@)_P9K_CACHE_VAL}" } ################################################################ @@ -1491,18 +1555,33 @@ build_test_stats() { ################################################################ # System time -prompt_time() { - set_default POWERLEVEL9K_TIME_FORMAT "%D{%H:%M:%S}" +# If set to true, `time` prompt will update every second. +set_default POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME false +set_default POWERLEVEL9K_TIME_FORMAT "%D{%H:%M:%S}" +prompt_time() { "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR_INVERTED" "$DEFAULT_COLOR" "$POWERLEVEL9K_TIME_FORMAT" "TIME_ICON" + # For the reference, here's how the code should ideally look like. However, it's 2ms slower + # for a tiny gain in usability. The difference is that the current code will cause time + # to update when vcs segment goes from grey to green/yellow, but the commented-out code + # won't (unless POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME is true). + #if [[ $POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME == true ]]; then + # local _P9K_TIME=$POWERLEVEL9K_TIME_FORMAT + #else + # [[ -v _P9K_REFRESH_PROMPT ]] || typeset -gH _P9K_TIME=$(print -P $POWERLEVEL9K_TIME_FORMAT) + # typeset -gH _P9K_TIME=$POWERLEVEL9K_TIME_FORMAT + #fi + #"$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR_INVERTED" "$DEFAULT_COLOR" "$_P9K_TIME" "TIME_ICON" } ################################################################ # System date +set_default POWERLEVEL9K_DATE_FORMAT "%D{%d.%m.%y}" prompt_date() { - set_default POWERLEVEL9K_DATE_FORMAT "%D{%d.%m.%y}" - "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR_INVERTED" "$DEFAULT_COLOR" "$POWERLEVEL9K_DATE_FORMAT" "DATE_ICON" + # See comments in prompt_time. + # [[ -v _P9K_REFRESH_PROMPT ]] || typeset -gH _P9K_DATE=$(print -P $POWERLEVEL9K_DATE_FORMAT) + # "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR_INVERTED" "$DEFAULT_COLOR" "$_P9K_DATE" "DATE_ICON" } ################################################################ @@ -1522,6 +1601,7 @@ prompt_todo() { set_default POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND "red" # Default: Just display the first 8 characters of our changeset-ID. set_default POWERLEVEL9K_VCS_INTERNAL_HASH_LENGTH "8" + powerlevel9k_vcs_init() { if [[ -n "$POWERLEVEL9K_CHANGESET_HASH_LENGTH" ]]; then POWERLEVEL9K_VCS_INTERNAL_HASH_LENGTH="$POWERLEVEL9K_CHANGESET_HASH_LENGTH" @@ -1539,6 +1619,7 @@ powerlevel9k_vcs_init() { 'clean' 'green' 'modified' 'yellow' 'untracked' 'green' + 'loading' 'grey' ) VCS_CHANGESET_PREFIX='' @@ -1546,7 +1627,6 @@ powerlevel9k_vcs_init() { VCS_CHANGESET_PREFIX="$(print_icon 'VCS_COMMIT_ICON')%0.$POWERLEVEL9K_VCS_INTERNAL_HASH_LENGTH""i " fi - zstyle ':vcs_info:*' enable git hg svn zstyle ':vcs_info:*' check-for-changes true VCS_DEFAULT_FORMAT="$VCS_CHANGESET_PREFIX%b%c%u%m" @@ -1582,30 +1662,200 @@ powerlevel9k_vcs_init() { fi } +# git workdir => the last prompt we've shown for it +typeset -gAH _P9K_LAST_GIT_PROMPT + +# git workdir => 1 if gitstatus is slow on it, 0 if it's fast. +typeset -gAH _P9K_GIT_SLOW + +typeset -fH _p9k_vcs_render() { + if [[ -v _P9K_NEXT_VCS_DIR ]]; then + local prompt + local dir=$PWD + while true; do + prompt=${_P9K_LAST_GIT_PROMPT[$dir]} + [[ -n $prompt || $dir == / ]] && break + dir=${dir:h} + done + $2_prompt_segment $1_LOADING $3 "${vcs_states[loading]}" "$DEFAULT_COLOR" ${prompt:-loading} + return 0 + fi + + [[ $VCS_STATUS_RESULT == ok-* ]] || return 1 + local -a cache_key=( + "$VCS_STATUS_LOCAL_BRANCH" + "$VCS_STATUS_REMOTE_BRANCH" + "$VCS_STATUS_REMOTE_URL" + "$VCS_STATUS_ACTION" + "$VCS_STATUS_HAS_STAGED" + "$VCS_STATUS_HAS_UNSTAGED" + "$VCS_STATUS_HAS_UNTRACKED" + "$VCS_STATUS_COMMITS_AHEAD" + "$VCS_STATUS_COMMITS_BEHIND" + "$VCS_STATUS_STASHES" + ) + if ! _p9k_cache_get "${(@)cache_key}"; then + local state + if [[ $VCS_STATUS_HAS_STAGED != 0 || $VCS_STATUS_HAS_UNSTAGED != 0 ]]; then + state='modified' + elif [[ $VCS_STATUS_HAS_UNTRACKED != 0 ]]; then + state='untracked' + else + state='clean' + fi + + local vcs_prompt + if [[ "$VCS_STATUS_REMOTE_URL" == *github* ]] then + _p9k_get_icon VCS_GIT_GITHUB_ICON + vcs_prompt+=$_P9K_RETVAL + elif [[ "$VCS_STATUS_REMOTE_URL" == *bitbucket* ]] then + _p9k_get_icon VCS_GIT_BITBUCKET_ICON + vcs_prompt+=$_P9K_RETVAL + elif [[ "$VCS_STATUS_REMOTE_URL" == *stash* ]] then + _p9k_get_icon VCS_GIT_GITHUB_ICON + vcs_prompt+=$_P9K_RETVAL + elif [[ "$VCS_STATUS_REMOTE_URL" == *gitlab* ]] then + _p9k_get_icon VCS_GIT_GITLAB_ICON + vcs_prompt+=$_P9K_RETVAL + else + _p9k_get_icon VCS_GIT_ICON + vcs_prompt+=$_P9K_RETVAL + fi + + _p9k_get_icon VCS_BRANCH_ICON + vcs_prompt+="$_P9K_RETVAL$VCS_STATUS_LOCAL_BRANCH" + if [[ -n $VCS_STATUS_ACTION ]]; then + vcs_prompt+=" %F{${POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND}}| $VCS_STATUS_ACTION%f" + else + if [[ -n $VCS_STATUS_REMOTE_BRANCH && + $VCS_STATUS_LOCAL_BRANCH != $VCS_STATUS_REMOTE_BRANCH ]]; then + _p9k_get_icon VCS_REMOTE_BRANCH_ICON + vcs_prompt+=" $_P9K_RETVAL$VCS_STATUS_REMOTE_BRANCH" + fi + if [[ $VCS_STATUS_HAS_STAGED == 1 ]]; then + _p9k_get_icon VCS_STAGED_ICON + vcs_prompt+=" $_P9K_RETVAL" + fi + if [[ $VCS_STATUS_HAS_UNSTAGED == 1 ]]; then + _p9k_get_icon VCS_UNSTAGED_ICON + vcs_prompt+=" $_P9K_RETVAL" + fi + if [[ $VCS_STATUS_HAS_UNTRACKED == 1 ]]; then + _p9k_get_icon VCS_UNTRACKED_ICON + vcs_prompt+=" $_P9K_RETVAL" + fi + if [[ $VCS_STATUS_COMMITS_AHEAD -gt 0 ]]; then + _p9k_get_icon VCS_OUTGOING_CHANGES_ICON + vcs_prompt+=" $_P9K_RETVAL$VCS_STATUS_COMMITS_AHEAD" + fi + if [[ $VCS_STATUS_COMMITS_BEHIND -gt 0 ]]; then + _p9k_get_icon VCS_INCOMING_CHANGES_ICON + vcs_prompt+=" $_P9K_RETVAL$VCS_STATUS_COMMITS_BEHIND" + fi + if [[ $VCS_STATUS_STASHES -gt 0 ]]; then + _p9k_get_icon VCS_STASH_ICON + vcs_prompt+=" $_P9K_RETVAL$VCS_STATUS_STASHES" + fi + fi + + _p9k_cache_set "${1}_${(U)state}" "${vcs_states[$state]}" "$vcs_prompt" + fi + + _P9K_LAST_GIT_PROMPT[$VCS_STATUS_WORKDIR]="${_P9K_CACHE_VAL[3]}" + "$2_prompt_segment" "${_P9K_CACHE_VAL[1]}" $3 "${_P9K_CACHE_VAL[2]}" "$DEFAULT_COLOR" "${_P9K_CACHE_VAL[3]}" + return 0 +} + +typeset -fH _p9k_vcs_resume() { + if [[ $VCS_STATUS_RESULT == ok-async ]]; then + local latency=$((EPOCHREALTIME - _P9K_GITSTATUS_START_TIME)) + if (( latency > POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS )); then + _P9K_GIT_SLOW[$VCS_STATUS_WORKDIR]=1 + elif (( latency < 0.8 * POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS )); then # 0.8 to avoid flip-flopping + _P9K_GIT_SLOW[$VCS_STATUS_WORKDIR]=0 + fi + fi + + if [[ -z $_P9K_NEXT_VCS_DIR ]]; then + unset _P9K_NEXT_VCS_DIR + _p9k_update_prompts + else + typeset -gFH _P9K_GITSTATUS_START_TIME=$EPOCHREALTIME + if ! gitstatus_query -d $_P9K_NEXT_VCS_DIR -t 0 -c _p9k_vcs_resume POWERLEVEL9K; then + unset _P9K_NEXT_VCS_DIR + return + fi + case $VCS_STATUS_RESULT in + *-sync) + unset _P9K_NEXT_VCS_DIR + _p9k_update_prompts + ;; + tout) + typeset -gH _P9K_NEXT_VCS_DIR="" + ;; + esac + fi +} + +typeset -fH _p9k_vcs_gitstatus() { + [[ $POWERLEVEL9K_DISABLE_GITSTATUS == true ]] && return 1 + if [[ ! -v _P9K_REFRESH_PROMPT ]]; then + if [[ -v _P9K_NEXT_VCS_DIR ]]; then + typeset -gH _P9K_NEXT_VCS_DIR=$PWD + else + local dir=$PWD + local -F timeout=$POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS + while true; do + case "$_P9K_GIT_SLOW[$dir]" in + "") [[ $dir == / ]] && break; dir=${dir:h};; + 0) break;; + 1) timeout=0; break;; + esac + done + typeset -gFH _P9K_GITSTATUS_START_TIME=$EPOCHREALTIME + gitstatus_query -t $timeout -c _p9k_vcs_resume POWERLEVEL9K || return 1 + [[ $VCS_STATUS_RESULT == tout ]] && typeset -gH _P9K_NEXT_VCS_DIR="" + fi + fi + return 0 +} + ################################################################ # Segment to show VCS information -prompt_vcs() { - VCS_WORKDIR_DIRTY=false - VCS_WORKDIR_HALF_DIRTY=false - local current_state="" - # Actually invoke vcs_info manually to gather all information. - vcs_info - local vcs_prompt="${vcs_info_msg_0_}" +# If it takes longer than this to fetch git repo status, display the prompt with a greyed out +# vcs segment and fix it asynchronously when the results come it. +[ -v POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS ] || typeset -gF POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS=0.05 - if [[ -n "$vcs_prompt" ]]; then - if [[ "$VCS_WORKDIR_DIRTY" == true ]]; then - # $vcs_visual_identifier gets set in +vi-vcs-detect-changes in functions/vcs.zsh, - # as we have there access to vcs_info internal hooks. - current_state='modified' - else - if [[ "$VCS_WORKDIR_HALF_DIRTY" == true ]]; then - current_state='untracked' +prompt_vcs() { + local -a backends + [[ -v POWERLEVEL9K_VCS_BACKENDS ]] && backends=($POWERLEVEL9K_VCS_BACKENDS) || backends=(git) + if (( ${backends[(I)git]} )) && _p9k_vcs_gitstatus; then + _p9k_vcs_render $0 $1 $2 && return + backends=(${backends:#git}) + fi + if (( #backends )); then + VCS_WORKDIR_DIRTY=false + VCS_WORKDIR_HALF_DIRTY=false + local current_state="" + # Actually invoke vcs_info manually to gather all information. + zstyle ':vcs_info:*' enable ${backends} + vcs_info + local vcs_prompt="${vcs_info_msg_0_}" + if [[ -n "$vcs_prompt" ]]; then + if [[ "$VCS_WORKDIR_DIRTY" == true ]]; then + # $vcs_visual_identifier gets set in +vi-vcs-detect-changes in functions/vcs.zsh, + # as we have there access to vcs_info internal hooks. + current_state='modified' else - current_state='clean' + if [[ "$VCS_WORKDIR_HALF_DIRTY" == true ]]; then + current_state='untracked' + else + current_state='clean' + fi fi + "$1_prompt_segment" "${0}_${(U)current_state}" "$2" "${vcs_states[$current_state]}" "$DEFAULT_COLOR" "$vcs_prompt" "$vcs_visual_identifier" fi - "$1_prompt_segment" "${0}_${(U)current_state}" "$2" "${vcs_states[$current_state]}" "$DEFAULT_COLOR" "$vcs_prompt" "$vcs_visual_identifier" fi } @@ -1752,6 +2002,9 @@ prompt_java_version() { ################################################################ # Main prompt build_left_prompt() { + typeset -gH _P9K_CURRENT_BG=NONE + typeset -gH _P9K_LAST_SEGMENT_INDEX=0 + local index=1 local element for element in "${POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[@]}"; do @@ -1760,7 +2013,7 @@ build_left_prompt() { # Check if it is a custom command, otherwise interpet it as # a prompt. - if [[ $element[0,7] =~ "custom_" ]]; then + if [[ $element == custom_* ]]; then "prompt_custom" "left" "$index" $element[8,-1] else "prompt_$element" "left" "$index" @@ -1770,19 +2023,25 @@ build_left_prompt() { done left_prompt_end + + unset _P9K_CURRENT_BG _P9K_LAST_SEGMENT_INDEX } # Right prompt build_right_prompt() { + typeset -gH _P9K_CURRENT_BG=NONE + typeset -gH _P9K_LAST_SEGMENT_INDEX=0 + local index=1 local element + for element in "${POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[@]}"; do # Remove joined information in direct calls element=${element%_joined} # Check if it is a custom command, otherwise interpet it as # a prompt. - if [[ $element[0,7] =~ "custom_" ]]; then + if [[ $element == custom_* ]]; then "prompt_custom" "right" "$index" $element[8,-1] else "prompt_$element" "right" "$index" @@ -1792,33 +2051,31 @@ build_right_prompt() { done # Clear to the end of the line - echo -n "%E" + _P9K_PROMPT+="%E" + + unset _P9K_CURRENT_BG _P9K_LAST_SEGMENT_INDEX } powerlevel9k_preexec() { _P9K_TIMER_START=$EPOCHREALTIME } -set_default POWERLEVEL9K_PROMPT_ADD_NEWLINE false -powerlevel9k_prepare_prompts() { - # Return values. These need to be global, because - # they are used in prompt_status. Also, we need - # to get the return value of the last command at - # very first in this function. Do not move the - # lines down, otherwise the last command is not - # what you expected it to be. - RETVAL=$? - RETVALS=( "$pipestatus[@]" ) +typeset -fH _p9k_set_prompts() { + typeset -gH _P9K_PROMPT='' + build_left_prompt + local left=$_P9K_PROMPT + _P9K_PROMPT='' + build_right_prompt + local right=$_P9K_PROMPT + unset _P9K_PROMPT + local NEWLINE=$'\n' local RPROMPT_SUFFIX RPROMPT_PREFIX - _P9K_COMMAND_DURATION=$((EPOCHREALTIME - _P9K_TIMER_START)) - - # Reset start time - _P9K_TIMER_START=0x7FFFFFFF - if [[ "$POWERLEVEL9K_PROMPT_ON_NEWLINE" == true ]]; then - PROMPT='$(print_icon 'MULTILINE_FIRST_PROMPT_PREFIX')%f%b%k$(build_left_prompt) -$(print_icon 'MULTILINE_LAST_PROMPT_PREFIX')' + _p9k_get_icon MULTILINE_FIRST_PROMPT_PREFIX + PROMPT="$_P9K_RETVAL%f%b%k$left$NEWLINE" + _p9k_get_icon MULTILINE_LAST_PROMPT_PREFIX + PROMPT+=$_P9K_RETVAL if [[ "$POWERLEVEL9K_RPROMPT_ON_NEWLINE" != true ]]; then # The right prompt should be on the same line as the first line of the left # prompt. To do so, there is just a quite ugly workaround: Before zsh draws @@ -1833,20 +2090,17 @@ $(print_icon 'MULTILINE_LAST_PROMPT_PREFIX')' RPROMPT_SUFFIX='' fi else - PROMPT='%f%b%k$(build_left_prompt)' + PROMPT="%f%b%k$left" RPROMPT_PREFIX='' RPROMPT_SUFFIX='' fi if [[ "$POWERLEVEL9K_DISABLE_RPROMPT" != true ]]; then - RPROMPT="${RPROMPT_PREFIX}"'%f%b%k$(build_right_prompt)%{$reset_color%}'"${RPROMPT_SUFFIX}" + RPROMPT="${RPROMPT_PREFIX}%f%b%k$right%{$reset_color%}${RPROMPT_SUFFIX}" fi -local NEWLINE=' -' - if [[ $POWERLEVEL9K_PROMPT_ADD_NEWLINE == true ]]; then - NEWLINES="" + local NEWLINES="" repeat ${POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT:-1} { NEWLINES+=$NEWLINE } PROMPT="$NEWLINES$PROMPT" fi @@ -1855,6 +2109,29 @@ local NEWLINE=' [[ $ITERM_SHELL_INTEGRATION_INSTALLED == "Yes" ]] && PROMPT="%{$(iterm2_prompt_mark)%}$PROMPT" } +typeset -fH _p9k_update_prompts() { + [[ $_P9K_LOADED == true ]] || return + typeset -gH _P9K_REFRESH_PROMPT='' + _p9k_set_prompts + unset _P9K_REFRESH_PROMPT + zle && zle .reset-prompt +} + +set_default POWERLEVEL9K_PROMPT_ADD_NEWLINE false +powerlevel9k_prepare_prompts() { + # Return values. These need to be global, because + # they are used in prompt_status. Also, we need + # to get the return value of the last command at + # very first in this function. Do not move the + # lines down, otherwise the last command is not + # what you expected it to be. + RETVAL=$? + RETVALS=( "$pipestatus[@]" ) + _P9K_COMMAND_DURATION=$((EPOCHREALTIME - _P9K_TIMER_START)) + _P9K_TIMER_START=0x7FFFFFFF + _p9k_set_prompts +} + zle-keymap-select () { zle reset-prompt zle -R @@ -1896,9 +2173,6 @@ prompt_powerlevel9k_setup() { fi fi - defined POWERLEVEL9K_LEFT_PROMPT_ELEMENTS || POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context dir vcs) - defined POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS || POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status root_indicator background_jobs history time) - # Display a warning if deprecated segments are in use. typeset -AH deprecated_segments # old => new @@ -1928,6 +2202,36 @@ prompt_powerlevel9k_setup() { add-zsh-hook preexec powerlevel9k_preexec zle -N zle-keymap-select + + local -i max_dirty=${POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY:--1} + [[ $POWERLEVEL9K_DISABLE_GITSTATUS == true ]] || gitstatus_start -m $max_dirty POWERLEVEL9K + + if [[ $POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME == true ]]; then + local fifo && fifo=$(mktemp -u "${TMPDIR:-/tmp}"/p10k.$$.pipe.time.XXXXXXXXXX) + typeset -giH _P9K_TIMER_FD=0 + _p9k_start_timer() { + emulate -L zsh + setopt err_return + unsetopt bg_nice + mkfifo $fifo + exec {_P9K_TIMER_FD}<>$fifo + typeset -gfH _p9k_on_timer() { + local _ && IFS='' read -u $_P9K_TIMER_FD _ && zle && zle .reset-prompt + } + zle -F $_P9K_TIMER_FD _p9k_on_timer + zsh -c "while kill -0 $$; do sleep 1; echo; done" >&$_P9K_TIMER_FD 2>/dev/null &! + } + if ! _p9k_start_timer ; then + echo "powerlevel10k: failed to initialize realtime clock" >&2 + zle -F $_P9K_TIMER_FD + (( _P9K_TIMER_FD )) && exec {_P9K_TIMER_FD}>&- + unset _P9K_TIMER_FD + unset -f _p9k_on_timer + fi + rm -f "$fifo" + fi + + _P9K_LOADED=true } prompt_powerlevel9k_teardown() { @@ -1935,6 +2239,7 @@ prompt_powerlevel9k_teardown() { add-zsh-hook -D preexec powerlevel9k_\* PROMPT='%m%# ' RPROMPT= + _P9K_LOADED=false } prompt_powerlevel9k_setup "$@" diff --git a/prompt.png b/prompt.png Binary files differnew file mode 100644 index 00000000..104b550b --- /dev/null +++ b/prompt.png diff --git a/prompt_powerlevel10k_setup b/prompt_powerlevel10k_setup new file mode 120000 index 00000000..866a1f4a --- /dev/null +++ b/prompt_powerlevel10k_setup @@ -0,0 +1 @@ +prompt_powerlevel9k_setup
\ No newline at end of file diff --git a/shunit2 b/shunit2 deleted file mode 160000 -Subproject 07bb3292048a4982aad7247bdd7890f2bf532ec diff --git a/test-bsd-vm/Vagrantfile b/test-bsd-vm/Vagrantfile deleted file mode 100644 index 7df512a3..00000000 --- a/test-bsd-vm/Vagrantfile +++ /dev/null @@ -1,87 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -# All Vagrant configuration is done below. The "2" in Vagrant.configure -# configures the configuration version (we support older styles for -# backwards compatibility). Please don't change it unless you know what -# you're doing. -Vagrant.configure("2") do |config| - # The most common configuration options are documented and commented below. - # For a complete reference, please see the online documentation at - # https://docs.vagrantup.com. - - # Every Vagrant development environment requires a box. You can search for - # boxes at https://atlas.hashicorp.com/search. - config.vm.box = "freebsd/FreeBSD-11.0-STABLE" - - # Bootstrap - config.vm.provision :shell, path: "bootstrap-zero.sh", privileged: true - config.vm.provision :shell, path: "bootstrap.sh", privileged: false - config.vm.provision :shell, path: "../test-vm-providers/plain.sh", privileged: false - - # Disable automatic box update checking. If you disable this, then - # boxes will only be checked for updates when the user runs - # `vagrant box outdated`. This is not recommended. - # config.vm.box_check_update = false - - # Create a forwarded port mapping which allows access to a specific port - # within the machine from a port on the host machine. In the example below, - # accessing "localhost:8080" will access port 80 on the guest machine. - # config.vm.network "forwarded_port", guest: 80, host: 8080 - - # Create a private network, which allows host-only access to the machine - # using a specific IP. - config.vm.network "private_network", ip: "192.168.33.10" - - # Create a public network, which generally matched to bridged network. - # Bridged networks make the machine appear as another physical device on - # your network. - #config.vm.network "public_network" - - # The BSD base box does not define a MAC address. Whysoever. - config.vm.base_mac = "8AAB4975994A" - - # There is no BASH for root on BSD. We need to set another shell. - # See https://www.freebsd.org/doc/en/articles/linux-users/shells.html - config.ssh.shell = "/bin/sh" - - # Share an additional folder to the guest VM. The first argument is - # the path on the host to the actual folder. The second argument is - # the path on the guest to mount the folder. And the optional third - # argument is a set of non-required options. - config.vm.synced_folder "..", "/vagrant_data", type: "nfs" - config.vm.synced_folder ".", "/vagrant", type: "nfs" - - # Provider-specific configuration so you can fine-tune various - # backing providers for Vagrant. These expose provider-specific options. - # Example for VirtualBox: - config.vm.provider "virtualbox" do |vb| - - # Change name to "powerlevel9k-bsd" - vb.name = "powerlevel9k-bsd" - - # Display the VirtualBox GUI when booting the machine - #vb.gui = true - - # Customize the amount of memory on the VM: - vb.memory = "256" - end - - # View the documentation for the provider you are using for more - # information on available options. - - # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies - # such as FTP and Heroku are also available. See the documentation at - # https://docs.vagrantup.com/v2/push/atlas.html for more information. - # config.push.define "atlas" do |push| - # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME" - # end - - # Enable provisioning with a shell script. Additional provisioners such as - # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the - # documentation for more information about their specific syntax and use. - # config.vm.provision "shell", inline: <<-SHELL - # apt-get update - # apt-get install -y apache2 - # SHELL -end diff --git a/test-bsd-vm/bootstrap-zero.sh b/test-bsd-vm/bootstrap-zero.sh deleted file mode 100644 index 35dcd7f3..00000000 --- a/test-bsd-vm/bootstrap-zero.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -pkg install -y sudo
\ No newline at end of file diff --git a/test-bsd-vm/bootstrap.sh b/test-bsd-vm/bootstrap.sh deleted file mode 100644 index ba27ffb3..00000000 --- a/test-bsd-vm/bootstrap.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -# Install ZSH -sudo pkg install -y zsh -sudo chsh -s `which zsh` vagrant -sudo ln -s /usr/local/bin/zsh /usr/bin/zsh - -# Install git -sudo pkg install -y git -# Install mercurial -sudo pkg install -y mercurial -# Install subversion -sudo pkg install -y subversion
\ No newline at end of file diff --git a/test-in-docker b/test-in-docker deleted file mode 100755 index 0ed1254f..00000000 --- a/test-in-docker +++ /dev/null @@ -1,200 +0,0 @@ -#!/usr/bin/env zsh - -set -eu - -# The default ZSH to use; it can just be the first few characters. -# This should be the oldest version we support. -default_version='4.' - -setopt extended_glob glob_subst numeric_glob_sort -setopt warn_create_global warn_nested_var 2> /dev/null -cd "${${(%):-%x}:A:h}" - -# TODO: Crazy Logic to munge TERM to something supported in Ubuntu 14.04 -term=screen-256color - -# Note: If versions and frameworks looks complicated, it isn't that bad... -# ...see Modifiers in zshexpn(1) for details. - -# List of ZSH versions -typeset -aU versions -versions=( docker/base-*/Dockerfile(N.on:h:t:s/base-//) ) -typeset -r versions - -# List of frameworks -typeset -aU frameworks -frameworks=( docker/*/Dockerfile(N.on:h:t) ) -for i in {$#frameworks..1}; do - # Remove all base entries - [[ "${frameworks[$i]}" == base-* ]] && frameworks[$i]=() -done -typeset -r frameworks - -# Known Issues -typeset -A known_issues -known_issues["4.3.11-antigen"]="Antigen commands that need git won't work; it needs a newer version of git." -known_issues["4.3.11-zim"]="BROKEN: Zim wants ZSH 5.2 or newer." -known_issues["5.0.3-zim"]="DEPRECATED: Zim wants ZSH 5.2 or newer." -known_issues["5.1.1-zim"]="DEPRECATED: Zim wants ZSH 5.2 or newer." -known_issues["4.3.11-zulu"]="Zulu doesn't work; it needs a newer version of git." -typeset -r known_issues - -err() -{ - print -P "%F{red}Error:%f $*" - exit 2 -} - -resolve_framework() { - local f=$1 found - found=${frameworks[(In:-1:)$f*]} - if (( found <= $#frameworks )); then - echo "${frameworks[$found]}" - fi -} - -resolve_version() { - local v=$1 found - found=${versions[(In:-1:)$v*]} - if (( found <= $#versions )); then - echo "${versions[$found]}" - fi -} - -check_for_known_issues() { - local version="$1" - local framework="$2" - local name="${version}-${framework}" - - if (( ${+known_issues["$name"]} )); then - echo - print -P "%F{red}Known Issue: %F{yellow}${known_issues["$name"]}%f" - echo - fi -} - -cmd() { - if (( dry_run )); then - echo "${(@q)*}" 1>&2 - else - "${(@)*}" - fi -} - -build_and_run() { - local version="$1" - local framework="$2" - local name="${version}-${framework}" - - check_for_known_issues "$version" "$framework" - - print -P "%F{green}Preparing containers...%f" - - echo -n "p9k:base-${version}: " - cmd docker build \ - --quiet \ - --tag "p9k:base-${version}" \ - --file "docker/base-${version}/Dockerfile" \ - . - - echo -n "p9k:${version}-${framework}: " - cmd docker build \ - --quiet \ - --build-arg="base=base-${version}" \ - --tag "p9k:${version}-${framework}" \ - --file "docker/${framework}/Dockerfile" \ - . - - print -P "%F{green}Starting ${name} container...%f" - cmd docker run \ - --rm \ - --interactive \ - --tty \ - --hostname="${name//./_}" \ - --env="TERM=${term}" \ - "p9k:${version}-${framework}" -} - -show_help() { - local f v - echo "Usage: ${(%):-%x} <framework>|--list" - echo - echo "Loads up a docker image with powershell9k configured in <framework>" - echo - echo " -f --frameworks Lists all available frameworks, newline separated." - echo " -v --versions Lists all available ZSH versions, newline separated." - echo " -z --zsh VER Uses ZSH with version VER." - echo " -n --dry-run Just prints the docker commands that would be run." - echo " --help You're soaking in it." - echo - echo "ZSH versions:" - for v in "${(@)versions}"; do - echo " $v" - done - echo - echo "Framework containers:" - for f in "${(@)frameworks}"; do - echo " $f" - done -} - -# No arguments -if (( $# == 0 )); then - show_help - exit -fi - -# Parse flags and such. -asked_for_version=$default_version -asked_for_framework= -dry_run=0 -while (( $# > 0 )); do - case "$1" in - -f | --frameworks ) - print -l "${(@)frameworks}" - exit - ;; - -v | --versions ) - print -l "${(@)versions}" - exit - ;; - -z | --zsh ) - shift - asked_for_version=$1 - ;; - -n | --dry-run ) dry_run=1 ;; - -h | --help ) - show_help - exit - ;;; - -* ) - err "Unknown option ${1}" - show_help - exit 1 - ;; - * ) - if [[ -z "$asked_for_framework" ]]; then - asked_for_framework=$1 - else - err "You can only specify one framework at a time; you already specified '${asked_for_framework}'" - fi - ;; - esac - shift -done - -typeset -r asked_for_version asked_for_framework - -typeset -r use_version="$(resolve_version "${asked_for_version}")" -if [[ -z "$use_version" ]]; then - err "No such ZSH version '${asked_for_version}'" -fi - -typeset -r use_framework="$(resolve_framework "${asked_for_framework}")" -if [[ -z "$use_framework" ]]; then - err "No such framework '${asked_for_framework}'" -fi - -build_and_run "$use_version" "$use_framework" - -# EOF diff --git a/test-vm-providers/plain.sh b/test-vm-providers/plain.sh deleted file mode 100644 index b827a0c4..00000000 --- a/test-vm-providers/plain.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/zsh - -echo 'LANG=en_US.UTF-8' >! ~/.zshrc -echo 'source /vagrant_data/powerlevel9k.zsh-theme' >> ~/.zshrc - -echo 'echo "Have a look at the ~/p9k folder for prepared test setups."' >> ~/.zshrc - -# setup environment -/vagrant_data/test-vm-providers/setup-environment.sh
\ No newline at end of file diff --git a/test-vm-providers/setup-environment.sh b/test-vm-providers/setup-environment.sh deleted file mode 100755 index 0e8beb6d..00000000 --- a/test-vm-providers/setup-environment.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/zsh - -OLDPWD="$(pwd)" -cd $HOME - -TESTFOLDER="${HOME}/p9k" -mkdir -p $TESTFOLDER -cd $TESTFOLDER - -# Make a deep test folder -mkdir -p deep-folder/1/12/123/1234/12345/123456/1234567/123455678/123456789 - -# Make a git repo -mkdir git-repo -cd git-repo -git config --global user.email "test@powerlevel9k.theme" -git config --global user.name "Testing Tester" -git init -echo "TEST" >> testfile -git add testfile -git commit -m "Initial commit" -cd $TESTFOLDER - -# Make a Mercurial repo -mkdir hg-repo -cd hg-repo -export HGUSER="Test bot <bot@example.com>" -hg init -echo "TEST" >> testfile -hg add testfile -hg ci -m "Initial commit" -cd $TESTFOLDER - -# Setup a SVN folder -svnadmin create ~/.svn-repo -mkdir svn-repo -svn checkout "file://${HOME}/.svn-repo" "svn-repo" -cd svn-repo -echo "TEST" >> testfile -svn add testfile -svn commit -m "Initial commit" -cd $TESTFOLDER - -cd $OLDPWD
\ No newline at end of file diff --git a/test-vm/README.md b/test-vm/README.md deleted file mode 100644 index 9f0861e9..00000000 --- a/test-vm/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Test-VM for powerlevel9k - -In this virtual machine you will find a recent ubuntu with preinstalled ZSH, oh-my-zsh, antigen, prezto and - of course - powerlevel9k. The main use-case is to test the powerlevel9k theme. - -## Installation - -In order to run this virtual machine, you need [vagrant](https://www.vagrantup.com/) and [VirtualBox](http://www.virtualbox.org/). - -## Running - -`vagrant` is a quite easy to use command line tool to configure a virtual machine. To fire the machine up, just run `vagrant up`. At the first run, it will install a whole ubuntu. With `vagrant ssh` you can log in into the machine. - -## Testing - -Once you have SSH'd into the machine, you'll see a plain ZSH. To test the other frameworks, you just have to switch to one of the following users: - - * `vagrant-antigen` - * `vagrant-prezto` - * `vagrant-omz` - -To switch use `sudo -i -H -u <USERNAME>`. `-i` stands for "simulate initial login", `-H` sets the "$HOME" variable to the directory of the user , `-u` for the username. - -All users have `vagrant` as password and are in the /etc/sudoers. - -The regular `vagrant` user has a plain ZSH with the powerlevel9k theme. diff --git a/test-vm/Vagrantfile b/test-vm/Vagrantfile deleted file mode 100644 index a421c706..00000000 --- a/test-vm/Vagrantfile +++ /dev/null @@ -1,82 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -# All Vagrant configuration is done below. The "2" in Vagrant.configure -# configures the configuration version (we support older styles for -# backwards compatibility). Please don't change it unless you know what -# you're doing. -Vagrant.configure(2) do |config| - # The most common configuration options are documented and commented below. - # For a complete reference, please see the online documentation at - # https://docs.vagrantup.com. - - # Every Vagrant development environment requires a box. You can search for - # boxes at https://atlas.hashicorp.com/search. - config.vm.box = "ubuntu/precise64" - - # Bootstrap - config.vm.provision :shell, path: "bootstrap.sh", privileged: false - config.vm.provision :shell, path: "../test-vm-providers/plain.sh", privileged: false - config.vm.provision :shell, path: "antigen.sh" - config.vm.provision :shell, path: "prezto.sh" - config.vm.provision :shell, path: "omz.sh" - - # Disable automatic box update checking. If you disable this, then - # boxes will only be checked for updates when the user runs - # `vagrant box outdated`. This is not recommended. - # config.vm.box_check_update = false - - # Create a forwarded port mapping which allows access to a specific port - # within the machine from a port on the host machine. In the example below, - # accessing "localhost:8080" will access port 80 on the guest machine. - # config.vm.network "forwarded_port", guest: 80, host: 8080 - - # Create a private network, which allows host-only access to the machine - # using a specific IP. - # config.vm.network "private_network", ip: "192.168.33.10" - - # Create a public network, which generally matched to bridged network. - # Bridged networks make the machine appear as another physical device on - # your network. - # config.vm.network "public_network" - - # Share an additional folder to the guest VM. The first argument is - # the path on the host to the actual folder. The second argument is - # the path on the guest to mount the folder. And the optional third - # argument is a set of non-required options. - config.vm.synced_folder "..", "/vagrant_data" - - # Provider-specific configuration so you can fine-tune various - # backing providers for Vagrant. These expose provider-specific options. - # Example for VirtualBox: - - config.vm.provider "virtualbox" do |vb| - - # Change name to "powerlevel9k" - vb.name = "powerlevel9k" - - # Display the VirtualBox GUI when booting the machine - #vb.gui = true - - # Customize the amount of memory on the VM: - vb.memory = "256" - end - # - # View the documentation for the provider you are using for more - # information on available options. - - # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies - # such as FTP and Heroku are also available. See the documentation at - # https://docs.vagrantup.com/v2/push/atlas.html for more information. - # config.push.define "atlas" do |push| - # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME" - # end - - # Enable provisioning with a shell script. Additional provisioners such as - # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the - # documentation for more information about their specific syntax and use. - # config.vm.provision "shell", inline: <<-SHELL - # sudo apt-get update - # sudo apt-get install -y apache2 - # SHELL -end diff --git a/test-vm/antigen.sh b/test-vm/antigen.sh deleted file mode 100644 index 2c563322..00000000 --- a/test-vm/antigen.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/zsh -# We need to run this script in ZSH, so that switching user works! -NEW_USER=vagrant-antigen -# Create User -PASSWORD='$6$OgLg9v2Z$Db38Jr9inZG7y8BzL8kqFK23fF5jZ7FU1oiIBLFjNYR9XVX03fwQayMgA6Rm1rzLbXaf.gkZaTWhB9pv5XLq11' -useradd -p $PASSWORD -g vagrant -s $(which zsh) -m $NEW_USER -echo "$NEW_USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$NEW_USER -chmod 440 /etc/sudoers.d/$NEW_USER - -( - # Change User (See http://unix.stackexchange.com/questions/86778/why-cant-we-execute-a-list-of-commands-as-different-user-without-sudo) - USERNAME=$NEW_USER - #UID=$(id -u $NEW_USER) - #EUID=$(id -u $NEW_USER) - HOME=/home/$NEW_USER - - echo " -source ~/antigen/antigen.zsh\n -antigen theme /vagrant_data powerlevel9k --no-local-clone\n -antigen apply -" > ~/.zshrc - - # install antigen - mkdir ~/antigen - curl -qL https://raw.githubusercontent.com/zsh-users/antigen/master/antigen.zsh > ~/antigen/antigen.zsh - source ~/antigen/antigen.zsh - - # setup environment - /vagrant_data/test-vm-providers/setup-environment.sh -) diff --git a/test-vm/bootstrap.sh b/test-vm/bootstrap.sh deleted file mode 100644 index f680d4b8..00000000 --- a/test-vm/bootstrap.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -#sudo apt-get update - -sudo apt-get install -y curl -sudo apt-get install -y git - -sudo apt-get install -y zsh -sudo chsh -s $(which zsh) vagrant - -# Install mercurial -sudo apt-get install -y mercurial -# Install Subversion -sudo apt-get install -y subversion -# install golang -echo 'golang-go golang-go/dashboard boolean false' | sudo debconf-set-selections -sudo apt-get install -y golang -# Install dependencies for tests -sudo apt-get install -y jq node ruby python python-virtualenv
\ No newline at end of file diff --git a/test-vm/omz.sh b/test-vm/omz.sh deleted file mode 100644 index 73b659f3..00000000 --- a/test-vm/omz.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/zsh -# We need to run this script in ZSH, so that switching user works! -NEW_USER=vagrant-omz -# Create User -PASSWORD='$6$OgLg9v2Z$Db38Jr9inZG7y8BzL8kqFK23fF5jZ7FU1oiIBLFjNYR9XVX03fwQayMgA6Rm1rzLbXaf.gkZaTWhB9pv5XLq11' -useradd -p $PASSWORD -g vagrant -s $(which zsh) -m $NEW_USER -echo "$NEW_USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$NEW_USER -chmod 440 /etc/sudoers.d/$NEW_USER - -( - # Change User (See http://unix.stackexchange.com/questions/86778/why-cant-we-execute-a-list-of-commands-as-different-user-without-sudo) - USERNAME=$NEW_USER - #UID=$(id -u $NEW_USER) - #EUID=$(id -u $NEW_USER) - HOME=/home/$NEW_USER - SHELL=$(which zsh) - - sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" - - mkdir -p ~/.oh-my-zsh/custom/themes - ln -s /vagrant_data ~/.oh-my-zsh/custom/themes/powerlevel9k - - echo ' -export ZSH=$HOME/.oh-my-zsh -ZSH_THEME="powerlevel9k/powerlevel9k" -plugins=(git rake ruby) - -source $ZSH/oh-my-zsh.sh -' > $HOME/.zshrc - - # setup environment - /vagrant_data/test-vm-providers/setup-environment.sh -) diff --git a/test-vm/prezto.sh b/test-vm/prezto.sh deleted file mode 100644 index 3ac38503..00000000 --- a/test-vm/prezto.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/zsh -# We need to run this script in ZSH, so that switching user works! -NEW_USER=vagrant-prezto -# Create User -PASSWORD='$6$OgLg9v2Z$Db38Jr9inZG7y8BzL8kqFK23fF5jZ7FU1oiIBLFjNYR9XVX03fwQayMgA6Rm1rzLbXaf.gkZaTWhB9pv5XLq11' -useradd -p $PASSWORD -g vagrant -s $(which zsh) -m $NEW_USER -echo "$NEW_USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$NEW_USER -chmod 440 /etc/sudoers.d/$NEW_USER - -( - # Change User (See http://unix.stackexchange.com/questions/86778/why-cant-we-execute-a-list-of-commands-as-different-user-without-sudo) - USERNAME=$NEW_USER - #UID=$(id -u $NEW_USER) - #EUID=$(id -u $NEW_USER) - HOME=/home/$NEW_USER - - git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto" - - setopt EXTENDED_GLOB - for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do - ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}" - done - - ln -s /vagrant_data/powerlevel9k.zsh-theme ~/.zprezto/modules/prompt/functions/prompt_powerlevel9k_setup - sed -i "s/theme\ 'sorin'/theme\ 'powerlevel9k'/g" ~/.zpreztorc - - # setup environment - /vagrant_data/test-vm-providers/setup-environment.sh -) diff --git a/test/core/color_overriding.spec b/test/core/color_overriding.spec deleted file mode 100755 index e23d3aaa..00000000 --- a/test/core/color_overriding.spec +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - # Load Powerlevel9k - source powerlevel9k.zsh-theme -} - -function testDynamicColoringOfSegmentsWork() { - local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(date) - local POWERLEVEL9K_DATE_ICON="date-icon" - local POWERLEVEL9K_DATE_BACKGROUND='red' - - assertEquals "%K{001} %F{000}date-icon %F{000}%D{%d.%m.%y} %k%F{001}%f " "$(build_left_prompt)" -} - -function testDynamicColoringOfVisualIdentifiersWork() { - local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(date) - local POWERLEVEL9K_DATE_ICON="date-icon" - local POWERLEVEL9K_DATE_VISUAL_IDENTIFIER_COLOR='green' - - assertEquals "%K{007} %F{002}date-icon %F{000}%D{%d.%m.%y} %k%F{007}%f " "$(build_left_prompt)" -} - -function testColoringOfVisualIdentifiersDoesNotOverwriteColoringOfSegment() { - local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(date) - local POWERLEVEL9K_DATE_ICON="date-icon" - local POWERLEVEL9K_DATE_VISUAL_IDENTIFIER_COLOR='green' - local POWERLEVEL9K_DATE_FOREGROUND='red' - local POWERLEVEL9K_DATE_BACKGROUND='yellow' - - assertEquals "%K{003} %F{002}date-icon %F{001}%D{%d.%m.%y} %k%F{003}%f " "$(build_left_prompt)" -} - -function testColorOverridingOfStatefulSegment() { - local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(host) - local POWERLEVEL9K_SSH_ICON="ssh-icon" - local POWERLEVEL9K_HOST_REMOTE_BACKGROUND='red' - local POWERLEVEL9K_HOST_REMOTE_FOREGROUND='green' - # Provoke state - local SSH_CLIENT="x" - - assertEquals "%K{001} %F{002}ssh-icon %F{002}%m %k%F{001}%f " "$(build_left_prompt)" -} - -function testColorOverridingOfCustomSegment() { - local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - local POWERLEVEL9K_CUSTOM_WORLD_ICON='CW' - local POWERLEVEL9K_CUSTOM_WORLD_VISUAL_IDENTIFIER_COLOR='green' - local POWERLEVEL9K_CUSTOM_WORLD_FOREGROUND='red' - local POWERLEVEL9K_CUSTOM_WORLD_BACKGROUND='red' - - assertEquals "%K{001} %F{002}CW %F{001}world %k%F{001}%f " "$(build_left_prompt)" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/core/joining_segments.spec b/test/core/joining_segments.spec deleted file mode 100755 index 18213a52..00000000 --- a/test/core/joining_segments.spec +++ /dev/null @@ -1,187 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - # Load Powerlevel9k - source powerlevel9k.zsh-theme -} - -function testLeftNormalSegmentsShouldNotBeJoined() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3 custom_world4_joined custom_world5 custom_world6) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo world2" - local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD4="echo world4" - local POWERLEVEL9K_CUSTOM_WORLD5="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD6="echo world6" - - assertEquals "%K{007} %F{000}world1 %K{007}%F{000} %F{000}world2 %K{007}%F{000} %F{000}world4 %K{007}%F{000} %F{000}world6 %k%F{007}%f " "$(build_left_prompt)" -} - -function testLeftJoinedSegments() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2_joined) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo world2" - - assertEquals "%K{007} %F{000}world1 %K{007}%F{000}%F{000}world2 %k%F{007}%f " "$(build_left_prompt)" -} - -function testLeftTransitiveJoinedSegments() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2_joined custom_world3_joined) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo world2" - local POWERLEVEL9K_CUSTOM_WORLD3="echo world3" - - assertEquals "%K{007} %F{000}world1 %K{007}%F{000}%F{000}world2 %K{007}%F{000}%F{000}world3 %k%F{007}%f " "$(build_left_prompt)" -} - -function testLeftTransitiveJoiningWithConditionalJoinedSegment() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2_joined custom_world3_joined custom_world4_joined) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo world2" - local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD4="echo world4" - - assertEquals "%K{007} %F{000}world1 %K{007}%F{000}%F{000}world2 %K{007}%F{000}%F{000}world4 %k%F{007}%f " "$(build_left_prompt)" -} - -function testLeftPromotingSegmentWithConditionalPredecessor() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3_joined) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD3="echo world3" - - assertEquals "%K{007} %F{000}world1 %K{007}%F{000} %F{000}world3 %k%F{007}%f " "$(build_left_prompt)" -} - -function testLeftPromotingSegmentWithJoinedConditionalPredecessor() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3_joined custom_world4_joined) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD4="echo world4" - - assertEquals "%K{007} %F{000}world1 %K{007}%F{000} %F{000}world4 %k%F{007}%f " "$(build_left_prompt)" -} - -function testLeftPromotingSegmentWithDeepJoinedConditionalPredecessor() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3_joined custom_world4_joined custom_world5_joined custom_world6_joined) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD4="echo world4" - local POWERLEVEL9K_CUSTOM_WORLD5="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD6="echo world6" - - assertEquals "%K{007} %F{000}world1 %K{007}%F{000} %F{000}world4 %K{007}%F{000}%F{000}world6 %k%F{007}%f " "$(build_left_prompt)" -} - -function testLeftJoiningBuiltinSegmentWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(php_version php_version_joined) - alias php="echo PHP 1.2.3" - - assertEquals "%K{013} %F{255}PHP 1.2.3 %K{013}%F{255}%F{255}PHP 1.2.3 %k%F{013}%f " "$(build_left_prompt)" - - unalias php -} - -function testRightNormalSegmentsShouldNotBeJoined() { - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3 custom_world4 custom_world5_joined custom_world6) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo world2" - local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD4="echo world4" - local POWERLEVEL9K_CUSTOM_WORLD5="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD6="echo world6" - - assertEquals "%F{007}%f%K{007}%F{000} world1 %f%F{000}%f%K{007}%F{000} world2 %f%F{000}%f%K{007}%F{000} world4 %f%F{000}%f%K{007}%F{000} world6%E" "$(build_right_prompt)" -} - -function testRightJoinedSegments() { - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2_joined) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo world2" - - assertEquals "%F{007}%f%K{007}%F{000} world1 %f%K{007}%F{000}world2%E" "$(build_right_prompt)" -} - -function testRightTransitiveJoinedSegments() { - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2_joined custom_world3_joined) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo world2" - local POWERLEVEL9K_CUSTOM_WORLD3="echo world3" - - assertEquals "%F{007}%f%K{007}%F{000} world1 %f%K{007}%F{000}world2 %f%K{007}%F{000}world3%E" "$(build_right_prompt)" -} - -function testRightTransitiveJoiningWithConditionalJoinedSegment() { - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2_joined custom_world3_joined custom_world4_joined) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo world2" - local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD4="echo world4" - - assertEquals "%F{007}%f%K{007}%F{000} world1 %f%K{007}%F{000}world2 %f%K{007}%F{000}world4%E" "$(build_right_prompt)" -} - -function testRightPromotingSegmentWithConditionalPredecessor() { - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3_joined) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD3="echo world3" - - assertEquals "%F{007}%f%K{007}%F{000} world1 %f%F{000}%f%K{007}%F{000} world3%E" "$(build_right_prompt)" -} - -function testRightPromotingSegmentWithJoinedConditionalPredecessor() { - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3_joined custom_world4_joined) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD4="echo world4" - - assertEquals "%F{007}%f%K{007}%F{000} world1 %f%F{000}%f%K{007}%F{000} world4%E" "$(build_right_prompt)" -} - -function testRightPromotingSegmentWithDeepJoinedConditionalPredecessor() { - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2 custom_world3_joined custom_world4_joined custom_world5_joined custom_world6_joined) - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD3="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD4="echo world4" - local POWERLEVEL9K_CUSTOM_WORLD5="echo " # Print nothing to simulate unmet conditions - local POWERLEVEL9K_CUSTOM_WORLD6="echo world6" - - assertEquals "%F{007}%f%K{007}%F{000} world1 %f%F{000}%f%K{007}%F{000} world4 %f%K{007}%F{000}world6%E" "$(build_right_prompt)" -} - -function testRightJoiningBuiltinSegmentWorks() { - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(php_version php_version_joined) - alias php="echo PHP 1.2.3" - - assertEquals "%F{013}%f%K{013}%F{255} PHP 1.2.3 %f%K{013}%F{255}PHP 1.2.3%E" "$(build_right_prompt)" - - unalias php -} -source shunit2/shunit2
\ No newline at end of file diff --git a/test/core/prompt.spec b/test/core/prompt.spec deleted file mode 100755 index 47d3ac7b..00000000 --- a/test/core/prompt.spec +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - # Load Powerlevel9k - source powerlevel9k.zsh-theme -} - -function testSegmentOnRightSide() { - # Reset RPROMPT, so a running P9K does not interfere with the test - local RPROMPT= - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2) - local POWERLEVEL9K_CUSTOM_WORLD1='echo world1' - local POWERLEVEL9K_CUSTOM_WORLD2='echo world2' - - powerlevel9k_prepare_prompts - - local reset_attributes=$'\e[00m' - assertEquals "%f%b%k%F{007}%f%K{007}%F{000} world1 %f%F{000}%f%K{007}%F{000} world2%E%{${reset_attributes}%}" "${(e)RPROMPT}" -} - -function testDisablingRightPrompt() { - # Reset RPROMPT, so a running P9K does not interfere with the test - local RPROMPT= - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1 custom_world2) - local POWERLEVEL9K_CUSTOM_WORLD1='echo world1' - local POWERLEVEL9K_CUSTOM_WORLD2='echo world2' - local POWERLEVEL9K_DISABLE_RPROMPT=true - - powerlevel9k_prepare_prompts - - assertEquals "" "${(e)RPROMPT}" -} - -function testLeftMultilinePrompt() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1) - local POWERLEVEL9K_CUSTOM_WORLD1='echo world1' - local POWERLEVEL9K_PROMPT_ON_NEWLINE=true - - powerlevel9k_prepare_prompts - - local nl=$'\n' - assertEquals "╭─%f%b%k%K{007} %F{000}world1 %k%F{007}%f ${nl}╰─ " "${(e)PROMPT}" -} - -function testRightPromptOnSameLine() { - # Reset RPROMPT, so a running P9K does not interfere with the test - local RPROMPT= - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1) - local POWERLEVEL9K_CUSTOM_WORLD1='echo world1' - - local POWERLEVEL9K_PROMPT_ON_NEWLINE=true - local POWERLEVEL9K_RPROMPT_ON_NEWLINE=false # We want the RPROMPT on the same line as our left prompt - - # Skip test, as this cannot be tested properly. - # The "go one line up" instruction does not get - # printed as real characters in RPROMPT. - # On command line the assert statement produces - # a visually identical output as we expect, but - # it fails anyway. :( - startSkipping - - powerlevel9k_prepare_prompts - assertEquals "%{\e[1A%}%F{007}%f%K{007}%F{000} world1 %f%{\e[1B%}" "${(e)RPROMPT}" -} - -function testPrefixingFirstLineOnLeftPrompt() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1) - local POWERLEVEL9K_CUSTOM_WORLD1='echo world1' - - local POWERLEVEL9K_PROMPT_ON_NEWLINE=true - local POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='XXX' - - powerlevel9k_prepare_prompts - - local nl=$'\n' - assertEquals "XXX%f%b%k%K{007} %F{000}world1 %k%F{007}%f ${nl}╰─ " "${(e)PROMPT}" -} - -function testPrefixingSecondLineOnLeftPrompt() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1) - local POWERLEVEL9K_CUSTOM_WORLD1='echo world1' - - local POWERLEVEL9K_PROMPT_ON_NEWLINE=true - local POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX='XXX' - - powerlevel9k_prepare_prompts - - local nl=$'\n' - assertEquals "╭─%f%b%k%K{007} %F{000}world1 %k%F{007}%f ${nl}XXX" "${(e)PROMPT}" -} - -source shunit2/shunit2 diff --git a/test/core/visual_identifier.spec b/test/core/visual_identifier.spec deleted file mode 100755 index 33815f79..00000000 --- a/test/core/visual_identifier.spec +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - # Load Powerlevel9k - source powerlevel9k.zsh-theme - source functions/* -} - -function testOverwritingIconsWork() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1) - local POWERLEVEL9K_CUSTOM_WORLD1='echo world1' - local POWERLEVEL9K_CUSTOM_WORLD1_ICON='icon-here' - - assertEquals "%K{007} %F{000}icon-here %F{000}world1 %k%F{007}%f " "$(build_left_prompt)" -} - -function testVisualIdentifierAppearsBeforeSegmentContentOnLeftSegments() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1) - local POWERLEVEL9K_CUSTOM_WORLD1='echo world1' - local POWERLEVEL9K_CUSTOM_WORLD1_ICON='icon-here' - - assertEquals "%K{007} %F{000}icon-here %F{000}world1 %k%F{007}%f " "$(build_left_prompt)" -} - -function testVisualIdentifierAppearsAfterSegmentContentOnRightSegments() { - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_world1) - local POWERLEVEL9K_CUSTOM_WORLD1='echo world1' - local POWERLEVEL9K_CUSTOM_WORLD1_ICON='icon-here' - - assertEquals "%F{007}%f%K{007}%F{000} world1%F{000} icon-here%E" "$(build_right_prompt)" -} - -function testVisualIdentifierPrintsNothingIfNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1) - local POWERLEVEL9K_CUSTOM_WORLD1='echo world1' - - assertEquals "%K{007} %F{000}world1 %k%F{007}%f " "$(build_left_prompt)" -} - -function testVisualIdentifierIsPrintedInNumericalColorCode() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1) - local POWERLEVEL9K_CUSTOM_WORLD1='echo world1' - local POWERLEVEL9K_CUSTOM_WORLD1_ICON="xxx" - local POWERLEVEL9K_CUSTOM_WORLD1_VISUAL_IDENTIFIER_COLOR="purple3" - - assertEquals "%K{007} %F{056}xxx %F{000}world1 %k%F{007}%f " "$(build_left_prompt)" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/functions/colors.spec b/test/functions/colors.spec deleted file mode 100755 index 4ee71205..00000000 --- a/test/functions/colors.spec +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - # Load Powerlevel9k - source functions/colors.zsh -} - -function testGetColorCodeWithAnsiForegroundColor() { - assertEquals '002' "$(getColorCode 'green')" -} - -function testGetColorCodeWithAnsiBackgroundColor() { - assertEquals '002' "$(getColorCode 'bg-green')" -} - -function testGetColorCodeWithNumericalColor() { - assertEquals '002' "$(getColorCode '002')" -} - -function testGetColorCodeWithNoneColor() { - assertEquals 'none' "$(getColorCode 'NONE')" -} - -function testIsSameColorComparesAnsiForegroundAndNumericalColorCorrectly() { - assertTrue "isSameColor 'green' '002'" -} - -function testIsSameColorComparesAnsiBackgroundAndNumericalColorCorrectly() { - assertTrue "isSameColor 'bg-green' '002'" -} - -function testIsSameColorComparesShortCodesCorrectly() { - assertTrue "isSameColor '002' '2'" -} - -function testIsSameColorDoesNotYieldNotEqualColorsTruthy() { - assertFalse "isSameColor 'green' '003'" -} - -function testIsSameColorHandlesNoneCorrectly() { - assertTrue "isSameColor 'none' 'NOnE'" -} - -function testIsSameColorCompareTwoNoneColorsCorrectly() { - assertTrue "isSameColor 'none' 'none'" -} - -function testIsSameColorComparesColorWithNoneCorrectly() { - assertFalse "isSameColor 'green' 'none'" -} - -function testBrightColorsWork() { - # We had some code in the past that equalized bright colors - # with normal ones. This code is now gone, and this test should - # ensure that all input channels for bright colors are handled - # correctly. - assertTrue "isSameColor 'cyan' '006'" - assertEquals '006' "$(getColorCode 'cyan')" - assertEquals '006' "$(getColor 'cyan')" -} - -source shunit2/shunit2 diff --git a/test/functions/icons.spec b/test/functions/icons.spec deleted file mode 100755 index 8083c095..00000000 --- a/test/functions/icons.spec +++ /dev/null @@ -1,479 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - # Store old value for LC_CTYPE - _OLD_LC_CTYPE="${LC_CTYPE}" - # Reset actual LC_CTYPE - unset LC_CTYPE -} - -function tearDown() { - # Restore LC_CTYPE - LC_CTYPE="${_OLD_LC_CTYPE}" -} - -function testLcCtypeIsNotOverwrittenInDefaultMode() { - local POWERLEVEL9K_MODE="default" - local LC_CTYPE="my-locale" - # Load Powerlevel9k - source functions/icons.zsh - - assertEquals 'my-locale' "${LC_CTYPE}" -} - -function testLcCtypeIsNotOverwrittenInAwesomePatchedMode() { - local POWERLEVEL9K_MODE="awesome-patched" - local LC_CTYPE="my-locale" - # Load Powerlevel9k - source functions/icons.zsh - - assertEquals 'my-locale' "${LC_CTYPE}" -} - -function testLcCtypeIsNotOverwrittenInAwesomeFontconfigMode() { - local POWERLEVEL9K_MODE="awesome-fontconfig" - local LC_CTYPE="my-locale" - # Load Powerlevel9k - source functions/icons.zsh - - assertEquals 'my-locale' "${LC_CTYPE}" -} - -function testLcCtypeIsNotOverwrittenInNerdfontFontconfigMode() { - local POWERLEVEL9K_MODE="nerdfont-fontconfig" - local LC_CTYPE="my-locale" - # Load Powerlevel9k - source functions/icons.zsh - - assertEquals 'my-locale' "${LC_CTYPE}" -} - -function testLcCtypeIsNotOverwrittenInFlatMode() { - local POWERLEVEL9K_MODE="flat" - local LC_CTYPE="my-locale" - # Load Powerlevel9k - source functions/icons.zsh - - assertEquals 'my-locale' "${LC_CTYPE}" -} - -function testLcCtypeIsNotOverwrittenInCompatibleMode() { - local POWERLEVEL9K_MODE="compatible" - local LC_CTYPE="my-locale" - # Load Powerlevel9k - source functions/icons.zsh - - assertEquals 'my-locale' "${LC_CTYPE}" -} - -# Go through all icons defined in default mode, and -# check if all of them are defined in the other modes. -function testAllIconsAreDefinedLikeInDefaultMode() { - # Always compare against this mode - local _P9K_TEST_MODE="default" - local POWERLEVEL9K_MODE="${_P9K_TEST_MODE}" - source functions/icons.zsh - # _ICONS_UNDER_TEST is an array of just the keys of $icons. - # We later check via (r) "subscript" flag that our key - # is in the values of our flat array. - typeset -ah _ICONS_UNDER_TEST - _ICONS_UNDER_TEST=(${(k)icons[@]}) - - # Switch to "awesome-patched" mode - POWERLEVEL9K_MODE="awesome-patched" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - # Iterate over all keys found in the _ICONS_UNDER_TEST - # array and compare it with the icons array of the - # current POWERLEVEL9K_MODE. - # Use parameter expansion, to directly check if the - # key exists in the flat current array of keys. That - # is quite complicated, but there seems no easy way - # to check the mere existance of a key in an array. - # The usual way would always return the value, so that - # would do the wrong thing as we have some (on purpose) - # empty values. - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "awesome-fontconfig" mode - POWERLEVEL9K_MODE="awesome-fontconfig" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "nerdfont-fontconfig" mode - POWERLEVEL9K_MODE="nerdfont-fontconfig" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "nerdfont-complete" mode - POWERLEVEL9K_MODE="nerdfont-complete" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "flat" mode - POWERLEVEL9K_MODE="flat" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "compatible" mode - POWERLEVEL9K_MODE="compatible" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - unset current_icons - unset _ICONS_UNDER_TEST -} - -# Go through all icons defined in awesome-patched mode, and -# check if all of them are defined in the other modes. -function testAllIconsAreDefinedLikeInAwesomePatchedMode() { - # Always compare against this mode - local _P9K_TEST_MODE="awesome-patched" - local POWERLEVEL9K_MODE="$_P9K_TEST_MODE" - source functions/icons.zsh - # _ICONS_UNDER_TEST is an array of just the keys of $icons. - # We later check via (r) "subscript" flag that our key - # is in the values of our flat array. - typeset -ah _ICONS_UNDER_TEST - _ICONS_UNDER_TEST=(${(k)icons[@]}) - - # Switch to "default" mode - POWERLEVEL9K_MODE="default" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - # Iterate over all keys found in the _ICONS_UNDER_TEST - # array and compare it with the icons array of the - # current POWERLEVEL9K_MODE. - # Use parameter expansion, to directly check if the - # key exists in the flat current array of keys. That - # is quite complicated, but there seems no easy way - # to check the mere existance of a key in an array. - # The usual way would always return the value, so that - # would do the wrong thing as we have some (on purpose) - # empty values. - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "awesome-fontconfig" mode - POWERLEVEL9K_MODE="awesome-fontconfig" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "nerdfont-fontconfig" mode - POWERLEVEL9K_MODE="nerdfont-fontconfig" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "nerdfont-complete" mode - POWERLEVEL9K_MODE="nerdfont-complete" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "flat" mode - POWERLEVEL9K_MODE="flat" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "compatible" mode - POWERLEVEL9K_MODE="compatible" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - unset current_icons - unset _ICONS_UNDER_TEST -} - -# Go through all icons defined in awesome-fontconfig mode, and -# check if all of them are defined in the other modes. -function testAllIconsAreDefinedLikeInAwesomeFontconfigMode() { - # Always compare against this mode - local _P9K_TEST_MODE="awesome-fontconfig" - local POWERLEVEL9K_MODE="$_P9K_TEST_MODE" - source functions/icons.zsh - # _ICONS_UNDER_TEST is an array of just the keys of $icons. - # We later check via (r) "subscript" flag that our key - # is in the values of our flat array. - typeset -ah _ICONS_UNDER_TEST - _ICONS_UNDER_TEST=(${(k)icons[@]}) - - # Switch to "default" mode - POWERLEVEL9K_MODE="default" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - # Iterate over all keys found in the _ICONS_UNDER_TEST - # array and compare it with the icons array of the - # current POWERLEVEL9K_MODE. - # Use parameter expansion, to directly check if the - # key exists in the flat current array of keys. That - # is quite complicated, but there seems no easy way - # to check the mere existance of a key in an array. - # The usual way would always return the value, so that - # would do the wrong thing as we have some (on purpose) - # empty values. - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "awesome-patched" mode - POWERLEVEL9K_MODE="awesome-patched" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "nerdfont-fontconfig" mode - POWERLEVEL9K_MODE="nerdfont-fontconfig" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "nerdfont-complete" mode - POWERLEVEL9K_MODE="nerdfont-complete" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "flat" mode - POWERLEVEL9K_MODE="flat" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "compatible" mode - POWERLEVEL9K_MODE="compatible" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - unset current_icons - unset _ICONS_UNDER_TEST -} - -# Go through all icons defined in nerdfont-fontconfig mode, and -# check if all of them are defined in the other modes. -function testAllIconsAreDefinedLikeInNerdfontFontconfigMode() { - # Always compare against this mode - local _P9K_TEST_MODE="nerdfont-fontconfig" - local POWERLEVEL9K_MODE="$_P9K_TEST_MODE" - source functions/icons.zsh - # _ICONS_UNDER_TEST is an array of just the keys of $icons. - # We later check via (r) "subscript" flag that our key - # is in the values of our flat array. - typeset -ah _ICONS_UNDER_TEST - _ICONS_UNDER_TEST=(${(k)icons[@]}) - - # Switch to "default" mode - POWERLEVEL9K_MODE="default" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - # Iterate over all keys found in the _ICONS_UNDER_TEST - # array and compare it with the icons array of the - # current POWERLEVEL9K_MODE. - # Use parameter expansion, to directly check if the - # key exists in the flat current array of keys. That - # is quite complicated, but there seems no easy way - # to check the mere existance of a key in an array. - # The usual way would always return the value, so that - # would do the wrong thing as we have some (on purpose) - # empty values. - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "awesome-patched" mode - POWERLEVEL9K_MODE="awesome-patched" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "awesome-fontconfig" mode - POWERLEVEL9K_MODE="awesome-fontconfig" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "nerdfont-complete" mode - POWERLEVEL9K_MODE="nerdfont-complete" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "flat" mode - POWERLEVEL9K_MODE="flat" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "compatible" mode - POWERLEVEL9K_MODE="compatible" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - unset current_icons - unset _ICONS_UNDER_TEST -} - -# Go through all icons defined in nerdfont-complete mode, and -# check if all of them are defined in the other modes. -function testAllIconsAreDefinedLikeInNerdfontCompleteMode() { - # Always compare against this mode - local _P9K_TEST_MODE="nerdfont-complete" - local POWERLEVEL9K_MODE="$_P9K_TEST_MODE" - source functions/icons.zsh - # _ICONS_UNDER_TEST is an array of just the keys of $icons. - # We later check via (r) "subscript" flag that our key - # is in the values of our flat array. - typeset -ah _ICONS_UNDER_TEST - _ICONS_UNDER_TEST=(${(k)icons[@]}) - - # Switch to "default" mode - POWERLEVEL9K_MODE="default" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - # Iterate over all keys found in the _ICONS_UNDER_TEST - # array and compare it with the icons array of the - # current POWERLEVEL9K_MODE. - # Use parameter expansion, to directly check if the - # key exists in the flat current array of keys. That - # is quite complicated, but there seems no easy way - # to check the mere existance of a key in an array. - # The usual way would always return the value, so that - # would do the wrong thing as we have some (on purpose) - # empty values. - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "awesome-patched" mode - POWERLEVEL9K_MODE="awesome-patched" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "awesome-fontconfig" mode - POWERLEVEL9K_MODE="awesome-fontconfig" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "nerdfont-fontconfig" mode - POWERLEVEL9K_MODE="nerdfont-fontconfig" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "flat" mode - POWERLEVEL9K_MODE="flat" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - # Switch to "compatible" mode - POWERLEVEL9K_MODE="compatible" - source functions/icons.zsh - typeset -ah current_icons - current_icons=(${(k)icons[@]}) - for key in ${_ICONS_UNDER_TEST}; do - assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" - done - - unset current_icons - unset _ICONS_UNDER_TEST -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/functions/utilities.spec b/test/functions/utilities.spec deleted file mode 100755 index b727c1f6..00000000 --- a/test/functions/utilities.spec +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - # Load Powerlevel9k - source functions/icons.zsh - source functions/utilities.zsh -} - -function testDefinedFindsDefinedVariable() { - my_var='X' - - assertTrue "defined 'my_var'" - unset my_var -} - -function testDefinedDoesNotFindUndefinedVariable() { - assertFalse "defined 'my_var'" -} - -function testSetDefaultSetsVariable() { - set_default 'my_var' 'x' - - assertEquals 'x' "$my_var" - unset my_var -} - -function testPrintSizeHumanReadableWithBigNumber() { - # Interesting: Currently we can't support numbers bigger than that. - assertEquals '0.87E' "$(printSizeHumanReadable 1000000000000000000)" -} - -function testPrintSizeHumanReadableWithExabytesAsBase() { - assertEquals '9.77Z' "$(printSizeHumanReadable 10000 'E')" -} - -function testGetRelevantItem() { - typeset -a list - list=(a b c) - local callback='[[ "$item" == "b" ]] && echo "found"' - - local result=$(getRelevantItem "$list" "$callback") - assertEquals 'found' "$result" - - unset list -} - -function testGetRelevantItemDoesNotReturnNotFoundItems() { - typeset -a list - list=(a b c) - local callback='[[ "$item" == "d" ]] && echo "found"' - - local result=$(getRelevantItem "$list" "$callback") - assertEquals '' '' - - unset list -} - -function testSegmentShouldBeJoinedIfDirectPredecessingSegmentIsJoined() { - typeset -a segments - segments=(a b_joined c_joined) - # Look at the third segment - local current_index=3 - local last_element_index=2 - - local joined - segmentShouldBeJoined $current_index $last_element_index "$segments" && joined=true || joined=false - assertTrue "$joined" - - unset segments -} - -function testSegmentShouldBeJoinedIfPredecessingSegmentIsJoinedTransitivley() { - typeset -a segments - segments=(a b_joined c_joined) - # Look at the third segment - local current_index=3 - # The last printed segment was the first one, - # the second segmend was conditional. - local last_element_index=1 - - local joined - segmentShouldBeJoined $current_index $last_element_index "$segments" && joined=true || joined=false - assertTrue "$joined" - - unset segments -} - -function testSegmentShouldNotBeJoinedIfPredecessingSegmentIsNotJoinedButConditional() { - typeset -a segments - segments=(a b_joined c d_joined) - # Look at the fourth segment - local current_index=4 - # The last printed segment was the first one, - # the second segmend was conditional. - local last_element_index=1 - - local joined - segmentShouldBeJoined $current_index $last_element_index "$segments" && joined=true || joined=false - assertFalse "$joined" - - unset segments -} - -source shunit2/shunit2 diff --git a/test/powerlevel9k.spec b/test/powerlevel9k.spec deleted file mode 100755 index 9c5cbeec..00000000 --- a/test/powerlevel9k.spec +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - # Load Powerlevel9k - source powerlevel9k.zsh-theme - source functions/* - - # Unset mode, so that user settings - # do not interfere with tests - unset POWERLEVEL9K_MODE -} - -function testJoinedSegments() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir dir_joined) - cd /tmp - - assertEquals "%K{004} %F{000}/tmp %K{004}%F{000}%F{000}/tmp %k%F{004}%f " "$(build_left_prompt)" - - cd - -} - -function testTransitiveJoinedSegments() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir root_indicator_joined dir_joined) - cd /tmp - - assertEquals "%K{004} %F{000}/tmp %K{004}%F{000}%F{000}/tmp %k%F{004}%f " "$(build_left_prompt)" - - cd - -} - -function testJoiningWithConditionalSegment() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir background_jobs dir_joined) - cd /tmp - - assertEquals "%K{004} %F{000}/tmp %K{004}%F{000} %F{000}/tmp %k%F{004}%f " "$(build_left_prompt)" - - cd - -} - -function testDynamicColoringOfSegmentsWork() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_DEFAULT_BACKGROUND='red' - cd /tmp - - assertEquals "%K{001} %F{000}/tmp %k%F{001}%f " "$(build_left_prompt)" - - cd - -} - -function testDynamicColoringOfVisualIdentifiersWork() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_DEFAULT_VISUAL_IDENTIFIER_COLOR='green' - local POWERLEVEL9K_FOLDER_ICON="icon-here" - - cd /tmp - - assertEquals "%K{004} %F{002}icon-here %F{000}/tmp %k%F{004}%f " "$(build_left_prompt)" - - cd - -} - -function testColoringOfVisualIdentifiersDoesNotOverwriteColoringOfSegment() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_DEFAULT_VISUAL_IDENTIFIER_COLOR='green' - local POWERLEVEL9K_DIR_DEFAULT_FOREGROUND='red' - local POWERLEVEL9K_DIR_DEFAULT_BACKGROUND='yellow' - local POWERLEVEL9K_FOLDER_ICON="icon-here" - - # Re-Source the icons, as the POWERLEVEL9K_MODE is directly - # evaluated there. - source functions/icons.zsh - - cd /tmp - - assertEquals "%K{003} %F{002}icon-here %F{001}/tmp %k%F{003}%f " "$(build_left_prompt)" - - cd - -} - -function testOverwritingIconsWork() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_FOLDER_ICON='icon-here' - #local testFolder=$(mktemp -d -p p9k) - # Move testFolder under home folder - #mv testFolder ~ - # Go into testFolder - #cd ~/$testFolder - - cd /tmp - assertEquals "%K{004} %F{000}icon-here %F{000}/tmp %k%F{004}%f " "$(build_left_prompt)" - - cd - - # rm -fr ~/$testFolder -} - -function testNewlineOnRpromptCanBeDisabled() { - local POWERLEVEL9K_PROMPT_ON_NEWLINE=true - local POWERLEVEL9K_RPROMPT_ON_NEWLINE=false - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - local POWERLEVEL9K_CUSTOM_RWORLD='echo rworld' - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world) - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(custom_rworld) - - powerlevel9k_prepare_prompts - assertEquals '$(print_icon MULTILINE_FIRST_PROMPT_PREFIX)[39m[0m[49m[47m [30mworld [49m[37m[39m $(print_icon MULTILINE_LAST_PROMPT_PREFIX)[1A[39m[0m[49m[37m[39m[47m[30m rworld[K[00m[1B' "$(print -P ${PROMPT}${RPROMPT})" -} - -source shunit2/shunit2 diff --git a/test/segments/anaconda.spec b/test/segments/anaconda.spec deleted file mode 100755 index a25aed9b..00000000 --- a/test/segments/anaconda.spec +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" -} - -function testAnacondaSegmentPrintsNothingIfNoAnacondaPathIsSet() { - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(anaconda custom_world) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - # Unset anacona variables - unset CONDA_ENV_PATH - unset CONDA_PREFIX - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testAnacondaSegmentWorksIfOnlyAnacondaPathIsSet() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(anaconda) - local POWERLEVEL9K_PYTHON_ICON="icon-here" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - CONDA_ENV_PATH=/tmp - unset CONDA_PREFIX - - assertEquals "%K{004} %F{000}icon-here %F{000}(tmp) %k%F{004}%f " "$(build_left_prompt)" -} - -function testAnacondaSegmentWorksIfOnlyAnacondaPrefixIsSet() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(anaconda) - local POWERLEVEL9K_PYTHON_ICON="icon-here" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - unset CONDA_ENV_PATH - local CONDA_PREFIX="test" - - assertEquals "%K{004} %F{000}icon-here %F{000}(test) %k%F{004}%f " "$(build_left_prompt)" -} - -function testAnacondaSegmentWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(anaconda) - local POWERLEVEL9K_PYTHON_ICON="icon-here" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - local CONDA_ENV_PATH=/tmp - local CONDA_PREFIX="test" - - assertEquals "%K{004} %F{000}icon-here %F{000}(tmptest) %k%F{004}%f " "$(build_left_prompt)" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/aws_eb_env.spec b/test/segments/aws_eb_env.spec deleted file mode 100755 index 6cd8931c..00000000 --- a/test/segments/aws_eb_env.spec +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" -} - -function testAwsEbEnvSegmentPrintsNothingIfNoElasticBeanstalkEnvironmentIsSet() { - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(aws_eb_env custom_world) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testAwsEbEnvSegmentWorksIfElasticBeanstalkEnvironmentIsSet() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(aws_eb_env) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - mkdir -p /tmp/powerlevel9k-test/.elasticbeanstalk - echo "test:\n environment: test" > /tmp/powerlevel9k-test/.elasticbeanstalk/config.yml - cd /tmp/powerlevel9k-test - - assertEquals "%K{000} %F{002}🌱 %F{002}test %k%F{000}%f " "$(build_left_prompt)" - - rm -fr /tmp/powerlevel9k-test - cd - -} - -function testAwsEbEnvSegmentWorksIfElasticBeanstalkEnvironmentIsSetInParentDirectory() { - # Skip test, because currently we cannot detect - # if the configuration is in a parent directory - startSkipping # Skip test - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(aws_eb_env) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - mkdir -p /tmp/powerlevel9k-test/.elasticbeanstalk - mkdir -p /tmp/powerlevel9k-test/1/12/123/1234/12345 - echo "test:\n environment: test" > /tmp/powerlevel9k-test/.elasticbeanstalk/config.yml - cd /tmp/powerlevel9k-test/1/12/123/1234/12345 - - assertEquals "%K{000} %F{002}🌱 %F{002}test %k%F{000}%f " "$(build_left_prompt)" - - rm -fr /tmp/powerlevel9k-test - cd - -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/background_jobs.spec b/test/segments/background_jobs.spec deleted file mode 100755 index 558ad1aa..00000000 --- a/test/segments/background_jobs.spec +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" -} - -function testBackgroundJobsSegmentPrintsNothingWithoutBackgroundJobs() { - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(background_jobs custom_world) - alias jobs="nojobs 2>/dev/null" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unalias jobs -} - -function testBackgroundJobsSegmentWorksWithOneBackgroundJob() { - unset POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(background_jobs) - jobs() { - echo '[1] + 30444 suspended nvim xx' - } - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{006}⚙ %k%F{000}%f " "$(build_left_prompt)" - - unfunction jobs -} - -function testBackgroundJobsSegmentWorksWithMultipleBackgroundJobs() { - local POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(background_jobs) - jobs() { - echo "[1] 31190 suspended nvim xx" - echo "[2] - 31194 suspended nvim xx2" - echo "[3] + 31206 suspended nvim xx3" - } - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{006}⚙ %k%F{000}%f " "$(build_left_prompt)" - - unfunction jobs -} - -function testBackgroundJobsSegmentWithVerboseMode() { - local POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=true - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(background_jobs) - jobs() { - echo "[1] 31190 suspended nvim xx" - echo "[2] - 31194 suspended nvim xx2" - echo "[3] + 31206 suspended nvim xx3" - } - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{006}⚙ %F{006}3 %k%F{000}%f " "$(build_left_prompt)" - - unfunction jobs -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/battery.spec b/test/segments/battery.spec deleted file mode 100755 index 39437b7f..00000000 --- a/test/segments/battery.spec +++ /dev/null @@ -1,177 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - P9K_HOME=$(pwd) - ### Test specific - # Create default folder - FOLDER=/tmp/powerlevel9k-test - mkdir -p "${FOLDER}" - cd $FOLDER - - # Prepare folder for pmset (OSX) - PMSET_PATH=$FOLDER/usr/bin - mkdir -p $PMSET_PATH - # Prepare folder for $BATTERY (Linux) - BATTERY_PATH=$FOLDER/sys/class/power_supply - mkdir -p $BATTERY_PATH - mkdir -p $BATTERY_PATH/BAT0 - mkdir -p $BATTERY_PATH/BAT1 -} - -function tearDown() { - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" &>/dev/null - # At least remove test folder completely - rm -fr /tmp/powerlevel9k-test &>/dev/null - unset PMSET_PATH - unset BATTERY_PATH - unset FOLDER - unset P9K_HOME -} - -# Mock Battery -# For mocking pmset on OSX this function takes one argument (the -# content that pmset should echo). -# For mocking the battery on Linux this function takes two -# arguments: $1 is the capacity; $2 the battery status. -function makeBatterySay() { - if [[ -z "${FOLDER}" ]]; then - echo "Fake root path is not correctly set!" - exit 1 - fi - # OSX - echo "#!/bin/sh" > $PMSET_PATH/pmset - echo "echo \"$1\"" >> $PMSET_PATH/pmset - chmod +x $PMSET_PATH/pmset - - # Linux - local capacity="$1" - echo "$capacity" > $BATTERY_PATH/BAT0/capacity - echo "$capacity" > $BATTERY_PATH/BAT1/capacity - local battery_status="$2" - echo "$battery_status" > $BATTERY_PATH/BAT0/status - echo "$battery_status" > $BATTERY_PATH/BAT1/status -} - -function testBatterySegmentIfBatteryIsLowWhileDischargingOnOSX() { - local OS='OSX' # Fake OSX - makeBatterySay "Now drawing from 'Battery Power' - -InternalBattery-0 (id=1234567) 4%; discharging; 0:05 remaining present: true" - - assertEquals "%K{000} %F{001}🔋 %F{001}4%% (0:05) " "$(prompt_battery left 1 false ${FOLDER})" -} - -function testBatterySegmentIfBatteryIsLowWhileChargingOnOSX() { - local OS='OSX' # Fake OSX - makeBatterySay "Now drawing from 'Battery Power' - -InternalBattery-0 (id=1234567) 4%; charging; 0:05 remaining present: true" - - assertEquals "%K{000} %F{003}🔋 %F{003}4%% (0:05) " "$(prompt_battery left 1 false ${FOLDER})" -} - -function testBatterySegmentIfBatteryIsAlmostFullWhileDischargingOnOSX() { - local OS='OSX' # Fake OSX - makeBatterySay "Now drawing from 'Battery Power' - -InternalBattery-0 (id=1234567) 98%; discharging; 3:57 remaining present: true" - - assertEquals "%K{000} %F{007}🔋 %F{007}98%% (3:57) " "$(prompt_battery left 1 false ${FOLDER})" -} - -function testBatterySegmentIfBatteryIsAlmostFullWhileChargingOnOSX() { - local OS='OSX' # Fake OSX - makeBatterySay "Now drawing from 'Battery Power' - -InternalBattery-0 (id=1234567) 98%; charging; 3:57 remaining present: true" - - assertEquals "%K{000} %F{003}🔋 %F{003}98%% (3:57) " "$(prompt_battery left 1 false ${FOLDER})" -} - -function testBatterySegmentIfBatteryIsFullOnOSX() { - local OS='OSX' # Fake OSX - makeBatterySay "Now drawing from 'AC Power' - -InternalBattery-0 (id=1234567) 99%; charged; 0:00 remaining present: true" - - assertEquals "%K{000} %F{002}🔋 %F{002}99%% " "$(prompt_battery left 1 false ${FOLDER})" -} - -function testBatterySegmentIfBatteryIsCalculatingOnOSX() { - local OS='OSX' # Fake OSX - makeBatterySay "Now drawing from 'Battery Power' - -InternalBattery-0 (id=1234567) 99%; discharging; (no estimate) present: true" - - assertEquals "%K{000} %F{007}🔋 %F{007}99%% (...) " "$(prompt_battery left 1 false ${FOLDER})" -} - -function testBatterySegmentIfBatteryIsLowWhileDischargingOnLinux() { - local OS='Linux' # Fake Linux - makeBatterySay "4" "Discharging" - - assertEquals "%K{000} %F{001}🔋 %F{001}4%% " "$(prompt_battery left 1 false ${FOLDER})" -} - -function testBatterySegmentIfBatteryIsLowWhileChargingOnLinux() { - local OS='Linux' # Fake Linux - makeBatterySay "4" "Charging" - - assertEquals "%K{000} %F{003}🔋 %F{003}4%% " "$(prompt_battery left 1 false ${FOLDER})" -} - -function testBatterySegmentIfBatteryIsNormalWhileDischargingOnLinux() { - local OS='Linux' # Fake Linux - makeBatterySay "10" "Discharging" - - assertEquals "%K{000} %F{007}🔋 %F{007}10%% " "$(prompt_battery left 1 false ${FOLDER})" -} - -function testBatterySegmentIfBatteryIsNormalWhileChargingOnLinux() { - local OS='Linux' # Fake Linux - makeBatterySay "10" "Charging" - - assertEquals "%K{000} %F{003}🔋 %F{003}10%% " "$(prompt_battery left 1 false ${FOLDER})" -} - -function testBatterySegmentIfBatteryIsFullOnLinux() { - local OS='Linux' # Fake Linux - makeBatterySay "100" "Full" - - assertEquals "%K{000} %F{002}🔋 %F{002}100%% " "$(prompt_battery left 1 false ${FOLDER})" -} - -function testBatterySegmentIfBatteryIsNormalWithAcpiEnabledOnLinux() { - local OS='Linux' # Fake Linux - makeBatterySay "50" "Discharging" - echo "echo 'Batter 0: Discharging, 50%, 01:38:54 remaining'" > ${FOLDER}/usr/bin/acpi - chmod +x ${FOLDER}/usr/bin/acpi - # For running on Mac, we need to mock date :( - [[ -f /usr/local/bin/gdate ]] && alias date=gdate - - assertEquals "%K{000} %F{007}🔋 %F{007}50%% (1:38) " "$(prompt_battery left 1 false ${FOLDER})" - - unalias date &>/dev/null - # unaliasing date fails where it was never aliased (e.g. on Linux). - # This causes the whole test to fail, because the return code is - # non-zero. - return 0 -} - -function testBatterySegmentIfBatteryIsCalculatingWithAcpiEnabledOnLinux() { - local OS='Linux' # Fake Linux - makeBatterySay "50" "Discharging" - # Todo: Include real acpi output! - echo "echo 'Batter 0: Discharging, 50%, rate remaining'" > ${FOLDER}/usr/bin/acpi - chmod +x ${FOLDER}/usr/bin/acpi - - assertEquals "%K{000} %F{007}🔋 %F{007}50%% (...) " "$(prompt_battery left 1 false ${FOLDER})" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/command_execution_time.spec b/test/segments/command_execution_time.spec deleted file mode 100755 index 6d2d7ad9..00000000 --- a/test/segments/command_execution_time.spec +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" -} - -function testCommandExecutionTimeIsNotShownIfTimeIsBelowThreshold() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world command_execution_time) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - # Override payload - local _P9K_COMMAND_DURATION=2 - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testCommandExecutionTimeThresholdCouldBeChanged() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) - local POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=1 - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - # Override payload - local _P9K_COMMAND_DURATION=2.03 - - assertEquals "%K{001} %F{226}Dur %F{226}2.03 %k%F{001}%f " "$(build_left_prompt)" -} - -function testCommandExecutionTimeThresholdCouldBeSetToZero() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) - local POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=0 - local _P9K_COMMAND_DURATION=0.03 - - assertEquals "%K{001} %F{226}Dur %F{226}0.03 %k%F{001}%f " "$(build_left_prompt)" -} - -function testCommandExecutionTimePrecisionCouldBeChanged() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) - local POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=0 - local POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=4 - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - # Override payload - local _P9K_COMMAND_DURATION=0.0001 - - assertEquals "%K{001} %F{226}Dur %F{226}0.0001 %k%F{001}%f " "$(build_left_prompt)" -} - -function testCommandExecutionTimePrecisionCouldBeSetToZero() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) - local POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0 - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - # Override payload - local _P9K_COMMAND_DURATION=23.5001 - - assertEquals "%K{001} %F{226}Dur %F{226}23 %k%F{001}%f " "$(build_left_prompt)" -} - -function testCommandExecutionTimeIsFormattedHumandReadbleForMinuteLongCommand() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - # Override payload - local _P9K_COMMAND_DURATION=180 - - assertEquals "%K{001} %F{226}Dur %F{226}03:00 %k%F{001}%f " "$(build_left_prompt)" -} - -function testCommandExecutionTimeIsFormattedHumandReadbleForHourLongCommand() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(command_execution_time) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - # Override payload - local _P9K_COMMAND_DURATION=7200 - - assertEquals "%K{001} %F{226}Dur %F{226}02:00:00 %k%F{001}%f " "$(build_left_prompt)" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/context.spec b/test/segments/context.spec deleted file mode 100755 index 25c355a7..00000000 --- a/test/segments/context.spec +++ /dev/null @@ -1,131 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - # Test specific settings - OLD_DEFAULT_USER=$DEFAULT_USER - unset DEFAULT_USER - - # Fix leaked state for travis - OLD_POWERLEVEL9K_CONTEXT_ALWAYS_SHOW=$POWERLEVEL9K_CONTEXT_ALWAYS_SHOW - unset POWERLEVEL9K_CONTEXT_ALWAYS_SHOW - OLD_SSH_CLIENT=$SSH_CLIENT - unset SSH_CLIENT - OLD_SSH_TTY=$SSH_TTY - unset SSH_TTY -} - -function tearDown() { - # Restore old variables - [[ -n "$OLD_DEFAULT_USER" ]] && DEFAULT_USER=$OLD_DEFAULT_USER - unset OLD_DEFAULT_USER - - [[ -n "$OLD_POWERLEVEL9K_CONTEXT_ALWAYS_SHOW" ]] && POWERLEVEL9K_CONTEXT_ALWAYS_SHOW=$OLD_POWERLEVEL9K_CONTEXT_ALWAYS_SHOW - unset OLD_POWERLEVEL9K_CONTEXT_ALWAYS_SHOW - - [[ -n "$OLD_SSH_CLIENT" ]] && SSH_CLIENT=$OLD_SSH_CLIENT - unset OLD_SSH_CLIENT - - [[ -n "$OLD_SSH_TTY" ]] && SSH_TTY=$OLD_SSH_TTY - unset OLD_SSH_TTY - - return 0 -} - -function testContextSegmentDoesNotGetRenderedWithDefaultUser() { - local DEFAULT_USER=$(whoami) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context custom_world) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testContextSegmentDoesGetRenderedWhenSshConnectionIsOpen() { - function sudo() { - return 0 - } - local SSH_CLIENT="putty" - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{003}%n@%m %k%F{000}%f " "$(build_left_prompt)" - - unfunction sudo -} - -function testContextSegmentWithForeignUser() { - function sudo() { - return 0 - } - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{003}%n@%m %k%F{000}%f " "$(build_left_prompt)" - - unfunction sudo -} - -# TODO: How to test root? -function testContextSegmentWithRootUser() { - startSkipping # Skip test - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{003}%n@%m %k%F{000}%f " "$(build_left_prompt)" -} - -function testOverridingContextTemplate() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context) - local POWERLEVEL9K_CONTEXT_TEMPLATE=xx - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{003}xx %k%F{000}%f " "$(build_left_prompt)" -} - -function testContextSegmentIsShownIfDefaultUserIsSetWhenForced() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context) - local POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true - local DEFAULT_USER=$(whoami) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{003}%n@%m %k%F{000}%f " "$(build_left_prompt)" -} - -function testContextSegmentIsShownIfForced() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context) - local POWERLEVEL9K_ALWAYS_SHOW_USER=true - local DEFAULT_USER=$(whoami) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{003}$(whoami) %k%F{000}%f " "$(build_left_prompt)" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/custom.spec b/test/segments/custom.spec deleted file mode 100755 index 7aef02b0..00000000 --- a/test/segments/custom.spec +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" -} - -function testCustomDirectOutputSegment() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world) - local POWERLEVEL9K_CUSTOM_WORLD="echo world" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testCustomClosureSegment() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world) - function p9k_hello_world() { - echo "world" - } - local POWERLEVEL9K_CUSTOM_WORLD='p9k_hello_world' - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testSettingBackgroundForCustomSegment() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world) - local POWERLEVEL9K_CUSTOM_WORLD="echo world" - local POWERLEVEL9K_CUSTOM_WORLD_BACKGROUND="yellow" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{003} %F{000}world %k%F{003}%f " "$(build_left_prompt)" -} - -function testSettingForegroundForCustomSegment() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world) - local POWERLEVEL9K_CUSTOM_WORLD="echo world" - local POWERLEVEL9K_CUSTOM_WORLD_FOREGROUND="red" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{001}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testSettingVisualIdentifierForCustomSegment() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world) - local POWERLEVEL9K_CUSTOM_WORLD="echo world" - local POWERLEVEL9K_CUSTOM_WORLD_ICON="hw" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}hw %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testSettingVisualIdentifierForegroundColorForCustomSegment() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world) - local POWERLEVEL9K_CUSTOM_WORLD="echo world" - local POWERLEVEL9K_CUSTOM_WORLD_ICON="hw" - local POWERLEVEL9K_CUSTOM_WORLD_VISUAL_IDENTIFIER_COLOR="red" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{001}hw %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/detect_virt.spec b/test/segments/detect_virt.spec deleted file mode 100755 index 910f52eb..00000000 --- a/test/segments/detect_virt.spec +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - # Load Powerlevel9k - source powerlevel9k.zsh-theme -} - -function testDetectVirtSegmentPrintsNothingIfSystemdIsNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(detect_virt custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - alias systemd-detect-virt="novirt" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unalias systemd-detect-virt -} - -function testDetectVirtSegmentIfSystemdReturnsPlainName() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(detect_virt) - alias systemd-detect-virt="echo 'xxx'" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{003}xxx %k%F{000}%f " "$(build_left_prompt)" - - unalias systemd-detect-virt -} - -function testDetectVirtSegmentIfRootFsIsOnExpectedInode() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(detect_virt) - # Well. This is a weak test, as it fixates the implementation, - # but it is necessary, as the implementation relys on the root - # directory having the inode number "2".. - alias systemd-detect-virt="echo 'none'" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - # The original command in the implementation is "ls -di / | grep -o 2", - # which translates to: Show the inode number of "/" and test if it is "2". - alias ls="echo '2'" - - assertEquals "%K{000} %F{003}none %k%F{000}%f " "$(build_left_prompt)" - - unalias ls - unalias systemd-detect-virt -} - -function testDetectVirtSegmentIfRootFsIsNotOnExpectedInode() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(detect_virt) - # Well. This is a weak test, as it fixates the implementation, - # but it is necessary, as the implementation relys on the root - # directory having the inode number "2".. - alias systemd-detect-virt="echo 'none'" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - # The original command in the implementation is "ls -di / | grep -o 2", - # which translates to: Show the inode number of "/" and test if it is "2". - alias ls="echo '3'" - - assertEquals "%K{000} %F{003}chroot %k%F{000}%f " "$(build_left_prompt)" - - unalias ls - unalias systemd-detect-virt -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/dir.spec b/test/segments/dir.spec deleted file mode 100755 index d75ca42f..00000000 --- a/test/segments/dir.spec +++ /dev/null @@ -1,789 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - P9K_HOME="${PWD}" -} - -function tearDown() { - unset P9K_HOME -} - -function testDirPathAbsoluteWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_ABSOLUTE=true - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - cd ~ - - # Unfortunately, we cannot fake Linux or OSX here, because - # of /home or /Users path.. That is why we change the test - # according to the OS of the host. - if [[ "${OS}" == 'Linux' ]]; then - assertEquals "%K{004} %F{000}/home/${USER} %k%F{004}%f " "$(build_left_prompt)" - elif [[ "${OS}" == 'OSX' ]]; then - assertEquals "%K{004} %F{000}/Users/${USER} %k%F{004}%f " "$(build_left_prompt)" - fi - - cd - -} - -function testTruncateFoldersWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_folders' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 - mkdir -p $FOLDER - cd $FOLDER - - assertEquals "%K{004} %F{000}…/12345678/123456789 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testTruncateFolderWithHomeDirWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=1 - local CURRENT_DIR=$(pwd) - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - cd ~ - local FOLDER="powerlevel9k-test-${RANDOM}" - mkdir -p $FOLDER - cd $FOLDER - # Switch back to home folder as this causes the problem. - cd .. - - assertEquals "%K{004} %F{000}~ %k%F{004}%f " "$(build_left_prompt)" - - rmdir $FOLDER - cd ${CURRENT_DIR} -} - -function testTruncateMiddleWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_middle' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 - mkdir -p $FOLDER - cd $FOLDER - - assertEquals "%K{004} %F{000}/tmp/po…st/1/12/123/1234/12…45/12…56/12…67/12…78/123456789 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testTruncationFromRightWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_from_right' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 - mkdir -p $FOLDER - cd $FOLDER - - assertEquals "%K{004} %F{000}/tmp/po…/1/12/123/12…/12…/12…/12…/12…/123456789 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testTruncateToLastWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY="truncate_to_last" - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 - mkdir -p $FOLDER - cd $FOLDER - - assertEquals "%K{004} %F{000}123456789 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testTruncateToFirstAndLastWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY="truncate_to_first_and_last" - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 - mkdir -p $FOLDER - cd $FOLDER - - assertEquals "%K{004} %F{000}/tmp/powerlevel9k-test/…/…/…/…/…/…/…/12345678/123456789 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testTruncateAbsoluteWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY="truncate_absolute" - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 - mkdir -p $FOLDER - cd $FOLDER - - assertEquals "%K{004} %F{000}…89 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testTruncationFromRightWithEmptyDelimiter() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_DELIMITER="" - local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_from_right' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - local FOLDER=/tmp/powerlevel9k-test/1/12/123/1234/12345/123456/1234567/12345678/123456789 - mkdir -p $FOLDER - cd $FOLDER - - assertEquals "%K{004} %F{000}/tmp/po/1/12/123/12/12/12/12/12/123456789 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testTruncateWithFolderMarkerWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_STRATEGY="truncate_with_folder_marker" - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - local BASEFOLDER=/tmp/powerlevel9k-test - local FOLDER=$BASEFOLDER/1/12/123/1234/12345/123456/1234567 - mkdir -p $FOLDER - # Setup folder marker - touch $BASEFOLDER/1/12/.shorten_folder_marker - cd $FOLDER - assertEquals "%K{004} %F{000}/…/12/123/1234/12345/123456/1234567 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr $BASEFOLDER -} - -function testTruncateWithFolderMarkerWithChangedFolderMarker() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_STRATEGY="truncate_with_folder_marker" - local POWERLEVEL9K_SHORTEN_FOLDER_MARKER='.xxx' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - local BASEFOLDER=/tmp/powerlevel9k-test - local FOLDER=$BASEFOLDER/1/12/123/1234/12345/123456/1234567 - mkdir -p $FOLDER - # Setup folder marker - touch $BASEFOLDER/1/12/.xxx - cd $FOLDER - assertEquals "%K{004} %F{000}/…/12/123/1234/12345/123456/1234567 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr $BASEFOLDER -} - -function testTruncateWithPackageNameWorks() { - local p9kFolder=$(pwd) - local BASEFOLDER=/tmp/powerlevel9k-test - local FOLDER=$BASEFOLDER/1/12/123/1234/12345/123456/1234567/12345678/123456789 - mkdir -p $FOLDER - - cd /tmp/powerlevel9k-test - echo ' -{ - "name": "My_Package" -} -' > package.json - # Unfortunately: The main folder must be a git repo.. - git init &>/dev/null - - # Go back to deeper folder - cd "${FOLDER}" - - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_with_package_name' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{004} %F{000}My_Package/1/12/123/12…/12…/12…/12…/12…/123456789 %k%F{004}%f " "$(build_left_prompt)" - - # Go back - cd $p9kFolder - rm -fr $BASEFOLDER -} - -function testTruncateWithPackageNameIfRepoIsSymlinkedInsideDeepFolder() { - local p9kFolder=$(pwd) - local BASEFOLDER=/tmp/powerlevel9k-test - local FOLDER=$BASEFOLDER/1/12/123/1234/12345/123456/1234567/12345678/123456789 - mkdir -p $FOLDER - cd $FOLDER - - # Unfortunately: The main folder must be a git repo.. - git init &>/dev/null - - echo ' -{ - "name": "My_Package" -} -' > package.json - - # Create a subdir inside the repo - mkdir -p asdfasdf/qwerqwer - - cd $BASEFOLDER - ln -s ${FOLDER} linked-repo - - # Go to deep folder inside linked repo - cd linked-repo/asdfasdf/qwerqwer - - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_with_package_name' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{004} %F{000}My_Package/as…/qwerqwer %k%F{004}%f " "$(build_left_prompt)" - - # Go back - cd $p9kFolder - rm -fr $BASEFOLDER -} - -function testTruncateWithPackageNameIfRepoIsSymlinkedInsideGitDir() { - local p9kFolder=$(pwd) - local BASEFOLDER=/tmp/powerlevel9k-test - local FOLDER=$BASEFOLDER/1/12/123/1234/12345/123456/1234567/12345678/123456789 - mkdir -p $FOLDER - cd $FOLDER - - # Unfortunately: The main folder must be a git repo.. - git init &>/dev/null - - echo ' -{ - "name": "My_Package" -} -' > package.json - - cd $BASEFOLDER - ln -s ${FOLDER} linked-repo - - cd linked-repo/.git/refs/heads - - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_with_package_name' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{004} %F{000}My_Package/.g…/re…/heads %k%F{004}%f " "$(build_left_prompt)" - - # Go back - cd $p9kFolder - rm -fr $BASEFOLDER -} - -function testHomeFolderDetectionWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_HOME_ICON='home-icon' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - cd ~ - assertEquals "%K{004} %F{000}home-icon %F{000}~ %k%F{004}%f " "$(build_left_prompt)" - - cd - -} - -function testHomeSubfolderDetectionWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_HOME_SUB_ICON='sub-icon' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - local FOLDER=~/powerlevel9k-test - mkdir $FOLDER - cd $FOLDER - assertEquals "%K{004} %F{000}sub-icon %F{000}~/powerlevel9k-test %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr $FOLDER -} - -function testOtherFolderDetectionWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_FOLDER_ICON='folder-icon' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - local FOLDER=/tmp/powerlevel9k-test - mkdir $FOLDER - cd $FOLDER - assertEquals "%K{004} %F{000}folder-icon %F{000}/tmp/powerlevel9k-test %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr $FOLDER -} - -function testChangingDirPathSeparator() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - local FOLDER="/tmp/powerlevel9k-test/1/2" - mkdir -p $FOLDER - cd $FOLDER - - assertEquals "%K{004} %F{000}xXxtmpxXxpowerlevel9k-testxXx1xXx2 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testHomeFolderAbbreviation() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local dir=$PWD - - cd ~/ - # default - local POWERLEVEL9K_HOME_FOLDER_ABBREVIATION='~' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{004} %F{000}~ %k%F{004}%f " "$(build_left_prompt)" - - # substituted - local POWERLEVEL9K_HOME_FOLDER_ABBREVIATION='qQq' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{004} %F{000}qQq %k%F{004}%f " "$(build_left_prompt)" - - cd /tmp - # default - local POWERLEVEL9K_HOME_FOLDER_ABBREVIATION='~' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{004} %F{000}/tmp %k%F{004}%f " "$(build_left_prompt)" - - # substituted - local POWERLEVEL9K_HOME_FOLDER_ABBREVIATION='qQq' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{004} %F{000}/tmp %k%F{004}%f " "$(build_left_prompt)" - - cd "$dir" -} - -function testOmittingFirstCharacterWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true - local POWERLEVEL9K_FOLDER_ICON='folder-icon' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - cd /tmp - - assertEquals "%K{004} %F{000}folder-icon %F{000}tmp %k%F{004}%f " "$(build_left_prompt)" - - cd - -} - -function testOmittingFirstCharacterWorksWithChangingPathSeparator() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true - local POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx' - local POWERLEVEL9K_FOLDER_ICON='folder-icon' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - mkdir -p /tmp/powerlevel9k-test/1/2 - cd /tmp/powerlevel9k-test/1/2 - - assertEquals "%K{004} %F{000}folder-icon %F{000}tmpxXxpowerlevel9k-testxXx1xXx2 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -# This test makes it obvious that combining a truncation strategy -# that cuts off folders from the left and omitting the the first -# character does not make much sense. The truncation strategy -# comes first, prints an ellipsis and that gets then cut off by -# POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER.. -# But it does more sense in combination with other truncation -# strategies. -function testOmittingFirstCharacterWorksWithChangingPathSeparatorAndDefaultTruncation() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true - local POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx' - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_folders' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - mkdir -p /tmp/powerlevel9k-test/1/2 - cd /tmp/powerlevel9k-test/1/2 - - assertEquals "%K{004} %F{000}xXx1xXx2 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testOmittingFirstCharacterWorksWithChangingPathSeparatorAndMiddleTruncation() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true - local POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx' - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_middle' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - mkdir -p /tmp/powerlevel9k-test/1/2 - cd /tmp/powerlevel9k-test/1/2 - - assertEquals "%K{004} %F{000}tmpxXxpo…stxXx1xXx2 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testOmittingFirstCharacterWorksWithChangingPathSeparatorAndRightTruncation() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true - local POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx' - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_from_right' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - mkdir -p /tmp/powerlevel9k-test/1/2 - cd /tmp/powerlevel9k-test/1/2 - - assertEquals "%K{004} %F{000}tmpxXxpo…xXx1xXx2 %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testTruncateToUniqueWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true - local POWERLEVEL9K_DIR_PATH_SEPARATOR='xXx' - local POWERLEVEL9K_SHORTEN_DIR_LENGTH=2 - local POWERLEVEL9K_SHORTEN_STRATEGY='truncate_to_unique' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - mkdir -p /tmp/powerlevel9k-test/adam/devl - mkdir -p /tmp/powerlevel9k-test/alice/devl - mkdir -p /tmp/powerlevel9k-test/alice/docs - mkdir -p /tmp/powerlevel9k-test/bob/docs - cd /tmp/powerlevel9k-test/alice/devl - - assertEquals "%K{004} %F{000}txXxpxXxalxXxde %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testBoldHomeDirWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - cd ~ - - assertEquals "%K{004} %F{000}%B~%b %k%F{004}%f " "$(build_left_prompt)" - - cd - -} - -function testBoldHomeSubdirWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - mkdir -p ~/powerlevel9k-test - cd ~/powerlevel9k-test - - assertEquals "%K{004} %F{000}~/%Bpowerlevel9k-test%b %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr ~/powerlevel9k-test -} - -function testBoldRootDirWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - cd / - - assertEquals "%K{004} %F{000}%B/%b %k%F{004}%f " "$(build_left_prompt)" - - cd - -} - -function testBoldRootSubdirWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - cd /tmp - - assertEquals "%K{004} %F{000}/%Btmp%b %k%F{004}%f " "$(build_left_prompt)" - - cd - -} - -function testBoldRootSubSubdirWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - mkdir -p /tmp/powerlevel9k-test - cd /tmp/powerlevel9k-test - - assertEquals "%K{004} %F{000}/tmp/%Bpowerlevel9k-test%b %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testHighlightHomeWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - cd ~ - - assertEquals "%K{004} %F{000}%F{red}~ %k%F{004}%f " "$(build_left_prompt)" - - cd - -} - -function testHighlightHomeSubdirWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - mkdir -p ~/powerlevel9k-test - cd ~/powerlevel9k-test - - assertEquals "%K{004} %F{000}~/%F{red}powerlevel9k-test %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr ~/powerlevel9k-test -} - -function testHighlightRootWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - cd / - - assertEquals "%K{004} %F{000}%F{red}/ %k%F{004}%f " "$(build_left_prompt)" - - cd - -} - -function testHighlightRootSubdirWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - cd /tmp - - assertEquals "%K{004} %F{000}/%F{red}tmp %k%F{004}%f " "$(build_left_prompt)" - - cd - -} - -function testHighlightRootSubSubdirWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND='red' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - mkdir /tmp/powerlevel9k-test - cd /tmp/powerlevel9k-test - - assertEquals "%K{004} %F{000}/tmp/%F{red}powerlevel9k-test %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testDirSeparatorColorHomeSubdirWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND='red' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - mkdir -p ~/powerlevel9k-test - cd ~/powerlevel9k-test - - assertEquals "%K{004} %F{000}~%F{red}/%F{black}powerlevel9k-test %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr ~/powerlevel9k-test -} - -function testDirSeparatorColorRootSubSubdirWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - local POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND='red' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - mkdir -p /tmp/powerlevel9k-test - cd /tmp/powerlevel9k-test - - assertEquals "%K{004} %F{000}%F{red}/%F{black}tmp%F{red}/%F{black}powerlevel9k-test %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr /tmp/powerlevel9k-test -} - -function testDirHomeTruncationWorksOnlyAtTheBeginning() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir) - - local FOLDER=/tmp/p9ktest - local SAVED_HOME="${HOME}" - HOME="/p9ktest" - - mkdir -p $FOLDER - # Setup folder marker - cd $FOLDER - assertEquals "%K{004} %F{000}/tmp/p9ktest %k%F{004}%f " "$(build_left_prompt)" - - cd - - rm -fr $FOLDER - HOME="${SAVED_HOME}" -} - -source shunit2/shunit2 diff --git a/test/segments/disk_usage.spec b/test/segments/disk_usage.spec deleted file mode 100755 index 7858da4f..00000000 --- a/test/segments/disk_usage.spec +++ /dev/null @@ -1,131 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - # Test specific - P9K_HOME=$(pwd) - FOLDER=/tmp/powerlevel9k-test - mkdir -p $FOLDER - cd $FOLDER -} - -function tearDown() { - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" - # At least remove test folder completely - rm -fr /tmp/powerlevel9k-test - unset FOLDER - unset P9K_HOME - - # Remove IP cache file - rm -f ${POWERLEVEL9K_PUBLIC_IP_FILE} -} - -function testDiskUsageSegmentWhenDiskIsAlmostFull() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(disk_usage) - df() { - echo "Filesystem 1K-blocks Used Available Use% Mounted on -/dev/disk1 487219288 471466944 15496344 97% /" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{001} %F{007}hdd %F{007}97%% %k%F{001}%f " "$(build_left_prompt)" - - unfunction df -} - -function testDiskUsageSegmentWhenDiskIsVeryFull() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(disk_usage) - df() { - echo "Filesystem 1K-blocks Used Available Use% Mounted on -/dev/disk1 487219288 471466944 15496344 94% /" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{003} %F{000}hdd %F{000}94%% %k%F{003}%f " "$(build_left_prompt)" - - unfunction df -} - -function testDiskUsageSegmentWhenDiskIsQuiteEmpty() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(disk_usage) - df() { - echo "Filesystem 1K-blocks Used Available Use% Mounted on -/dev/disk1 487219288 471466944 15496344 4% /" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{003}hdd %F{003}4%% %k%F{000}%f " "$(build_left_prompt)" - - unfunction df -} - -function testDiskUsageSegmentPrintsNothingIfDiskIsQuiteEmptyAndOnlyWarningsShouldBeDisplayed() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(disk_usage custom_world) - df() { - echo "Filesystem 1K-blocks Used Available Use% Mounted on -/dev/disk1 487219288 471466944 15496344 4% /" - } - - local POWERLEVEL9K_DISK_USAGE_ONLY_WARNING=true - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unfunction df -} - -function testDiskUsageSegmentWarningLevelCouldBeAdjusted() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(disk_usage) - local POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL=10 - df() { - echo "Filesystem 1K-blocks Used Available Use% Mounted on -/dev/disk1 487219288 471466944 15496344 11% /" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{003} %F{000}hdd %F{000}11%% %k%F{003}%f " "$(build_left_prompt)" - - unfunction df -} - -function testDiskUsageSegmentCriticalLevelCouldBeAdjusted() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(disk_usage) - local POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL=5 - local POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL=10 - df() { - echo "Filesystem 1K-blocks Used Available Use% Mounted on -/dev/disk1 487219288 471466944 15496344 11% /" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{001} %F{007}hdd %F{007}11%% %k%F{001}%f " "$(build_left_prompt)" - - unfunction df -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/go_version.spec b/test/segments/go_version.spec deleted file mode 100755 index 3ac51eaf..00000000 --- a/test/segments/go_version.spec +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" -} - -function mockGo() { - case "$1" in - 'version') - echo 'go version go1.5.3 darwin/amd64' - ;; - 'env') - echo "$HOME/go" - ;; - esac -} - -function mockGoEmptyGopath() { - case "$1" in - 'version') - echo 'go version go1.5.3 darwin/amd64' - ;; - 'env') - echo "" - ;; - esac -} - -function testGo() { - alias go=mockGo - local POWERLEVEL9K_GO_ICON="" - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(go_version) - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - local PWD="$HOME/go/src/github.com/bhilburn/powerlevel9k" - - assertEquals "%K{002} %F{255} %F{255}go1.5.3 %k%F{002}%f " "$(build_left_prompt)" - - unalias go -} - -function testGoSegmentPrintsNothingIfEmptyGopath() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world go_version) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - alias go=mockGoEmptyGopath - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testGoSegmentPrintsNothingIfNotInGopath() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world go_version) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - alias go=mockGo - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testGoSegmentPrintsNothingIfGoIsNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world go_version) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - alias go=noGo - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unalias go -} - -source shunit2/shunit2 diff --git a/test/segments/ip.spec b/test/segments/ip.spec deleted file mode 100755 index 86819e19..00000000 --- a/test/segments/ip.spec +++ /dev/null @@ -1,245 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - # Test specific - P9K_HOME=$(pwd) - FOLDER=/tmp/powerlevel9k-test - mkdir -p $FOLDER - mkdir $FOLDER/sbin -} - -function tearDown() { - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" - - unset FOLDER - unset P9K_HOME -} - -function fakeIfconfig() { - local INTERFACE1="${1}" - [[ -z "${INTERFACE1}" ]] && INTERFACE1="eth0" - local INTERFACE1_IP="1.2.3.4" - local INTERFACE2="${2}" - [[ -z "${INTERFACE2}" ]] && INTERFACE2="disabled-if2" - local INTERFACE2_IP="5.6.7.8" - # Fake ifconfig - cat > $FOLDER/sbin/ifconfig <<EOF -#!/usr/bin/env zsh - -if [[ "\$*" =~ '-l' ]]; then - echo "docker0 tun1 ${INTERFACE1} ${INTERFACE2} lo" - exit 0 -fi - -if [[ "\$*" =~ '${INTERFACE1}' ]]; then - cat <<INNER -tun1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 - inet ${INTERFACE1_IP} txqueuelen 1000 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - device interrupt 16 memory 0xe8200000-e8220000 -INNER - exit 0 -fi - -if [[ "\$*" =~ '${INTERFACE2}' ]]; then - cat <<INNER -tun1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 - inet ${INTERFACE2_IP} txqueuelen 1000 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - device interrupt 16 memory 0xe8200000-e8220000 -INNER - exit 0 -fi - - -# If neither INTERFACE1 nor INTERFACE2 is queried, fake a offline (DOWN) interface. -# We assume if there is at least one argument, we queried for a specific interface. -if [[ "\$#" -gt 0 ]]; then - cat <<INNER -tun1: flags=4099<DOWN,BROADCAST,MULTICAST> mtu 1500 - inet 5.5.5.5 txqueuelen 1000 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - device interrupt 16 memory 0xe8200000-e8220000 -INNER - exit 0 -fi - -if [[ "\$#" -eq 0 ]]; then - cat <<INNER -docker0: flags=4099<DOWN,BROADCAST,MULTICAST> mtu 1500 - inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 - ether 02:42:8f:5c:ed:51 txqueuelen 0 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - -tun1: flags=4099<DOWN,BROADCAST,MULTICAST> mtu 1500 - inet 10.20.30.40 txqueuelen 1000 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - device interrupt 16 memory 0xe8200000-e8220000 - -${INTERFACE1}: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 - inet ${INTERFACE1_IP} txqueuelen 1000 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - device interrupt 16 memory 0xe8200000-e8220000 - -${INTERFACE2}: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 - inet ${INTERFACE2_IP} txqueuelen 1000 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - device interrupt 16 memory 0xe8200000-e8220000 - -lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 - inet 127.0.0.1 netmask 255.0.0.0 - inet6 ::1 prefixlen 128 scopeid 0x10<host> - loop txqueuelen 1000 (Local Loopback) - RX packets 5136 bytes 328651 (320.9 KiB) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 5136 bytes 328651 (320.9 KiB) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 -INNER -exit 0 -fi -EOF - chmod +x $FOLDER/sbin/ifconfig -} - -function fakeIp() { - local INTERFACE1="${1}" - [[ -z "${INTERFACE1}" ]] && INTERFACE1="eth0" - local INTERFACE2="${2}" - [[ -z "${INTERFACE2}" ]] && INTERFACE2="disabled-if2" - cat > $FOLDER/sbin/ip <<EOF -#!/usr/bin/env zsh - - if [[ "\$*" =~ '-brief.*show' ]]; then - cat <<INNER -lo UNKNOWN 127.0.0.1/8 -${INTERFACE1} UP 1.2.3.4/24 -${INTERFACE2} UP 5.4.3.2/16 -docker0 DOWN 172.17.0.1/16 -INNER - fi - - if [[ "\$*" =~ 'show ${INTERFACE1}' ]]; then - cat <<INNER -2: ${INTERFACE1}: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 - inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 - valid_lft forever preferred_lft forever -INNER - fi - - if [[ "\$*" =~ 'show ${INTERFACE2}' ]]; then - cat <<INNER -3: ${INTERFACE2}: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 - inet 1.2.3.4 brd 10.0.2.255 scope global eth0 - valid_lft forever preferred_lft forever -INNER - fi -EOF - - chmod +x $FOLDER/sbin/ip -} - -function testIpSegmentPrintsNothingOnOsxIfNotConnected() { - cat > $FOLDER/sbin/ifconfig <<EOF -#!/usr/bin/env zsh - -echo "not connected" -EOF - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local OS="OSX" # Fake OSX - - assertEquals "" "$(prompt_ip left 1 false "$FOLDER")" -} - -function testIpSegmentPrintsNothingOnLinuxIfNotConnected() { - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local OS="Linux" # Fake Linux - - cat > $FOLDER/sbin/ip <<EOF -#!/usr/bin/env zsh - -echo "not connected" -EOF - chmod +x $FOLDER/sbin/ip - - assertEquals "" "$(prompt_ip left 1 false "$FOLDER")" -} - -function testIpSegmentWorksOnOsxWithNoInterfaceSpecified() { - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local OS='OSX' # Fake OSX - - fakeIfconfig "eth1" "eth2" - - assertEquals "%K{006} %F{000}IP %F{000}1.2.3.4 " "$(prompt_ip left 1 false "$FOLDER")" -} - -function testIpSegmentWorksOnOsxWithInterfaceSpecified() { - fakeIfconfig "eth1" - - local POWERLEVEL9K_IP_INTERFACE="eth1" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local OS='OSX' # Fake OSX - - assertEquals "%K{006} %F{000}IP %F{000}1.2.3.4 " "$(prompt_ip left 1 false "$FOLDER")" -} - -function testIpSegmentWorksOnLinuxWithNoInterfaceSpecified() { - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local OS='Linux' # Fake Linux - - fakeIp "eth0" - - assertEquals "%K{006} %F{000}IP %F{000}1.2.3.4 " "$(prompt_ip left 1 false "$FOLDER")" -} - -function testIpSegmentWorksOnLinuxWithInterfaceSpecified() { - fakeIp "eth3" - - local POWERLEVEL9K_IP_INTERFACE="eth3" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local OS='Linux' # Fake Linux - - assertEquals "%K{006} %F{000}IP %F{000}1.2.3.4 " "$(prompt_ip left 1 false "$FOLDER")" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/kubecontext.spec b/test/segments/kubecontext.spec deleted file mode 100755 index 74b05b04..00000000 --- a/test/segments/kubecontext.spec +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" -} - -function mockKubectl() { - case "$1" in - 'version') - echo 'non-empty text' - ;; - 'config') - case "$2" in - 'view') - case "$3" in - '-o=jsonpath={.current-context}') - echo 'minikube' - ;; - '-o=jsonpath={.contexts'*) - echo '' - ;; - *) - echo "Mock value missed" - exit 1 - ;; - esac - ;; - esac - ;; - esac -} - -function mockKubectlOtherNamespace() { - case "$1" in - 'version') - echo 'non-empty text' - ;; - 'config') - case "$2" in - 'view') - case "$3" in - # Get Current Context - '-o=jsonpath={.current-context}') - echo 'minikube' - ;; - # Get current namespace - '-o=jsonpath={.contexts'*) - echo 'kube-system' - ;; - *) - echo "Mock value missed" - exit 1 - ;; - esac - ;; - esac - ;; - esac -} - -function testKubeContext() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(kubecontext) - alias kubectl=mockKubectl - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{005} %F{007}⎈ %F{007}minikube/default %k%F{005}%f " "$(build_left_prompt)" - - unalias kubectl -} -function testKubeContextOtherNamespace() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(kubecontext) - alias kubectl=mockKubectlOtherNamespace - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{005} %F{007}⎈ %F{007}minikube/kube-system %k%F{005}%f " "$(build_left_prompt)" - - unalias kubectl -} -function testKubeContextPrintsNothingIfKubectlNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world kubecontext) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - alias kubectl=noKubectl - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unalias kubectl -} - -source shunit2/shunit2 diff --git a/test/segments/laravel_version.spec b/test/segments/laravel_version.spec deleted file mode 100755 index 499a894d..00000000 --- a/test/segments/laravel_version.spec +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" -} - -function mockLaravelVersion() { - case "$1" in - "artisan") - # artisan --version follows the format Laravel Framework <version> - echo "Laravel Framework 5.4.23" - ;; - default) - esac -} - -function mockNoLaravelVersion() { - # When php can't find a file it will output a message - echo "Could not open input file: artisan" - return 0 -} - -function testLaravelVersionSegment() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(laravel_version) - local POWERLEVEL9K_LARAVEL_ICON='x' - alias php=mockLaravelVersion - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{009} %F{007}x %F{007}5.4.23 %k%F{009}%f " "$(build_left_prompt)" - - unalias php -} - -function testLaravelVersionSegmentIfArtisanIsNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world laravel_version) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - local POWERLEVEL9K_LARAVEL_ICON='x' - alias php=mockNoLaravelVersion - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unalias php -} - -function testLaravelVersionSegmentPrintsNothingIfPhpIsNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world laravel_version) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - local POWERLEVEL9K_LARAVEL_ICON='x' - alias php=noPhp - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unalias php -} - -source shunit2/shunit2 diff --git a/test/segments/load.spec b/test/segments/load.spec deleted file mode 100755 index 5867b419..00000000 --- a/test/segments/load.spec +++ /dev/null @@ -1,149 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - P9K_HOME=$(pwd) - ### Test specific - # Create default folder and git init it. - FOLDER=/tmp/powerlevel9k-test/load-test - mkdir -p "${FOLDER}" - cd $FOLDER -} - -function tearDown() { - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" - # At least remove test folder completely - rm -fr /tmp/powerlevel9k-test -} - -function testLoadSegmentWorksOnOsx() { - sysctl() { - if [[ "$*" == 'vm.loadavg' ]]; then - echo "vm.loadavg: { 1,38 1,45 2,16 }"; - fi - - if [[ "$*" == '-n hw.logicalcpu' ]]; then - echo "4"; - fi - } - - local POWERLEVEL9K_LOAD_WHICH=1 - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="OSX" # Fake OSX - - assertEquals "%K{002} %F{000}L %F{000}1.38 " "$(prompt_load left 1 false ${FOLDER})" - - unfunction sysctl -} - -function testLoadSegmentWorksOnBsd() { - sysctl() { - if [[ "$*" == 'vm.loadavg' ]]; then - echo "vm.loadavg: { 1,38 1,45 2,16 }"; - fi - - if [[ "$*" == '-n hw.ncpu' ]]; then - echo "4"; - fi - } - - local POWERLEVEL9K_LOAD_WHICH=1 - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="BSD" # Fake BSD - - assertEquals "%K{002} %F{000}L %F{000}1.38 " "$(prompt_load left 1 false ${FOLDER})" - - unfunction sysctl -} - -function testLoadSegmentWorksOnLinux() { - # Prepare loadavg - mkdir proc - echo "1.38 0.01 0.05 1/87 8641" > proc/loadavg - - alias nproc="echo 4" - local POWERLEVEL9K_LOAD_WHICH=1 - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="Linux" # Fake Linux - - assertEquals "%K{002} %F{000}L %F{000}1.38 " "$(prompt_load left 1 false ${FOLDER})" - - unalias nproc -} - -# Test normal state. This test is not OS specific. -# We test it as the Linux version, but that -# does not matter here. -function testLoadSegmentNormalState() { - # Prepare loadavg - mkdir proc - echo "1.00 0.01 0.05 1/87 8641" > proc/loadavg - - alias nproc="echo 4" - local POWERLEVEL9K_LOAD_WHICH=1 - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="Linux" # Fake Linux - - assertEquals "%K{002} %F{000}L %F{000}1.00 " "$(prompt_load left 1 false ${FOLDER})" - - unalias nproc -} - -# Test warning state. This test is not OS specific. -# We test it as the Linux version, but that -# does not matter here. -function testLoadSegmentWarningState() { - # Prepare loadavg - mkdir proc - echo "2.01 0.01 0.05 1/87 8641" > proc/loadavg - - alias nproc="echo 4" - local POWERLEVEL9K_LOAD_WHICH=1 - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="Linux" # Fake Linux - - assertEquals "%K{003} %F{000}L %F{000}2.01 " "$(prompt_load left 1 false ${FOLDER})" - - unalias nproc -} - -# Test critical state. This test is not OS specific. -# We test it as the Linux version, but that -# does not matter here. -function testLoadSegmentCriticalState() { - # Prepare loadavg - mkdir proc - echo "2.81 0.01 0.05 1/87 8641" > proc/loadavg - - alias nproc="echo 4" - local POWERLEVEL9K_LOAD_WHICH=1 - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="Linux" # Fake Linux - - assertEquals "%K{001} %F{000}L %F{000}2.81 " "$(prompt_load left 1 false ${FOLDER})" - - unalias nproc -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/newline.spec b/test/segments/newline.spec deleted file mode 100755 index 7cd00a89..00000000 --- a/test/segments/newline.spec +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - P9K_HOME=$(pwd) - ### Test specific -} - -function testNewlineDoesNotCreateExtraSegmentSeparator() { - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local POWERLEVEL9K_CUSTOM_WORLD2="echo world2" - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 newline newline newline custom_world2) - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="OSX" # Fake OSX - - local newline=$'\n' - - assertEquals "%K{007} %F{000}world1 %k%F{007}%f${newline}%k%f${newline}%k%f${newline}%K{007} %F{000}world2 %k%F{007}%f " "$(build_left_prompt)" -} - -function testNewlineMakesPreviousSegmentEndWell() { - local POWERLEVEL9K_CUSTOM_WORLD1="echo world1" - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world1 newline) - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="OSX" # Fake OSX - - local newline=$'\n' - - assertEquals "%K{007} %F{000}world1 %k%F{007}%f${newline}%k%F{none}%f " "$(build_left_prompt)" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/node_version.spec b/test/segments/node_version.spec deleted file mode 100755 index 764bfda2..00000000 --- a/test/segments/node_version.spec +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" -} - -function testNodeVersionSegmentPrintsNothingWithoutNode() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(node_version custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - alias node="nonode 2>/dev/null" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unalias node -} - -function testNodeVersionSegmentWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(node_version) - node() { - echo "v1.2.3" - } - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{007}⬢ %F{007}1.2.3 %k%F{002}%f " "$(build_left_prompt)" - - unfunction node -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/nodeenv.spec b/test/segments/nodeenv.spec deleted file mode 100755 index 92de81f5..00000000 --- a/test/segments/nodeenv.spec +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - # Test specfic - # unset all possible user specified variables - unset NODE_VIRTUAL_ENV_DISABLE_PROMPT - unset NODE_VIRTUAL_ENV -} - -function testNodeenvSegmentPrintsNothingWithoutNode() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nodeenv custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - alias node="nonode 2>/dev/null" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unalias node -} - -function testNodeenvSegmentPrintsNothingIfNodeVirtualEnvIsNotSet() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nodeenv custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - node() { - echo "v1.2.3" - } - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unfunction node -} - -function testNodeenvSegmentPrintsAtLeastNodeEnvWithoutNode() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nodeenv) - alias node="nonode 2>/dev/null" - NODE_VIRTUAL_ENV="node-env" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{002}⬢ %F{002}[node-env] %k%F{000}%f " "$(build_left_prompt)" - - unset NODE_VIRTUAL_ENV - unalias node -} - -function testNodeenvSegmentWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nodeenv) - node() { - echo "v1.2.3" - } - NODE_VIRTUAL_ENV="node-env" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{002}⬢ %F{002}v1.2.3[node-env] %k%F{000}%f " "$(build_left_prompt)" - - unfunction node - unset NODE_VIRTUAL_ENV -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/nvm.spec b/test/segments/nvm.spec deleted file mode 100755 index b53bf22e..00000000 --- a/test/segments/nvm.spec +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - P9K_HOME=$(pwd) - ### Test specific - # Create default folder and git init it. - FOLDER=/tmp/powerlevel9k-test/nvm-test - mkdir -p "${FOLDER}/bin" - OLD_PATH=$PATH - PATH=${FOLDER}/bin:$PATH - cd $FOLDER -} - -function tearDown() { - # Restore old path - PATH="${OLD_PATH}" - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" - # At least remove test folder completely - rm -fr /tmp/powerlevel9k-test -} - -function testNvmSegmentPrintsNothingIfNvmIsNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nvm custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testNvmSegmentWorksWithoutHavingADefaultAlias() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nvm) - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - function nvm_version() { - [[ ${1} == 'current' ]] && echo 'v4.6.0' || echo 'v1.4.0' - } - - assertEquals "%K{005} %F{000}⬢ %F{000}4.6.0 %k%F{005}%f " "$(build_left_prompt)" -} - -function testNvmSegmentPrintsNothingWhenOnDefaultVersion() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(nvm custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - function nvm_version() { - [[ ${1} == 'current' ]] && echo 'v4.6.0' || echo 'v4.6.0' - } - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/php_version.spec b/test/segments/php_version.spec deleted file mode 100755 index 6d64c570..00000000 --- a/test/segments/php_version.spec +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" -} - -function testPhpVersionSegmentPrintsNothingIfPhpIsNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(php_version custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - alias php="nophp" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unalias php -} - -function testPhpVersionSegmentWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(php_version) - alias php="echo 'PHP 5.6.27 (cli) (built: Oct 23 2016 11:47:58) -Copyright (c) 1997-2016 The PHP Group -Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies -'" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{013} %F{255}PHP 5.6.27 %k%F{013}%f " "$(build_left_prompt)" - - unalias php -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/public_ip.spec b/test/segments/public_ip.spec deleted file mode 100755 index 19c3adbc..00000000 --- a/test/segments/public_ip.spec +++ /dev/null @@ -1,386 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - # Test specific - P9K_HOME=$(pwd) - FOLDER=/tmp/powerlevel9k-test - mkdir -p $FOLDER - mkdir $FOLDER/sbin - cd $FOLDER - - # Change cache file, so that the users environment don't - # interfere with the tests. - POWERLEVEL9K_PUBLIC_IP_FILE=$FOLDER/public_ip_file -} - -function tearDown() { - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" - # At least remove test folder completely - rm -fr /tmp/powerlevel9k-test - unset FOLDER - unset P9K_HOME - - # Unset cache file - unset POWERLEVEL9K_PUBLIC_IP_FILE -} - -function fakeIfconfig() { - local INTERFACE="${1}" - [[ -z "${INTERFACE}" ]] && INTERFACE="tun0" - # Fake ifconfig - cat > $FOLDER/sbin/ifconfig <<EOF -#!/usr/bin/env zsh - -if [[ "\$*" == "-l" ]]; then - echo "lo0 gif0 stf0 EHC250 EHC253 tun1 tun0 ${INTERFACE} fw0 en0 en2 en1 p2p0 bridge0 utun0" - exit 0 -fi - -if [[ "\$*" == "${INTERFACE}" ]]; then - cat <<INNER -${INTERFACE}: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 - inet 1.2.3.4 txqueuelen 1000 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - device interrupt 16 memory 0xe8200000-e8220000 -INNER - exit 0 -fi - -if [[ "\$#" == "0" ]]; then - cat <<INNER -docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 - inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 - ether 02:42:8f:5c:ed:51 txqueuelen 0 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - -${INTERFACE}: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 - inet 1.2.3.4 txqueuelen 1000 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - device interrupt 16 memory 0xe8200000-e8220000 - -lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 - inet 127.0.0.1 netmask 255.0.0.0 - inet6 ::1 prefixlen 128 scopeid 0x10<host> - loop txqueuelen 1000 (Local Loopback) - RX packets 5136 bytes 328651 (320.9 KiB) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 5136 bytes 328651 (320.9 KiB) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 -INNER -fi -EOF - chmod +x $FOLDER/sbin/ifconfig -} - -function fakeIp() { - local INTERFACE1="${1}" - [[ -z "${INTERFACE1}" ]] && INTERFACE1="tun0" - local INTERFACE2="${2}" - [[ -z "${INTERFACE2}" ]] && INTERFACE2="disabled-if2" - cat > $FOLDER/sbin/ip <<EOF -#!/usr/bin/env zsh - - if [[ "\$*" == 'link ls up' ]]; then - cat <<INNER -1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default - link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 -2: ${INTERFACE1}: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 - link/ether 08:00:27:7e:84:45 brd ff:ff:ff:ff:ff:ff -3: ${INTERFACE2}: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 - link/ether 08:00:27:7e:84:45 brd ff:ff:ff:ff:ff:ff -4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 - link/ether 08:00:27:7e:84:45 brd ff:ff:ff:ff:ff:ff -INNER - fi - - if [[ "\$*" =~ '-brief.*show' ]]; then - cat <<INNER -lo UNKNOWN 127.0.0.1/8 -${INTERFACE1} UP 1.2.3.4/24 -${INTERFACE2} UP 5.4.3.2/16 -docker0 DOWN 172.17.0.1/16 -INNER - fi - - if [[ "\$*" =~ 'show ${INTERFACE1}' ]]; then - cat <<INNER -2: ${INTERFACE1}: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 - inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 - valid_lft forever preferred_lft forever -INNER - fi - - if [[ "\$*" =~ 'show ${INTERFACE2}' ]]; then - cat <<INNER -3: ${INTERFACE2}: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 - inet 1.2.3.4 brd 10.0.2.255 scope global eth0 - valid_lft forever preferred_lft forever -INNER - fi -EOF - - chmod +x $FOLDER/sbin/ip -} - -function testPublicIpSegmentPrintsNothingByDefaultIfHostIsNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip custom_world) - local POWERLEVEL9K_PUBLIC_IP_HOST='http://unknown.xyz' - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - # We need to overwrite dig, as this is a fallback method that - # uses an alternative host. - alias dig='nodig' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unalias dig -} - -function testPublicIpSegmentPrintsNoticeIfNotConnected() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip) - local POWERLEVEL9K_PUBLIC_IP_HOST='http://unknown.xyz' - local POWERLEVEL9K_PUBLIC_IP_NONE="disconnected" - # We need to overwrite dig, as this is a fallback method that - # uses an alternative host. - alias dig='nodig' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{007}disconnected %k%F{000}%f " "$(build_left_prompt)" - - unalias dig -} - -function testPublicIpSegmentWorksWithWget() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip) - alias dig='nodig' - alias curl='nocurl' - wget() { - echo "wget 1.2.3.4" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{007}wget 1.2.3.4 %k%F{000}%f " "$(build_left_prompt)" - - unfunction wget - unalias dig - unalias curl -} - -function testPublicIpSegmentUsesCurlAsFallbackMethodIfWgetIsNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip) - alias dig='nodig' - alias wget='nowget' - curl() { - echo "curl 1.2.3.4" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{007}curl 1.2.3.4 %k%F{000}%f " "$(build_left_prompt)" - - unfunction curl - unalias dig - unalias wget -} - -function testPublicIpSegmentUsesDigAsFallbackMethodIfWgetAndCurlAreNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip) - alias curl='nocurl' - alias wget='nowget' - dig() { - echo "dig 1.2.3.4" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{007}dig 1.2.3.4 %k%F{000}%f " "$(build_left_prompt)" - - unfunction dig - unalias curl - unalias wget -} - -function testPublicIpSegmentCachesFile() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip) - dig() { - echo "first" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{007}first %k%F{000}%f " "$(build_left_prompt)" - - dig() { - echo "second" - } - - # Segment should not have changed! - assertEquals "%K{000} %F{007}first %k%F{000}%f " "$(build_left_prompt)" - - unfunction dig -} - -function testPublicIpSegmentRefreshesCachesFileAfterTimeout() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip) - local POWERLEVEL9K_PUBLIC_IP_TIMEOUT=2 - dig() { - echo "first" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{007}first %k%F{000}%f " "$(build_left_prompt)" - - sleep 3 - dig() { - echo "second" - } - - # Segment should not have changed! - assertEquals "%K{000} %F{007}second %k%F{000}%f " "$(build_left_prompt)" - - unfunction dig -} - -function testPublicIpSegmentRefreshesCachesFileIfEmpty() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip) - dig() { - echo "first" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{007}first %k%F{000}%f " "$(build_left_prompt)" - - # Truncate cache file - echo "" >! $POWERLEVEL9K_PUBLIC_IP_FILE - - dig() { - echo "second" - } - - # Segment should not have changed! - assertEquals "%K{000} %F{007}second %k%F{000}%f " "$(build_left_prompt)" - - unfunction dig -} - -function testPublicIpSegmentWhenGoingOnline() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(public_ip) - local POWERLEVEL9K_PUBLIC_IP_METHODS="dig" - local POWERLEVEL9K_PUBLIC_IP_NONE="disconnected" - alias dig="nodig" - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{007}disconnected %k%F{000}%f " "$(build_left_prompt)" - - unalias dig - - dig() { - echo "second" - } - - # Segment should not have changed! - assertEquals "%K{000} %F{007}second %k%F{000}%f " "$(build_left_prompt)" - - unfunction dig -} - -function testPublicIpSegmentWithVPNTurnedOnLinux() { - local OS='linux' - - echo "1.2.3.4" > $POWERLEVEL9K_PUBLIC_IP_FILE - local POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE="tun1" - - # Fake ip command - fakeIp "tun1" - - assertEquals "%K{000} %F{007}(vpn) %F{007}1.2.3.4 " "$(prompt_public_ip left 1 false "$FOLDER")" -} - -function testPublicIpSegmentWithVPNTurnedOnOsx() { - typeset -F now - now=$(date +%s) - - local OS='OSX' - - echo "1.2.3.4" > $POWERLEVEL9K_PUBLIC_IP_FILE - local POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE="tun1" - - # Fake stat call - function stat() { - echo $now - } - - # Fake ifconfig - fakeIfconfig "tun1" - - assertEquals "%K{000} %F{007}(vpn) %F{007}1.2.3.4 " "$(prompt_public_ip left 1 false "$FOLDER")" - - unfunction stat -} - -function testPublicIpSegmentWithVPNTurnedOnAndFuzzyMatchingOnOsx() { - typeset -F now - now=$(date +%s) - - local OS='OSX' - - echo "1.2.3.4" > $POWERLEVEL9K_PUBLIC_IP_FILE - local POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE="tun" - - # Fake stat call - function stat() { - echo $now - } - - # Fake ifconfig - fakeIfconfig "tun3" - - assertEquals "%K{000} %F{007}(vpn) %F{007}1.2.3.4 " "$(prompt_public_ip left 1 false "$FOLDER")" - - unfunction stat -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/ram.spec b/test/segments/ram.spec deleted file mode 100755 index 292c784b..00000000 --- a/test/segments/ram.spec +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - P9K_HOME=$(pwd) - ### Test specific - # Create default folder and git init it. - FOLDER=/tmp/powerlevel9k-test/ram-test - mkdir -p "${FOLDER}" - cd $FOLDER -} - -function tearDown() { - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" - # At least remove test folder completely - rm -fr /tmp/powerlevel9k-test -} - -function testRamSegmentWorksOnOsx() { - alias vm_stat="echo 'Mach Virtual Memory Statistics: (page size of 4096 bytes) -Pages free: 299687. -Pages active: 1623792. -Pages inactive: 1313411. -'" - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="OSX" # Fake OSX - - assertEquals "%K{003} %F{000}RAM %F{000}6.15G " "$(prompt_ram left 1 false ${FOLDER})" - - unalias vm_stat -} - -function testRamSegmentWorksOnBsd() { - mkdir -p var/run - echo "avail memory 5678B 299687 4444G 299" > var/run/dmesg.boot - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="BSD" # Fake BSD - - assertEquals "%K{003} %F{000}RAM %F{000}0.29M " "$(prompt_ram left 1 false ${FOLDER})" -} - -function testRamSegmentWorksOnLinux() { - mkdir proc - echo "MemAvailable: 299687" > proc/meminfo - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="Linux" # Fake Linux - - assertEquals "%K{003} %F{000}RAM %F{000}0.29G " "$(prompt_ram left 1 false ${FOLDER})" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/rust_version.spec b/test/segments/rust_version.spec deleted file mode 100755 index 7b6ffe7c..00000000 --- a/test/segments/rust_version.spec +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -TEST_BASE_FOLDER=/tmp/powerlevel9k-test -RUST_TEST_FOLDER="${TEST_BASE_FOLDER}/rust-test" - -function setUp() { - OLDPATH="${PATH}" - mkdir -p "${RUST_TEST_FOLDER}" - PATH="${RUST_TEST_FOLDER}:${PATH}" - - export TERM="xterm-256color" -} - -function tearDown() { - PATH="${OLDPATH}" - rm -fr "${TEST_BASE_FOLDER}" -} - -function mockRust() { - echo "#!/bin/sh\n\necho 'rustc 0.4.1a-alpha'" > "${RUST_TEST_FOLDER}/rustc" - chmod +x "${RUST_TEST_FOLDER}/rustc" -} - -function testRust() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(rust_version) - mockRust - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{208} %F{000}Rust %F{000}0.4.1a-alpha %k%F{208}%f " "$(build_left_prompt)" -} - -function testRustPrintsNothingIfRustIsNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(custom_world rust_version) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -source shunit2/shunit2 diff --git a/test/segments/ssh.spec b/test/segments/ssh.spec deleted file mode 100755 index 40723ebd..00000000 --- a/test/segments/ssh.spec +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" -} - -function testSshSegmentPrintsNothingIfNoSshConnection() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ssh custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo "world"' - local POWERLEVEL9K_SSH_ICON="ssh-icon" - # Weak test: Emulate No SSH connection by unsetting - # $SSH_CLIENT and $SSH_TTY - unset SSH_CLIENT - unset SSH_TTY - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testSshSegmentWorksIfOnlySshClientIsSet() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ssh) - local POWERLEVEL9K_SSH_ICON="ssh-icon" - # Weak test: Emulate No SSH connection by unsetting - # $SSH_CLIENT and $SSH_TTY - SSH_CLIENT='ssh-client' - unset SSH_TTY - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{003}ssh-icon %k%F{000}%f " "$(build_left_prompt)" - - unset SSH_CLIENT -} - -function testSshSegmentWorksIfOnlySshTtyIsSet() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ssh) - local POWERLEVEL9K_SSH_ICON="ssh-icon" - # Weak test: Emulate No SSH connection by unsetting - # $SSH_CLIENT and $SSH_TTY - SSH_TTY='ssh-tty' - unset SSH_CLIENT - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{003}ssh-icon %k%F{000}%f " "$(build_left_prompt)" - - unset SSH_TTY -} - -function testSshSegmentWorksIfAllNecessaryVariablesAreSet() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(ssh) - local POWERLEVEL9K_SSH_ICON="ssh-icon" - # Weak test: Emulate No SSH connection by unsetting - # $SSH_CLIENT and $SSH_TTY - SSH_CLIENT='ssh-client' - SSH_TTY='ssh-tty' - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{003}ssh-icon %k%F{000}%f " "$(build_left_prompt)" - - unset SSH_TTY - unset SSH_CLIENT -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/status.spec b/test/segments/status.spec deleted file mode 100755 index 839f30ab..00000000 --- a/test/segments/status.spec +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - ### Test specific - # Resets if someone has set these in his/hers env - unset POWERLEVEL9K_STATUS_VERBOSE - unset POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE -} - -function testStatusPrintsNothingIfReturnCodeIsZeroAndVerboseIsUnset() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - local POWERLEVEL9K_STATUS_VERBOSE=false - local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testStatusWorksAsExpectedIfReturnCodeIsZeroAndVerboseIsSet() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status) - local POWERLEVEL9K_STATUS_VERBOSE=true - local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false - local POWERLEVEL9K_STATUS_HIDE_SIGNAME=true - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{002}✔ %k%F{000}%f " "$(build_left_prompt)" -} - -function testStatusInGeneralErrorCase() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status) - local POWERLEVEL9K_STATUS_VERBOSE=true - local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local RETVAL=1 - - assertEquals "%K{001} %F{226}↵ %F{226}1 %k%F{001}%f " "$(build_left_prompt)" -} - -function testPipestatusInErrorCase() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status) - local POWERLEVEL9K_STATUS_VERBOSE=true - local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=true - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local -a RETVALS - RETVALS=(0 0 1 0) - - assertEquals "%K{001} %F{226}↵ %F{226}0|0|1|0 %k%F{001}%f " "$(build_left_prompt)" -} - -function testStatusCrossWinsOverVerbose() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status) - local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false - local POWERLEVEL9K_STATUS_VERBOSE=true - local POWERLEVEL9K_STATUS_CROSS=true - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local RETVAL=1 - - assertEquals "%K{000} %F{001}✘ %k%F{000}%f " "$(build_left_prompt)" -} - -function testStatusShowsSignalNameInErrorCase() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status) - local POWERLEVEL9K_STATUS_SHOW_PIPESTATUS=false - local POWERLEVEL9K_STATUS_VERBOSE=true - local POWERLEVEL9K_STATUS_HIDE_SIGNAME=false - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local RETVAL=132 - - assertEquals "%K{001} %F{226}↵ %F{226}SIGILL(4) %k%F{001}%f " "$(build_left_prompt)" -} - -function testStatusSegmentIntegrated() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status) - local -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS - POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=() - local POWERLEVEL9K_STATUS_CROSS=true - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - false; powerlevel9k_prepare_prompts - - assertEquals "%f%b%k%K{000} %F{001}✘ %k%F{000}%f " "${(e)PROMPT}" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/swap.spec b/test/segments/swap.spec deleted file mode 100755 index 07b254be..00000000 --- a/test/segments/swap.spec +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - P9K_HOME=$(pwd) - ### Test specific - # Create default folder and git init it. - FOLDER=/tmp/powerlevel9k-test/swap-test - mkdir -p "${FOLDER}" - cd $FOLDER -} - -function tearDown() { - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" - # At least remove test folder completely - rm -fr /tmp/powerlevel9k-test -} - -function testSwapSegmentWorksOnOsx() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(swap) - sysctl() { - echo "vm.swapusage: total = 3072,00M used = 1620,50M free = 1451,50M (encrypted)" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="OSX" # Fake OSX - - assertEquals "%K{003} %F{000}SWP %F{000}1.58G " "$(prompt_swap left 1 false ${FOLDER})" - - unfunction sysctl -} - -function testSwapSegmentWorksOnLinux() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(swap) - mkdir proc - echo "SwapTotal: 1000000" > proc/meminfo - echo "SwapFree: 1000" >> proc/meminfo - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - local OS="Linux" # Fake Linux - - assertEquals "%K{003} %F{000}SWP %F{000}0.95G " "$(prompt_swap left 1 false ${FOLDER})" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/swift_version.spec b/test/segments/swift_version.spec deleted file mode 100755 index 57a2ef7b..00000000 --- a/test/segments/swift_version.spec +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - P9K_HOME=$(pwd) - ### Test specific - # Create default folder and git init it. - FOLDER=/tmp/powerlevel9k-test - mkdir -p "${FOLDER}" - cd $FOLDER -} - -function tearDown() { - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" - # At least remove test folder completely - rm -fr /tmp/powerlevel9k-test -} - -function testSwiftSegmentPrintsNothingIfSwiftIsNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(swift_version custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - alias swift="noswift" - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unalias swift -} - -function testSwiftSegmentWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(swift_version) - function swift() { - echo "Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)\nTarget: x86_64-apple-macosx10.9" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{005} %F{007}Swift %F{007}3.0.1 %k%F{005}%f " "$(build_left_prompt)" - - unfunction swift -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/symfony_version.spec b/test/segments/symfony_version.spec deleted file mode 100755 index cb480724..00000000 --- a/test/segments/symfony_version.spec +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - P9K_HOME=$(pwd) - ### Test specific - # Create default folder and git init it. - FOLDER=/tmp/powerlevel9k-test - mkdir -p "${FOLDER}" - cd $FOLDER -} - -function tearDown() { - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" - # At least remove test folder completely - rm -fr /tmp/powerlevel9k-test -} - -function testSymfonyVersionSegmentPrintsNothingIfPhpIsNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(symfony2_version custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - alias php="nophp" - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unalias php -} - -function testSymfonyVersionSegmentPrintsNothingIfSymfonyIsNotAvailable() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(symfony2_version custom_world) - # "Symfony" is not a command, but rather a framework. - # To sucessfully execute this test, we just need to - # navigate into a folder that does not contain symfony. - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testSymfonyVersionPrintsNothingIfPhpThrowsAnError() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(symfony2_version custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - mkdir app - touch app/AppKernel.php - function php() { - echo "Warning: Unsupported declare strict_types in /Users/dr/Privat/vendor/ocramius/proxy-manager/src/ProxyManager/Configuration.php on line 19 - - Parse error: parse error, expecting `;´ or `{´ in /Users/dr/Privat/vendor/ocramius/proxy-manager/src/ProxyManager/Configuration.php on line 97" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" - - unfunction php -} - -function testSymfonyVersionSegmentWorks() { - startSkipping # Skip test - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(symfony2_version) - mkdir app - touch app/AppKernel.php - - function php() { - echo "Symfony version 3.1.4 - app/dev/debug" - } - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{240} %F{000}SF %f%F{000}3.1.4 %k%F{240}%f " "$(build_left_prompt)" - - unfunction php -} - -function testSymfonyVersionSegmentWorksInNestedFolder() { - startSkipping # Skip test - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(symfony2_version) - mkdir app - touch app/AppKernel.php - - function php() { - echo "Symfony version 3.1.4 - app/dev/debug" - } - - mkdir -p src/P9K/AppBundle - cd src/P9K/AppBundle - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{240} %F{000}SF %f%F{000}3.1.4 %k%F{240}%f " "$(build_left_prompt)" - - unfunction php -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/todo.spec b/test/segments/todo.spec deleted file mode 100755 index 21da2a92..00000000 --- a/test/segments/todo.spec +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - P9K_HOME=$(pwd) - ### Test specific - # Create default folder and git init it. - FOLDER=/tmp/powerlevel9k-test - mkdir -p "${FOLDER}" - mkdir ${FOLDER}/bin - OLD_PATH=$PATH - PATH=${FOLDER}/bin:$PATH - cd $FOLDER -} - -function tearDown() { - # Reset PATH - PATH=$OLD_PATH - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" - # At least remove test folder completely - rm -fr /tmp/powerlevel9k-test -} - -function testTodoSegmentPrintsNothingIfTodoShIsNotInstalled() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(todo custom_world) - local POWERLEVEL9K_CUSTOM_WORLD='echo world' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{000}world %k%F{007}%f " "$(build_left_prompt)" -} - -function testTodoSegmentWorksAsExpected() { - # TODO: Skript in den PATH legen! - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(todo) - echo '#!/bin/sh' > ${FOLDER}/bin/todo.sh - echo 'echo "TODO: 34 of 100 tasks shown";' >> ${FOLDER}/bin/todo.sh - chmod +x ${FOLDER}/bin/todo.sh - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{244} %F{000}☑ %F{000}100 %k%F{244}%f " "$(build_left_prompt)" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/vcs-git.spec b/test/segments/vcs-git.spec deleted file mode 100755 index 81a934e9..00000000 --- a/test/segments/vcs-git.spec +++ /dev/null @@ -1,535 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - P9K_HOME=$(pwd) - ### Test specific - # Create default folder and git init it. - FOLDER=/tmp/powerlevel9k-test/vcs-test - mkdir -p "${FOLDER}" - cd $FOLDER - - # Set username and email - OLD_GIT_AUTHOR_NAME=$GIT_AUTHOR_NAME - GIT_AUTHOR_NAME="Testing Tester" - OLD_GIT_AUTHOR_EMAIL=$GIT_AUTHOR_EMAIL - GIT_AUTHOR_EMAIL="test@powerlevel9k.theme" - - # Set default username if not already set! - if [[ -z $(git config user.name) ]]; then - GIT_AUTHOR_NAME_SET_BY_TEST=true - git config --global user.name "${GIT_AUTHOR_NAME}" - fi - # Set default email if not already set! - if [[ -z $(git config user.email) ]]; then - GIT_AUTHOR_EMAIL_SET_BY_TEST=true - git config --global user.email "${GIT_AUTHOR_EMAIL}" - fi - - # Initialize FOLDER as git repository - git init 1>/dev/null -} - -function tearDown() { - if [[ -n "${OLD_GIT_AUTHOR_NAME}" ]]; then - GIT_AUTHOR_NAME=$OLD_GIT_AUTHOR - unset OLD_GIT_AUTHOR_NAME - else - unset GIT_AUTHOR_NAME - fi - - if [[ -n "${OLD_GIT_AUTHOR_EMAIL}" ]]; then - GIT_AUTHOR_EMAIL=$OLD_GIT_AUTHOR_EMAIL - unset OLD_GIT_AUTHOR_EMAIL - else - unset GIT_AUTHOR_EMAIL - fi - - if [[ "${GIT_AUTHOR_NAME_SET_BY_TEST}" == "true" ]]; then - git config --global --unset user.name - fi - if [[ "${GIT_AUTHOR_EMAIL_SET_BY_TEST}" == "true" ]]; then - git config --global --unset user.email - fi - - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" - # At least remove test folder completely - rm -fr /tmp/powerlevel9k-test - unset FOLDER -} - -function testColorOverridingForCleanStateWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_CLEAN_FOREGROUND='cyan' - local POWERLEVEL9K_VCS_CLEAN_BACKGROUND='white' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{006} master %k%F{007}%f " "$(build_left_prompt)" -} - -function testColorOverridingForModifiedStateWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_MODIFIED_FOREGROUND='red' - local POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='yellow' - - touch testfile - git add testfile - git commit -m "test" 1>/dev/null - echo "test" > testfile - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{003} %F{001} master ● %k%F{003}%f " "$(build_left_prompt)" -} - -function testColorOverridingForUntrackedStateWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND='cyan' - local POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND='yellow' - - touch testfile - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{003} %F{006} master ? %k%F{003}%f " "$(build_left_prompt)" -} - -function testGitIconWorks() { - local POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_GIT_ICON='Git-Icon' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000}Git-Icon %F{000} master %k%F{002}%f " "$(build_left_prompt)" -} - -function testGitlabIconWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_GIT_GITLAB_ICON='GL-Icon' - - # Add a GitLab project as remote origin. This is - # sufficient to show the GitLab-specific icon. - git remote add origin https://gitlab.com/dritter/gitlab-test-project.git - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000}GL-Icon %F{000} master %k%F{002}%f " "$(build_left_prompt)" -} - -function testBitbucketIconWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_GIT_BITBUCKET_ICON='BB-Icon' - - # Add a BitBucket project as remote origin. This is - # sufficient to show the BitBucket-specific icon. - git remote add origin https://dritter@bitbucket.org/dritter/dr-test.git - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000}BB-Icon %F{000} master %k%F{002}%f " "$(build_left_prompt)" -} - -function testGitHubIconWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_GIT_GITHUB_ICON='GH-Icon' - - # Add a GitHub project as remote origin. This is - # sufficient to show the GitHub-specific icon. - git remote add origin https://github.com/dritter/test.git - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000}GH-Icon %F{000} master %k%F{002}%f " "$(build_left_prompt)" -} - -function testUntrackedFilesIconWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_UNTRACKED_ICON='?' - - # Create untracked file - touch "i-am-untracked.txt" - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000} master ? %k%F{002}%f " "$(build_left_prompt)" -} - -function testStagedFilesIconWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_STAGED_ICON='+' - - # Create staged file - touch "i-am-added.txt" - git add i-am-added.txt &>/dev/null - git commit -m "initial commit" &>/dev/null - echo "xx" >> i-am-added.txt - git add i-am-added.txt &>/dev/null - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{003} %F{000} master + %k%F{003}%f " "$(build_left_prompt)" -} - -function testUnstagedFilesIconWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_UNSTAGED_ICON='M' - - # Create unstaged (modified, but not added to index) file - touch "i-am-modified.txt" - git add i-am-modified.txt - git commit -m "Add File" 1>/dev/null - echo "xx" > i-am-modified.txt - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{003} %F{000} master M %k%F{003}%f " "$(build_left_prompt)" -} - -function testStashIconWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_STASH_ICON='S' - - # Create modified file - touch "i-am-modified.txt" - git add i-am-modified.txt - git commit -m "Add File" 1>/dev/null - echo "xx" > i-am-modified.txt - git stash 1>/dev/null - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000} master S1 %k%F{002}%f " "$(build_left_prompt)" -} - -function testTagIconWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_TAG_ICON='T' - - touch "file.txt" - git add file.txt - git commit -m "Add File" 1>/dev/null - git tag "v0.0.1" - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000} master Tv0.0.1 %k%F{002}%f " "$(build_left_prompt)" -} - -function testTagIconInDetachedHeadState() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_TAG_ICON='T' - - touch "file.txt" - git add file.txt - git commit -m "Add File" &>/dev/null - git tag "v0.0.1" - touch "file2.txt" - git add file2.txt - git commit -m "Add File2" &>/dev/null - git checkout v0.0.1 &>/dev/null - local hash=$(git rev-list -n 1 --abbrev-commit --abbrev=8 HEAD) - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000} ${hash} Tv0.0.1 %k%F{002}%f " "$(build_left_prompt)" -} - -function testActionHintWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - - touch "i-am-modified.txt" - git add i-am-modified.txt - git commit -m "Add File" &>/dev/null - - git clone . ../vcs-test2 &>/dev/null - echo "xx" >> i-am-modified.txt - git commit -a -m "Modified file" &>/dev/null - - cd ../vcs-test2 - echo "yy" >> i-am-modified.txt - git commit -a -m "Provoke conflict" &>/dev/null - git pull &>/dev/null - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{003} %F{000} master %F{red}| merge%f %k%F{003}%f " "$(build_left_prompt)" -} - -function testIncomingHintWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON='I' - - touch "i-am-modified.txt" - git add i-am-modified.txt - git commit -m "Add File" &>/dev/null - - git clone . ../vcs-test2 &>/dev/null - echo "xx" >> i-am-modified.txt - git commit -a -m "Modified file" &>/dev/null - - cd ../vcs-test2 - git fetch &>/dev/null - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000} master I1 %k%F{002}%f " "$(build_left_prompt)" -} - -function testOutgoingHintWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON='o' - - touch "i-am-modified.txt" - git add i-am-modified.txt - git commit -m "Add File" &>/dev/null - - git clone . ../vcs-test2 &>/dev/null - - cd ../vcs-test2 - - echo "xx" >> i-am-modified.txt - git commit -a -m "Modified file" &>/dev/null - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000} master o1 %k%F{002}%f " "$(build_left_prompt)" -} - -function testShorteningCommitHashWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_SHOW_CHANGESET=true - local POWERLEVEL9K_CHANGESET_HASH_LENGTH='4' - - touch "file.txt" - git add file.txt - git commit -m "Add File" 1>/dev/null - local hash=$(git rev-list -n 1 --abbrev-commit --abbrev=3 HEAD) - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - # This test needs to call powerlevel9k_vcs_init, where - # the changeset is truncated. - powerlevel9k_vcs_init - assertEquals "%K{002} %F{000}${hash} master %k%F{002}%f " "$(build_left_prompt)" -} - -function testShorteningCommitHashIsNotShownIfShowChangesetIsFalse() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_SHOW_CHANGESET=false - local POWERLEVEL9K_CHANGESET_HASH_LENGTH='4' - - touch "file.txt" - git add file.txt - git commit -m "Add File" 1>/dev/null - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - # This test needs to call powerlevel9k_vcs_init, where - # the changeset is truncated. - powerlevel9k_vcs_init - assertEquals "%K{002} %F{000} master %k%F{002}%f " "$(build_left_prompt)" -} - -function testDetectingUntrackedFilesInSubmodulesWork() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY="true" - unset POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND - - mkdir ../submodule - cd ../submodule - git init 1>/dev/null - touch "i-am-tracked.txt" - git add . 1>/dev/null && git commit -m "Initial Commit" 1>/dev/null - - local submodulePath="${PWD}" - - cd - - git submodule add "${submodulePath}" 2>/dev/null - git commit -m "Add submodule" 1>/dev/null - - # Go into checked-out submodule path - cd submodule - # Create untracked file - touch "i-am-untracked.txt" - cd - - - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000} master ? %k%F{002}%f " "$(build_left_prompt)" -} - -function testDetectinUntrackedFilesInMainRepoWithDirtySubmodulesWork() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY="true" - unset POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND - - mkdir ../submodule - cd ../submodule - git init 1>/dev/null - touch "i-am-tracked.txt" - git add . 1>/dev/null && git commit -m "Initial Commit" 1>/dev/null - - local submodulePath="${PWD}" - - cd - - git submodule add "${submodulePath}" 2>/dev/null - git commit -m "Add submodule" 1>/dev/null - - # Create untracked file - touch "i-am-untracked.txt" - - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000} master ? %k%F{002}%f " "$(build_left_prompt)" -} - -function testDetectingUntrackedFilesInNestedSubmodulesWork() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY="true" - unset POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND - - local mainRepo="${PWD}" - - mkdir ../submodule - cd ../submodule - git init 1>/dev/null - touch "i-am-tracked.txt" - git add . 1>/dev/null && git commit -m "Initial Commit" 1>/dev/null - - local submodulePath="${PWD}" - - mkdir ../subsubmodule - cd ../subsubmodule - git init 1>/dev/null - touch "i-am-tracked-too.txt" - git add . 1>/dev/null && git commit -m "Initial Commit" 1>/dev/null - - local subsubmodulePath="${PWD}" - - cd "${submodulePath}" - git submodule add "${subsubmodulePath}" 2>/dev/null - git commit -m "Add subsubmodule" 1>/dev/null - cd "${mainRepo}" - git submodule add "${submodulePath}" 2>/dev/null - git commit -m "Add submodule" 1>/dev/null - - git submodule update --init --recursive 2>/dev/null - - cd submodule/subsubmodule - # Create untracked file - touch "i-am-untracked.txt" - cd - - - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000} master ? %k%F{002}%f " "$(build_left_prompt)" -} - -function testDetectingUntrackedFilesInCleanSubdirectoryWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY="true" - unset POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND - mkdir clean-folder - touch clean-folder/file.txt - mkdir dirty-folder - touch dirty-folder/file.txt - git add . 2>/dev/null - git commit -m "Initial commit" >/dev/null - touch dirty-folder/new-file.txt - cd clean-folder - source ${P9K_HOME}/powerlevel9k.zsh-theme - assertEquals "%K{002} %F{000} master ? %k%F{002}%f " "$(build_left_prompt)" -} - -function testBranchNameScriptingVulnerability() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - echo "#!/bin/sh\n\necho 'hacked'\n" > evil_script.sh - chmod +x evil_script.sh - - git checkout -b '$(./evil_script.sh)' 2>/dev/null - git add . 2>/dev/null - git commit -m "Initial commit" >/dev/null - - assertEquals '%K{002} %F{000} $(./evil_script.sh) %k%F{002}%f ' "$(build_left_prompt)" -} - -function testGitSubmoduleWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY="true" - unset POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND - - mkdir ../submodule - cd ../submodule - git init 1>/dev/null - touch "i-am-tracked.txt" - git add . 1>/dev/null && git commit -m "Initial Commit" 1>/dev/null - - local submodulePath="${PWD}" - - cd - - git submodule add "${submodulePath}" 2>/dev/null - git commit -m "Add submodule" 1>/dev/null - - cd submodule - - source "${P9K_HOME}/powerlevel9k.zsh-theme" - - local result="$(build_left_prompt)" - [[ "$result" =~ ".*(is outside repository)+" ]] && return 1 - - assertEquals "%K{002} %F{000} master %k%F{002}%f " "$result" -} - - -source shunit2/shunit2 diff --git a/test/segments/vcs-hg.spec b/test/segments/vcs-hg.spec deleted file mode 100755 index 8fabc21a..00000000 --- a/test/segments/vcs-hg.spec +++ /dev/null @@ -1,220 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - P9K_HOME=$(pwd) - ### Test specific - # Create default folder and hg init it. - FOLDER=/tmp/powerlevel9k-test/vcs-test - mkdir -p "${FOLDER}" - cd $FOLDER - - export HGUSER="Test bot <bot@example.com>" - - hg init 1>/dev/null -} - -function tearDown() { - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" &>/dev/null - # At least remove test folder completely - rm -fr /tmp/powerlevel9k-test &>/dev/null - unset FOLDER - unset HGUSER -} - -function testColorOverridingForCleanStateWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_CLEAN_FOREGROUND='cyan' - local POWERLEVEL9K_VCS_CLEAN_BACKGROUND='white' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{007} %F{006} default %k%F{007}%f " "$(build_left_prompt)" -} - -function testColorOverridingForModifiedStateWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_MODIFIED_FOREGROUND='red' - local POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='yellow' - - touch testfile - hg add testfile - hg commit -m "test" 1>/dev/null - echo "test" > testfile - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{003} %F{001} default ● %k%F{003}%f " "$(build_left_prompt)" -} - -# There is no staging area in mercurial, therefore there are no "untracked" -# files.. In case there are added files, we show the VCS segment with a -# yellow background. -# This may be improved in future versions, to be a bit more consistent with -# the git part. -function testAddedFilesIconWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - touch "myfile.txt" - hg add myfile.txt - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{003} %F{000} default ● %k%F{003}%f " "$(build_left_prompt)" -} - -# We don't support tagging in mercurial right now.. -function testTagIconWorks() { - startSkipping # Skip test - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_TAG_ICON='T' - - touch "file.txt" - hg add file.txt - hg commit -m "Add File" 1>/dev/null - hg tag "v0.0.1" - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000} default Tv0.0.1 %k%F{002}%f " "$(build_left_prompt)" -} - -function testTagIconInDetachedHeadState() { - startSkipping # Skip test - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_TAG_ICON='T' - - touch "file.txt" - hg add file.txt - hg commit -m "Add File" &>/dev/null - hg tag "v0.0.1" - touch "file2.txt" - hg add file2.txt - hg commit -m "Add File2" &>/dev/null - hg checkout v0.0.1 &>/dev/null - local hash=$(hg id) - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000} ${hash} Tv0.0.1 %k%F{002}%f " "$(build_left_prompt)" -} - -function testActionHintWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - touch "i-am-modified.txt" - hg add i-am-modified.txt - hg commit -m "Add File" &>/dev/null - - hg clone . ../vcs-test2 &>/dev/null - echo "xx" >> i-am-modified.txt - hg commit -m "Modified file" &>/dev/null - - cd ../vcs-test2 - echo "yy" >> i-am-modified.txt - hg commit -m "Provoke conflict" 2>/dev/null - hg pull 1>/dev/null - hg merge --tool internal:merge >/dev/null 2>&1 - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{003} %F{000} default %F{red}| merging%f %k%F{003}%f " "$(build_left_prompt)" -} - -function testShorteningCommitHashWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_SHOW_CHANGESET=true - local POWERLEVEL9K_CHANGESET_HASH_LENGTH='4' - - touch "file.txt" - hg add file.txt - hg commit -m "Add File" 1>/dev/null - local hash=$(hg id | head -c ${POWERLEVEL9K_CHANGESET_HASH_LENGTH}) - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - # This test needs to call powerlevel9k_vcs_init, where - # the changeset is truncated. - powerlevel9k_vcs_init - - assertEquals "%K{002} %F{000}${hash} default %k%F{002}%f " "$(build_left_prompt)" -} - -function testShorteningCommitHashIsNotShownIfShowChangesetIsFalse() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_SHOW_CHANGESET=false - local POWERLEVEL9K_CHANGESET_HASH_LENGTH='4' - - touch "file.txt" - hg add file.txt - hg commit -m "Add File" 1>/dev/null - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - # This test needs to call powerlevel9k_vcs_init, where - # the changeset is truncated. - powerlevel9k_vcs_init - - assertEquals "%K{002} %F{000} default %k%F{002}%f " "$(build_left_prompt)" -} - -function testMercurialIconWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_HG_ICON='HG-Icon' - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000}HG-Icon %F{000} default %k%F{002}%f " "$(build_left_prompt)" -} - -function testBookmarkIconWorks() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - local POWERLEVEL9K_VCS_BOOKMARK_ICON='B' - hg bookmark "initial" - - # Load Powerlevel9k - source ${P9K_HOME}/powerlevel9k.zsh-theme - - assertEquals "%K{002} %F{000} default Binitial %k%F{002}%f " "$(build_left_prompt)" -} - -function testBranchNameScriptingVulnerability() { - local -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS - POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(vcs) - echo "#!/bin/sh\n\necho 'hacked'\n" > evil_script.sh - chmod +x evil_script.sh - - hg branch '$(./evil_script.sh)' >/dev/null - hg add . >/dev/null - hg commit -m "Initial commit" >/dev/null - - assertEquals '%K{002} %F{000} $(./evil_script.sh) %k%F{002}%f ' "$(build_left_prompt)" -} - -source shunit2/shunit2 diff --git a/test/segments/vi_mode.spec b/test/segments/vi_mode.spec deleted file mode 100755 index 6a3a07b5..00000000 --- a/test/segments/vi_mode.spec +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" -} - -function testViInsertModeWorks() { - local KEYMAP='viins' - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{004}INSERT " "$(prompt_vi_mode left 1 false)" -} - -function testViInsertModeWorksWhenLabeledAsMain() { - local KEYMAP='main' - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{004}INSERT " "$(prompt_vi_mode left 1 false)" -} - -function testViCommandModeWorks() { - local KEYMAP='vicmd' - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{007}NORMAL " "$(prompt_vi_mode left 1 false)" -} - -function testViInsertModeStringIsCustomizable() { - local KEYMAP='viins' - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - - assertEquals "%K{000} %F{004}INSERT " "$(prompt_vi_mode left 1 false)" -} - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/segments/vpn_ip.spec b/test/segments/vpn_ip.spec deleted file mode 100755 index fe5b5fbc..00000000 --- a/test/segments/vpn_ip.spec +++ /dev/null @@ -1,195 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -# Required for shunit2 to run correctly -setopt shwordsplit -SHUNIT_PARENT=$0 - -function setUp() { - export TERM="xterm-256color" - - # Test specific - P9K_HOME=$(pwd) - FOLDER=/tmp/powerlevel9k-test - mkdir -p $FOLDER - mkdir $FOLDER/sbin -} - -function tearDown() { - # Go back to powerlevel9k folder - cd "${P9K_HOME}" - # Remove eventually created test-specific folder - rm -fr "${FOLDER}" - - unset FOLDER - unset P9K_HOME -} - -function fakeIfconfig() { - # Fake ifconfig - cat > $FOLDER/sbin/ifconfig <<EOF -#!/usr/bin/env zsh - -if [[ "\$#" -gt 0 ]]; then - cat <<INNER -tun1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 - inet 1.2.3.4 txqueuelen 1000 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - device interrupt 16 memory 0xe8200000-e8220000 -INNER - exit 0 -fi - - cat <<INNER -docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 - inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 - ether 02:42:8f:5c:ed:51 txqueuelen 0 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - -tun1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 - inet 1.2.3.4 txqueuelen 1000 (Ethernet) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - device interrupt 16 memory 0xe8200000-e8220000 - -lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 - inet 127.0.0.1 netmask 255.0.0.0 - inet6 ::1 prefixlen 128 scopeid 0x10<host> - loop txqueuelen 1000 (Local Loopback) - RX packets 5136 bytes 328651 (320.9 KiB) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 5136 bytes 328651 (320.9 KiB) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 -INNER -EOF - chmod +x $FOLDER/sbin/ifconfig -} - -function fakeIp() { - local INTERFACE1="${1}" - [[ -z "${INTERFACE1}" ]] && INTERFACE1="tun0" - local INTERFACE2="${2}" - [[ -z "${INTERFACE2}" ]] && INTERFACE2="disabled-if2" - cat > $FOLDER/sbin/ip <<EOF -#!/usr/bin/env zsh - - if [[ "\$*" == 'link ls up' ]]; then - cat <<INNER -1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default - link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 -2: ${INTERFACE1}: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 - link/ether 08:00:27:7e:84:45 brd ff:ff:ff:ff:ff:ff -3: ${INTERFACE2}: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 - link/ether 08:00:27:7e:84:45 brd ff:ff:ff:ff:ff:ff -4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 - link/ether 08:00:27:7e:84:45 brd ff:ff:ff:ff:ff:ff -INNER - fi - - if [[ "\$*" =~ '-brief.*show' ]]; then - cat <<INNER -lo UNKNOWN 127.0.0.1/8 -${INTERFACE1} UP 1.2.3.4/24 -${INTERFACE2} UP 5.4.3.2/16 -docker0 DOWN 172.17.0.1/16 -INNER - fi - - if [[ "\$*" =~ 'show ${INTERFACE1}' ]]; then - cat <<INNER -2: ${INTERFACE1}: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 - inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 - valid_lft forever preferred_lft forever -INNER - fi - - if [[ "\$*" =~ 'show ${INTERFACE2}' ]]; then - cat <<INNER -3: ${INTERFACE2}: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 - inet 1.2.3.4 brd 10.0.2.255 scope global eth0 - valid_lft forever preferred_lft forever -INNER - fi -EOF - - chmod +x $FOLDER/sbin/ip -} - -function testVpnIpSegmentPrintsNothingOnOsxIfNotConnected() { - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local OS="OSX" # Fake OSX - - cat > $FOLDER/sbin/ifconfig <<EOF -#!/usr/bin/env zsh - -echo "not connected" -EOF - chmod +x $FOLDER/sbin/ifconfig - - assertEquals "" "$(prompt_vpn_ip left 1 false "$FOLDER")" -} - -function testVpnIpSegmentPrintsNothingOnLinuxIfNotConnected() { - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local OS="Linux" # Fake Linux - - cat > $FOLDER/sbin/ip <<EOF -#!/usr/bin/env zsh - -echo "not connected" -EOF - chmod +x $FOLDER/sbin/ip - - assertEquals "" "$(prompt_vpn_ip left 1 false "$FOLDER")" -} - -function testVpnIpSegmentWorksOnOsxWithInterfaceSpecified() { - local POWERLEVEL9K_VPN_IP_INTERFACE='tun1' - - fakeIfconfig - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local OS='OSX' # Fake OSX - - assertEquals "%K{006} %F{000}(vpn) %F{000}1.2.3.4 " "$(prompt_vpn_ip left 1 false "$FOLDER")" -} - -function testVpnIpSegmentWorksOnLinuxWithInterfaceSpecified() { - local POWERLEVEL9K_VPN_IP_INTERFACE='tun1' - - fakeIp "tun1" - - # Load Powerlevel9k - source powerlevel9k.zsh-theme - local OS='Linux' # Fake Linux - - assertEquals "%K{006} %F{000}(vpn) %F{000}1.2.3.4 " "$(prompt_vpn_ip left 1 false "$FOLDER")" -} - -# vpn_ip is not capable of handling multiple vpn interfaces ATM. -# function testVpnIpSegmentWorksOnLinuxWithMultipleInterfacesSpecified() { -# local POWERLEVEL9K_VPN_IP_INTERFACE=(tun0 tun1) - -# fakeIp "tun0" "tun1" - -# # Load Powerlevel9k -# source powerlevel9k.zsh-theme -# local OS='Linux' # Fake Linux - -# setopt xtrace -# assertEquals "%K{006} %F{000}(vpn) %F{000}10.0.2.15 " "$(prompt_vpn_ip left 1 false "$FOLDER")" -# unsetopt xtrace -# } - -source shunit2/shunit2
\ No newline at end of file diff --git a/test/suite.spec b/test/suite.spec deleted file mode 100755 index 0e51d322..00000000 --- a/test/suite.spec +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env zsh -#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 - -local failed=false - -for test in **/*.spec; do - echo - echo "Now executing ${test}" - if [[ "${test}" == "test/suite.spec" ]]; then - continue; - fi - ./${test} || failed=true -done - -if [[ "${failed}" == "true" ]]; then - exit 1 -fi
\ No newline at end of file |