• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Protocol Buffers - Google's data interchange format
2# Copyright 2008 Google Inc.  All rights reserved.
3#
4# Use of this source code is governed by a BSD-style
5# license that can be found in the LICENSE file or at
6# https://developers.google.com/open-source/licenses/bsd
7
8"""Protobuf Runtime versions and validators.
9
10It should only be accessed by Protobuf gencodes and tests. DO NOT USE it
11elsewhere.
12"""
13
14__author__ = 'shaod@google.com (Dennis Shao)'
15
16from enum import Enum
17import os
18import warnings
19
20
21class Domain(Enum):
22  GOOGLE_INTERNAL = 1
23  PUBLIC = 2
24
25
26# The versions of this Python Protobuf runtime to be changed automatically by
27# the Protobuf release process. Do not edit them manually.
28# These OSS versions are not stripped to avoid merging conflicts.
29OSS_DOMAIN = Domain.PUBLIC
30OSS_MAJOR = 5
31OSS_MINOR = 29
32OSS_PATCH = 4
33OSS_SUFFIX = ''
34
35DOMAIN = OSS_DOMAIN
36MAJOR = OSS_MAJOR
37MINOR = OSS_MINOR
38PATCH = OSS_PATCH
39SUFFIX = OSS_SUFFIX
40
41# Avoid flooding of warnings.
42_MAX_WARNING_COUNT = 20
43_warning_count = 0
44
45class VersionError(Exception):
46  """Exception class for version violation."""
47
48
49def _ReportVersionError(msg):
50  raise VersionError(msg)
51
52
53def ValidateProtobufRuntimeVersion(
54    gen_domain, gen_major, gen_minor, gen_patch, gen_suffix, location
55):
56  """Function to validate versions.
57
58  Args:
59    gen_domain: The domain where the code was generated from.
60    gen_major: The major version number of the gencode.
61    gen_minor: The minor version number of the gencode.
62    gen_patch: The patch version number of the gencode.
63    gen_suffix: The version suffix e.g. '-dev', '-rc1' of the gencode.
64    location: The proto location that causes the version violation.
65
66  Raises:
67    VersionError: if gencode version is invalid or incompatible with the
68    runtime.
69  """
70
71  disable_flag = os.getenv('TEMPORARILY_DISABLE_PROTOBUF_VERSION_CHECK')
72  if disable_flag is not None and disable_flag.lower() == 'true':
73    return
74
75  global _warning_count
76
77  version = f'{MAJOR}.{MINOR}.{PATCH}{SUFFIX}'
78  gen_version = f'{gen_major}.{gen_minor}.{gen_patch}{gen_suffix}'
79
80  if gen_major < 0 or gen_minor < 0 or gen_patch < 0:
81    raise VersionError(f'Invalid gencode version: {gen_version}')
82
83  error_prompt = (
84      'See Protobuf version guarantees at'
85      ' https://protobuf.dev/support/cross-version-runtime-guarantee.'
86  )
87
88  if gen_domain != DOMAIN:
89    _ReportVersionError(
90        'Detected mismatched Protobuf Gencode/Runtime domains when loading'
91        f' {location}: gencode {gen_domain.name} runtime {DOMAIN.name}.'
92        ' Cross-domain usage of Protobuf is not supported.'
93    )
94
95  if gen_major != MAJOR:
96    if gen_major == MAJOR - 1:
97      if _warning_count < _MAX_WARNING_COUNT:
98        warnings.warn(
99            'Protobuf gencode version %s is exactly one major version older'
100            ' than the runtime version %s at %s. Please update the gencode to'
101            ' avoid compatibility violations in the next runtime release.'
102            % (gen_version, version, location)
103        )
104        _warning_count += 1
105    else:
106      _ReportVersionError(
107          'Detected mismatched Protobuf Gencode/Runtime major versions when'
108          f' loading {location}: gencode {gen_version} runtime {version}.'
109          f' Same major version is required. {error_prompt}'
110      )
111
112  if MINOR < gen_minor or (MINOR == gen_minor and PATCH < gen_patch):
113    _ReportVersionError(
114        'Detected incompatible Protobuf Gencode/Runtime versions when loading'
115        f' {location}: gencode {gen_version} runtime {version}. Runtime version'
116        f' cannot be older than the linked gencode version. {error_prompt}'
117    )
118
119  if gen_suffix != SUFFIX:
120    _ReportVersionError(
121        'Detected mismatched Protobuf Gencode/Runtime version suffixes when'
122        f' loading {location}: gencode {gen_version} runtime {version}.'
123        f' Version suffixes must be the same. {error_prompt}'
124    )
125