|
Pierre-Yves Chibon |
33b534 |
# -*- coding: utf-8 -*-
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
"""
|
|
Pierre-Yves Chibon |
413073 |
(c) 2015 - Copyright Red Hat Inc
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
Authors:
|
|
Pierre-Yves Chibon |
413073 |
Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
"""
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
__requires__ = ['SQLAlchemy >= 0.7']
|
|
Pierre-Yves Chibon |
413073 |
import pkg_resources
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
import unittest
|
|
Pierre-Yves Chibon |
59d644 |
import shutil
|
|
Pierre-Yves Chibon |
413073 |
import sys
|
|
Pierre-Yves Chibon |
c27b0d |
import tempfile
|
|
Pierre-Yves Chibon |
413073 |
import os
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
from datetime import date
|
|
Pierre-Yves Chibon |
21f499 |
from datetime import datetime
|
|
Pierre-Yves Chibon |
413073 |
from datetime import timedelta
|
|
Pierre-Yves Chibon |
413073 |
from functools import wraps
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
4e9b76 |
import pygit2
|
|
Pierre-Yves Chibon |
4e9b76 |
|
|
Pierre-Yves Chibon |
413073 |
from contextlib import contextmanager
|
|
Pierre-Yves Chibon |
413073 |
from sqlalchemy import create_engine
|
|
Pierre-Yves Chibon |
413073 |
from sqlalchemy.orm import sessionmaker
|
|
Pierre-Yves Chibon |
413073 |
from sqlalchemy.orm import scoped_session
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
sys.path.insert(0, os.path.join(os.path.dirname(
|
|
Pierre-Yves Chibon |
413073 |
os.path.abspath(__file__)), '..'))
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
fe5017 |
import pagure
|
|
Pierre-Yves Chibon |
fe5017 |
import pagure.lib
|
|
Pierre-Yves Chibon |
fe5017 |
import pagure.lib.model
|
|
Pierre-Yves Chibon |
27a73d |
from pagure.lib.repo import PagureRepo
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
DB_PATH = 'sqlite:///:memory:'
|
|
Pierre-Yves Chibon |
c2fe6f |
FAITOUT_URL = 'http://faitout.cloud.fedoraproject.org/faitout/'
|
|
Pierre-Yves Chibon |
f62635 |
HERE = os.path.join(os.path.dirname(os.path.abspath(__file__)))
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
if os.environ.get('BUILD_ID'):
|
|
Pierre-Yves Chibon |
413073 |
try:
|
|
Pierre-Yves Chibon |
413073 |
import requests
|
|
Pierre-Yves Chibon |
413073 |
req = requests.get('%s/new' % FAITOUT_URL)
|
|
Pierre-Yves Chibon |
413073 |
if req.status_code == 200:
|
|
Pierre-Yves Chibon |
413073 |
DB_PATH = req.text
|
|
Pierre-Yves Chibon |
413073 |
print 'Using faitout at: %s' % DB_PATH
|
|
Pierre-Yves Chibon |
413073 |
except:
|
|
Pierre-Yves Chibon |
413073 |
pass
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
d14b61 |
# Remove the log handlers for the tests
|
|
Pierre-Yves Chibon |
fe5017 |
pagure.LOG.handlers = []
|
|
Pierre-Yves Chibon |
d14b61 |
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
@contextmanager
|
|
Pierre-Yves Chibon |
413073 |
def user_set(APP, user):
|
|
Pierre-Yves Chibon |
413073 |
""" Set the provided user as fas_user in the provided application."""
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
# Hack used to remove the before_request function set by
|
|
Pierre-Yves Chibon |
413073 |
# flask.ext.fas_openid.FAS which otherwise kills our effort to set a
|
|
Pierre-Yves Chibon |
413073 |
# flask.g.fas_user.
|
|
Pierre-Yves Chibon |
413073 |
from flask import appcontext_pushed, g
|
|
Pierre-Yves Chibon |
413073 |
APP.before_request_funcs[None] = []
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
def handler(sender, **kwargs):
|
|
Pierre-Yves Chibon |
413073 |
g.fas_user = user
|
|
Pierre-Yves Chibon |
e120d5 |
g.fas_session_id = b'123'
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
with appcontext_pushed.connected_to(handler, APP):
|
|
Pierre-Yves Chibon |
413073 |
yield
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
class Modeltests(unittest.TestCase):
|
|
Pierre-Yves Chibon |
413073 |
""" Model tests. """
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
def __init__(self, method_name='runTest'):
|
|
Pierre-Yves Chibon |
413073 |
""" Constructor. """
|
|
Pierre-Yves Chibon |
413073 |
unittest.TestCase.__init__(self, method_name)
|
|
Pierre-Yves Chibon |
413073 |
self.session = None
|
|
Pierre-Yves Chibon |
fe5017 |
self.path = tempfile.mkdtemp(prefix='pagure-tests')
|
|
Pierre-Yves Chibon |
3a4d42 |
self.gitrepo = None
|
|
Pierre-Yves Chibon |
619b9a |
self.gitrepos = None
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
# pylint: disable=C0103
|
|
Pierre-Yves Chibon |
413073 |
def setUp(self):
|
|
Pierre-Yves Chibon |
413073 |
""" Set up the environnment, ran before every tests. """
|
|
Pierre-Yves Chibon |
aab707 |
# Clean up eventual git repo left in the present folder.
|
|
Pierre-Yves Chibon |
aab707 |
for filename in os.listdir(HERE):
|
|
Pierre-Yves Chibon |
ad1cac |
filename = os.path.join(HERE, filename)
|
|
Pierre-Yves Chibon |
aab707 |
if filename.endswith('.git') and os.path.isdir(filename):
|
|
Pierre-Yves Chibon |
aab707 |
shutil.rmtree(filename)
|
|
Pierre-Yves Chibon |
aab707 |
|
|
Pierre-Yves Chibon |
1c965f |
for folder in ['tickets', 'repos', 'forks', 'docs',
|
|
Pierre-Yves Chibon |
1c965f |
'requests' ,'releases']:
|
|
Pierre-Yves Chibon |
58e731 |
folder = os.path.join(HERE, folder)
|
|
Pierre-Yves Chibon |
58e731 |
if os.path.exists(folder):
|
|
Pierre-Yves Chibon |
58e731 |
shutil.rmtree(folder)
|
|
Pierre-Yves Chibon |
58e731 |
os.mkdir(folder)
|
|
Pierre-Yves Chibon |
58e731 |
|
|
Pierre-Yves Chibon |
973fb9 |
self.session = pagure.lib.model.create_tables(
|
|
Pierre-Yves Chibon |
973fb9 |
DB_PATH, acls=pagure.APP.config.get('ACLS', {}))
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
# Create a couple of users
|
|
Pierre-Yves Chibon |
fe5017 |
item = pagure.lib.model.User(
|
|
Pierre-Yves Chibon |
413073 |
user='pingou',
|
|
Pierre-Yves Chibon |
413073 |
fullname='PY C',
|
|
Pierre-Yves Chibon |
413073 |
password='foo',
|
|
Pierre-Yves Chibon |
0e3e63 |
default_email='bar@pingou.com',
|
|
Pierre-Yves Chibon |
413073 |
)
|
|
Pierre-Yves Chibon |
413073 |
self.session.add(item)
|
|
Pierre-Yves Chibon |
fe5017 |
item = pagure.lib.model.UserEmail(
|
|
Pierre-Yves Chibon |
0daa1b |
user_id=1,
|
|
Pierre-Yves Chibon |
0daa1b |
email='bar@pingou.com')
|
|
Pierre-Yves Chibon |
0daa1b |
self.session.add(item)
|
|
Pierre-Yves Chibon |
fe5017 |
item = pagure.lib.model.UserEmail(
|
|
Pierre-Yves Chibon |
0daa1b |
user_id=1,
|
|
Pierre-Yves Chibon |
0daa1b |
email='foo@pingou.com')
|
|
Pierre-Yves Chibon |
0daa1b |
self.session.add(item)
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
fe5017 |
item = pagure.lib.model.User(
|
|
Pierre-Yves Chibon |
413073 |
user='foo',
|
|
Pierre-Yves Chibon |
413073 |
fullname='foo bar',
|
|
Pierre-Yves Chibon |
413073 |
password='foo',
|
|
Pierre-Yves Chibon |
0e3e63 |
default_email='foo@bar.com',
|
|
Pierre-Yves Chibon |
413073 |
)
|
|
Pierre-Yves Chibon |
413073 |
self.session.add(item)
|
|
Pierre-Yves Chibon |
fe5017 |
item = pagure.lib.model.UserEmail(
|
|
Pierre-Yves Chibon |
0daa1b |
user_id=2,
|
|
Pierre-Yves Chibon |
0daa1b |
email='foo@bar.com')
|
|
Pierre-Yves Chibon |
0daa1b |
self.session.add(item)
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
self.session.commit()
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
564e63 |
# Prevent unit-tests to send email, globally
|
|
Pierre-Yves Chibon |
564e63 |
pagure.APP.config['EMAIL_SEND'] = False
|
|
Pierre-Yves Chibon |
564e63 |
|
|
Pierre-Yves Chibon |
413073 |
# pylint: disable=C0103
|
|
Pierre-Yves Chibon |
413073 |
def tearDown(self):
|
|
Pierre-Yves Chibon |
413073 |
""" Remove the test.db database if there is one. """
|
|
Pierre-Yves Chibon |
413073 |
self.session.close()
|
|
Pierre-Yves Chibon |
7cbc4e |
|
|
Pierre-Yves Chibon |
7cbc4e |
# Clear temp directory
|
|
Pierre-Yves Chibon |
c480d9 |
shutil.rmtree(self.path)
|
|
Pierre-Yves Chibon |
7cbc4e |
|
|
Pierre-Yves Chibon |
7cbc4e |
# Clear DB
|
|
Pierre-Yves Chibon |
413073 |
if os.path.exists(DB_PATH):
|
|
Pierre-Yves Chibon |
413073 |
os.unlink(DB_PATH)
|
|
Pierre-Yves Chibon |
413073 |
if DB_PATH.startswith('postgres'):
|
|
Pierre-Yves Chibon |
413073 |
if 'localhost' in DB_PATH:
|
|
Pierre-Yves Chibon |
fe5017 |
pagure.lib.model.drop_tables(DB_PATH, self.session.bind)
|
|
Pierre-Yves Chibon |
413073 |
else:
|
|
Pierre-Yves Chibon |
413073 |
db_name = DB_PATH.rsplit('/', 1)[1]
|
|
Pierre-Yves Chibon |
413073 |
requests.get('%s/clean/%s' % (FAITOUT_URL, db_name))
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
class FakeGroup(object):
|
|
Pierre-Yves Chibon |
413073 |
""" Fake object used to make the FakeUser object closer to the
|
|
Pierre-Yves Chibon |
413073 |
expectations.
|
|
Pierre-Yves Chibon |
413073 |
"""
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
def __init__(self, name):
|
|
Pierre-Yves Chibon |
413073 |
""" Constructor.
|
|
Pierre-Yves Chibon |
413073 |
:arg name: the name given to the name attribute of this object.
|
|
Pierre-Yves Chibon |
413073 |
"""
|
|
Pierre-Yves Chibon |
413073 |
self.name = name
|
|
Pierre-Yves Chibon |
413073 |
self.group_type = 'cla'
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
# pylint: disable=R0903
|
|
Pierre-Yves Chibon |
413073 |
class FakeUser(object):
|
|
Pierre-Yves Chibon |
413073 |
""" Fake user used to test the fedocallib library. """
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
def __init__(self, groups=[], username='username', cla_done=True):
|
|
Pierre-Yves Chibon |
413073 |
""" Constructor.
|
|
Pierre-Yves Chibon |
413073 |
:arg groups: list of the groups in which this fake user is
|
|
Pierre-Yves Chibon |
413073 |
supposed to be.
|
|
Pierre-Yves Chibon |
413073 |
"""
|
|
Pierre-Yves Chibon |
413073 |
if isinstance(groups, basestring):
|
|
Pierre-Yves Chibon |
413073 |
groups = [groups]
|
|
Pierre-Yves Chibon |
413073 |
self.groups = groups
|
|
Pierre-Yves Chibon |
413073 |
self.username = username
|
|
Pierre-Yves Chibon |
413073 |
self.name = username
|
|
Pierre-Yves Chibon |
c52718 |
self.email = 'foo@bar.com'
|
|
Pierre-Yves Chibon |
413073 |
self.approved_memberships = [
|
|
Pierre-Yves Chibon |
413073 |
FakeGroup('packager'),
|
|
Pierre-Yves Chibon |
413073 |
FakeGroup('design-team')
|
|
Pierre-Yves Chibon |
413073 |
]
|
|
Pierre-Yves Chibon |
413073 |
self.dic = {}
|
|
Pierre-Yves Chibon |
413073 |
self.dic['timezone'] = 'Europe/Paris'
|
|
Pierre-Yves Chibon |
9fe7c1 |
self.login_time = datetime.utcnow()
|
|
Pierre-Yves Chibon |
413073 |
self.cla_done = cla_done
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
def __getitem__(self, key):
|
|
Pierre-Yves Chibon |
413073 |
return self.dic[key]
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
def create_projects(session):
|
|
Pierre-Yves Chibon |
413073 |
""" Create some projects in the database. """
|
|
Pierre-Yves Chibon |
fe5017 |
item = pagure.lib.model.Project(
|
|
Pierre-Yves Chibon |
413073 |
user_id=1, # pingou
|
|
Pierre-Yves Chibon |
413073 |
name='test',
|
|
Pierre-Yves Chibon |
413073 |
description='test project #1',
|
|
Pierre-Yves Chibon |
e2259d |
hook_token='aaabbbccc',
|
|
Pierre-Yves Chibon |
413073 |
)
|
|
Pierre-Yves Chibon |
413073 |
session.add(item)
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
fe5017 |
item = pagure.lib.model.Project(
|
|
Pierre-Yves Chibon |
413073 |
user_id=1, # pingou
|
|
Pierre-Yves Chibon |
413073 |
name='test2',
|
|
Pierre-Yves Chibon |
413073 |
description='test project #2',
|
|
Pierre-Yves Chibon |
e2259d |
hook_token='aaabbbddd',
|
|
Pierre-Yves Chibon |
413073 |
)
|
|
Pierre-Yves Chibon |
413073 |
session.add(item)
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
session.commit()
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
413073 |
|
|
Pierre-Yves Chibon |
05b648 |
def create_projects_git(folder, bare=False):
|
|
Pierre-Yves Chibon |
4e9b76 |
""" Create some projects in the database. """
|
|
Pierre-Yves Chibon |
4e9b76 |
repos = []
|
|
Pierre-Yves Chibon |
4e9b76 |
for project in ['test.git', 'test2.git']:
|
|
Pierre-Yves Chibon |
4e9b76 |
repo_path = os.path.join(folder, project)
|
|
Pierre-Yves Chibon |
4e9b76 |
repos.append(repo_path)
|
|
Pierre-Yves Chibon |
63d161 |
if not os.path.exists(repo_path):
|
|
Pierre-Yves Chibon |
63d161 |
os.makedirs(repo_path)
|
|
Pierre-Yves Chibon |
05b648 |
pygit2.init_repository(repo_path, bare=bare)
|
|
Pierre-Yves Chibon |
4e9b76 |
|
|
Pierre-Yves Chibon |
4e9b76 |
return repos
|
|
Pierre-Yves Chibon |
4e9b76 |
|
|
Pierre-Yves Chibon |
4e9b76 |
|
|
Pierre-Yves Chibon |
c0b635 |
def create_tokens(session, user_id=1):
|
|
Pierre-Yves Chibon |
c0b635 |
""" Create some tokens for the project in the database. """
|
|
Pierre-Yves Chibon |
c0b635 |
item = pagure.lib.model.Token(
|
|
Pierre-Yves Chibon |
c0b635 |
id='aaabbbcccddd',
|
|
Pierre-Yves Chibon |
c0b635 |
user_id=user_id,
|
|
Pierre-Yves Chibon |
c0b635 |
project_id=1,
|
|
Pierre-Yves Chibon |
c0b635 |
expiration=datetime.utcnow() + timedelta(days=30)
|
|
Pierre-Yves Chibon |
c0b635 |
)
|
|
Pierre-Yves Chibon |
c0b635 |
session.add(item)
|
|
Pierre-Yves Chibon |
c0b635 |
|
|
Pierre-Yves Chibon |
c0b635 |
item = pagure.lib.model.Token(
|
|
Pierre-Yves Chibon |
c0b635 |
id='foo_token',
|
|
Pierre-Yves Chibon |
c0b635 |
user_id=user_id,
|
|
Pierre-Yves Chibon |
c0b635 |
project_id=1,
|
|
Pierre-Yves Chibon |
c0b635 |
expiration=datetime.utcnow() + timedelta(days=30)
|
|
Pierre-Yves Chibon |
c0b635 |
)
|
|
Pierre-Yves Chibon |
c0b635 |
session.add(item)
|
|
Pierre-Yves Chibon |
c0b635 |
|
|
Pierre-Yves Chibon |
c0b635 |
item = pagure.lib.model.Token(
|
|
Pierre-Yves Chibon |
c0b635 |
id='expired_token',
|
|
Pierre-Yves Chibon |
c0b635 |
user_id=user_id,
|
|
Pierre-Yves Chibon |
c0b635 |
project_id=1,
|
|
Pierre-Yves Chibon |
c0b635 |
expiration=datetime.utcnow() - timedelta(days=1)
|
|
Pierre-Yves Chibon |
c0b635 |
)
|
|
Pierre-Yves Chibon |
c0b635 |
session.add(item)
|
|
Pierre-Yves Chibon |
c0b635 |
|
|
Pierre-Yves Chibon |
c0b635 |
session.commit()
|
|
Pierre-Yves Chibon |
c0b635 |
|
|
Pierre-Yves Chibon |
c0b635 |
|
|
Pierre-Yves Chibon |
631c33 |
def create_tokens_acl(session, token_id='aaabbbcccddd'):
|
|
Pierre-Yves Chibon |
955beb |
""" Create some acls for the tokens. """
|
|
Pierre-Yves Chibon |
e18f81 |
for aclid in range(7):
|
|
Pierre-Yves Chibon |
955beb |
item = pagure.lib.model.TokenAcl(
|
|
Pierre-Yves Chibon |
631c33 |
token_id=token_id,
|
|
Pierre-Yves Chibon |
9ed075 |
acl_id=aclid + 1,
|
|
Pierre-Yves Chibon |
955beb |
)
|
|
Pierre-Yves Chibon |
955beb |
session.add(item)
|
|
Pierre-Yves Chibon |
955beb |
|
|
Pierre-Yves Chibon |
955beb |
session.commit()
|
|
Pierre-Yves Chibon |
955beb |
|
|
Pierre-Yves Chibon |
955beb |
|
|
Pierre-Yves Chibon |
f0ad75 |
def add_content_git_repo(folder):
|
|
Pierre-Yves Chibon |
f0ad75 |
""" Create some content for the specified git repo. """
|
|
Pierre-Yves Chibon |
f0ad75 |
if not os.path.exists(folder):
|
|
Pierre-Yves Chibon |
f0ad75 |
os.makedirs(folder)
|
|
Pierre-Yves Chibon |
128dfb |
brepo = pygit2.init_repository(folder, bare=True)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
128dfb |
newfolder = tempfile.mkdtemp(prefix='pagure-tests')
|
|
Pierre-Yves Chibon |
128dfb |
repo = pygit2.clone_repository(folder, newfolder)
|
|
Pierre-Yves Chibon |
f0ad75 |
|
|
Pierre-Yves Chibon |
f0ad75 |
# Create a file in that git repo
|
|
Pierre-Yves Chibon |
128dfb |
with open(os.path.join(newfolder, 'sources'), 'w') as stream:
|
|
Pierre-Yves Chibon |
f0ad75 |
stream.write('foo\n bar')
|
|
Pierre-Yves Chibon |
f0ad75 |
repo.index.add('sources')
|
|
Pierre-Yves Chibon |
f0ad75 |
repo.index.write()
|
|
Pierre-Yves Chibon |
f0ad75 |
|
|
Pierre-Yves Chibon |
a71c8d |
parents = []
|
|
Pierre-Yves Chibon |
a71c8d |
commit = None
|
|
Pierre-Yves Chibon |
a71c8d |
try:
|
|
Pierre-Yves Chibon |
a71c8d |
commit = repo.revparse_single('HEAD')
|
|
Pierre-Yves Chibon |
a71c8d |
except KeyError:
|
|
Pierre-Yves Chibon |
a71c8d |
pass
|
|
Pierre-Yves Chibon |
a71c8d |
if commit:
|
|
Pierre-Yves Chibon |
a71c8d |
parents = [commit.oid.hex]
|
|
Pierre-Yves Chibon |
a71c8d |
|
|
Pierre-Yves Chibon |
f0ad75 |
# Commits the files added
|
|
Pierre-Yves Chibon |
f0ad75 |
tree = repo.index.write_tree()
|
|
Pierre-Yves Chibon |
f0ad75 |
author = pygit2.Signature(
|
|
Pierre-Yves Chibon |
f0ad75 |
'Alice Author', 'alice@authors.tld')
|
|
Pierre-Yves Chibon |
f0ad75 |
committer = pygit2.Signature(
|
|
Pierre-Yves Chibon |
f0ad75 |
'Cecil Committer', 'cecil@committers.tld')
|
|
Pierre-Yves Chibon |
f0ad75 |
repo.create_commit(
|
|
Pierre-Yves Chibon |
f0ad75 |
'refs/heads/master', # the name of the reference to update
|
|
Pierre-Yves Chibon |
f0ad75 |
author,
|
|
Pierre-Yves Chibon |
f0ad75 |
committer,
|
|
Pierre-Yves Chibon |
f0ad75 |
'Add sources file for testing',
|
|
Pierre-Yves Chibon |
f0ad75 |
# binary string representing the tree object ID
|
|
Pierre-Yves Chibon |
f0ad75 |
tree,
|
|
Pierre-Yves Chibon |
f0ad75 |
# list of binary strings representing parents of the new commit
|
|
Pierre-Yves Chibon |
a71c8d |
parents,
|
|
Pierre-Yves Chibon |
f0ad75 |
)
|
|
Pierre-Yves Chibon |
a71c8d |
|
|
Pierre-Yves Chibon |
a71c8d |
parents = []
|
|
Pierre-Yves Chibon |
a71c8d |
commit = None
|
|
Pierre-Yves Chibon |
a71c8d |
try:
|
|
Pierre-Yves Chibon |
a71c8d |
commit = repo.revparse_single('HEAD')
|
|
Pierre-Yves Chibon |
a71c8d |
except KeyError:
|
|
Pierre-Yves Chibon |
a71c8d |
pass
|
|
Pierre-Yves Chibon |
a71c8d |
if commit:
|
|
Pierre-Yves Chibon |
a71c8d |
parents = [commit.oid.hex]
|
|
Pierre-Yves Chibon |
f0ad75 |
|
|
Pierre-Yves Chibon |
f0ad75 |
subfolder = os.path.join('folder1', 'folder2')
|
|
Pierre-Yves Chibon |
128dfb |
if not os.path.exists(os.path.join(newfolder, subfolder)):
|
|
Pierre-Yves Chibon |
128dfb |
os.makedirs(os.path.join(newfolder, subfolder))
|
|
Pierre-Yves Chibon |
f0ad75 |
# Create a file in that git repo
|
|
Pierre-Yves Chibon |
128dfb |
with open(os.path.join(newfolder, subfolder, 'file'), 'w') as stream:
|
|
Pierre-Yves Chibon |
f0ad75 |
stream.write('foo\n bar\nbaz')
|
|
Pierre-Yves Chibon |
f0ad75 |
repo.index.add(os.path.join(subfolder, 'file'))
|
|
Pierre-Yves Chibon |
f0ad75 |
repo.index.write()
|
|
Pierre-Yves Chibon |
f0ad75 |
|
|
Pierre-Yves Chibon |
f0ad75 |
# Commits the files added
|
|
Pierre-Yves Chibon |
f0ad75 |
tree = repo.index.write_tree()
|
|
Pierre-Yves Chibon |
f0ad75 |
author = pygit2.Signature(
|
|
Pierre-Yves Chibon |
f0ad75 |
'Alice Author', 'alice@authors.tld')
|
|
Pierre-Yves Chibon |
f0ad75 |
committer = pygit2.Signature(
|
|
Pierre-Yves Chibon |
f0ad75 |
'Cecil Committer', 'cecil@committers.tld')
|
|
Pierre-Yves Chibon |
f0ad75 |
repo.create_commit(
|
|
Pierre-Yves Chibon |
f0ad75 |
'refs/heads/master', # the name of the reference to update
|
|
Pierre-Yves Chibon |
f0ad75 |
author,
|
|
Pierre-Yves Chibon |
f0ad75 |
committer,
|
|
Pierre-Yves Chibon |
f0ad75 |
'Add some directory and a file for more testing',
|
|
Pierre-Yves Chibon |
f0ad75 |
# binary string representing the tree object ID
|
|
Pierre-Yves Chibon |
f0ad75 |
tree,
|
|
Pierre-Yves Chibon |
f0ad75 |
# list of binary strings representing parents of the new commit
|
|
Pierre-Yves Chibon |
a71c8d |
parents
|
|
Pierre-Yves Chibon |
f0ad75 |
)
|
|
Pierre-Yves Chibon |
f0ad75 |
|
|
Pierre-Yves Chibon |
128dfb |
# Push to origin
|
|
Pierre-Yves Chibon |
128dfb |
ori_remote = repo.remotes[0]
|
|
Pierre-Yves Chibon |
128dfb |
master_ref = repo.lookup_reference('HEAD').resolve()
|
|
Pierre-Yves Chibon |
128dfb |
refname = '%s:%s' % (master_ref.name, master_ref.name)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
27a73d |
PagureRepo.push(ori_remote, refname)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
128dfb |
shutil.rmtree(newfolder)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
f0ad75 |
|
|
Pierre-Yves Chibon |
87ffe2 |
def add_readme_git_repo(folder):
|
|
Pierre-Yves Chibon |
87ffe2 |
""" Create a README file for the specified git repo. """
|
|
Pierre-Yves Chibon |
87ffe2 |
if not os.path.exists(folder):
|
|
Pierre-Yves Chibon |
87ffe2 |
os.makedirs(folder)
|
|
Pierre-Yves Chibon |
128dfb |
brepo = pygit2.init_repository(folder, bare=True)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
128dfb |
newfolder = tempfile.mkdtemp(prefix='pagure-tests')
|
|
Pierre-Yves Chibon |
128dfb |
repo = pygit2.clone_repository(folder, newfolder)
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
fe5017 |
content = """Pagure
|
|
Pierre-Yves Chibon |
87ffe2 |
======
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
87ffe2 |
:Author: Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
fe5017 |
Pagure is a light-weight git-centered forge based on pygit2.
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
fe5017 |
Currently, Pagure offers a web-interface for git repositories, a ticket
|
|
Pierre-Yves Chibon |
fe5017 |
system and possibilities to create new projects, fork existing ones and
|
|
Pierre-Yves Chibon |
fe5017 |
create/merge pull-requests across or within projects.
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
fe5017 |
Homepage: https://github.com/pypingou/pagure
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
87ffe2 |
Dev instance: http://209.132.184.222/ (/!\\ May change unexpectedly, it's a dev instance ;-))
|
|
Pierre-Yves Chibon |
87ffe2 |
"""
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
87ffe2 |
parents = []
|
|
Pierre-Yves Chibon |
a71c8d |
commit = None
|
|
Pierre-Yves Chibon |
a71c8d |
try:
|
|
Pierre-Yves Chibon |
a71c8d |
commit = repo.revparse_single('HEAD')
|
|
Pierre-Yves Chibon |
a71c8d |
except KeyError:
|
|
Pierre-Yves Chibon |
a71c8d |
pass
|
|
Pierre-Yves Chibon |
87ffe2 |
if commit:
|
|
Pierre-Yves Chibon |
87ffe2 |
parents = [commit.oid.hex]
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
87ffe2 |
# Create a file in that git repo
|
|
Pierre-Yves Chibon |
128dfb |
with open(os.path.join(newfolder, 'README.rst'), 'w') as stream:
|
|
Pierre-Yves Chibon |
87ffe2 |
stream.write(content)
|
|
Pierre-Yves Chibon |
87ffe2 |
repo.index.add('README.rst')
|
|
Pierre-Yves Chibon |
87ffe2 |
repo.index.write()
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
87ffe2 |
# Commits the files added
|
|
Pierre-Yves Chibon |
87ffe2 |
tree = repo.index.write_tree()
|
|
Pierre-Yves Chibon |
87ffe2 |
author = pygit2.Signature(
|
|
Pierre-Yves Chibon |
87ffe2 |
'Alice Author', 'alice@authors.tld')
|
|
Pierre-Yves Chibon |
87ffe2 |
committer = pygit2.Signature(
|
|
Pierre-Yves Chibon |
87ffe2 |
'Cecil Committer', 'cecil@committers.tld')
|
|
Pierre-Yves Chibon |
87ffe2 |
repo.create_commit(
|
|
Pierre-Yves Chibon |
87ffe2 |
'refs/heads/master', # the name of the reference to update
|
|
Pierre-Yves Chibon |
87ffe2 |
author,
|
|
Pierre-Yves Chibon |
87ffe2 |
committer,
|
|
Pierre-Yves Chibon |
87ffe2 |
'Add a README file',
|
|
Pierre-Yves Chibon |
87ffe2 |
# binary string representing the tree object ID
|
|
Pierre-Yves Chibon |
87ffe2 |
tree,
|
|
Pierre-Yves Chibon |
87ffe2 |
# list of binary strings representing parents of the new commit
|
|
Pierre-Yves Chibon |
87ffe2 |
parents
|
|
Pierre-Yves Chibon |
87ffe2 |
)
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
128dfb |
# Push to origin
|
|
Pierre-Yves Chibon |
128dfb |
ori_remote = repo.remotes[0]
|
|
Pierre-Yves Chibon |
128dfb |
master_ref = repo.lookup_reference('HEAD').resolve()
|
|
Pierre-Yves Chibon |
128dfb |
refname = '%s:%s' % (master_ref.name, master_ref.name)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
27a73d |
PagureRepo.push(ori_remote, refname)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
128dfb |
shutil.rmtree(newfolder)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
87ffe2 |
|
|
Pierre-Yves Chibon |
595b4e |
def add_commit_git_repo(folder, ncommits=10):
|
|
Pierre-Yves Chibon |
595b4e |
""" Create some more commits for the specified git repo. """
|
|
Pierre-Yves Chibon |
595b4e |
if not os.path.exists(folder):
|
|
Pierre-Yves Chibon |
595b4e |
os.makedirs(folder)
|
|
Pierre-Yves Chibon |
128dfb |
brepo = pygit2.init_repository(folder, bare=True)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
128dfb |
newfolder = tempfile.mkdtemp(prefix='pagure-tests')
|
|
Pierre-Yves Chibon |
128dfb |
repo = pygit2.clone_repository(folder, newfolder)
|
|
Pierre-Yves Chibon |
595b4e |
|
|
Pierre-Yves Chibon |
595b4e |
for index in range(ncommits):
|
|
Pierre-Yves Chibon |
595b4e |
# Create a file in that git repo
|
|
Pierre-Yves Chibon |
128dfb |
with open(os.path.join(newfolder, 'sources'), 'a') as stream:
|
|
Pierre-Yves Chibon |
595b4e |
stream.write('Row %s\n' % index)
|
|
Pierre-Yves Chibon |
595b4e |
repo.index.add('sources')
|
|
Pierre-Yves Chibon |
595b4e |
repo.index.write()
|
|
Pierre-Yves Chibon |
595b4e |
|
|
Pierre-Yves Chibon |
595b4e |
parents = []
|
|
Pierre-Yves Chibon |
595b4e |
commit = None
|
|
Pierre-Yves Chibon |
595b4e |
try:
|
|
Pierre-Yves Chibon |
595b4e |
commit = repo.revparse_single('HEAD')
|
|
Pierre-Yves Chibon |
595b4e |
except KeyError:
|
|
Pierre-Yves Chibon |
595b4e |
pass
|
|
Pierre-Yves Chibon |
595b4e |
if commit:
|
|
Pierre-Yves Chibon |
595b4e |
parents = [commit.oid.hex]
|
|
Pierre-Yves Chibon |
595b4e |
|
|
Pierre-Yves Chibon |
595b4e |
# Commits the files added
|
|
Pierre-Yves Chibon |
595b4e |
tree = repo.index.write_tree()
|
|
Pierre-Yves Chibon |
595b4e |
author = pygit2.Signature(
|
|
Pierre-Yves Chibon |
595b4e |
'Alice Author', 'alice@authors.tld')
|
|
Pierre-Yves Chibon |
595b4e |
committer = pygit2.Signature(
|
|
Pierre-Yves Chibon |
595b4e |
'Cecil Committer', 'cecil@committers.tld')
|
|
Pierre-Yves Chibon |
595b4e |
repo.create_commit(
|
|
Pierre-Yves Chibon |
595b4e |
'refs/heads/master', # the name of the reference to update
|
|
Pierre-Yves Chibon |
595b4e |
author,
|
|
Pierre-Yves Chibon |
595b4e |
committer,
|
|
Pierre-Yves Chibon |
595b4e |
'Add row %s to sources file' % index,
|
|
Pierre-Yves Chibon |
595b4e |
# binary string representing the tree object ID
|
|
Pierre-Yves Chibon |
595b4e |
tree,
|
|
Pierre-Yves Chibon |
595b4e |
# list of binary strings representing parents of the new commit
|
|
Pierre-Yves Chibon |
595b4e |
parents,
|
|
Pierre-Yves Chibon |
595b4e |
)
|
|
Pierre-Yves Chibon |
595b4e |
|
|
Pierre-Yves Chibon |
128dfb |
# Push to origin
|
|
Pierre-Yves Chibon |
128dfb |
ori_remote = repo.remotes[0]
|
|
Pierre-Yves Chibon |
128dfb |
master_ref = repo.lookup_reference('HEAD').resolve()
|
|
Pierre-Yves Chibon |
128dfb |
refname = '%s:%s' % (master_ref.name, master_ref.name)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
27a73d |
PagureRepo.push(ori_remote, refname)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
128dfb |
shutil.rmtree(newfolder)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
595b4e |
|
|
Pierre-Yves Chibon |
6e857b |
def add_binary_git_repo(folder, filename):
|
|
Pierre-Yves Chibon |
6e857b |
""" Create a fake image file for the specified git repo. """
|
|
Pierre-Yves Chibon |
6e857b |
if not os.path.exists(folder):
|
|
Pierre-Yves Chibon |
6e857b |
os.makedirs(folder)
|
|
Pierre-Yves Chibon |
128dfb |
brepo = pygit2.init_repository(folder, bare=True)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
128dfb |
newfolder = tempfile.mkdtemp(prefix='pagure-tests')
|
|
Pierre-Yves Chibon |
128dfb |
repo = pygit2.clone_repository(folder, newfolder)
|
|
Pierre-Yves Chibon |
6e857b |
|
|
Pierre-Yves Chibon |
945241 |
content = b"""\x00\x00\x01\x00\x01\x00\x18\x18\x00\x00\x01\x00 \x00\x88
|
|
Pierre-Yves Chibon |
945241 |
\t\x00\x00\x16\x00\x00\x00(\x00\x00\x00\x18\x00x00\x00\x01\x00 \x00\x00\x00
|
|
Pierre-Yves Chibon |
945241 |
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
|
|
Pierre-Yves Chibon |
945241 |
00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa7lM\x01\xa6kM\t\xa6kM\x01
|
|
Pierre-Yves Chibon |
945241 |
\xa4fF\x04\xa2dE\x95\xa2cD8\xa1a
|
|
Pierre-Yves Chibon |
6e857b |
"""
|
|
Pierre-Yves Chibon |
6e857b |
|
|
Pierre-Yves Chibon |
6e857b |
parents = []
|
|
Pierre-Yves Chibon |
6e857b |
commit = None
|
|
Pierre-Yves Chibon |
6e857b |
try:
|
|
Pierre-Yves Chibon |
6e857b |
commit = repo.revparse_single('HEAD')
|
|
Pierre-Yves Chibon |
6e857b |
except KeyError:
|
|
Pierre-Yves Chibon |
6e857b |
pass
|
|
Pierre-Yves Chibon |
6e857b |
if commit:
|
|
Pierre-Yves Chibon |
6e857b |
parents = [commit.oid.hex]
|
|
Pierre-Yves Chibon |
6e857b |
|
|
Pierre-Yves Chibon |
6e857b |
# Create a file in that git repo
|
|
Pierre-Yves Chibon |
945241 |
with open(os.path.join(newfolder, filename), 'wb') as stream:
|
|
Pierre-Yves Chibon |
6e857b |
stream.write(content)
|
|
Pierre-Yves Chibon |
6e857b |
repo.index.add(filename)
|
|
Pierre-Yves Chibon |
6e857b |
repo.index.write()
|
|
Pierre-Yves Chibon |
6e857b |
|
|
Pierre-Yves Chibon |
6e857b |
# Commits the files added
|
|
Pierre-Yves Chibon |
6e857b |
tree = repo.index.write_tree()
|
|
Pierre-Yves Chibon |
6e857b |
author = pygit2.Signature(
|
|
Pierre-Yves Chibon |
6e857b |
'Alice Author', 'alice@authors.tld')
|
|
Pierre-Yves Chibon |
6e857b |
committer = pygit2.Signature(
|
|
Pierre-Yves Chibon |
6e857b |
'Cecil Committer', 'cecil@committers.tld')
|
|
Pierre-Yves Chibon |
6e857b |
repo.create_commit(
|
|
Pierre-Yves Chibon |
6e857b |
'refs/heads/master', # the name of the reference to update
|
|
Pierre-Yves Chibon |
6e857b |
author,
|
|
Pierre-Yves Chibon |
6e857b |
committer,
|
|
Pierre-Yves Chibon |
6e857b |
'Add a fake image file',
|
|
Pierre-Yves Chibon |
6e857b |
# binary string representing the tree object ID
|
|
Pierre-Yves Chibon |
6e857b |
tree,
|
|
Pierre-Yves Chibon |
6e857b |
# list of binary strings representing parents of the new commit
|
|
Pierre-Yves Chibon |
6e857b |
parents
|
|
Pierre-Yves Chibon |
6e857b |
)
|
|
Pierre-Yves Chibon |
6e857b |
|
|
Pierre-Yves Chibon |
128dfb |
# Push to origin
|
|
Pierre-Yves Chibon |
128dfb |
ori_remote = repo.remotes[0]
|
|
Pierre-Yves Chibon |
128dfb |
master_ref = repo.lookup_reference('HEAD').resolve()
|
|
Pierre-Yves Chibon |
128dfb |
refname = '%s:%s' % (master_ref.name, master_ref.name)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
27a73d |
PagureRepo.push(ori_remote, refname)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
128dfb |
shutil.rmtree(newfolder)
|
|
Pierre-Yves Chibon |
128dfb |
|
|
Pierre-Yves Chibon |
652aff |
|
|
Pierre-Yves Chibon |
413073 |
if __name__ == '__main__':
|
|
Pierre-Yves Chibon |
413073 |
SUITE = unittest.TestLoader().loadTestsFromTestCase(Modeltests)
|
|
Pierre-Yves Chibon |
413073 |
unittest.TextTestRunner(verbosity=2).run(SUITE)
|