Fixture for testing with clones of existing git repos
Add fixture to test with clones of repos from urls. Change-Id: Ide13525f963495dc83b09ce98c7e9a685e89bf34
This commit is contained in:
parent
4393a372ea
commit
6568d026cf
|
@ -23,6 +23,11 @@ import git
|
||||||
|
|
||||||
from fixtures_git import utils
|
from fixtures_git import utils
|
||||||
|
|
||||||
|
try:
|
||||||
|
import urlparse as parse
|
||||||
|
except ImportError:
|
||||||
|
from urllib import parse
|
||||||
|
|
||||||
|
|
||||||
class GitTree(object):
|
class GitTree(object):
|
||||||
"""Helper class to build a git repository from a graph definition
|
"""Helper class to build a git repository from a graph definition
|
||||||
|
@ -284,3 +289,53 @@ class GitFixture(fixtures.Fixture):
|
||||||
for x in range(num):
|
for x in range(num):
|
||||||
self._create_file_commit(
|
self._create_file_commit(
|
||||||
change_id=ids[x], message_prefix=message_prefix)
|
change_id=ids[x], message_prefix=message_prefix)
|
||||||
|
|
||||||
|
|
||||||
|
class GitCloneFixture(fixtures.Fixture):
|
||||||
|
def __init__(self, repo_url, username=None, password=None, directory=None):
|
||||||
|
"""
|
||||||
|
Setup a fixture with a cloned git repo
|
||||||
|
|
||||||
|
Clones a repo to a temporary directory that is deleted once the
|
||||||
|
fixture is cleaned up.
|
||||||
|
|
||||||
|
To use tokens for cloning from Github private repos for testing,
|
||||||
|
set the username to '' and password to your token and it will
|
||||||
|
reconstruct a suitable URL to use if it doesn't make sense to
|
||||||
|
set the token in the original url passed.
|
||||||
|
|
||||||
|
:param repo_url: Url to repository
|
||||||
|
:param username: Username to use when cloning, set to '' if you wish
|
||||||
|
to do authenticated clones using a token as the password without
|
||||||
|
a user.
|
||||||
|
:param password: Password to use when cloning
|
||||||
|
:param directory: target directory to clone to
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.username = username
|
||||||
|
self.password = password
|
||||||
|
self.repo_url = repo_url
|
||||||
|
self.directory = directory
|
||||||
|
|
||||||
|
def _setUp(self):
|
||||||
|
if self.directory is None:
|
||||||
|
self.directory = self.useFixture(fixtures.TempDir()).path
|
||||||
|
|
||||||
|
project = self.repo_url.rstrip('/').split('/')[-1]
|
||||||
|
if project.endswith('.git'):
|
||||||
|
project = project[:-4]
|
||||||
|
|
||||||
|
clone_dir = os.path.join(self.directory, project)
|
||||||
|
if os.path.exists(clone_dir):
|
||||||
|
shutil.rmtree(clone_dir)
|
||||||
|
|
||||||
|
if self.username is not None:
|
||||||
|
url_parts = list(parse.urlparse(self.repo_url))
|
||||||
|
auth = ":".join(filter(None, (self.username, self.password)))
|
||||||
|
netloc = "@".join((auth, url_parts[1]))
|
||||||
|
url_parts[1] = netloc
|
||||||
|
clone_url = parse.urlunparse(url_parts)
|
||||||
|
else:
|
||||||
|
clone_url = self.repo_url
|
||||||
|
|
||||||
|
self.repo = git.Repo.clone_from(url=clone_url, to_path=clone_dir)
|
||||||
|
|
Loading…
Reference in New Issue