mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	Compute all version numbers using cef_version.py (see issue #2596)
The version format can now be controlled by setting the CEF_OLD_VERSION_FORMAT environment variable. The old format is currently the default.
This commit is contained in:
		
							
								
								
									
										266
									
								
								tools/cef_version.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								tools/cef_version.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,266 @@ | ||||
| # Copyright (c) 2019 The Chromium Embedded Framework Authors. All rights | ||||
| # reserved. Use of this source code is governed by a BSD-style license that | ||||
| # can be found in the LICENSE file. | ||||
|  | ||||
| from file_util import * | ||||
| import git_util as git | ||||
| import os | ||||
|  | ||||
|  | ||||
| class VersionFormatter: | ||||
|   """ Formats CEF version information. """ | ||||
|  | ||||
|   def __init__(self, chromium_src_path=None): | ||||
|     if chromium_src_path is None: | ||||
|       # Relative to the current directory. | ||||
|       script_path = os.path.abspath(os.path.dirname(__file__)) | ||||
|       chromium_src_path = os.path.abspath( | ||||
|           os.path.join(script_path, os.pardir, os.pardir)) | ||||
|  | ||||
|     self.src_path = chromium_src_path | ||||
|     assert os.path.isdir(self.src_path), self.src_path | ||||
|     self.cef_path = os.path.join(self.src_path, 'cef') | ||||
|     assert os.path.isdir(self.cef_path), self.cef_path | ||||
|  | ||||
|     # Whether to use the old version format by default. | ||||
|     self._old_format_default = \ | ||||
|         bool(int(os.environ.get('CEF_OLD_VERSION_FORMAT', '1'))) | ||||
|  | ||||
|     self.reset() | ||||
|  | ||||
|   def reset(self): | ||||
|     """ Reset internal state. """ | ||||
|     self._chrome_version = {} | ||||
|     self._cef_version = {} | ||||
|     self._cef_commit = {} | ||||
|     self._branch_version = {} | ||||
|     self._old_version_string = None | ||||
|     self._old_version_parts = {} | ||||
|     self._version_string = None | ||||
|     self._version_parts = {} | ||||
|  | ||||
|   def get_chrome_version_components(self): | ||||
|     """ Returns Chrome version components. """ | ||||
|     if not bool(self._chrome_version): | ||||
|       file_path = os.path.join(self.src_path, 'chrome', 'VERSION') | ||||
|       assert os.path.isfile(file_path), file_path | ||||
|       read_version_file(file_path, self._chrome_version) | ||||
|     return self._chrome_version | ||||
|  | ||||
|   def get_cef_version_components(self): | ||||
|     """ Returns CEF version components. """ | ||||
|     if not bool(self._cef_version): | ||||
|       file_path = os.path.join(self.cef_path, 'VERSION.in') | ||||
|       assert os.path.isfile(file_path), file_path | ||||
|       read_version_file(file_path, self._cef_version) | ||||
|     return self._cef_version | ||||
|  | ||||
|   def get_cef_commit_components(self): | ||||
|     """ Returns CEF commit components. """ | ||||
|     if not bool(self._cef_commit): | ||||
|       hash = git.get_hash(self.cef_path) | ||||
|       number = git.get_commit_number(self.cef_path) | ||||
|       self._cef_commit = {'HASH': hash, 'NUMBER': number} | ||||
|     return self._cef_commit | ||||
|  | ||||
|   def get_cef_branch_version_components(self): | ||||
|     """ Computes the CEF branch version. """ | ||||
|     if not bool(self._branch_version): | ||||
|       minor = 0 | ||||
|       bugfix = 0 | ||||
|  | ||||
|       # Retrieve the list of commits that have been applied on the current | ||||
|       # branch since branching from origin/master. | ||||
|       hashes = git.get_branch_hashes(self.cef_path) | ||||
|       for hash in hashes: | ||||
|         # Determine if the API hash file was modified by the commit. | ||||
|         found = False | ||||
|         files = git.get_changed_files(self.cef_path, hash) | ||||
|         for file in files: | ||||
|           if file.find('cef_api_hash.h') >= 0: | ||||
|             found = True | ||||
|             break | ||||
|  | ||||
|         if found: | ||||
|           minor += 1 | ||||
|           bugfix = 0 | ||||
|         else: | ||||
|           bugfix += 1 | ||||
|  | ||||
|       self._branch_version = {'MINOR': minor, 'PATCH': bugfix} | ||||
|     return self._branch_version | ||||
|  | ||||
|   def get_chromium_version_string(self): | ||||
|     """ Returns the Chromium version number string. """ | ||||
|     chrome_version = self.get_chrome_version_components() | ||||
|     return '%s.%s.%s.%s' % (chrome_version['MAJOR'], chrome_version['MINOR'], | ||||
|                             chrome_version['BUILD'], chrome_version['PATCH']) | ||||
|  | ||||
|   @staticmethod | ||||
|   def _format_commit_hash(hash): | ||||
|     return 'g%s' % hash[:7] | ||||
|  | ||||
|   # Computes old version numbers in the format "X.YYYY.A.gHHHHHHH". | ||||
|   # | ||||
|   # Where: | ||||
|   # - "X" is the CEF major version (currently 3). | ||||
|   # - "YYYY" is the Chromium branch. | ||||
|   # - "A" is an incremental number representing the number of commits in the | ||||
|   #   current branch. This is roughly equivalent to the SVN revision number but | ||||
|   #   on a per-branch basis and assists people in quickly determining the order | ||||
|   #   of builds in the same branch (for bug reports, etc). | ||||
|   # - "gHHHHHHH" is the 7-character abbreviation for the Git commit hash. This | ||||
|   #   facilitates lookup of the relevant commit history in Git. | ||||
|   # | ||||
|   # Example: "3.3729.1921.g62d140e" | ||||
|   def _compute_old_version(self): | ||||
|     if not self._old_version_string is None: | ||||
|       return | ||||
|  | ||||
|     chrome_version = self.get_chrome_version_components() | ||||
|     cef_version = self.get_cef_version_components() | ||||
|     cef_commit = self.get_cef_commit_components() | ||||
|     cef_commit_hash = self._format_commit_hash(cef_commit['HASH']) | ||||
|  | ||||
|     self._old_version_parts = { | ||||
|         'MAJOR': int(cef_version['CEF_MAJOR']), | ||||
|         'MINOR': int(chrome_version['BUILD']), | ||||
|         'PATCH': int(cef_commit['NUMBER']) | ||||
|     } | ||||
|     self._old_version_string = \ | ||||
|         '%s.%s.%s.%s' % (cef_version['CEF_MAJOR'], chrome_version['BUILD'], | ||||
|                          cef_commit['NUMBER'], cef_commit_hash) | ||||
|  | ||||
|   def _get_old_version_string(self): | ||||
|     self._compute_old_version() | ||||
|     return self._old_version_string | ||||
|  | ||||
|   def _get_old_version_parts(self): | ||||
|     self._compute_old_version() | ||||
|     return self._old_version_parts | ||||
|  | ||||
|   # Computes version numbers in the format: | ||||
|   # - "X.Y.Z+gHHHHHHH+chromium-A.B.C.D" for release branch builds. | ||||
|   # - "X.0.0-master.N+gHHHHHHH+chromium-A.B.C.D" for master branch builds. | ||||
|   # | ||||
|   # Where: | ||||
|   # - "X" is the Chromium major version (e.g. 74). | ||||
|   # - "Y" is an incremental number that starts at 0 when a release branch is | ||||
|   #   created and changes only when the CEF C/C++ API changes (similar to how | ||||
|   #   the CEF_API_HASH_UNIVERSAL value behaves in cef_version.h) (release branch | ||||
|   #   only). | ||||
|   # - "Z" is an incremental number that starts at 0 when a release branch is | ||||
|   #   created and changes on each commit, with reset to 0 when "Y" changes | ||||
|   #   (release branch only). | ||||
|   # - "N" is an incremental number representing the number of commits (master | ||||
|   #   branch only). | ||||
|   # - "gHHHHHHH" is the 7-character abbreviation for the Git commit hash. This | ||||
|   #   facilitates lookup of the relevant commit history in Git. | ||||
|   # - "A.B.C.D" is the Chromium version (e.g. 74.0.3729.6). | ||||
|   # | ||||
|   # Examples: | ||||
|   # - "74.0.1+g62d140e+chromium-74.0.3729.6" for a release build. | ||||
|   # - "74.0.0-master.1920+g725ed88+chromium-74.0.3729.0" for a master build. | ||||
|   def _compute_version(self): | ||||
|     if not self._version_string is None: | ||||
|       return | ||||
|  | ||||
|     chrome_version = self.get_chrome_version_components() | ||||
|     chrome_major = chrome_version['MAJOR'] | ||||
|     chrome_version_part = 'chromium-' + self.get_chromium_version_string() | ||||
|  | ||||
|     cef_commit = self.get_cef_commit_components() | ||||
|     cef_commit_hash = self._format_commit_hash(cef_commit['HASH']) | ||||
|  | ||||
|     # Remove the remote name prefix, if any. | ||||
|     cef_branch_name = git.get_branch_name(self.cef_path).split('/')[-1] | ||||
|  | ||||
|     if cef_branch_name != chrome_version['BUILD']: | ||||
|       # Not on an official named release branch. | ||||
|       self._version_parts = {'MAJOR': int(chrome_major), 'MINOR': 0, 'PATCH': 0} | ||||
|       self._version_string = '%s.0.0-%s.%s+%s+%s' % \ | ||||
|              (chrome_major, cef_branch_name, cef_commit['NUMBER'], | ||||
|               cef_commit_hash, chrome_version_part) | ||||
|     else: | ||||
|       cef_branch = self.get_cef_branch_version_components() | ||||
|  | ||||
|       self._version_parts = { | ||||
|           'MAJOR': int(chrome_major), | ||||
|           'MINOR': cef_branch['MINOR'], | ||||
|           'PATCH': cef_branch['PATCH'] | ||||
|       } | ||||
|       self._version_string = '%s.%d.%d+%s+%s' % \ | ||||
|              (chrome_major, cef_branch['MINOR'], cef_branch['PATCH'], | ||||
|               cef_commit_hash, chrome_version_part) | ||||
|  | ||||
|   def _get_version_string(self): | ||||
|     self._compute_version() | ||||
|     return self._version_string | ||||
|  | ||||
|   def _get_version_parts(self): | ||||
|     self._compute_version() | ||||
|     return self._version_parts | ||||
|  | ||||
|   def get_version_string(self, oldFormat=None): | ||||
|     """ Returns the CEF version number string based on current checkout state. | ||||
|     """ | ||||
|     if oldFormat is None: | ||||
|       oldFormat = self._old_format_default | ||||
|  | ||||
|     if oldFormat: | ||||
|       return self._get_old_version_string() | ||||
|     return self._get_version_string() | ||||
|  | ||||
|   def get_version_parts(self, oldFormat=None): | ||||
|     """ Returns the CEF version number parts based on current checkout state. | ||||
|     """ | ||||
|     if oldFormat is None: | ||||
|       oldFormat = self._old_format_default | ||||
|  | ||||
|     if oldFormat: | ||||
|       return self._get_old_version_parts() | ||||
|     return self._get_version_parts() | ||||
|  | ||||
|   def get_plist_version_string(self, oldFormat=None): | ||||
|     """ Returns the CEF version number string for plist files based on current | ||||
|         checkout state. """ | ||||
|     parts = self.get_version_parts(oldFormat=oldFormat) | ||||
|     return "%d.%d.%d.0" % (parts['MAJOR'], parts['MINOR'], parts['PATCH']) | ||||
|  | ||||
|   def get_dylib_version_string(self, oldFormat=None): | ||||
|     """ Returns the CEF version number string for dylib files based on current | ||||
|         checkout state. """ | ||||
|     parts = self.get_version_parts(oldFormat=oldFormat) | ||||
|     # Dylib format supports a max value of 255 for the 2nd and 3rd components. | ||||
|     return "%d%d.%d.%d" % (parts['MAJOR'], parts['MINOR'], parts['PATCH'] / 255, | ||||
|                            parts['PATCH'] % 255) | ||||
|  | ||||
|  | ||||
| # Test the module. | ||||
| if __name__ == "__main__": | ||||
|   import sys | ||||
|  | ||||
|   # Optionally specify a format. | ||||
|   formats = ['current', 'old', 'plist', 'dylib'] | ||||
|   if len(sys.argv) >= 2: | ||||
|     formats = [sys.argv[1]] | ||||
|  | ||||
|   # Optionally specify the path to chromium/src. | ||||
|   chromium_src_path = None | ||||
|   if len(sys.argv) >= 3: | ||||
|     chromium_src_path = sys.argv[2] | ||||
|  | ||||
|   formatter = VersionFormatter(chromium_src_path) | ||||
|  | ||||
|   for format in formats: | ||||
|     if len(formats) > 1: | ||||
|       print format | ||||
|  | ||||
|     if format == 'old': | ||||
|       print formatter.get_version_string(True) | ||||
|     elif format == 'dylib': | ||||
|       print formatter.get_dylib_version_string() | ||||
|     elif format == 'plist': | ||||
|       print formatter.get_plist_version_string() | ||||
|     else: | ||||
|       print formatter.get_version_string(False) | ||||
		Reference in New Issue
	
	Block a user