Files
git-upstream/git_upstream/lib/utils.py
Darragh Bailey 5c0a4a7e4d Remove compatibility hacks causing issues with newer GitPython
Remove some monkey patching used to allow git-upstream to work with
GitPython releases older than 0.3.2, as the project requirements now
depends on 1.0.1 or newer.

GitPython release from 2.0.9 onwards removes the '__slots__'
definition. This allowed for the git_dir attribute existence to be
checked to determine whether to patch the Commit class imported from
the GitPython project to add this attribute for older versions of the
API.

Change-Id: I3d83785b16cd0650942c7112b5cafffc21dddba7
Closes-Bug: #1634053
2016-10-17 11:52:17 +01:00

85 lines
2.6 KiB
Python

#
# Copyright (c) 2012, 2013, 2014 Hewlett-Packard Development Company, L.P.
#
# 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 os
import sys
from git.repo import Repo
from git_upstream.errors import GitUpstreamError
try:
from git.exc import InvalidGitRepositoryError
except ImportError:
from git.errors import InvalidGitRepositoryError
class GitMixin(object):
def __init__(self, *args, **kwargs):
repo = kwargs.pop('repo', None)
if repo:
self.__repo = repo
else:
try:
self.__repo = Repo(os.environ.get('GIT_WORK_TREE',
os.path.curdir))
except InvalidGitRepositoryError:
exc_class, exc, tb = sys.exc_info()
raise GitUpstreamError("Not a git repository", tb)
self.__git = self.repo.git
super(GitMixin, self).__init__(*args, **kwargs)
@property
def repo(self):
return self.__repo
@property
def git(self):
return self.__git
def is_detached(self):
return not self.git.symbolic_ref("HEAD", q=True, with_exceptions=False)
def get_name(self, sha1, pattern=None):
"""
Return a symbolic name corresponding to a SHA1
Will return reference names using the commit revision modifier strings
to identify the given SHA1. Or will return nothing if SHA1 cannot be
identified relative to any existing reference.
"""
if pattern:
return self.git.name_rev(sha1, name_only=False, refs=pattern,
with_exceptions=False)
else:
return self.git.name_rev(sha1, name_only=False,
with_exceptions=False)
def is_valid_commit(self, sha1):
"""
Check if given SHA1 refers to a commit object on a valid ref.
This can be used to test if any name or SHA1 refers to a commit
reachable by walking any of the refs under the .git/refs.
"""
# get_name will return a string if the sha1 is reachable from an
# existing reference.
return bool(self.get_name(sha1))