Replaced mixed error handling with exception usage
This commit is contained in:
parent
ad7b4a92fc
commit
4bb716e5b8
|
@ -100,19 +100,46 @@ class InternalCommands:
|
||||||
) % (app, app)
|
) % (app, app)
|
||||||
|
|
||||||
def configure(self):
|
def configure(self):
|
||||||
err = self.configure_internal()
|
self.configure_internal()
|
||||||
|
|
||||||
|
print ('Configure complete!\n\n'
|
||||||
|
'Open project now: %s open\n'
|
||||||
|
'Command line build: %s build'
|
||||||
|
) % (self.this_cmd, self.this_cmd)
|
||||||
|
|
||||||
if err == 0:
|
def configure_internal(self):
|
||||||
print ('Configure complete!\n\n'
|
|
||||||
'Open project now: %s open\n'
|
# ensure latest setup and do not ask config for generator (only fall
|
||||||
'Command line build: %s build'
|
# back to prompt if not specified as arg)
|
||||||
) % (self.this_cmd, self.this_cmd)
|
self.ensure_setup_latest()
|
||||||
return True
|
|
||||||
|
# ensure that we have access to cmake
|
||||||
|
_cmake_cmd = self.persist_cmake()
|
||||||
|
|
||||||
|
# now that we know we've got the latest setup, we can ask the config
|
||||||
|
# file for the generator (but again, we only fall back to this if not
|
||||||
|
# specified as arg).
|
||||||
|
generator = self.get_generator_from_config()
|
||||||
|
|
||||||
|
if generator != '':
|
||||||
|
cmake_args = '%s -G "%s"' % (self.source_dir, generator)
|
||||||
else:
|
else:
|
||||||
return False
|
cmake_args = self.source_dir
|
||||||
|
|
||||||
# TODO: handle svn not installed
|
cmake_cmd_string = '%s %s' % (_cmake_cmd, cmake_args)
|
||||||
# TODO: implement for other platforms
|
|
||||||
|
print "Configuring with CMake (%s)..." % cmake_cmd_string
|
||||||
|
|
||||||
|
# Run from build dir so we have an out-of-source build.
|
||||||
|
self.try_chdir(self.bin_dir)
|
||||||
|
err = os.system(cmake_cmd_string)
|
||||||
|
self.restore_chdir()
|
||||||
|
|
||||||
|
if err != 0:
|
||||||
|
raise Exception('CMake encountered error: ' + str(err))
|
||||||
|
|
||||||
|
self.set_conf_run()
|
||||||
|
|
||||||
def persist_cmake(self):
|
def persist_cmake(self):
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
|
|
||||||
|
@ -146,61 +173,27 @@ class InternalCommands:
|
||||||
if not os.path.exists('tool'):
|
if not os.path.exists('tool'):
|
||||||
os.mkdir('tool')
|
os.mkdir('tool')
|
||||||
|
|
||||||
os.system(r'svn checkout https://synergy-plus.googlecode.com/svn/tools/win/cmake tool\cmake')
|
err = os.system(r'svn checkout https://synergy-plus.googlecode.com/svn/tools/win/cmake tool\cmake')
|
||||||
|
if err != 0:
|
||||||
|
raise Exception('Unable to get cmake from repository with error code code: ' + str(err))
|
||||||
|
|
||||||
found_cmd = r'..\tool\cmake\bin\%s' % self.cmake_cmd
|
found_cmd = r'..\tool\cmake\bin\%s' % self.cmake_cmd
|
||||||
found_cmake = True
|
found_cmake = True
|
||||||
|
|
||||||
# if cmake was not found
|
# if cmake was not found
|
||||||
if not found_cmake:
|
if not found_cmake:
|
||||||
print 'Cannot continue without CMake, exiting.'
|
raise Exception('Cannot continue without CMake, exiting.')
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
return found_cmd
|
return found_cmd
|
||||||
else:
|
else:
|
||||||
return self.cmake_cmd
|
return self.cmake_cmd
|
||||||
|
|
||||||
def configure_internal(self):
|
|
||||||
|
|
||||||
# ensure latest setup and do not ask config for generator (only fall
|
|
||||||
# back to prompt if not specified as arg)
|
|
||||||
self.ensure_setup_latest()
|
|
||||||
|
|
||||||
# ensure that we have access to cmake
|
|
||||||
_cmake_cmd = self.persist_cmake()
|
|
||||||
|
|
||||||
# now that we know we've got the latest setup, we can ask the config
|
|
||||||
# file for the generator (but again, we only fall back to this if not
|
|
||||||
# specified as arg).
|
|
||||||
generator = self.get_generator_from_config()
|
|
||||||
|
|
||||||
if generator != '':
|
|
||||||
cmake_args = '%s -G "%s"' % (self.source_dir, generator)
|
|
||||||
else:
|
|
||||||
cmake_args = self.source_dir
|
|
||||||
|
|
||||||
cmake_cmd_string = '%s %s' % (_cmake_cmd, cmake_args)
|
|
||||||
|
|
||||||
print "Configuring with CMake (%s)..." % cmake_cmd_string
|
|
||||||
|
|
||||||
# Run from build dir so we have an out-of-source build.
|
|
||||||
self.try_chdir(self.bin_dir)
|
|
||||||
err = os.system(cmake_cmd_string)
|
|
||||||
self.restore_chdir()
|
|
||||||
|
|
||||||
if err != 0:
|
|
||||||
print 'CMake encountered error:', err
|
|
||||||
else:
|
|
||||||
self.set_conf_run()
|
|
||||||
|
|
||||||
return err;
|
|
||||||
|
|
||||||
def build(self, mode = None):
|
def build(self, mode = None):
|
||||||
|
|
||||||
self.ensure_setup_latest()
|
self.ensure_setup_latest()
|
||||||
|
|
||||||
if not self.has_conf_run():
|
if not self.has_conf_run():
|
||||||
if self.configure_internal() != 0:
|
self.configure_internal()
|
||||||
return False
|
|
||||||
|
|
||||||
generator = self.get_generator_from_config()
|
generator = self.get_generator_from_config()
|
||||||
|
|
||||||
|
@ -210,22 +203,13 @@ class InternalCommands:
|
||||||
self.try_chdir(self.bin_dir)
|
self.try_chdir(self.bin_dir)
|
||||||
err = os.system(self.make_cmd)
|
err = os.system(self.make_cmd)
|
||||||
self.restore_chdir()
|
self.restore_chdir()
|
||||||
|
|
||||||
if err == 0:
|
if err != 0:
|
||||||
return True
|
raise Exception('GNU Make failed: ' + str(err))
|
||||||
else:
|
|
||||||
print 'GNU Make failed:', err
|
|
||||||
return False
|
|
||||||
|
|
||||||
elif generator.startswith('Visual Studio'):
|
elif generator.startswith('Visual Studio'):
|
||||||
|
|
||||||
ret = self.run_vcbuild(generator, mode)
|
self.run_vcbuild(generator, mode)
|
||||||
|
|
||||||
if ret == 0:
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
print 'VCBuild failed:', ret
|
|
||||||
return False
|
|
||||||
|
|
||||||
elif generator == 'Xcode':
|
elif generator == 'Xcode':
|
||||||
|
|
||||||
|
@ -234,15 +218,11 @@ class InternalCommands:
|
||||||
err = os.system(self.xcodebuild_cmd)
|
err = os.system(self.xcodebuild_cmd)
|
||||||
self.restore_chdir()
|
self.restore_chdir()
|
||||||
|
|
||||||
if err == 0:
|
if err != 0:
|
||||||
return True
|
raise Exception('Xcode failed:', err)
|
||||||
else:
|
|
||||||
print 'Xcode failed:', err
|
|
||||||
return False
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print 'Not supported with generator:',generator
|
raise Exception('Not supported with generator: ' + generator)
|
||||||
return False
|
|
||||||
|
|
||||||
def clean(self, mode = None):
|
def clean(self, mode = None):
|
||||||
|
|
||||||
|
@ -255,33 +235,18 @@ class InternalCommands:
|
||||||
err = os.system(self.make_cmd + ' clean')
|
err = os.system(self.make_cmd + ' clean')
|
||||||
self.restore_chdir()
|
self.restore_chdir()
|
||||||
|
|
||||||
if err == 0:
|
if err != 0:
|
||||||
return True
|
raise Exception('GNU Make failed: ' + str(err))
|
||||||
else:
|
|
||||||
print 'GNU Make failed: %s' % err
|
|
||||||
return False
|
|
||||||
|
|
||||||
# special case for version 10, use new /target:clean
|
# special case for version 10, use new /target:clean
|
||||||
elif generator.startswith('Visual Studio 10'):
|
elif generator.startswith('Visual Studio 10'):
|
||||||
|
|
||||||
ret = self.run_vcbuild(generator, mode, '/target:clean')
|
self.run_vcbuild(generator, mode, '/target:clean')
|
||||||
|
|
||||||
if ret == 0:
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
print 'VCBuild failed:', ret
|
|
||||||
return False
|
|
||||||
|
|
||||||
# any other version of visual studio, use /clean
|
# any other version of visual studio, use /clean
|
||||||
elif generator.startswith('Visual Studio'):
|
elif generator.startswith('Visual Studio'):
|
||||||
|
|
||||||
ret = self.run_vcbuild(generator, mode, '/clean')
|
self.run_vcbuild(generator, mode, '/clean')
|
||||||
|
|
||||||
if ret == 0:
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
print 'VCBuild failed:', ret
|
|
||||||
return False
|
|
||||||
|
|
||||||
elif generator == 'Xcode':
|
elif generator == 'Xcode':
|
||||||
|
|
||||||
|
@ -290,45 +255,42 @@ class InternalCommands:
|
||||||
err = os.system(xcodebuild_cmd + ' clean')
|
err = os.system(xcodebuild_cmd + ' clean')
|
||||||
self.restore_chdir()
|
self.restore_chdir()
|
||||||
|
|
||||||
if err == 0:
|
if err != 0:
|
||||||
return True
|
raise Exception('Xcode failed:', err)
|
||||||
else:
|
|
||||||
print 'XCode failed:', err
|
|
||||||
return False
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print 'clean: Not supported on platform:',sys.platform
|
raise Exception('Not supported with generator: ' + generator)
|
||||||
return False
|
|
||||||
|
|
||||||
def open(self):
|
def open(self):
|
||||||
generator = self.get_generator_from_config()
|
generator = self.get_generator_from_config()
|
||||||
if generator.startswith('Visual Studio'):
|
if generator.startswith('Visual Studio'):
|
||||||
print 'Opening with %s...' % generator
|
print 'Opening with %s...' % generator
|
||||||
self.open_internal(self.sln_filepath())
|
self.open_internal(self.sln_filepath())
|
||||||
return True
|
|
||||||
elif generator.startswith('Xcode'):
|
elif generator.startswith('Xcode'):
|
||||||
print 'Opening with %s...' % generator
|
print 'Opening with %s...' % generator
|
||||||
self.open_internal(xcodeproj_filepath(), 'open')
|
self.open_internal(xcodeproj_filepath(), 'open')
|
||||||
return True
|
|
||||||
else:
|
else:
|
||||||
print 'Not supported with generator:',generator
|
raise Exception('Not supported with generator: ' + generator)
|
||||||
return False
|
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
print "Running Subversion update..."
|
print "Running Subversion update..."
|
||||||
os.system('svn update')
|
err = os.system('svn update')
|
||||||
|
if err != 0:
|
||||||
|
raise Exception('Could not update from repository with error code code: ' + str(err))
|
||||||
|
|
||||||
def revision(self):
|
def revision(self):
|
||||||
# While this doesn't print out the revision specifically, it will do.
|
# While this doesn't print out the revision specifically, it will do.
|
||||||
os.system('svn info')
|
err = os.system('svn info')
|
||||||
|
if err != 0:
|
||||||
|
raise Exception('Could not get revision info with error code code: ' + str(err))
|
||||||
|
|
||||||
def kill(self):
|
def kill(self):
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
os.system('taskkill /F /FI "IMAGENAME eq synergy*"')
|
return os.system('taskkill /F /FI "IMAGENAME eq synergy*"')
|
||||||
return True
|
|
||||||
else:
|
else:
|
||||||
print 'kill: Error: Command not implemented for current platform'
|
raise Exception('Not implemented for platform: ' + sys.platform)
|
||||||
return False
|
|
||||||
|
|
||||||
def package(self, type):
|
def package(self, type):
|
||||||
|
|
||||||
|
@ -339,60 +301,43 @@ class InternalCommands:
|
||||||
self.package_usage()
|
self.package_usage()
|
||||||
elif type == 'src':
|
elif type == 'src':
|
||||||
if sys.platform in ['linux2', 'darwin']:
|
if sys.platform in ['linux2', 'darwin']:
|
||||||
self.package_tgz()
|
self.package_run('make package_source')
|
||||||
else:
|
else:
|
||||||
package_unsupported = True
|
package_unsupported = True
|
||||||
elif type == 'rpm':
|
elif type == 'rpm':
|
||||||
if sys.platform == 'linux2':
|
if sys.platform == 'linux2':
|
||||||
self.package_rpm()
|
self.package_run('cpack -G RPM')
|
||||||
else:
|
else:
|
||||||
package_unsupported = True
|
package_unsupported = True
|
||||||
elif type == 'deb':
|
elif type == 'deb':
|
||||||
if sys.platform == 'linux2':
|
if sys.platform == 'linux2':
|
||||||
self.package_deb()
|
self.package_run('cpack -G DEB')
|
||||||
else:
|
else:
|
||||||
package_unsupported = True
|
package_unsupported = True
|
||||||
elif type == 'win':
|
elif type == 'win':
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
self.package_win()
|
self.package_run('cpack -G NSIS')
|
||||||
else:
|
else:
|
||||||
package_unsupported = True
|
package_unsupported = True
|
||||||
elif type == 'mac':
|
elif type == 'mac':
|
||||||
if sys.platform == 'darwin':
|
if sys.platform == 'darwin':
|
||||||
self.package_mac()
|
self.package_run('cpack -G PackageMaker')
|
||||||
else:
|
else:
|
||||||
package_unsupported = True
|
package_unsupported = True
|
||||||
else:
|
else:
|
||||||
print 'Not yet implemented: package %s' % type
|
print 'Not yet implemented: package %s' % type
|
||||||
|
|
||||||
if package_unsupported:
|
if package_unsupported:
|
||||||
print ('Package type, %s is not '
|
raise Exception(
|
||||||
'supported for platform, %s') % (type, sys.platform)
|
("Package type, '%s' is not supported for platform, '%s'")
|
||||||
|
% (type, sys.platform))
|
||||||
def package_tgz(self):
|
|
||||||
|
def package_run(self, command):
|
||||||
self.try_chdir(self.bin_dir)
|
self.try_chdir(self.bin_dir)
|
||||||
os.system('make package_source')
|
err = os.system(command)
|
||||||
self.restore_chdir()
|
|
||||||
|
|
||||||
def package_rpm(self):
|
|
||||||
self.try_chdir(self.bin_dir)
|
|
||||||
os.system('cpack -G RPM')
|
|
||||||
self.restore_chdir()
|
|
||||||
|
|
||||||
def package_deb(self):
|
|
||||||
self.try_chdir(self.bin_dir)
|
|
||||||
os.system('cpack -G DEB')
|
|
||||||
self.restore_chdir()
|
|
||||||
|
|
||||||
def package_win(self):
|
|
||||||
self.try_chdir(self.bin_dir)
|
|
||||||
os.system('cpack -G NSIS')
|
|
||||||
self.restore_chdir()
|
|
||||||
|
|
||||||
def package_mac(self):
|
|
||||||
self.try_chdir(self.bin_dir)
|
|
||||||
os.system('cpack -G PackageMaker')
|
|
||||||
self.restore_chdir()
|
self.restore_chdir()
|
||||||
|
if err != 0:
|
||||||
|
raise Exception('Package failed: ' + str(err))
|
||||||
|
|
||||||
def package_usage(self):
|
def package_usage(self):
|
||||||
print ('Usage: %s package [package-type]\n'
|
print ('Usage: %s package [package-type]\n'
|
||||||
|
@ -431,14 +376,16 @@ class InternalCommands:
|
||||||
def open_internal(self, project_filename, application = ''):
|
def open_internal(self, project_filename, application = ''):
|
||||||
|
|
||||||
if not os.path.exists(project_filename):
|
if not os.path.exists(project_filename):
|
||||||
print 'Project file (%s) not found, run hm conf first.' % project_filename
|
raise Exception('Project file (%s) not found, run hm conf first.' % project_filename)
|
||||||
return False
|
|
||||||
else:
|
else:
|
||||||
path = project_filename
|
path = project_filename
|
||||||
|
|
||||||
if application != '':
|
if application != '':
|
||||||
path = application + ' ' + path
|
path = application + ' ' + path
|
||||||
os.system(path)
|
|
||||||
return True
|
err = os.system(path)
|
||||||
|
if err != 0:
|
||||||
|
raise Exception('Could not open project with error code code: ' + str(err))
|
||||||
|
|
||||||
def setup(self):
|
def setup(self):
|
||||||
print "Running setup..."
|
print "Running setup..."
|
||||||
|
@ -604,6 +551,7 @@ class InternalCommands:
|
||||||
|
|
||||||
if not os.path.exists(path):
|
if not os.path.exists(path):
|
||||||
raise Exception("'%s' not found." % path)
|
raise Exception("'%s' not found." % path)
|
||||||
|
|
||||||
return path
|
return path
|
||||||
|
|
||||||
def run_vcbuild(self, generator, mode, args=''):
|
def run_vcbuild(self, generator, mode, args=''):
|
||||||
|
@ -651,18 +599,22 @@ class InternalCommands:
|
||||||
file.write(cmd)
|
file.write(cmd)
|
||||||
file.close()
|
file.close()
|
||||||
|
|
||||||
return os.system(temp_bat)
|
err = os.system(temp_bat)
|
||||||
|
if err != 0:
|
||||||
|
raise Exception('Microsoft compiler failed with error code: ' + str(err))
|
||||||
|
|
||||||
def ensure_setup_latest(self):
|
def ensure_setup_latest(self):
|
||||||
if not self.min_setup_version(self.setup_version):
|
if not self.min_setup_version(self.setup_version):
|
||||||
self.setup()
|
self.setup()
|
||||||
|
|
||||||
def reformat(self):
|
def reformat(self):
|
||||||
# TODO: error handling
|
err = os.system(
|
||||||
os.system(
|
|
||||||
r'tool\astyle\AStyle.exe '
|
r'tool\astyle\AStyle.exe '
|
||||||
'--quiet --suffix=none --style=java --indent=force-tab=4 --recursive '
|
'--quiet --suffix=none --style=java --indent=force-tab=4 --recursive '
|
||||||
'lib/*.cpp lib/*.h cmd/*.cpp cmd/*.h')
|
'lib/*.cpp lib/*.h cmd/*.cpp cmd/*.h')
|
||||||
|
|
||||||
|
if err != 0:
|
||||||
|
raise Exception('Reformat failed with error code: ' + str(err))
|
||||||
|
|
||||||
# the command handler should be called only from hm.py (i.e. directly
|
# the command handler should be called only from hm.py (i.e. directly
|
||||||
# from the command prompt). the purpose of this class is so that we
|
# from the command prompt). the purpose of this class is so that we
|
||||||
|
|
50
hm.py
50
hm.py
|
@ -126,35 +126,35 @@ def start_cmd(argv):
|
||||||
|
|
||||||
def run_cmd(cmd, argv = []):
|
def run_cmd(cmd, argv = []):
|
||||||
|
|
||||||
options_pair = cmd_opt_dict[cmd]
|
|
||||||
|
|
||||||
options = global_options + options_pair[0]
|
|
||||||
|
|
||||||
options_long = []
|
|
||||||
options_long.extend(global_options_long)
|
|
||||||
options_long.extend(options_pair[1])
|
|
||||||
|
|
||||||
opts, args = getopt(argv, options, options_long)
|
|
||||||
|
|
||||||
verbose = False
|
verbose = False
|
||||||
for o, a in opts:
|
|
||||||
if o in ('-v', '--verbose'):
|
|
||||||
verbose = True
|
|
||||||
|
|
||||||
# pass args and optarg data to command handler, which figures out
|
|
||||||
# how to handle the arguments
|
|
||||||
handler = commands.CommandHandler(argv, opts, args)
|
|
||||||
handler.verbose = verbose
|
|
||||||
|
|
||||||
# use reflection to get the function pointer
|
|
||||||
cmd_func = getattr(handler, cmd)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
options_pair = cmd_opt_dict[cmd]
|
||||||
|
|
||||||
|
options = global_options + options_pair[0]
|
||||||
|
|
||||||
|
options_long = []
|
||||||
|
options_long.extend(global_options_long)
|
||||||
|
options_long.extend(options_pair[1])
|
||||||
|
|
||||||
|
opts, args = getopt(argv, options, options_long)
|
||||||
|
|
||||||
|
for o, a in opts:
|
||||||
|
if o in ('-v', '--verbose'):
|
||||||
|
verbose = True
|
||||||
|
|
||||||
|
# pass args and optarg data to command handler, which figures out
|
||||||
|
# how to handle the arguments
|
||||||
|
handler = commands.CommandHandler(argv, opts, args)
|
||||||
|
handler.verbose = verbose
|
||||||
|
|
||||||
|
# use reflection to get the function pointer
|
||||||
|
cmd_func = getattr(handler, cmd)
|
||||||
|
|
||||||
cmd_func()
|
cmd_func()
|
||||||
except Exception as ex:
|
except:
|
||||||
if not verbose:
|
if not verbose:
|
||||||
# print friendly error for users
|
# print friendly error for users
|
||||||
print 'Error:',ex
|
sys.stderr.write('Error: ' + sys.exc_info()[1].__str__())
|
||||||
exit(1)
|
exit(1)
|
||||||
else:
|
else:
|
||||||
# if user wants to be verbose let python do it's thing
|
# if user wants to be verbose let python do it's thing
|
||||||
|
@ -167,7 +167,7 @@ def main(argv):
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
sys.exit(start_cmd(argv))
|
start_cmd(argv)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print '\n\nUser aborted, exiting.'
|
print '\n\nUser aborted, exiting.'
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue