view kharon.py @ 2:05cece4371a4

Added an undo option, though it's not implemented yet.
author Atul Varma <varmaa@toolness.com>
date Mon, 08 Dec 2008 13:37:34 -0800
parents cb08fb8f0e87
children 4734efec5732
line wrap: on
line source

#! /usr/bin/env python3.0

'''
   This is a drop-in replacement for rm, with support for undo.
'''

import os
import sys
import json
import subprocess
import distutils.dir_util
from optparse import OptionParser

HADES_DIR = os.path.expanduser('~/.Hades')
STATE_FILENAME = os.path.join(HADES_DIR, 'state.json')

class Config(object):
    def __init__(self, filename):
        self.__filename = filename
        self.nextid = 0
        if os.path.exists(self.__filename):
            self.__dict__.update(json.load(open(self.__filename, 'r')))
        else:
            self.save()

    def save(self):
        state = {}
        keys = [key for key in self.__dict__
                if not key.startswith('__')]
        for key in keys:
            state[key] = self.__dict__[key]
        json.dump(state, open(self.__filename, 'w'))

def shell(*params):
    popen = subprocess.Popen(params)
    popen.wait()
    if popen.returncode:
        raise Exception('Process failed: %s' % repr(params))

if __name__ == '__main__':
    if not (os.path.exists(HADES_DIR) and os.path.isdir(HADES_DIR)):
        shell('mkdir', HADES_DIR)

    parser = OptionParser()
    parser.add_option('-u', '--undo',
                      dest='undo', action='store_true', default=False,
                      help='undo a transaction (default is latest).')
    (options, args) = parser.parse_args()

    if not args:
        parser.print_help()
        sys.exit(-1)

    config = Config(STATE_FILENAME)

    if options.undo:
        raise NotImplementedError('Undo not implemented yet.')
    else:
        files = []
        for arg in args:
            filename = os.path.abspath(os.path.expanduser(arg))
            if not os.path.exists(filename):
                print('File does not exist: %s' % arg)
                sys.exit(-1)
            files.append(filename)

        thisid = config.nextid
        basedir = os.path.join(HADES_DIR, '%.9d' % thisid)
        shell('mkdir', basedir)
        config.nextid = thisid + 1
        config.save()

        print("Creating transaction %d." % thisid)

        for source in files:
            dest = os.path.join(basedir, filename[1:])
            distutils.dir_util.mkpath(os.path.dirname(dest))
            shell('mv', source, dest)