git_command: unify soft/hard versions with requirements.json

Use the requirements logic in the wrapper to load versions out of the
requirements.json file to avoid duplicating them in git_command.py.

Change-Id: Ib479049fc54ebc6f52c2c30d1315cf1734ff1990
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/415617
Reviewed-by: Josip Sokcevic <sokcevic@google.com>
Commit-Queue: Mike Frysinger <vapier@google.com>
Tested-by: Mike Frysinger <vapier@google.com>
This commit is contained in:
Mike Frysinger 2024-03-21 12:58:01 -04:00 committed by LUCI
parent 73356f1d5c
commit 4406642e20
4 changed files with 19 additions and 25 deletions

View File

@ -33,17 +33,6 @@ from wrapper import Wrapper
GIT = "git"
# NB: These do not need to be kept in sync with the repo launcher script.
# These may be much newer as it allows the repo launcher to roll between
# different repo releases while source versions might require a newer git.
#
# The soft version is when we start warning users that the version is old and
# we'll be dropping support for it. We'll refuse to work with versions older
# than the hard version.
#
# git-1.7 is in (EOL) Ubuntu Precise. git-1.9 is in Ubuntu Trusty.
MIN_GIT_VERSION_SOFT = (1, 9, 1)
MIN_GIT_VERSION_HARD = (1, 7, 2)
GIT_DIR = "GIT_DIR"
LAST_GITDIR = None

13
repo
View File

@ -210,7 +210,6 @@ GIT = "git" # our git command
# NB: The version of git that the repo launcher requires may be much older than
# the version of git that the main repo source tree requires. Keeping this at
# an older version also makes it easier for users to upgrade/rollback as needed.
# See requirements.json for versions.
MIN_GIT_VERSION = (1, 7, 9) # minimum supported git version
repodir = ".repo" # name of repo's private directory
S_repo = "repo" # special repo repository
@ -1237,13 +1236,13 @@ class Requirements:
return cls(json_data)
def _get_soft_ver(self, pkg):
def get_soft_ver(self, pkg):
"""Return the soft version for |pkg| if it exists."""
return self.requirements.get(pkg, {}).get("soft", ())
return tuple(self.requirements.get(pkg, {}).get("soft", ()))
def _get_hard_ver(self, pkg):
def get_hard_ver(self, pkg):
"""Return the hard version for |pkg| if it exists."""
return self.requirements.get(pkg, {}).get("hard", ())
return tuple(self.requirements.get(pkg, {}).get("hard", ()))
@staticmethod
def _format_ver(ver):
@ -1253,8 +1252,8 @@ class Requirements:
def assert_ver(self, pkg, curr_ver):
"""Verify |pkg|'s |curr_ver| is new enough."""
curr_ver = tuple(curr_ver)
soft_ver = tuple(self._get_soft_ver(pkg))
hard_ver = tuple(self._get_hard_ver(pkg))
soft_ver = tuple(self.get_soft_ver(pkg))
hard_ver = tuple(self.get_hard_ver(pkg))
if curr_ver < hard_ver:
print(
f'repo: error: Your version of "{pkg}" '

View File

@ -21,10 +21,9 @@ from command import MirrorSafeCommand
from error import RepoUnhandledExceptionError
from error import UpdateManifestError
from git_command import git_require
from git_command import MIN_GIT_VERSION_HARD
from git_command import MIN_GIT_VERSION_SOFT
from repo_logging import RepoLogger
from wrapper import Wrapper
from wrapper import WrapperDir
logger = RepoLogger(__file__)
@ -331,13 +330,17 @@ to update the working directory files.
self.OptionParser.error("too many arguments to init")
def Execute(self, opt, args):
git_require(MIN_GIT_VERSION_HARD, fail=True)
if not git_require(MIN_GIT_VERSION_SOFT):
wrapper = Wrapper()
reqs = wrapper.Requirements.from_dir(WrapperDir())
git_require(reqs.get_hard_ver("git"), fail=True)
min_git_version_soft = reqs.get_soft_ver("git")
if not git_require(min_git_version_soft):
logger.warning(
"repo: warning: git-%s+ will soon be required; "
"please upgrade your version of git to maintain "
"support.",
".".join(str(x) for x in MIN_GIT_VERSION_SOFT),
".".join(str(x) for x in min_git_version_soft),
)
rp = self.manifest.repoProject
@ -350,7 +353,6 @@ to update the working directory files.
# Handle new --repo-rev requests.
if opt.repo_rev:
wrapper = Wrapper()
try:
remote_ref, rev = wrapper.check_repo_rev(
rp.worktree,

View File

@ -18,8 +18,12 @@ import importlib.util
import os
def WrapperDir():
return os.path.dirname(__file__)
def WrapperPath():
return os.path.join(os.path.dirname(__file__), "repo")
return os.path.join(WrapperDir(), "repo")
@functools.lru_cache(maxsize=None)