From c719dcba2d37f1814aa2bae55947d77453f70b9c Mon Sep 17 00:00:00 2001 From: bnewbold Date: Wed, 21 Feb 2007 21:58:59 -0800 Subject: fixed some xhtml nitty gritty, progress on git_wiki --- bn_django/git_wiki/models.py | 155 ++++++++++++++++++++- bn_django/git_wiki/settings.py | 3 + bn_django/git_wiki/templates/git_wiki/base.html | 6 +- .../git_wiki/templates/git_wiki/frontpage.html | 5 +- .../git_wiki/templates/git_wiki/shortlog_table | 27 ++++ bn_django/git_wiki/urls.py | 5 - bn_django/git_wiki/views.py | 46 +++--- 7 files changed, 209 insertions(+), 38 deletions(-) create mode 100644 bn_django/git_wiki/templates/git_wiki/shortlog_table (limited to 'bn_django/git_wiki') diff --git a/bn_django/git_wiki/models.py b/bn_django/git_wiki/models.py index 71a8362..4201a84 100644 --- a/bn_django/git_wiki/models.py +++ b/bn_django/git_wiki/models.py @@ -1,3 +1,156 @@ from django.db import models +from settings import * +from django.conf import settings -# Create your models here. +try: + ADMIN_URL = settings.ADMIN_URL +except AttributeError: + ADMIN_URL='/admin' +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) + id = models.CharField("hash", maxlength=40,blank=False,primary_key=True) + name = models.CharField("name of dir", maxlength=128,blank=False) + type = 'tree' + def slug(self): + #TODO: secure this + return self.name.strip().lower() + + class Admin: + ordering = ['path','name'] + + def __str__(self): + return self.name + def get_absolute_url(self): + return "/k/%s/" % self.slug() + def get_admin_url(self): + return "%s/k/%s/" % (ADMIN_URL, self.id) + +class Item(models.Model): + mode = models.CharField("file mode/permissions", blank=False,maxlength=4) + path = models.CharField("relative path from repo base", maxlength=512) + id = models.CharField("hash", maxlength=40,blank=False,primary_key=True) + name = models.CharField("name of dir", maxlength=128,blank=False) + size = models.IntegerField("filesize in byte", maxlength=128,blank=False) + contents = models.TextField("ASCII contents of the file") + type='blob' + + class Admin: + ordering = ['path','name'] + def __str__(self): + return self.name + def get_absolute_url(self): + return "/k/%s/" % self.slug() + 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() + self.contents = commands.getoutput(GITPREFIX + ' cat-file -p ' \ + + self.id) + self.size = commands.getoutput(GITPREFIX + ' cat-file -s ' + self.id) + return + +class Commit(models.Model): + id = models.CharField("hash", maxlength=40,blank=False,primary_key=True) + 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") + comment = models.TextField("Notes on the commit") + parenthash = models.CharField("parent's hash", maxlength=40) + #TODO: parent = models.ForeignKey() + treehash = models.CharField("tree object's hash", maxlength=40) + tree = models.ForeignKey(Tree) + type='commit' + + class Admin: + ordering = ['commit_date','author_date','author'] + def __str__(self): + return self.id + def get_absolute_url(self): + return "/k/commit/%s/" % (self.id) + def get_admin_url(self): + return "%s/k/commit/%s/" % (ADMIN_URL, self.id) + + def update(self): + import commands,time + if (not self.id): return + + self.id = self.id.strip() + raw = commands.getoutput(GITPREFIX + ' cat-file -p ' + self.id) + self.rawdiff = commands.getoutput(GITPREFIX + ' diff ' + self.id \ + +' | cat') + + 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:]: + self.comment += str(l) + '\n' + else: + self.comment = '(none)' + return diff --git a/bn_django/git_wiki/settings.py b/bn_django/git_wiki/settings.py index bb81610..2aa9bb1 100644 --- a/bn_django/git_wiki/settings.py +++ b/bn_django/git_wiki/settings.py @@ -5,3 +5,6 @@ GITWIKI_BASE = '/home/bnewbold/knowledge/' # fill path to the git command GITCOMMAND = '/usr/local/bin/git' + +GITPREFIX = 'cd ' +str(GITWIKI_BASE) + '; ' + str(GITCOMMAND) + ' --git-dir=' \ + + str(GITWIKI_BASE) + '/.git' diff --git a/bn_django/git_wiki/templates/git_wiki/base.html b/bn_django/git_wiki/templates/git_wiki/base.html index 6107c04..ed88aa1 100644 --- a/bn_django/git_wiki/templates/git_wiki/base.html +++ b/bn_django/git_wiki/templates/git_wiki/base.html @@ -2,9 +2,9 @@ {% block stylesheets %} {{ block.super }} - - - + + + {% endblock %} diff --git a/bn_django/git_wiki/templates/git_wiki/frontpage.html b/bn_django/git_wiki/templates/git_wiki/frontpage.html index 897bf8b..b4c4cbd 100644 --- a/bn_django/git_wiki/templates/git_wiki/frontpage.html +++ b/bn_django/git_wiki/templates/git_wiki/frontpage.html @@ -22,10 +22,7 @@ For more recent content see the timeline

