--- a/prompt.py	Mon Oct 26 21:27:51 2020 -0400
+++ b/prompt.py	Tue Apr 06 12:55:48 2021 -0400
@@ -17,7 +17,6 @@
 from contextlib import closing
 from os import path
 from mercurial import extensions, commands, cmdutil, help
-from mercurial.i18n import _
 from mercurial.node import hex, short
 
 # command registration moved into `registrar` module in v4.3.
@@ -37,20 +36,20 @@
 
 FILTER_ARG = re.compile(r'\|.+\((.*)\)')
 
-
 def _with_groups(groups, out):
     out_groups = [groups[0]] + [groups[-1]]
 
     if any(out_groups) and not all(out_groups):
         print ('Error parsing prompt string.  Mismatched braces?')
 
+    out = s(out)
     out = out.replace('%', '%%')
     return ("%s" + out + "%s") % (out_groups[0][:-1] if out_groups[0] else '',
                                   out_groups[1][1:] if out_groups[1] else '')
 
 def _get_filter(name, g):
     '''Return the filter with the given name, or None if it was not used.'''
-    matching_filters = filter(lambda s: s and s.startswith('|%s' % name), g)
+    matching_filters = list(filter(lambda s: s and s.startswith('|%s' % name), g))
     if not matching_filters:
         return None
 
@@ -72,10 +71,13 @@
 def b(s):
     return bytes(s.encode("utf-8"))
 
+def s(b):
+    return b.decode("utf-8")
+
 @command(b('prompt'),
          [(b(''), b('angle-brackets'), None, b('use angle brackets (<>) for keywords'))],
          b('hg prompt STRING'))
