From 947cfc0d8a6033941caeaea1a8842b7dd4b3b6cc Mon Sep 17 00:00:00 2001 From: poikilos <7557867+poikilos@users.noreply.github.com> Date: Mon, 15 Nov 2021 16:54:25 -0500 Subject: [PATCH] Create and add a lynx-based CLI issue viewer for the repo. --- utilities/enlynx.py | 155 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100755 utilities/enlynx.py diff --git a/utilities/enlynx.py b/utilities/enlynx.py new file mode 100755 index 0000000..27719a3 --- /dev/null +++ b/utilities/enlynx.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python3 +''' +Specify a label or search term, optionally with a page #. + +Examples: +# label: + enlynx.py Bucket_Game +# label and page number: + enlynx.py Bucket_Game page 2 +# multiple labels: + enlynx.py Bucket_Game urgent +# closed issues only: + enlynx.py Bucket_Game --closed +# both closed and open issues: + enlynx.py Bucket_Game --closed --open +# search: + enlynx.py find SIGSEGV +# search for 2 terms: + enlynx.py find mobs find walk + # or + enlynx.py find mobs AND walk +# search for a closed issue: + enlynx.py find SIGSEGV --closed +# label with search: + enlynx.py Bucket_Game find mobs +# label with search, next page: + enlynx.py Bucket_Game find node page 2 + + +''' +me = "enlynx.py" +lynxCmd = "lynx" +sessionPath = "/tmp/enlynx.lynx-session" +import sys +import subprocess + +enc = {} # URL Encoded single characters +enc[':'] = '%3A' +# ^ Do this with urllib if there are many more + +# see +def error(*args, **kwargs): + print(*args, file=sys.stderr, **kwargs) + +verbose = True + +def debug(msg): + if not verbose: + return + sys.stderr.write("{}\n".format(msg)) + sys.stderr.flush() + + +def usage(): + error(__doc__) + + +def toSubQueryValue(value): + ''' + Convert the value to one that will fit in a + key+urlencoded(colon)+value string for GitHub queries. + + This function is copied to multiple scripts so they have no + dependencies: + - enissue.py + - enlynx.py + ''' + if " " in value: + value = '"' + value.replace(" ", "+") + '"' + return value + + +def toSubQuery(key, value): + return key + enc[':'] + value + + +base_url = "https://github.com/poikilos/EnlivenMinetest" +query_url = base_url + "/issues" +open_q = "?q=" + toSubQuery("is", "issue") + '+' + toSubQuery("is", "open") +any_q = "?q=" + toSubQuery("is", "issue") +closed_q = "?q=" + toSubQuery("is", "issue") + '+' + toSubQuery("is", "closed") + + +if __name__ == "__main__": + prev_arg = None + findStrings = [] + base_q = open_q + "+" + page_param = "" + _closed = None + _open = None + labels_subqueries = "" + for arg in sys.argv[1:]: + # ^ skip arg 0 since it is self + # Erase prev_arg in each case except "else" to turn off + # context-sensitivity after the term after the command is found. + if prev_arg == "find": + findStrings.append(arg) + prev_arg = None + elif prev_arg == "page": + page_param="&page=2" + prev_arg = None + else: + if arg == "--closed": + _closed = True + elif arg == "--open": + _open = True + elif arg == "find": + prev_arg = arg + elif arg == "AND": + if len(findStrings) == 0: + usage() + error("Error: You can only use AND after find" + " and after another keyword. To literally" + " search for the word \"AND\" itself," + " say find before the word:\n" + " {} find CREEPS find AND find WEIRDOS\n" + "".format(me)) + exit(1) + prev_arg = arg + elif arg == "page": + prev_arg = arg + else: + encArg = toSubQueryValue(arg) + # if encArg != arg: + # debug("* encoding label as '{}'".format(encArg)) + # else: + debug("* adding label {}".format(encArg)) + + labels_subqueries += toSubQuery('label', encArg) + "+" + + # Ensure there aren't any dangling commands *after* the loop: + if prev_arg is not None: + usage() + error("Error: You must specify a search term after {}." + "".format(prev_arg)) + exit(1) + + if (_closed is True) and (_open is True): + base_q = any_q + '+' + elif _open is True: + base_q = open_q + '+' # This is the default + elif _closed is True: + base_q = closed_q + '+' + + + + for find_str in findStrings: + base_q += find_str + "+" + # else: (dangling '+' at the end when labels_subqueries=="" is ok) + + query = base_q + labels_subqueries + page_param + url = query_url + query + print("URL: {}".format(url)) + + subprocess.call([lynxCmd, '-session=' + sessionPath, url])