Do a more "standard" system installation for bundlebuilder
- setup.py install takes a --prefix option and no arguments. - mo files are installed in /usr/share/locale. - po files are not installed - 8136 (marco)
This commit is contained in:
		
							parent
							
								
									9f88241ff5
								
							
						
					
					
						commit
						e7a10be1d4
					
				| @ -16,6 +16,7 @@ | ||||
| # Boston, MA 02111-1307, USA. | ||||
| 
 | ||||
| import os | ||||
| import sys | ||||
| import zipfile | ||||
| import tarfile | ||||
| import shutil | ||||
| @ -29,6 +30,9 @@ from fnmatch import fnmatch | ||||
| from sugar import env | ||||
| from sugar.bundle.activitybundle import ActivityBundle | ||||
| 
 | ||||
| IGNORE_DIRS = ['dist', '.git'] | ||||
| IGNORE_FILES = ['.gitignore', 'MANIFEST', '*.pyc', '*~', '*.bak'] | ||||
|          | ||||
| def list_files(base_dir, ignore_dirs=None, ignore_files=None): | ||||
|     result = [] | ||||
| 
 | ||||
| @ -119,21 +123,6 @@ class Builder(object): | ||||
|             f.write('[Activity]\nname = %s\n' % translated_name) | ||||
|             f.close() | ||||
| 
 | ||||
| class Packager(object): | ||||
|     def __init__(self, config): | ||||
|         self.config = config | ||||
|         self.package_path = None | ||||
| 
 | ||||
|         if not os.path.exists(self.config.dist_dir): | ||||
|             os.mkdir(self.config.dist_dir) | ||||
| 
 | ||||
|     def _list_files(self): | ||||
|         ignore_dirs = ['dist', '.git'] | ||||
|         ignore_files = ['.gitignore', 'MANIFEST', '*.pyc', '*~', '*.bak'] | ||||
|          | ||||
|         return list_files(self.config.source_dir, ignore_dirs, ignore_files) | ||||
| 
 | ||||
| class BuildPackager(Packager): | ||||
|     def get_files(self): | ||||
|         files = self.config.bundle.get_files() | ||||
| 
 | ||||
| @ -144,10 +133,11 @@ class BuildPackager(Packager): | ||||
| 
 | ||||
|         return files | ||||
| 
 | ||||
|     def _check_manifest(self): | ||||
|     def check_manifest(self): | ||||
|         missing_files = [] | ||||
| 
 | ||||
|         allfiles = self._list_files()         | ||||
|         allfiles = list_files(self.config.source_dir, | ||||
|                               IGNORE_DIRS, IGNORE_FILES) | ||||
|         for path in allfiles: | ||||
|             if path not in self.config.bundle.manifest: | ||||
|                 missing_files.append(path) | ||||
| @ -155,18 +145,30 @@ class BuildPackager(Packager): | ||||
|         return missing_files | ||||
|          | ||||
|     def fix_manifest(self): | ||||
|         self.build() | ||||
| 
 | ||||
|         manifest = self.config.bundle.manifest | ||||
|          | ||||
|         for path in self._check_manifest(): | ||||
|         for path in self.check_manifest(): | ||||
|             manifest.append(path) | ||||
|          | ||||
|         f = open(os.path.join(self.config.source_dir, "MANIFEST"), "wb") | ||||
|         for line in manifest: | ||||
|             f.write(line + "\n") | ||||
| 
 | ||||
| class XOPackager(BuildPackager): | ||||
| class Packager(object): | ||||
|     def __init__(self, config): | ||||
|         BuildPackager.__init__(self, config) | ||||
|         self.config = config | ||||
|         self.package_path = None | ||||
| 
 | ||||
|         if not os.path.exists(self.config.dist_dir): | ||||
|             os.mkdir(self.config.dist_dir) | ||||
| 
 | ||||
| class XOPackager(Packager): | ||||
|     def __init__(self, builder): | ||||
|         Packager.__init__(self, builder.config) | ||||
| 
 | ||||
|         self.builder = builder | ||||
|         self.package_path = os.path.join(self.config.dist_dir, | ||||
|                                          self.config.xo_name) | ||||
| 
 | ||||
| @ -174,14 +176,14 @@ class XOPackager(BuildPackager): | ||||
|         bundle_zip = zipfile.ZipFile(self.package_path, 'w', | ||||
|                                      zipfile.ZIP_DEFLATED) | ||||
|          | ||||
|         missing_files = self._check_manifest() | ||||
|         missing_files = self.builder.check_manifest() | ||||
|         if missing_files: | ||||
|             logging.warn('These files are not included in the manifest ' \ | ||||
|                          'and will not be present in the bundle:\n\n' + | ||||
|                          '\n'.join(missing_files) + | ||||
|                          '\n\nUse fix_manifest if you want to add them.') | ||||
| 
 | ||||
|         for f in self.get_files(): | ||||
|         for f in self.builder.get_files(): | ||||
|             bundle_zip.write(os.path.join(self.config.source_dir, f), | ||||
|                              os.path.join(self.config.bundle_root_dir, f)) | ||||
| 
 | ||||