-def prompt(ui, repo, fs='', **opts):
+def prompt(ui, repo, fs=b(''), **opts):
     '''get repository information for use in a shell prompt
 
     Take a string and output it for use in a shell prompt. You can use
@@ -115,7 +117,7 @@
 
     def _bookmark(m):
         try:
-            book = extensions.find('bookmarks').current(repo)
+            book = extensions.find(b('bookmarks')).current(repo)
         except AttributeError:
             book = getattr(repo, '_bookmarkcurrent', None)
         except KeyError:
@@ -123,7 +125,7 @@
         if book is None:
             book = getattr(repo, '_activebookmark', None)
         if book:
-            cur = repo['.'].node()
+            cur = repo[b('.')].node()
             if repo._bookmarks[book] == cur:
                 return _with_groups(m.groups(), book)
         else:
@@ -147,16 +149,16 @@
         p = repo[None].parents()[0]
         pn = p.node()
         branch = repo.dirstate.branch()
-        closed = (p.extra().get('close')
+        closed = (p.extra().get(b('close'))
                   and pn in repo.branchheads(branch, closed=True))
-        out = 'X' if (not quiet) and closed else ''
+        out = b('X') if (not quiet) and closed else ''
 
         return _with_groups(g, out) if out else ''
 
     def _count(m):
         g = m.groups()
-        query = [g[1][1:]] if g[1] else ['all()']
-        return _with_groups(g, str(len(revrange(repo, query))))
+        query = [b(g[1][1:])] if g[1] else [b('all()')]
+        return _with_groups(g, b("%d" % len(revrange(repo, query))))
 
     def _node(m):
         g = m.groups()
@@ -168,13 +170,13 @@
         format = short if '|short' in g else hex
 
         node = format(parents[p].node()) if p is not None else None
-        return _with_groups(g, str(node)) if node else ''
+        return _with_groups(g, node) if node else ''
 
     def _patch(m):
         g = m.groups()
 
         try:
-            extensions.find('mq')
+            extensions.find(b('mq'))
         except KeyError:
             return ''
 
@@ -185,17 +187,17 @@
 
         if _get_filter('topindex', g):
             if len(q.applied):
-                out = str(len(q.applied) - 1)
+                out = b('%d' % (len(q.applied) - 1))
             else:
-                out = ''
+                out = b('')
         elif _get_filter('applied', g):
-            out = str(len(q.applied))
+            out = b('%d' % len(q.applied))
         elif _get_filter('unapplied', g):
-            out = str(len(q.unapplied(repo)))
+            out = b('%d' % len(q.unapplied(repo)))
         elif _get_filter('count', g):
-            out = str(len(q.series))
+            out = b('%d' % len(q.series))
         else:
-            out = q.applied[-1].name if q.applied else ''
+            out = q.applied[-1].name if q.applied else b('')
 
         return _with_groups(g, out) if out else ''
 
@@ -203,25 +205,25 @@
         g = m.groups()
 
         try:
-            extensions.find('mq')
+            extensions.find(b('mq'))
         except KeyError:
             return ''
 
         join_filter = _get_filter('join', g)
         join_filter_arg = _get_filter_arg(join_filter)
-        sep = join_filter_arg if join_filter else ' -> '
+        sep = b(join_filter_arg) if join_filter else b(' -> ')
 
         patches = repo.mq.series
         applied = [p.name for p in repo.mq.applied]
-        unapplied = filter(lambda p: p not in applied, patches)
+        unapplied = list(filter(lambda p: p not in applied, patches))
 
         if _get_filter('hide_applied', g):
-            patches = filter(lambda p: p not in applied, patches)
+            patches = list(filter(lambda p: p not in applied, patches))
         if _get_filter('hide_unapplied', g):
-            patches = filter(lambda p: p not in unapplied, patches)
+            patches = list(filter(lambda p: p not in unapplied, patches))
 
         if _get_filter('reverse', g):
-            patches = reversed(patches)
+            patches = list(reversed(patches))
 
         pre_applied_filter = _get_filter('pre_applied', g)
         pre_applied_filter_arg = _get_filter_arg(pre_applied_filter)
@@ -233,6 +235,18 @@
         post_unapplied_filter = _get_filter('post_unapplied', g)
         post_unapplied_filter_arg = _get_filter_arg(post_unapplied_filter)
 
+        if pre_applied_filter_arg:
+            pre_applied_filter_arg = b(pre_applied_filter_arg)
+
+        if post_applied_filter_arg:
+            post_applied_filter_arg = b(post_applied_filter_arg)
+
+        if pre_unapplied_filter_arg:
+            pre_unapplied_filter_arg = b(pre_unapplied_filter_arg)
+
+        if post_unapplied_filter_arg:
+            post_unapplied_filter_arg = b(post_unapplied_filter_arg)
+
         for n, patch in enumerate(patches):
             if patch in applied:
                 if pre_applied_filter:
@@ -251,21 +265,20 @@
         g = m.groups()
 
         try:
-            extensions.find('mq')
+            extensions.find(b('mq'))
         except KeyError:
             return ''
 
         q = repo.mq
 
-        out = os.path.basename(q.path)
-        if out == 'patches' and not os.path.isdir(q.path):
-            out = ''
-        elif out.startswith('patches-'):
+        print(repr(out))
+        if out == b('patches') and not os.path.isdir(q.path):
+            out = b('')
+        elif out.startswith(b('patches-')):
             out = out[8:]
 
         return _with_groups(g, out) if out else ''
 
-
     def _rev(m):
         g = m.groups()
 
@@ -274,7 +287,7 @@
         parent = parent if len(parents) > parent else None
 
         rev = parents[parent].rev() if parent is not None else -1
-        return _with_groups(g, str(rev)) if rev >= 0 else ''
+        return _with_groups(g, b('%d' % rev)) if rev >= 0 else ''
 
     def _root(m):
         return _with_groups(m.groups(), repo.root) if repo.root else ''
@@ -286,14 +299,14 @@
         modified = any((st.modified, st.added, st.removed, st.deleted))
         unknown = len(st.unknown) > 0
 
-        flag = ''
+        flag = b('')
         if '|modified' not in g and '|unknown' not in g:
-            flag = '!' if modified else '?' if unknown else ''
+            flag = b('!') if modified else b('?') if unknown else ''
         else:
             if '|modified' in g:
-                flag += '!' if modified else ''
+                flag += b('!') if modified else b('')
             if '|unknown' in g:
-                flag += '?' if unknown else ''
+                flag += b('?') if unknown else b('')
 
         return _with_groups(g, flag) if flag else ''
 
@@ -302,18 +315,18 @@
         # As an alternative, we could show tags of p1 and p2.
         g = m.groups()
 
-        sep = g[2][1:] if g[2] else ' '
-        tags = repo['.'].tags()
+        sep = b(g[2][1:]) if g[2] else b(' ')
+        tags = repo[b('.')].tags()
 
         quiet = _get_filter('quiet', g)
         if quiet:
-            tags = filter(lambda tag: tag != 'tip', tags)
+            tags = filter(lambda tag: tag != b('tip'), tags)
 
         return _with_groups(g, sep.join(tags)) if tags else ''
 
     def _task(m):
         try:
-            task = extensions.find('tasks').current(repo)
+            task = extensions.find(b('tasks')).current(repo)
             return _with_groups(m.groups(), task) if task else ''
         except KeyError:
             return ''
@@ -325,9 +338,9 @@
 
         tip = repo[len(repo) - 1]
         rev = tip.rev()
-        tip = format(tip.node()) if '|node' in g else tip.rev()
+        tip = format(tip.node()) if '|node' in g else b('%d' % tip.rev())
 
-        return _with_groups(g, str(tip)) if rev >= 0 else ''
+        return _with_groups(g, tip) if rev >= 0 else ''
 
     def _update(m):
         current_rev = repo[None].parents()[0]
@@ -346,7 +359,7 @@
                 tip = head
                 break
 
-        return _with_groups(m.groups(), '^') if repo[tip].node() != current_rev.node() else ''
+        return _with_groups(m.groups(), b('^')) if repo[tip].node() != current_rev.node() else ''
 
     if opts.get("angle_brackets"):
         tag_start = r'\<([^><]*?\<)?'
@@ -404,15 +417,18 @@
     }
 
     if not fs:
-        fs = repo.ui.config("prompt", "template", "")
+        fs = repo.ui.config(b"prompt", b"template", b"")
 
+    fs = s(fs)
     for tag, repl in patterns.items():
         fs = re.sub(tag_start + tag + tag_end, repl, fs)
+    fs = b(fs)
+
     ui.status(fs)
 
 help.helptable += (
-    (['prompt-keywords'], _('Keywords supported by hg-prompt'),
-     lambda _: r'''hg-prompt currently supports a number of keywords.
+    ([b('prompt-keywords')], b('Keywords supported by hg-prompt'),
+     lambda _: b('''hg-prompt currently supports a number of keywords.
 
 Some keywords support filters.  Filters can be chained when it makes
 sense to do so.  When in doubt, try it!
@@ -563,5 +579,5 @@
      Display `^` if the current parent is not the tip of the current branch,
      otherwise nothing.  In effect, this lets you see if running `hg update`
      would do something.
-'''),
+''')),
 )