1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 | from datetime import datetime, timedelta
from time import localtime
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.template.defaultfilters import slugify
from fields import SeparatedValuesField
google_time = lambda s: datetime(*localtime(s)[:-2])
bitbucket_time = lambda s: datetime.strptime(s, '%Y-%m-%d %H:%M:%S')
git_time = lambda s: datetime.strptime(s[:-6], '%Y-%m-%dT%H:%M:%S') - timedelta(seconds=int(filter(lambda c: c in '0123456789', s[-6:])) * 60)
class RepositoryManager(models.Manager):
def git_lookup(self, data):
return {
'name': data['repository']['name'],
'url': data['repository']['url'],
'description': data['repository']['description'],
'owner': '%(name)s <%(email)s>' % data['repository']['owner'],
}
def googlecode_lookup(self, data):
return {
'url': data['repository_path'],
'name': data['project_name'],
}
def bitbucket_lookup(self, data):
return {
'url': data['repository']['website'] + data['repository']['absolute_url'],
'name': data['repository']['name'],
'owner': data['repository']['owner'],
'slug': data['repository']['slug']
}
def from_post(self, vcs, data):
try:
lookup = getattr(self, '%s_lookup' % vcs)(data)
except AttributeError:
lookup = self.git_lookup(data)
repo = self.create(vcs=vcs, **lookup)
for commit in data[vcs == 'googlecode' and 'revisions' or 'commits']:
Commit.objects.from_post(vcs, repo, commit)
class Repository(models.Model):
url = models.URLField(verify_exists=False)
name = models.CharField(max_length=255)
description = models.TextField(blank=True,null=True)
owner = models.CharField(max_length=255)
slug = models.SlugField()
vcs = models.CharField(max_length=255)
objects = RepositoryManager()
def __unicode__(self):
return '%s at %s' % (self.name, self.vcs)
@models.permalink
def get_absolute_url(self):
return ('vcs_repo_detail', [self.vcs, self.slug])
def save(self, *a, **kw):
if not self.slug:
self.slug = slugify(self.name)
super(Repository, self).save(*a, **kw)
class CommitManager(models.Manager):
def googlecode_lookup(self, data):
return {
'timestamp': google_time(data['timestamp']),
'message': data['message'],
'author': data['author'],
'revision': data['revision'],
'added': data.get('added',[]),
'removed': data.get('removed',[]),
'modified': data.get('modified',[]),
}
def bitbucket_lookup(self, data):
files = lambda k: [f['file'] for f in data['files'] if f['type'] == k]
return {
'added': files('added'),
'removed': files('removed'),
'modified': files('modified'),
'timestamp': bitbucket_time(data['timestamp']),
'message': data['message'],
'author': data['author'],
'revision': data['revision'],
}
def git_lookup(self, data):
return {
'revision': data['id'],
'timestamp': git_time(data['timestamp']),
'message': data['message'],
'author': '%(name)s <%(email)s>' % data['author'],
'added': data.get('added',[]),
'removed': data.get('removed',[]),
'modified': data.get('modified',[]),
}
def from_post(self, vcs, repo, data):
try:
lookup = getattr(self, '%s_lookup' % vcs)(data)
except AttributeError:
lookup = self.git_lookup(data)
return self.create(repository=repo, **lookup)
class Commit(models.Model):
repository = models.ForeignKey(Repository)
author = models.CharField(max_length=255)
revision = models.CharField(max_length=40)
message = models.TextField(blank=True,null=True)
timestamp = models.DateTimeField()
added = SeparatedValuesField()
removed = SeparatedValuesField()
modified = SeparatedValuesField()
objects = CommitManager()
def __unicode__(self):
return u'%s: %s' % (self.revision, self.message)
@models.permalink
def get_absolute_url(self):
return ('vcs_commit_detail', [self.repository.vcs, self.repository.slug, self.revision])
|