From 7823b9b39c486aedf830783329abdc3bd9664ba4 Mon Sep 17 00:00:00 2001
From: Jeffery To <jeffery.to@gmail.com>
Date: Thu, 9 Nov 2023 17:51:21 +0800
Subject: [PATCH 2/2] Add support for ash (Almquist shell)

---
 tests/docker/debian |  2 +-
 tests/test_ash.py   | 65 +++++++++++++++++++++++++++++++++++++++++++++
 userpath/shells.py  |  5 ++++
 3 files changed, 71 insertions(+), 1 deletion(-)
 create mode 100644 tests/test_ash.py

--- a/tests/docker/debian
+++ b/tests/docker/debian
@@ -2,7 +2,7 @@ ARG PYTHON_VERSION
 FROM python:${PYTHON_VERSION}
 
 RUN apt-get update \
- && apt-get --no-install-recommends -y install fish zsh
+ && apt-get --no-install-recommends -y install ash fish zsh
 
 COPY requirements.txt /
 RUN pip install -r requirements.txt
--- /dev/null
+++ b/tests/test_ash.py
@@ -0,0 +1,65 @@
+import pytest
+import userpath
+
+from .utils import SKIP_WINDOWS_CI, get_random_path
+
+SHELL_NAME = 'ash'
+
+pytestmark = [SKIP_WINDOWS_CI, pytest.mark.ash]
+
+
+@pytest.mark.usefixtures('shell_test')
+class TestDebian(object):
+    DOCKERFILE = 'debian'
+
+    def test_prepend(self, request, shell_test):
+        if shell_test is None:
+            location = get_random_path()
+            assert not userpath.in_current_path(location)
+            assert userpath.prepend(location, check=True)
+            assert userpath.in_new_path(location)
+            assert userpath.need_shell_restart(location)
+        else:
+            process = shell_test(request.node.name)
+            stdout, stderr = process.communicate()
+
+            assert process.returncode == 0, (stdout + stderr).decode('utf-8')
+
+    def test_prepend_multiple(self, request, shell_test):
+        if shell_test is None:
+            locations = [get_random_path(), get_random_path()]
+            assert not userpath.in_current_path(locations)
+            assert userpath.prepend(locations, check=True)
+            assert userpath.in_new_path(locations)
+            assert userpath.need_shell_restart(locations)
+        else:
+            process = shell_test(request.node.name)
+            stdout, stderr = process.communicate()
+
+            assert process.returncode == 0, (stdout + stderr).decode('utf-8')
+
+    def test_append(self, request, shell_test):
+        if shell_test is None:
+            location = get_random_path()
+            assert not userpath.in_current_path(location)
+            assert userpath.append(location, check=True)
+            assert userpath.in_new_path(location)
+            assert userpath.need_shell_restart(location)
+        else:
+            process = shell_test(request.node.name)
+            stdout, stderr = process.communicate()
+
+            assert process.returncode == 0, (stdout + stderr).decode('utf-8')
+
+    def test_append_multiple(self, request, shell_test):
+        if shell_test is None:
+            locations = [get_random_path(), get_random_path()]
+            assert not userpath.in_current_path(locations)
+            assert userpath.append(locations, check=True)
+            assert userpath.in_new_path(locations)
+            assert userpath.need_shell_restart(locations)
+        else:
+            process = shell_test(request.node.name)
+            stdout, stderr = process.communicate()
+
+            assert process.returncode == 0, (stdout + stderr).decode('utf-8')
--- a/userpath/shells.py
+++ b/userpath/shells.py
@@ -37,6 +37,10 @@ class Sh(Shell):
         return [cls._interactive_login_show_path_command()]
 
 
+class Ash(Sh):
+    name = 'ash'
+
+
 class Bash(Sh):
     name = 'bash'
 
@@ -114,6 +118,7 @@ class Zsh(Sh):
 
 
 SHELLS = {
+    'ash': Ash,
     'bash': Bash,
     'fish': Fish,
     'sh': Sh,
