remotes/origin/master
Сергей Маринкевич 4 years ago
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…
Cancel
Save