#! /usr/bin/env python
"""merge"""

import os
import sys
import signal
from time import sleep
from mergetools import parse_args, terminate_child_procs
from multiprocessing import Process
import merge_fetch, merge_backup, merge_sth, merge_dist

def run_once():
    """Merge once."""
    ret = merge_fetch.main()
    if ret == 0:
        ret = merge_backup.main()
    if ret == 0:
        ret = merge_sth.main()
    if ret == 0:
        ret = merge_dist.main()
    return ret

def term(signal, arg):
    terminate_child_procs()
    sys.exit(1)

def run_continuously(pidfilepath):
    """Run continuously."""
    parts = (('fetch', merge_fetch),
             ('backup', merge_backup),
             ('sth', merge_sth),
             ('dist', merge_dist))
    procs = {}
    for part, mod in parts:
        procs[part] = Process(target=mod.main, name='merge_%s' % part)
        procs[part].start()
        #print >>sys.stderr, "DEBUG:", part, "started, pid", procs[part].pid

    if pidfilepath:
        open(pidfilepath, 'w').write(str(os.getpid()) + '\n')

    signal.signal(signal.SIGTERM, term)
    retval = 0
    keep_going = True
    while keep_going:
        sleep(1)
        for name, p in procs.items():
            if not p.is_alive():
                print >>sys.stderr, "\nERROR:", name, "process is gone; exiting"
                retval = 1                # Fail.
                keep_going = False
                break

    terminate_child_procs()
    return retval

def main():
    """Main"""
    args, _, _ = parse_args()

    if args.mergeinterval is None:
        ret = run_once()
    else:
        ret = run_continuously(args.pidfile)

    return ret

if __name__ == '__main__':
    sys.exit(main())