rendered paste body#
import subprocess
import curses
import logging
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)s %(message)s',
filename='/tmp/myapp.log',
filemode='w')
def getFileList():
lines = subprocess.Popen(["svn", "status"], stdout=subprocess.PIPE).communicate()[0].split("\n")
fileList = list()
for line in lines:
status = line[0:7].strip()
file = line[7:].strip()
fileList.append({"status" : status, "file" : file, "checked" : False})
return fileList
#init curses
def initCurses():
global stdscr
stdscr = curses.initscr()
curses.noecho()
curses.cbreak()
stdscr.keypad(1)
pad = curses.newpad(1000, 1000)
#clean up
def cleanupCurses():
curses.nocbreak(); stdscr.keypad(0); curses.echo();curses.endwin()
def redraw():
x = 0;
for file in filelist:
try:
s = "[" + ("x" if file["checked"] else " ") + "] " + file["status"].ljust(6, " ") + file["file"];
stdscr.addstr(x, 0, s, curses.A_BOLD)
except Exception, err:
logging.error(err);
x = x+1
def toggleChecked(index):
checked = filelist[index]["checked"]
filelist[index]["checked"] = not checked
def checkall(checked=True):
for file in filelist:
file["checked"] = checked
def main():
global stdscr
try:
global filelist
initCurses()
filelist = getFileList()
redraw()
while 1:
curses.getsyx()
c = stdscr.getch()
stdscr.move(1,1)
if c == ord('q'): break # Exit the while()
if c == curses.KEY_UP :
logging.debug("KEYUP!")
y,x = curses.getsyx()
logging.debug("%(x)d %(y)d" % {"x" : x, "y" : y})
stdscr.move(y-1, 1);
if c == curses.KEY_DOWN :
logging.debug("KEYDOWN")
y,x = curses.getsyx()
logging.debug("%(x)d %(y)d" % {"x" : x, "y" : y})
stdscr.move(y+1, 1);
if c == ord(' '):
logging.debug("SPACE")
y,x = curses.getsyx()
toggleChecked(y)
redraw();
stdscr.move(y+1,x);
if c == ord('a'):
y,x = curses.getsyx()
checkall();
redraw();
stdscr.move(y,x);
if c == ord('u'):
y,x = curses.getsyx()
checkall(False);
redraw();
stdscr.move(y,x);
except Exception, err:
logging.error(err);
finally:
cleanupCurses()
if __name__ == "__main__":
main()