Init
commit
727130cf90
@ -0,0 +1,106 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import re
|
||||||
|
import curses
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
class Commit(object):
|
||||||
|
_RE_COMMIT = re.compile(r"(?P<hash>[abcdefABCDEF0-9]{3,16}) (?P<title>.+)")
|
||||||
|
def __init__(self, line):
|
||||||
|
"""@todo: to be defined1. """
|
||||||
|
match = Commit._RE_COMMIT.search(line)
|
||||||
|
if not match:
|
||||||
|
raise ValueError
|
||||||
|
self.hash = match.group("hash")
|
||||||
|
self.title = match.group("title")
|
||||||
|
|
||||||
|
process = subprocess.Popen(["git", "log", "--oneline"], stdout=subprocess.PIPE, stderr=open('/dev/null', 'w'))
|
||||||
|
commits = []
|
||||||
|
for part in process.communicate():
|
||||||
|
if part == None:
|
||||||
|
break
|
||||||
|
for line in part.decode('utf-8').split('\n'):
|
||||||
|
if not line:
|
||||||
|
continue
|
||||||
|
commits.append(Commit(line))
|
||||||
|
|
||||||
|
|
||||||
|
if len(commits) == 0:
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
stdscr = curses.initscr()
|
||||||
|
curses.start_color()
|
||||||
|
curses.curs_set(False)
|
||||||
|
curses.use_default_colors()
|
||||||
|
curses.noecho()
|
||||||
|
curses.cbreak()
|
||||||
|
stdscr.keypad(True)
|
||||||
|
stdscr.refresh()
|
||||||
|
curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_YELLOW)
|
||||||
|
curses.init_pair(2, curses.COLOR_YELLOW, curses.COLOR_BLACK)
|
||||||
|
|
||||||
|
maxcoords = stdscr.getmaxyx()
|
||||||
|
max_y, max_x = maxcoords[0], maxcoords[1]
|
||||||
|
|
||||||
|
|
||||||
|
def show_commit(commit):
|
||||||
|
os.system(f"git show {commit.hash}")
|
||||||
|
|
||||||
|
|
||||||
|
pad = curses.newpad(len(commits), max_x)
|
||||||
|
|
||||||
|
|
||||||
|
def print_commit(commit, pos_y, selected):
|
||||||
|
pad.addstr(pos_y, 0, " " * (max_x - 1))
|
||||||
|
if selected:
|
||||||
|
pad.addstr(pos_y, 0, f"{commit.hash}", curses.color_pair(1))
|
||||||
|
pad.addstr(pos_y, len(commit.hash) + 2, f"{commit.title}", curses.color_pair(1))
|
||||||
|
else:
|
||||||
|
pad.addstr(pos_y, 0, f"{commit.hash}", curses.color_pair(2))
|
||||||
|
pad.addstr(pos_y, len(commit.hash) + 2, f"{commit.title}")
|
||||||
|
|
||||||
|
print_commit(commits[0], 0, True)
|
||||||
|
|
||||||
|
linenum = 1
|
||||||
|
for commit in commits[1:]:
|
||||||
|
print_commit(commit, linenum, False)
|
||||||
|
linenum += 1
|
||||||
|
|
||||||
|
pad.refresh(0, 0, 0, 0, max_y - 1, max_x - 1)
|
||||||
|
|
||||||
|
running = True
|
||||||
|
pos = 0
|
||||||
|
offset = 0
|
||||||
|
while running:
|
||||||
|
print_commit(commits[pos], pos, False)
|
||||||
|
|
||||||
|
mvmt = stdscr.getch()
|
||||||
|
if mvmt == ord('j'):
|
||||||
|
if pos < len(commits):
|
||||||
|
pos += 1
|
||||||
|
if pos - offset > max_y - 2 and offset < len(commits) - max_y + 5:
|
||||||
|
offset += 1
|
||||||
|
elif mvmt == ord('k'):
|
||||||
|
if pos > 0:
|
||||||
|
pos -= 1
|
||||||
|
if pos - offset < 4 and offset > 0:
|
||||||
|
offset -= 1
|
||||||
|
elif mvmt == ord('q'):
|
||||||
|
running = False
|
||||||
|
elif mvmt == ord('l'):
|
||||||
|
show_commit(commits[pos])
|
||||||
|
stdscr.clear()
|
||||||
|
stdscr.refresh()
|
||||||
|
|
||||||
|
print_commit(commits[pos], pos, True)
|
||||||
|
|
||||||
|
pad.refresh(offset, 0, 0, 0, max_y - 1, max_x - 1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
curses.nocbreak()
|
||||||
|
stdscr.keypad(False)
|
||||||
|
curses.echo()
|
||||||
|
curses.endwin()
|
||||||
Loading…
Reference in New Issue