Source code for changes.models.repository
import os.path
from uuid import uuid4
from datetime import datetime
from enum import Enum
from flask import current_app
from sqlalchemy import Column, String, DateTime
from changes.config import db
from changes.db.types.enum import Enum as EnumType
from changes.db.types.guid import GUID
class RepositoryBackend(Enum):
unknown = 0
git = 1
hg = 2
def __str__(self):
return BACKEND_LABELS[self]
class RepositoryStatus(Enum):
inactive = 0
active = 1
importing = 2
def __str__(self):
return STATUS_LABELS[self]
BACKEND_LABELS = {
RepositoryBackend.unknown: 'Unknown',
RepositoryBackend.git: 'git',
RepositoryBackend.hg: 'hg',
}
STATUS_LABELS = {
RepositoryStatus.inactive: 'Inactive',
RepositoryStatus.active: 'Active',
RepositoryStatus.importing: 'importing',
}
[docs]class Repository(db.Model):
"""
Represents a VCS repository that Changes will watch for new commits.
"""
__tablename__ = 'repository'
id = Column(GUID, primary_key=True, default=uuid4)
url = Column(String(200), nullable=False, unique=True)
backend = Column(EnumType(RepositoryBackend),
default=RepositoryBackend.unknown, nullable=False)
status = Column(EnumType(RepositoryStatus),
default=RepositoryStatus.inactive,
nullable=False, server_default='1')
date_created = Column(DateTime, default=datetime.utcnow)
last_update = Column(DateTime)
last_update_attempt = Column(DateTime)
def __init__(self, **kwargs):
super(Repository, self).__init__(**kwargs)
if not self.id:
self.id = uuid4()
if not self.date_created:
self.date_created = datetime.utcnow()
def get_vcs(self):
from changes.models.option import ItemOption
from changes.vcs.git import GitVcs
from changes.vcs.hg import MercurialVcs
options = dict(
db.session.query(
ItemOption.name, ItemOption.value
).filter(
ItemOption.item_id == self.id,
ItemOption.name.in_([
'auth.username',
])
)
)
kwargs = {
'path': os.path.join(current_app.config['REPO_ROOT'], self.id.hex),
'url': self.url,
'username': options.get('auth.username'),
}
if self.backend == RepositoryBackend.git:
return GitVcs(**kwargs)
elif self.backend == RepositoryBackend.hg:
return MercurialVcs(**kwargs)
else:
return None
@classmethod
def get(cls, id):
result = cls.query.filter_by(url=id).first()
if result is None and len(id) == 32:
result = cls.query.get(id)
return result