| @ -198,7 +200,8 @@ class SourcePackager(Packager): | ||||
|                                   cwd=self.config.source_dir) | ||||
|         if git_ls.wait(): | ||||
|             # Fall back to filtered list | ||||
|             return self._list_files() | ||||
|             return list_files(self.config.source_dir, | ||||
|                               IGNORE_DIRS, IGNORE_FILES) | ||||
|          | ||||
|         return [path.strip() for path in git_ls.stdout.readlines()] | ||||
| 
 | ||||
| @ -209,21 +212,50 @@ class SourcePackager(Packager): | ||||
|                     os.path.join(self.config.tar_root_dir, f)) | ||||
|         tar.close() | ||||
| 
 | ||||
| def cmd_help(config, options, args): | ||||
|     print 'Usage: \n\ | ||||
| setup.py build               - build generated files \n\ | ||||
| setup.py dev                 - setup for development \n\ | ||||
| setup.py dist_xo             - create a xo bundle package \n\ | ||||
| setup.py dist_source         - create a tar source package \n\ | ||||
| setup.py fix_manifest        - add missing files to the manifest \n\ | ||||
| setup.py install   [dirname] - install the bundle \n\ | ||||
| setup.py uninstall [dirname] - uninstall the bundle \n\ | ||||
| setup.py genpot              - generate the gettext pot file \n\ | ||||
| setup.py release             - do a new release of the bundle \n\ | ||||
| setup.py help                - print this message \n\ | ||||
| ' | ||||
| class Installer(object): | ||||
|     IGNORES = [ 'po/*', 'MANIFEST', 'AUTHORS' ] | ||||
| 
 | ||||
|     def __init__(self, builder): | ||||
|         self.config = builder.config | ||||
|         self.builder = builder | ||||
| 
 | ||||
|     def should_ignore(self, f): | ||||
|         for pattern in self.IGNORES: | ||||
|             if fnmatch(f, pattern): | ||||
|                 return True | ||||
|         return False | ||||
| 
 | ||||
|     def install(self, prefix): | ||||
|         self.builder.build() | ||||
| 
 | ||||
|         activity_path = os.path.join(prefix, 'share', 'sugar', 'activities', | ||||
|                                      self.config.bundle_root_dir) | ||||
| 
 | ||||
|         source_to_dest = {} | ||||
|         for f in self.builder.get_files(): | ||||
|             if self.should_ignore(f): | ||||
|                 pass | ||||
|             elif f.startswith('locale/') and f.endswith('.mo'): | ||||
|                 source_to_dest[f] = os.path.join(prefix, 'share', f) | ||||
|             else: | ||||
|                 source_to_dest[f] = os.path.join(activity_path, f) | ||||
| 
 | ||||
|         for source, dest in source_to_dest.items(): | ||||
|             print 'Install %s to %s.' % (source, dest) | ||||
| 
 | ||||
|             path = os.path.dirname(dest) | ||||
|             if not os.path.exists(path): | ||||
|                 os.makedirs(path) | ||||
| 
 | ||||
|             shutil.copy(source, dest) | ||||
| 
 | ||||
| def cmd_dev(config, args): | ||||
|     '''Setup for development''' | ||||
| 
 | ||||
|     if args: | ||||
|         print 'Usage: %prog dev' | ||||
|         return | ||||
| 
 | ||||
| def cmd_dev(config, options, args): | ||||
|     bundle_path = env.get_user_activities_path() | ||||
|     if not os.path.isdir(bundle_path): | ||||
|         os.mkdir(bundle_path) | ||||
| @ -236,54 +268,57 @@ def cmd_dev(config, options, args): | ||||
|         else: | ||||
|             print 'ERROR - A bundle with the same name is already installed.' | ||||
| 
 | ||||
| def cmd_dist_xo(config, options, args): | ||||
|     builder = Builder(config) | ||||
|     builder.build() | ||||
| def cmd_dist_xo(config, args): | ||||
|     '''Create a xo bundle package''' | ||||
| 
 | ||||
|     packager = XOPackager(config) | ||||
|     if args: | ||||
|         print 'Usage: %prog dist_xo' | ||||
|         return | ||||
|     | ||||
|     packager = XOPackager(Builder(config)) | ||||
|     packager.package() | ||||
| 
 | ||||
| def cmd_fix_manifest(config, options, args): | ||||
| def cmd_fix_manifest(config, args): | ||||
|     '''Add missing files to the manifest''' | ||||
| 
 | ||||
|     if args: | ||||
|         print 'Usage: %prog fix_manifest' | ||||
|         return | ||||
| 
 | ||||
|     builder = Builder(config) | ||||
|     builder.build() | ||||
|     builder.fix_manifest() | ||||
| 
 | ||||
|     packager = XOPackager(config) | ||||
|     packager.fix_manifest() | ||||
| def cmd_dist_source(config, args): | ||||
|     '''Create a tar source package''' | ||||
| 
 | ||||
