Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Set of common operations/utilities for build archiving.""" | 5 """Set of common operations/utilities for build archiving.""" |
| 6 | 6 |
| 7 import glob | 7 import glob |
| 8 import os | 8 import os |
| 9 import platform | 9 import platform |
| 10 import re | 10 import re |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 71 symbol_staging_url = 'http://clients2.google.com/cr/staging_symbol' | 71 symbol_staging_url = 'http://clients2.google.com/cr/staging_symbol' |
| 72 | 72 |
| 73 | 73 |
| 74 class FilesCfgParser(object): | 74 class FilesCfgParser(object): |
| 75 """Class to process a FILES.cfg style listing of build files.""" | 75 """Class to process a FILES.cfg style listing of build files.""" |
| 76 | 76 |
| 77 def __init__(self, files_file, buildtype, arch): | 77 def __init__(self, files_file, buildtype, arch): |
| 78 self._buildtype = buildtype | 78 self._buildtype = buildtype |
| 79 self._arch = arch | 79 self._arch = arch |
| 80 self._files_cfg = self._ParseFilesCfg(files_file) | 80 self._files_cfg = self._ParseFilesCfg(files_file) |
| 81 self.files_dict = self._FilterFilesCfg() | 81 self._files_list = self._FilterFilesCfg() |
| 82 | 82 |
| 83 def _SetArch(self, value): | 83 def _SetArch(self, value): |
| 84 """Set build arch and reset files_dict to reflect new build criteria.""" | 84 """Set build arch and reset files_list to reflect new build criteria.""" |
| 85 self._arch = value | 85 self._arch = value |
| 86 self.files_dict.clear() | 86 del self._files_list[:] |
| 87 self.files_dict.update(self._FilterFilesCfg()) | 87 self._files_list.extend(self._FilterFilesCfg()) |
| 88 | 88 |
| 89 arch = property(fset=_SetArch) | 89 arch = property(fset=_SetArch) |
| 90 | 90 |
| 91 def _SetBuildType(self, value): | 91 def _SetBuildType(self, value): |
| 92 """Set build type and reset files_dict to reflect new build criteria.""" | 92 """Set build type and reset files_list to reflect new build criteria.""" |
| 93 self._buildtype = value | 93 self._buildtype = value |
| 94 self.files_dict.clear() | 94 del self._files_list[:] |
| 95 self.files_dict.update(self._FilterFilesCfg()) | 95 self._files_list.extend(self._FilterFilesCfg()) |
| 96 | 96 |
| 97 buildtype = property(fset=_SetBuildType) | 97 buildtype = property(fset=_SetBuildType) |
| 98 | 98 |
| 99 def _FilterFilesCfg(self): | 99 def _FilterFilesCfg(self): |
| 100 """Return a dict of file items that match the current build criteria.""" | 100 """Return a list of file items that match the current build criteria.""" |
| 101 files_dict = {} | 101 files_list = [] |
| 102 for fileobj in self._files_cfg: | 102 for fileobj in self._files_cfg: |
| 103 if self._buildtype not in fileobj['buildtype']: | 103 if self._buildtype not in fileobj['buildtype']: |
| 104 continue | 104 continue |
| 105 if not fileobj.get('arch') or self._arch in fileobj['arch']: | 105 if not fileobj.get('arch') or self._arch in fileobj['arch']: |
| 106 files_dict[fileobj['filename']] = fileobj | 106 files_list.append(fileobj) |
| 107 return files_dict | 107 return files_list |
| 108 | 108 |
| 109 @staticmethod | 109 @staticmethod |
| 110 def _ParseFilesCfg(files_file): | 110 def _ParseFilesCfg(files_file): |
| 111 """Return the dictionary of archive file info read from the given file.""" | 111 """Return the dictionary of archive file info read from the given file.""" |
| 112 if not os.path.exists(files_file): | 112 if not os.path.exists(files_file): |
| 113 raise StagingError('Files list does not exist (%s).' % files_file) | 113 raise StagingError('Files list does not exist (%s).' % files_file) |
| 114 exec_globals = {'__builtins__': None} | 114 exec_globals = {'__builtins__': None} |
| 115 | 115 |
| 116 execfile(files_file, exec_globals) | 116 execfile(files_file, exec_globals) |
| 117 return exec_globals['FILES'] | 117 return exec_globals['FILES'] |
| 118 | 118 |
| 119 @classmethod | 119 @classmethod |
| 120 def IsDirectArchive(cls, archive_list): | 120 def IsDirectArchive(cls, archive_list): |
| 121 """Determine if the given archive list should be archived as-is. | 121 """Determine if the given archive list should be archived as-is. |
| 122 | 122 |
| 123 An archive list (from ParseArchiveLists) is archived as-is (not added to | 123 An archive list (from ParseArchiveLists) is archived as-is (not added to |
| 124 another archive file) iff: | 124 another archive file) iff: |
| 125 - There list contains a single file, and | 125 - There list contains a single file, and |
| 126 - That file has the 'direct_archive' flag or its 'archive' name matches | 126 - That file has the 'direct_archive' flag or its 'archive' name matches |
| 127 its 'filename' (an implied 'direct_archive'). | 127 its 'filename' (an implied 'direct_archive'). |
| 128 """ | 128 """ |
| 129 fileobj = archive_list[0] | 129 fileobj = archive_list[0] |
| 130 return (len(archive_list) == 1 and | 130 return (len(archive_list) == 1 and |
| 131 (fileobj['filename'] == fileobj['archive'] or | 131 (fileobj['filename'] == fileobj['archive'] or |
| 132 fileobj.get('direct_archive'))) | 132 fileobj.get('direct_archive'))) |
| 133 | 133 |
| 134 def IsOptional(self, filename): | 134 def IsOptional(self, filename): |
| 135 """Determine if the given filename is marked optional for this config.""" | 135 """Determine if the given filename is marked optional for this config.""" |
| 136 return (self.files_dict.get(filename) and self._buildtype in | 136 has_file = False |
| 137 self.files_dict[filename].get('optional', [])) | 137 for fileobj in self._files_list: |
| 138 if fileobj['filename'] == filename: | |
| 139 has_file = True | |
| 140 if self._buildtype not in fileobj['optional']: | |
| 141 return False | |
| 142 return has_file | |
|
Michael Moss
2016/10/11 18:23:32
Maybe simplify slightly by getting rid of the 'has
Michael Moss
2016/10/11 18:47:06
Ugh, my logic was backwards, ignore. We want it to
| |
| 138 | 143 |
| 139 def ParseGroup(self, filegroup): | 144 def ParseGroup(self, filegroup): |
| 140 """Return the list of filenames in the given group (e.g. "symbols").""" | 145 """Return the list of filenames in the given group (e.g. "symbols").""" |
| 141 return [fileobj['filename'] for fileobj in self.files_dict.itervalues() | 146 return [fileobj['filename'] for fileobj in self._files_list |
| 142 if (fileobj.get('filegroup') and filegroup in fileobj.get('filegroup')) | 147 if (fileobj.get('filegroup') and filegroup in fileobj.get('filegroup')) |
| 143 ] | 148 ] |
| 144 | 149 |
| 145 def ParseArchiveLists(self): | 150 def ParseArchiveLists(self): |
| 146 """Generate a dict of all the file items in all archives.""" | 151 """Generate a dict of all the file items in all archives.""" |
| 147 archive_lists = {} | 152 archive_lists = {} |
| 148 for fileobj in self.files_dict.itervalues(): | 153 for fileobj in self._files_list: |
| 149 if fileobj.get('archive'): | 154 if fileobj.get('archive'): |
| 150 archive_lists.setdefault(fileobj['archive'], []).append(fileobj) | 155 archive_lists.setdefault(fileobj['archive'], []).append(fileobj) |
| 151 return archive_lists | 156 return archive_lists |
| 152 | 157 |
| 153 def ParseLegacyList(self): | 158 def ParseLegacyList(self): |
| 154 """Return the list of 'default' filenames. | 159 """Return the list of 'default' filenames. |
| 155 | 160 |
| 156 Default files are either tagged as "default" filegroup or they have no | 161 Default files are either tagged as "default" filegroup or they have no |
| 157 filegroup (i.e. legacy entries from before the filegroup field was added.) | 162 filegroup (i.e. legacy entries from before the filegroup field was added.) |
| 158 """ | 163 """ |
| 159 files_list = [ | 164 files_list = [ |
| 160 fileobj['filename'] for fileobj in self.files_dict.itervalues() | 165 fileobj['filename'] for fileobj in self._files_list |
| 161 if (not fileobj.get('archive') and | 166 if (not fileobj.get('archive') and |
| 162 (not fileobj.get('filegroup') or 'default' in | 167 (not fileobj.get('filegroup') or 'default' in |
| 163 fileobj.get('filegroup'))) | 168 fileobj.get('filegroup'))) |
| 164 ] | 169 ] |
| 165 return files_list | 170 return files_list |
| 166 | 171 |
| 167 | |
|
Michael Moss
2016/10/11 18:23:32
Nit: Keep 2 lines before top-level functions/class
chenwilliam
2016/10/11 19:08:15
Done.
| |
| 168 def ParseFilesList(files_file, buildtype, arch): | 172 def ParseFilesList(files_file, buildtype, arch): |
| 169 """DEPRECATED: Determine the list of archive files for a given release. | 173 """DEPRECATED: Determine the list of archive files for a given release. |
| 170 | 174 |
| 171 NOTE: This can be removed after 20.x goes stable (or after scripts/common/ | 175 NOTE: This can be removed after 20.x goes stable (or after scripts/common/ |
| 172 gets versioned on the official builders like site_config is). | 176 gets versioned on the official builders like site_config is). |
| 173 """ | 177 """ |
| 174 fparser = FilesCfgParser(files_file, buildtype, arch) | 178 fparser = FilesCfgParser(files_file, buildtype, arch) |
| 175 return fparser.ParseLegacyList() | 179 return fparser.ParseLegacyList() |
| 176 | 180 |
| 177 | 181 |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 320 raise_error=not allow_missing) | 324 raise_error=not allow_missing) |
| 321 if not os.path.exists(zip_file): | 325 if not os.path.exists(zip_file): |
| 322 raise StagingError('Failed to make zip package %s' % zip_file) | 326 raise StagingError('Failed to make zip package %s' % zip_file) |
| 323 | 327 |
| 324 if os.path.basename(zip_file) != archive_name: | 328 if os.path.basename(zip_file) != archive_name: |
| 325 orig_zip = zip_file | 329 orig_zip = zip_file |
| 326 zip_file = os.path.join(os.path.dirname(orig_zip), archive_name) | 330 zip_file = os.path.join(os.path.dirname(orig_zip), archive_name) |
| 327 print 'Renaming archive: "%s" -> "%s"' % (orig_zip, zip_file) | 331 print 'Renaming archive: "%s" -> "%s"' % (orig_zip, zip_file) |
| 328 chromium_utils.MoveFile(orig_zip, zip_file) | 332 chromium_utils.MoveFile(orig_zip, zip_file) |
| 329 return (zip_dir, zip_file) | 333 return (zip_dir, zip_file) |
| OLD | NEW |