aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md17
-rw-r--r--README.md2
-rw-r--r--TESTS.md8
-rwxr-xr-xdebug/font-issues.zsh182
-rwxr-xr-xpowerlevel9k.zsh-theme18
-rw-r--r--test-bsd-vm/Vagrantfile87
-rw-r--r--test-bsd-vm/bootstrap-zero.sh3
-rw-r--r--test-bsd-vm/bootstrap.sh8
-rw-r--r--test-vm-providers/plain.sh4
-rw-r--r--test-vm/Vagrantfile2
-rw-r--r--test-vm/plain.sh3
-rwxr-xr-xtest/segments/dir.spec106
12 files changed, 426 insertions, 14 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e991af28..7cfcd4a3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -24,28 +24,33 @@ 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.
-### New segment 'command_execution_time' added
+#### `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
+### 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
+### New segment `disk_usage` added
This segment will show the usage level of your current partition.
-### New segment 'public_ip' added
+### New segment `public_ip` added
Fetches your Public IP (using ident.me) and displays it in your prompt.
-### New segment 'swift_version' added
+### New segment `swift_version` added
This segment displays the version of Swift that is installed / in your path.
-### New segment 'detect_virt' added
+### New segment `detect_virt` added
Detects and reports if you are in a virtualized session using `systemd`.
diff --git a/README.md b/README.md
index 4440ecf6..00982a67 100644
--- a/README.md
+++ b/README.md
@@ -312,7 +312,7 @@ Customizations available are:
|Default|Truncate whole directories from left. How many is defined by `POWERLEVEL9K_SHORTEN_DIR_LENGTH`|
|`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_with_package_name`|Use the `package.json` `name` field to abbreviate the directory path.|
+|`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
diff --git a/TESTS.md b/TESTS.md
index d4e663dc..d51051c5 100644
--- a/TESTS.md
+++ b/TESTS.md
@@ -12,3 +12,11 @@ Tests in separate files under `test/functions`.
These Tests tend to be more complex in setup than the basic tests. To avoid ending
up in a huge single file, there is one file per segment in `test/segments`.
+
+# Test-VMs
+
+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 could use our Test-VMs!
+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). \ No newline at end of file
diff --git a/debug/font-issues.zsh b/debug/font-issues.zsh
new file mode 100755
index 00000000..166a6ac5
--- /dev/null
+++ b/debug/font-issues.zsh
@@ -0,0 +1,182 @@
+#!/usr/bin/env zsh
+#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
+
+# 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
+
+ # Check $PPID for terminal emulator.
+ while [[ -z "$term" ]]; do
+ parent="$(get_ppid "$parent")"
+ name="$(get_process_name "$parent")"
+
+ case "${name// }" in
+ "${SHELL/*\/}" | *"sh" | "tmux"* | "screen" | "su"*) ;;
+ "login"* | *"Login"* | "init" | "(init)") term="$(tty)" ;;
+ "ruby" | "1" | "systemd" | "sshd"* | "python"* | "USER"*"PID"*) break ;;
+ "gnome-terminal-") term="gnome-terminal" ;;
+ *) term="${name##*/}" ;;
+ esac
+ done
+
+ # Log that the function was run.
+ #term_run=1
+
+ echo "${term}"
+}
+
+get_term_font() {
+ local term="${1}"
+ #((term_run != 1)) && get_term
+
+ case "$term" in
+ "alacritty"*)
+ term_font="$(awk -F ':|#' '/normal:/ {getline; print}' "${XDG_CONFIG_HOME}/alacritty/alacritty.yml")"
+ term_font="${term_font/*family:}"
+ term_font="${term_font/$'\n'*}"
+ term_font="${term_font/\#*}"
+ ;;
+
+ "Apple_Terminal")
+ term_font="$(osascript -e 'tell application "Terminal" to font name of window frontmost')"
+ ;;
+ "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 window"
+ # thou, 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
+ # and: https://gitlab.com/gnachman/iterm2/issues/5586
+ 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
+
+ local nonAsciiFont
+
+ # 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"
+ term_font=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Normal\ Font:" ~/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.
+ local useDifferentFont=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Use\ Non-ASCII\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist)
+ if [[ "$useDifferentFont" == "true" ]]; then
+ local nonAsciiFont=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Non\ Ascii\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist)
+ if [[ "$term_font" != "$nonAsciiFont" ]]; then
+ term_font="$term_font (normal) / $nonAsciiFont (non-ascii)"
+ fi
+ 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")"
+ ;;
+
+ "Hyper"*)
+ term_font="$(awk -F "," '/fontFamily/ {a=$1} END{print a}' "${HOME}/.hyper.js" | awk -F "'" '{a=$2} END{print a}')"
+ ;;
+
+ "konsole"*)
+ # Get Process ID of current konsole window / tab
+ child="$(get_ppid "$$")"
+
+ konsole_instances=($(qdbus | grep 'org.kde.konsole'))
+
+ for i in "${konsole_instances[@]}"; do
+ konsole_sessions=($(qdbus "${i}" | grep '/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")"
+ ;;
+
+ "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")"
+ ;;
+
+ "sakura"*)
+ term_font="$(awk -F '=' '/^font=/ {a=$2} END{print a}' "${XDG_CONFIG_HOME}/sakura/sakura.conf")"
+ ;;
+
+ "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} /^font/ {if(opt==1) a=$2; opt=0} END{print a}' "/etc/xdg/termite/config" "$termite_config")"
+ ;;
+
+ "urxvt" | "urxvtd" | "rxvt-unicode" | "xterm")
+ term_font="$(grep -i -F "${term/d}*font" < <(xrdb -query))"
+ term_font="${term_font/*font:}"
+ term_font="$(trim "$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/:*}"
+ ;;
+
+ "-"*) term_font="$(awk -F '\\-' '{printf $3}' <<< "$term_font")" ;;
+ esac
+ ;;
+
+ "xfce4-terminal")
+ term_font="$(awk -F '=' '/^FontName/ {a=$2} END{print a}' "${XDG_CONFIG_HOME}/xfce4/terminal/terminalrc")"
+ ;;
+ 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/powerlevel9k.zsh-theme b/powerlevel9k.zsh-theme
index 5fab0190..f8367e85 100755
--- a/powerlevel9k.zsh-theme
+++ b/powerlevel9k.zsh-theme
@@ -655,12 +655,24 @@ prompt_dir() {
subdirectory_path=$(truncatePathFromRight "${current_dir:${#${(S%%)package_path//$~zero/}}}")
# Parse the 'name' from the package.json; if there are any problems, just
# print the file path
- if name=$( cat "$package_path/package.json" 2> /dev/null | grep -m 1 "\"name\""); then
- name=$(echo $name | awk -F ':' '{print $2}' | awk -F '"' '{print $2}')
+ 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
+
+ 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 $name | tr -d '"'`$subdirectory_path"
+ current_path="`echo $packageName | tr -d '"'`$subdirectory_path"
else
current_path=$(truncatePathFromRight "$(pwd | sed -e "s,^$HOME,~,")" )
fi
diff --git a/test-bsd-vm/Vagrantfile b/test-bsd-vm/Vagrantfile
new file mode 100644
index 00000000..7df512a3
--- /dev/null
+++ b/test-bsd-vm/Vagrantfile
@@ -0,0 +1,87 @@
+# -*- 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
new file mode 100644
index 00000000..35dcd7f3
--- /dev/null
+++ b/test-bsd-vm/bootstrap-zero.sh
@@ -0,0 +1,3 @@
+#!/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
new file mode 100644
index 00000000..f78b3078
--- /dev/null
+++ b/test-bsd-vm/bootstrap.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+# Install ZSH
+sudo pkg install -y zsh
+sudo chsh -s `which zsh` vagrant
+
+# Install git
+sudo pkg install -y git \ No newline at end of file
diff --git a/test-vm-providers/plain.sh b/test-vm-providers/plain.sh
new file mode 100644
index 00000000..a87220f8
--- /dev/null
+++ b/test-vm-providers/plain.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/zsh
+
+echo 'LANG=en_US.UTF-8' !> ~/.zshrc
+echo 'source /vagrant_data/powerlevel9k.zsh-theme' >> ~/.zshrc \ No newline at end of file
diff --git a/test-vm/Vagrantfile b/test-vm/Vagrantfile
index ee53fcdf..a421c706 100644
--- a/test-vm/Vagrantfile
+++ b/test-vm/Vagrantfile
@@ -16,7 +16,7 @@ Vagrant.configure(2) do |config|
# Bootstrap
config.vm.provision :shell, path: "bootstrap.sh", privileged: false
- config.vm.provision :shell, path: "plain.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"
diff --git a/test-vm/plain.sh b/test-vm/plain.sh
deleted file mode 100644
index 9c8445f4..00000000
--- a/test-vm/plain.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/zsh
-
-echo 'source /vagrant_data/powerlevel9k.zsh-theme' > ~/.zshrc
diff --git a/test/segments/dir.spec b/test/segments/dir.spec
index ce6869b7..b2991175 100755
--- a/test/segments/dir.spec
+++ b/test/segments/dir.spec
@@ -114,6 +114,112 @@ function testTruncateWithFolderMarkerWithChangedFolderMarker() {
unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
}
+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}"
+
+ POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
+ POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
+ POWERLEVEL9K_SHORTEN_STRATEGY='truncate_with_package_name'
+
+ assertEquals "%K{blue} %F{black}My_Package/1/12/123/12…/12…/12…/12…/12…/123456789 %k%F{blue}%f " "$(build_left_prompt)"
+
+ # Go back
+ cd $p9kFolder
+ rm -fr $BASEFOLDER
+ unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
+ unset POWERLEVEL9K_SHORTEN_STRATEGY
+ unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
+}
+
+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
+
+ POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
+ POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
+ POWERLEVEL9K_SHORTEN_STRATEGY='truncate_with_package_name'
+
+ assertEquals "%K{blue} %F{black}My_Package/as…/qwerqwer %k%F{blue}%f " "$(build_left_prompt)"
+
+ # Go back
+ cd $p9kFolder
+ rm -fr $BASEFOLDER
+ unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
+ unset POWERLEVEL9K_SHORTEN_STRATEGY
+ unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
+}
+
+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
+
+ POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(dir)
+ POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
+ POWERLEVEL9K_SHORTEN_STRATEGY='truncate_with_package_name'
+
+ assertEquals "%K{blue} %F{black}My_Package/.g…/re…/heads %k%F{blue}%f " "$(build_left_prompt)"
+
+ # Go back
+ cd $p9kFolder
+ rm -fr $BASEFOLDER
+ unset POWERLEVEL9K_LEFT_PROMPT_ELEMENTS
+ unset POWERLEVEL9K_SHORTEN_STRATEGY
+ unset POWERLEVEL9K_SHORTEN_DIR_LENGTH
+}
+
function testHomeFolderDetectionWorks() {
POWERLEVEL9K_HOME_ICON='home-icon'