#!/usr/bin/env python
# -*- python-mode -*-
"""Takes care of starting the Init function
"""

__copyright__ = """
Copyright (C) 2005, Catalin Marinas <catalin.marinas@gmail.com>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""

import sys, os
import profile, pstats, time

# Try to detect where it is run from and set prefix and the search path.
# It is assumed that the user installed StGIT using the --prefix= option
prefix, bin = os.path.split(sys.path[0])

if bin == 'bin' and prefix != sys.prefix:
    sys.prefix = prefix
    sys.exec_prefix = prefix

    major, minor = sys.version_info[0:2]
    local_path = [os.path.join(prefix, 'lib', 'python'),
                  os.path.join(prefix, 'lib', 'python%s.%s' % (major, minor)),
                  os.path.join(prefix, 'lib', 'python%s.%s' % (major, minor),
                               'site-packages')]
    sys.path = local_path + sys.path

from stgit.main import main

if __name__ == '__main__':
    start_time = time.time()
    def timer():
        return time.time() - start_time

    prof = profile.Profile(timer)
    try:
        prof.run('main()')
    except SystemExit:
        pass
    pstats.Stats(prof).strip_dirs().sort_stats(-1).print_stats().print_callees()
