aboutsummaryrefslogtreecommitdiffstats
path: root/bn_django/git_wiki/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'bn_django/git_wiki/models.py')
-rw-r--r--bn_django/git_wiki/models.py208
1 files changed, 147 insertions, 61 deletions
diff --git a/bn_django/git_wiki/models.py b/bn_django/git_wiki/models.py
index 4201a84..47fc612 100644
--- a/bn_django/git_wiki/models.py
+++ b/bn_django/git_wiki/models.py
@@ -9,55 +9,6 @@ except AttributeError:
if ADMIN_URL[-1] == '/':
ADMIN_URL=ADMIN_URL[:-1]
-GITPREFIX = 'cd ' +str(GITWIKI_BASE) + '; ' + str(GITCOMMAND) + ' --git-dir=' \
- + str(GITWIKI_BASE) + '/.git '
-
-def reposcan():
- import os
- heads = dict()
- for h in os.listdir(GITWIKI_BASE + self.slug + '/.git/refs/heads/'):
- f = open(GITWIKI_BASE + self.slug + '/.git/refs/heads/' + h,'r')
- heads[h.strip()] = f.readline().strip()
- f.close()
- tags = dict()
- for t in os.listdir(GITWIKI_BASE + self.slug + '/.git/refs/tags/'):
- f = open(GITWIKI_BASE + self.slug + '/.git/refs/tags/' + t,'r')
- tags[t.strip()] = f.readline().strip()
- f.close()
- return (heads, tags)
-
-def shortlog(hash=None,tree=None):
- import commands
-
- if tree:
- hash=tree.id
- logtxt = commands.getoutput(GITPREFIX \
- + ' log --relative-date --max-count=6 | cat')
- print GITPREFIX
- print logtxt
- log_items = logtxt.split('\ncommit ')
- if (log_items[0] == ''):
- log_items.pop(0)
- if (log_items[0].startswith('commit ')):
- log_items[0] = log_items[0][7:]
- shortlog = list()
- for li in log_items:
- logobj = dict()
- lines = li.splitlines()
- if len(lines) < 3: continue
- logobj['hash'] = lines[0].strip()
- logobj['shorthash'] = lines[0].strip()[:5]
- logobj['author'] = lines[1][8:]
- logobj['date'] = lines[2][8:]
- if len(lines) > 4:
- logobj['description'] = lines[4][4:]
- else:
- logobj['description'] = '(none)'
- # here we truncate commit comments for shortlogs
- logobj['shortdescription'] = logobj['description'][:128]
- shortlog.append(logobj)
- return shortlog
-
class Tree(models.Model):
mode = models.CharField("file mode/permissions", blank=False,maxlength=4)
path = models.CharField("relative path from repo base", maxlength=512)
@@ -66,7 +17,7 @@ class Tree(models.Model):
type = 'tree'
def slug(self):
#TODO: secure this
- return self.name.strip().lower()
+ return ''.join(self.path.strip().lower().split())
class Admin:
ordering = ['path','name']
@@ -78,6 +29,38 @@ class Tree(models.Model):
def get_admin_url(self):
return "%s/k/%s/" % (ADMIN_URL, self.id)
+ def update(self):
+ import commands
+ if (not self.id): return
+
+ self.id = self.id.strip()
+ tree_ls = commands.getoutput(GITPREFIX + ' ls-tree --full-name ' \
+ + self.id)
+ tree_objs = list()
+ blob_objs = list()
+ for line in tree_ls.splitlines():
+ l = line.split()
+ if len(l) < 4:
+ continue
+ if l[1] == 'tree':
+ t = Tree(id=l[2])
+ t.path = ' '.join(l[3:])
+ if self.path and self.path != '/':
+ t.path = self.path + '/' + t.path
+ t.name = t.path
+ tree_objs.append(t)
+ if l[1] == 'blob':
+ i = Item(id=l[2])
+ i.path = ' '.join(l[3:])
+ if self.path and self.path != '/':
+ i.path = self.path + '/' + i.path
+ i.name=i.path
+ blob_objs.append(i)
+ self.tree_objs = tree_objs
+ self.blob_objs = blob_objs
+ self.all_objs = tree_objs + blob_objs
+
+
class Item(models.Model):
mode = models.CharField("file mode/permissions", blank=False,maxlength=4)
path = models.CharField("relative path from repo base", maxlength=512)
@@ -86,6 +69,9 @@ class Item(models.Model):
size = models.IntegerField("filesize in byte", maxlength=128,blank=False)
contents = models.TextField("ASCII contents of the file")
type='blob'
+ def slug(self):
+ #TODO: secure this
+ return ''.join(self.name.strip().lower().split())
class Admin:
ordering = ['path','name']
@@ -111,10 +97,12 @@ class Commit(models.Model):
rawdiff = models.TextField("ASCII contents of full commit diff")
commit_date = models.DateField("Date of commit to repository")
author_date = models.DateField("Date commit was writen/created")
- author = models.CharField("Name of commit author")
- author_email = models.DateField("Email address of commit author")
- committer = models.CharField("Name of committer")
- committer_email = models.DateField("Email address of committer")
+ author = models.CharField("Name of commit author", maxlength=96)
+ author_email = models.CharField("Email address of commit author",\
+ maxlength=196)
+ committer = models.CharField("Name of committer", maxlength=96)
+ committer_email = models.CharField("Email address of committer", \
+ maxlength=196)
comment = models.TextField("Notes on the commit")
parenthash = models.CharField("parent's hash", maxlength=40)
#TODO: parent = models.ForeignKey()
@@ -143,14 +131,112 @@ class Commit(models.Model):
raw = raw.splitlines()
if len(raw) < 3: return
self.treehash = raw[0].split()[-1].strip()
- self.parenthash = raw[1][6:].strip()
- self.author = raw[2].split()[1]
- self.author_date = time.ctime(int(raw[2].split()[-2]))
- self.committer = raw[3].split()[1]
- self.committer_date = time.ctime(int(raw[3].split()[-2]))
- if len(raw) > 4:
- for l in raw[4:]:
+ if raw[1].startswith('parent'):
+ self.parenthash = raw[1][6:].strip()
+ raw.pop(1)
+ self.author = raw[1].split()[1]
+ self.author_date = time.ctime(int(raw[1].split()[-2]))
+ self.committer = raw[2].split()[1]
+ self.committer_date = time.ctime(int(raw[2].split()[-2]))
+ if len(raw) > 3:
+ for l in raw[3:]:
self.comment += str(l) + '\n'
else:
self.comment = '(none)'
return
+
+
+def fromslug(reqslug):
+ import commands
+
+ if reqslug == '' or reqslug == '/':
+ f = open(GITWIKI_BASE + '/.git/HEAD','r')
+ head = f.readline().strip().split()[1]
+ f.close()
+ f = open(GITWIKI_BASE + '/.git/'+head,'r')
+ hash = f.readline().strip()
+ f.close()
+ ret = Tree(id=hash)
+ ret.path='/'
+ ret.name='/'
+ ret.reqslug = '/'
+ return ret
+
+ reqslug = ''.join(reqslug.strip().lower().split())
+ if reqslug[-1] == '/':
+ reqslug=reqslug[:-1]
+ itemtxt = commands.getoutput(GITPREFIX \
+ + ' ls-tree -t -r HEAD')
+ if not itemtxt:
+ return None
+ hash, path, type = None, None, None
+ for l in itemtxt.splitlines():
+ words = l.split()
+ if len(words) < 4:
+ continue
+ ftype = words[1]
+ fhash = words[2]
+ fpath = ' '.join(words[3:])
+ if fpath[-1] == '/':
+ fpath=fpath[:-1]
+ if ''.join(fpath.strip().lower().split()) == reqslug:
+ hash = fhash
+ path = fpath
+ type = ftype
+ break;
+ if (not hash) or (not type) or (not path):
+ return None
+ if type == 'blob':
+ ret = Item(id=hash)
+ elif type == 'tree':
+ ret = Tree(id=hash)
+ ret.path=path
+ ret.name=path
+ ret.reqslug = reqslug
+ return ret
+
+def reposcan():
+ import os
+ heads = dict()
+ for h in os.listdir(GITWIKI_BASE + '/.git/refs/heads/'):
+ f = open(GITWIKI_BASE + '/.git/refs/heads/' + h,'r')
+ heads[h.strip()] = f.readline().strip()
+ f.close()
+ tags = dict()
+ for t in os.listdir(GITWIKI_BASE + '/.git/refs/tags/'):
+ f = open(GITWIKI_BASE + '/.git/refs/tags/' + t,'r')
+ tags[t.strip()] = f.readline().strip()
+ f.close()
+ return (heads, tags)
+
+def shortlog(hash=None,tree=None):
+ import commands
+
+ if tree:
+ hash=tree.id
+ logtxt = commands.getoutput(GITPREFIX \
+ + ' log --relative-date --max-count=6 | cat')
+ print GITPREFIX
+ print logtxt
+ log_items = logtxt.split('\ncommit ')
+ if (log_items[0] == ''):
+ log_items.pop(0)
+ if (log_items[0].startswith('commit ')):
+ log_items[0] = log_items[0][7:]
+ shortlog = list()
+ for li in log_items:
+ logobj = dict()
+ lines = li.splitlines()
+ if len(lines) < 3: continue
+ logobj['hash'] = lines[0].strip()
+ logobj['shorthash'] = lines[0].strip()[:5]
+ logobj['author'] = lines[1][8:]
+ logobj['date'] = lines[2][8:]
+ if len(lines) > 4:
+ logobj['description'] = lines[4][4:]
+ else:
+ logobj['description'] = '(none)'
+ # here we truncate commit comments for shortlogs
+ logobj['shortdescription'] = logobj['description'][:128]
+ shortlog.append(logobj)
+ return shortlog