| def cmd_dist(config, options, args): | ||||
|     logging.warn("dist deprecated, use dist_xo.") | ||||
|     cmd_dist_xo(config, options, args) | ||||
|     if args: | ||||
|         print 'Usage: %prog dist_source' | ||||
|         return | ||||
| 
 | ||||
| def cmd_dist_source(config, options, args): | ||||
|     packager = SourcePackager(config) | ||||
|     packager.package() | ||||
| 
 | ||||
| def cmd_install(config, options, args): | ||||
|     path = args[0] | ||||
| def cmd_install(config, args): | ||||
|     '''Install the activity in the system''' | ||||
| 
 | ||||
|     packager = XOPackager(config) | ||||
|     packager.package() | ||||
|     parser = OptionParser(usage='usage: %prog install [options]') | ||||
|     parser.add_option('--prefix', dest='prefix', default=sys.prefix, | ||||
|                       help='Prefix to install files to') | ||||
|     (suboptions, subargs) = parser.parse_args(args) | ||||
|     if subargs: | ||||
|         parser.print_help() | ||||
|         return | ||||
| 
 | ||||
|     root_path = os.path.join(args[0], config.bundle_root_dir) | ||||
|     if os.path.isdir(root_path): | ||||
|         shutil.rmtree(root_path) | ||||
|     installer = Installer(Builder(config)) | ||||
|     installer.install(suboptions.prefix) | ||||
| 
 | ||||
|     if not os.path.exists(path): | ||||
|         os.mkdir(path) | ||||
| def cmd_genpot(config, args): | ||||
|     '''Generate the gettext pot file''' | ||||
| 
 | ||||
|     zf = zipfile.ZipFile(packager.package_path) | ||||
|     if args: | ||||
|         print 'Usage: %prog genpot' | ||||
|         return | ||||
| 
 | ||||
|     for name in zf.namelist(): | ||||
|         full_path = os.path.join(path, name)             | ||||
|         if not os.path.exists(os.path.dirname(full_path)): | ||||
|             os.makedirs(os.path.dirname(full_path)) | ||||
| 
 | ||||
|         outfile = open(full_path, 'wb') | ||||
|         outfile.write(zf.read(name)) | ||||
|         outfile.flush() | ||||
|         outfile.close() | ||||
| 
 | ||||
| def cmd_genpot(config, options, args): | ||||
|     po_path = os.path.join(config.source_dir, 'po') | ||||
|     if not os.path.isdir(po_path): | ||||
|         os.mkdir(po_path) | ||||
| @ -315,7 +350,13 @@ def cmd_genpot(config, options, args): | ||||
|     if retcode: | ||||
|         print 'ERROR - xgettext failed with return code %i.' % retcode | ||||
| 
 | ||||
| def cmd_release(config, options, args): | ||||
| def cmd_release(config, args): | ||||
|     '''Do a new release of the bundle''' | ||||
| 
 | ||||
|     if args: | ||||
|         print 'Usage: %prog release' | ||||
|         return | ||||
| 
 | ||||
|     if not os.path.isdir('.git'): | ||||
|         print 'ERROR - this command works only for git repositories' | ||||
|         return | ||||
| @ -413,22 +454,40 @@ def cmd_release(config, options, args): | ||||
| 
 | ||||
|     print 'Done.' | ||||
| 
 | ||||
| def cmd_build(config, options, args): | ||||
| def cmd_build(config, args): | ||||
|     '''Build generated files''' | ||||
| 
 | ||||
|     if args: | ||||
|         print 'Usage: %prog build' | ||||
|         return | ||||
| 
 | ||||
|     builder = Builder(config) | ||||
|     builder.build() | ||||
| 
 | ||||
| def print_commands(): | ||||
|     print 'Available commands:\n' | ||||
| 
 | ||||
|     for name, func in globals().items(): | ||||
|         if name.startswith('cmd_'): | ||||
|             print "%-20s %s" % (name.replace('cmd_', ''), func.__doc__) | ||||
| 
 | ||||
|     print '\n(Type "./setup.py <command> --help" for help about a ' \ | ||||
|           'particular command\'s options.' | ||||
| 
 | ||||
| def start(bundle_name=None): | ||||
|     if bundle_name: | ||||
|         logging.warn("bundle_name deprecated, now comes from activity.info") | ||||
|     parser = OptionParser() | ||||
| 
 | ||||
|     parser = OptionParser(usage='[action] [options]') | ||||
|     parser.disable_interspersed_args() | ||||
|     (options, args) = parser.parse_args() | ||||
| 
 | ||||
|     config = Config() | ||||
| 
 | ||||
|     try: | ||||
|         globals()['cmd_' + args[0]](config, options, args[1:]) | ||||
|         globals()['cmd_' + args[0]](config, args[1:]) | ||||
|     except (KeyError, IndexError): | ||||
|         cmd_help(config, options, args) | ||||
|         print_commands() | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     start() | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Simon Schampijer
						Simon Schampijer