Latest knowledge

-{% if latest_knowledge %} -{% else %} -None yet! -{% endif %} +{% include "git_wiki/shortlog_table" %}

Latest comments

{% if latest_comments %} diff --git a/bn_django/git_wiki/templates/git_wiki/shortlog_table b/bn_django/git_wiki/templates/git_wiki/shortlog_table new file mode 100644 index 0000000..8d30f80 --- /dev/null +++ b/bn_django/git_wiki/templates/git_wiki/shortlog_table @@ -0,0 +1,27 @@ +{% if shortlog %} + +{% for l in shortlog %} + + + + + +{% endfor %} +
+ {{ l.date }} + {{ l.author }} + + {{ l.description|truncatewords:10 }} + {% if heads %}{% for h in heads.iteritems %} + {% ifequal h.1 l.hash %} + [{{ h.0 }}] + {% endifequal %} + {% endfor %}{% endif %} + {% if tags %}{% for t in tags.iteritems %} + {% ifequal l.hash t.1 %} + [{{ t.0 }}] + {% endifequal %}{% endfor %}{% endif %} + + + {{ l.shorthash }}...
+{% else %}No shortlog!{% endif %} diff --git a/bn_django/git_wiki/urls.py b/bn_django/git_wiki/urls.py index 98cedc4..d765aea 100644 --- a/bn_django/git_wiki/urls.py +++ b/bn_django/git_wiki/urls.py @@ -3,11 +3,6 @@ from django.conf import settings from models import * -try: - GITWIKI_BASE = settings.GITWIKI_BASE -except AttributeError: - GITWIKI_BASE='/home/usr/doc/' - try: ADMIN_URL = settings.ADMIN_URL except AttributeError: diff --git a/bn_django/git_wiki/views.py b/bn_django/git_wiki/views.py index d9ce15f..1212f44 100644 --- a/bn_django/git_wiki/views.py +++ b/bn_django/git_wiki/views.py @@ -1,4 +1,3 @@ -import settings from django import forms, http, template from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, render_to_response @@ -7,37 +6,34 @@ from django.http import HttpResponse import os, commands from models import * - -try: - GITWIKI_BASE = settings.GITWIKI_BASE+'/' -except AttributeError: - GITWIKI_BASE='/home/' - -try: - GITCOMMAND = settings.GITCOMMAND -except AttributeError: - GITCOMMAND='git' - +from settings import * # Create your views here. def frontpage(request): - + t = fromslug('/') + t.update() return render_to_response('git_wiki/frontpage.html', \ - dict()) - -def item(request, req=''): - #GITPREFIX = models.getGITPREFIX() - #i = Item() - #i.update() - - return render_to_response('git_browse/item.html', + dict(shortlog=shortlog(), tree=t)) + +def tree(request, reqslug): + t = fromslug(reqslug) + if t.type == 'blob': + return item(request, reqslug) + t.update() + return render_to_response('git_wiki/tree.html', + dict(shortlog=shortlog(tree=t), tree=t)) + +def item(request, reqslug): + i = fromslug(reqslug) + if i.type == 'tree': + return tree(request, reqslug) + i.update() + return render_to_response('git_wiki/item.html', dict(item=i)) def olditem(request, hash): - #GITPREFIX = models.getGITPREFIX() - #i = Item() - #i.update() - + i = get_object_or_404(Item, id=hash) + i.update() return render_to_response('git_browse/olditem.html', dict(item=i)) -- cgit v1.2.3