mirror of
https://gerrit.googlesource.com/git-repo
synced 2024-12-21 07:16:21 +00:00
f7c51606f0
As we convert repo to support Python 3, the version of Python that we use might not be the version that repo hooks users have written for. Since repo upgrades are not immediate, and not easily under direct control of end users (relative to the projects maintaining the hook code), allow hook authors to declare the version of Python that they want to use. Now repo will read the shebang from the hook script and compare it against the version of Python repo itself is running under. If they differ, we'll try to execute a separate instance of Python and have it load & execute the hook. If things are compatible, then we still use the inprocess execution logic that we have today. This allows repo hook users to upgrade on their own schedule (they could even upgrade to Python 3 ahead of us) without having to worry about their supported version being exactly in sync with repo's. Bug: https://crbug.com/gerrit/10418 Change-Id: I97c7c96b64fb2ee465c39b90e9bdcc76394a146a Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/228432 Reviewed-by: David Pursehouse <dpursehouse@collab.net> Tested-by: Mike Frysinger <vapier@google.com>
59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
# -*- coding:utf-8 -*-
|
|
#
|
|
# Copyright (C) 2019 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import unittest
|
|
|
|
import project
|
|
|
|
|
|
class RepoHookShebang(unittest.TestCase):
|
|
"""Check shebang parsing in RepoHook."""
|
|
|
|
def test_no_shebang(self):
|
|
"""Lines w/out shebangs should be rejected."""
|
|
DATA = (
|
|
'',
|
|
'# -*- coding:utf-8 -*-\n',
|
|
'#\n# foo\n',
|
|
'# Bad shebang in script\n#!/foo\n'
|
|
)
|
|
for data in DATA:
|
|
self.assertIsNone(project.RepoHook._ExtractInterpFromShebang(data))
|
|
|
|
def test_direct_interp(self):
|
|
"""Lines whose shebang points directly to the interpreter."""
|
|
DATA = (
|
|
('#!/foo', '/foo'),
|
|
('#! /foo', '/foo'),
|
|
('#!/bin/foo ', '/bin/foo'),
|
|
('#! /usr/foo ', '/usr/foo'),
|
|
('#! /usr/foo -args', '/usr/foo'),
|
|
)
|
|
for shebang, interp in DATA:
|
|
self.assertEqual(project.RepoHook._ExtractInterpFromShebang(shebang),
|
|
interp)
|
|
|
|
def test_env_interp(self):
|
|
"""Lines whose shebang launches through `env`."""
|
|
DATA = (
|
|
('#!/usr/bin/env foo', 'foo'),
|
|
('#!/bin/env foo', 'foo'),
|
|
('#! /bin/env /bin/foo ', '/bin/foo'),
|
|
)
|
|
for shebang, interp in DATA:
|
|
self.assertEqual(project.RepoHook._ExtractInterpFromShebang(shebang),
|
|
interp)
|