Add an experimental indexer similar to stagit-gopher-index - stahg-gopher - Static Mercurial page generator for gopher
hg clone https://bitbucket.org/iamleot/stahg-gopher
Log
Files
Refs
README
LICENSE
---
changeset 5a0937d0d603b626e3def7ae5bcd9025cb0c0c4c
parent ed1ce8cb40899fbf91ae58ed9e2e1c20709a8850
Author: Leonardo Taccari 
Date:   Mon, 13 May 2019 21:41:38 

Add an experimental indexer similar to stagit-gopher-index

Parse / log.gph and generate an index similar
to stagit-gopher-index.

Still experimental!

Diffstat:
 sta-log-gopher-index.py |  99 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 99 insertions(+), 0 deletions(-)
---
diff -r ed1ce8cb4089 -r 5a0937d0d603 sta-log-gopher-index.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sta-log-gopher-index.py   Mon May 13 21:41:38 2019 +0200
@@ -0,0 +1,99 @@
+#!/usr/bin/env python3.7
+
+#
+# Copyright (c) 2019 Leonardo Taccari
+# All rights reserved.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+
+import re
+import os
+
+
+def gph_escape_entry(text):
+    """Render text entry `[...]' by escaping/translating characters"""
+    escaped_text = text.expandtabs().replace('|', '\|')
+
+    return escaped_text
+
+
+def shorten(text, n=80):
+    """Shorten text to the first `n' character of first line"""
+    s, _, _ = text.partition('\n')
+
+    if len(s) > n:
+        s = s[:n - 1] + '…'
+
+    return s
+
+if __name__ == '__main__':
+    import getopt
+    import sys
+
+    def usage():
+        print('usage: {} [-b baseprefix] stagit-dir|stahg-dir ...'.format(
+               sys.argv[0]))
+        exit(1)
+
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], 'b:')
+    except:
+        usage()
+
+    if len(args) == 0:
+        usage()
+
+    base_prefix = ''
+    limit = None
+    for o, a in opts:
+        if o == '-b':
+            base_prefix = a
+
+    print('{:20}  {:40}  {}'.format('Name', 'Description', 'Last commit'))
+    for sd in args:
+        repo = description = date = ''
+        repo = os.path.basename(os.path.normpath(sd))
+        with open(os.path.join(sd, 'log.gph')) as f:
+            for l in f:
+                if not description and 'Log - ' in l:
+                    description = l.split(' - ', maxsplit=2)[-1]
+                    description = description.strip()
+                # XXX: simplify that
+                elif re.match('^\[1\|[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+', l):
+                    r = re.match('^\[1\|([0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+)', l)
+                    date = r.group(1)
+                    f.close()
+                    break
+
+        if repo and description and date:
+            print('[1|{desc}|{path}|server|port]'.format(
+                desc=gph_escape_entry(
+                    '{repo:20}  {description:40}  {date}'.format(
+                        repo=repo,
+                        description=shorten(description, 40),
+                        date=date)),
+                path='{base_path}{repo}'.format(
+                    base_path=base_prefix,
+                    repo=repo)))