# 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()