diff options
| -rw-r--r-- | bn_django/git_browse/models.py | 103 | ||||
| -rw-r--r-- | bn_django/git_browse/templates/git_browse/full_log.html | 4 | ||||
| -rw-r--r-- | bn_django/git_browse/templates/git_browse/tree.html | 2 | ||||
| -rw-r--r-- | bn_django/git_browse/urls.py | 11 | ||||
| -rw-r--r-- | bn_django/git_browse/views.py | 29 | ||||
| -rw-r--r-- | static/style/default.css | 6 | 
6 files changed, 116 insertions, 39 deletions
| diff --git a/bn_django/git_browse/models.py b/bn_django/git_browse/models.py index edddf60..4cc73a3 100644 --- a/bn_django/git_browse/models.py +++ b/bn_django/git_browse/models.py @@ -23,17 +23,19 @@ if ADMIN_URL[-1] == '/':  # Create your models here.  class Repository(models.Model): -    path = models.FilePathField("relative path to repository", path=GITBROWSE_BASE,recursive=True,match="^.*\.git$",unique=True,blank=False) -    #path = models.FilePathField("relative path to repository", path='/home/bnewbold/code/',recursive=True,match=".*\.git$",unique=True,blank=False) +    path = models.FilePathField("relative path to repository", \ +            path=GITBROWSE_BASE,recursive=True,match="^.*\.git$",unique=True, \ +            blank=False)      name = models.CharField(_("name"), maxlength=80)      slug = models.SlugField(prepopulate_from=("path",),unique=True) -    git_version = models.CharField(_("git version"), maxlength=100,default="git version 1.4.4", blank=True, help_text="Output of \'git --version\'") +    git_version = models.CharField(_("git version"), maxlength=100, \ +            default="git version 1.4.4", blank=True, \ +            help_text="Output of \'git --version\'")      description = models.TextField("description of repo",blank=True)      class Admin:           ordering = ['slug'] -      def __str__(self):          return self.name      def get_absolute_url(self): @@ -41,11 +43,16 @@ class Repository(models.Model):      def get_admin_url(self):          return "%s/code/repository/%s/" % (ADMIN_URL, self.slug) +    def getGITPREFIX(self): +        """returns the glued together combination of GITCOMMAND and +           GITBROWSE_BASE needed to call git commands on this repository""" +        return 'cd ' + str(GITBROWSE_BASE) + str(self.slug) + '; ' \ +            + str(GITCOMMAND) + ' --git-dir=' + str(GITBROWSE_BASE) \ +            + str(self.slug) + '/.git ' +      def scan(self):          import os - -        GITPREFIX = 'cd ' + GITBROWSE_BASE + self.slug + '; ' + GITCOMMAND \ -                + ' --git-dir=' + GITBROWSE_BASE + self.slug + '/.git ' +        GITPREFIX = self.getGITPREFIX()          heads = dict()          for h in os.listdir(GITBROWSE_BASE + self.slug + '/.git/refs/heads/'):              f = open(GITBROWSE_BASE + self.slug + '/.git/refs/heads/' + h,'r') @@ -58,13 +65,12 @@ class Repository(models.Model):              f.close()          return (GITPREFIX, heads, tags) -      def shortlog(self):          import commands -          GITPREFIX = 'cd ' + GITBROWSE_BASE + self.slug + '; ' + GITCOMMAND \                  + ' --git-dir=' + GITBROWSE_BASE + self.slug + '/.git ' -        logtxt = commands.getoutput(GITPREFIX + ' log --relative-date --max-count=6 | cat') +        logtxt = commands.getoutput(GITPREFIX \ +                + ' log --relative-date --max-count=6 | cat')          log_items = logtxt.split('\ncommit ')          if (log_items[0] == ''):              log_items.pop(0) @@ -87,8 +93,6 @@ class Repository(models.Model):              logobj['shortdescription'] = logobj['description'][:128]              shortlog.append(logobj)          return shortlog -         -  class Tree(models.Model):      repo = models.ForeignKey(Repository) @@ -104,7 +108,7 @@ class Tree(models.Model):      def __str__(self):          return self.name      def get_absolute_url(self): -        return "/code/%s/%s" % (self.repo.slug, self.hash) +        return "/code/%s/tree/%s/" % (self.repo.slug, self.hash)      def get_admin_url(self):          return "%s/code/tree/%s/" % (ADMIN_URL, self.id) @@ -119,31 +123,84 @@ class Blob(models.Model):      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.IntField("filesize in byte", 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 = ['repo','path'] - +        ordering = ['repo','path','name']      def __str__(self):          return self.name      def get_absolute_url(self): -        return "/code/%s/%s" % (self.repo.slug, self.hash) +        return "/code/%s/blob/%s/" % (self.repo.slug, self.hash)      def get_admin_url(self): -        return "%s/code/tree/%s/" % (ADMIN_URL, self.id) +        return "%s/code/blob/%s/" % (ADMIN_URL, self.id)      def update(self):          import commands +        if (not self.id) or (not self.repo): return +         +        GITPREFIX = self.repo.getGITPREFIX() -        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  ' + hash) - -         +        self.contents = commands.getoutput(GITPREFIX + ' cat-file -p  ' \ +                + self.id)  +        self.size = commands.getoutput(GITPREFIX + ' cat-file -s  ' + self.id) +        return  def blob_from_str(s):      s = s.split();      if len(s) != 4: return      return Blob(mode=s[0],id=s[2],name=s[3]) + +class Commit(models.Model): +    repo = models.ForeignKey(Repository) +    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 = ['repo','commit_date','author_date','author'] +    def __str__(self): +        return self.id +    def get_absolute_url(self): +        return "/code/%s/commit/%s/" % (self.repo.slug, self.hash) +    def get_admin_url(self): +        return "%s/code/commit/%s/" % (ADMIN_URL, self.id) +     +    def update(self): +        import commands,time +        if (not self.id) or (not self.repo): return +         +        GITPREFIX = self.repo.getGITPREFIX() + +        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_browse/templates/git_browse/full_log.html b/bn_django/git_browse/templates/git_browse/full_log.html index 75ea2ab..d2a1311 100644 --- a/bn_django/git_browse/templates/git_browse/full_log.html +++ b/bn_django/git_browse/templates/git_browse/full_log.html @@ -5,7 +5,9 @@      <h3>Full Log</h3><br />      {% for item in log_objs %}         <hr> -       <b>Hash: </b>{{ item.hash }} +       <b>Hash: </b> +       <a href="/code/{{object.slug}}/commit/{{ item.hash }}/"> +        <span class="hash">{{ item.hash }}</span></a>         <br /><b>Author: </b>{{ item.author }}         <br /><b>Date: </b>{{ item.date }}         <br /><b>Comment: </b> diff --git a/bn_django/git_browse/templates/git_browse/tree.html b/bn_django/git_browse/templates/git_browse/tree.html index 79a8f39..b177af8 100644 --- a/bn_django/git_browse/templates/git_browse/tree.html +++ b/bn_django/git_browse/templates/git_browse/tree.html @@ -4,6 +4,8 @@      <h3>Tree sha1 hash:</h3>          <span class="hash">{{ hash }}</span> +    <h3>Shortlog:</h3> +    {% include "git_browse/shortlog_table" %}      <h3>Directory listing:</h3>      {% include "git_browse/tree_table" %}  {% endblock %} diff --git a/bn_django/git_browse/urls.py b/bn_django/git_browse/urls.py index caede9d..a0c31fe 100644 --- a/bn_django/git_browse/urls.py +++ b/bn_django/git_browse/urls.py @@ -33,13 +33,12 @@ urlpatterns += patterns('bn_django.git_browse.views',      (r'^(?P<repo>[\w\-\_]*)/branches/$', 'view_branches',),       (r'^(?P<repo>[\w\-\_]*)/log/$', 'view_log',),       (r'^(?P<repo>[\w\-\_]*)/obj/(?P<hash>[0-9a-z]{40})/$', 'view_obj',),  -    (r'^(?P<repo>[\w\-\_]*)/commit/(?P<hash>[0-9a-z]{40})/$', 'view_obj',),  -    (r'^(?P<repo>[\w\-\_]*)/commit/$', 'view_obj',),  -    (r'^(?P<repo>[\w\-\_]*)/tag/(?P<hash>[0-9a-z]{40})/$', 'view_tag',),  +    (r'^(?P<repo>[\w\-\_]*)/commit/(?P<hash>[0-9a-z]{40})/$', 'view_commit',),  +    (r'^(?P<repo>[\w\-\_]*)/commit/$', 'view_commit',),  +    (r'^(?P<repo>[\w\-\_]*)/tag/(?P<name>[\w\-\_]+)/$', 'view_tag',),  +    (r'^(?P<repo>[\w\-\_]*)/head/(?P<name>[\w\-\_]+)/$', 'view_head',),       (r'^(?P<repo>[\w\-\_]*)/blob/(?P<hash>[0-9a-z]{40})/$', 'view_blob',),  -    (r'^(?P<repo>[\w\-\_]*)/blob/(?P<hash>[0-9a-z]{40})/raw/$', 'view_blob',),       (r'^(?P<repo>[\w\-\_]*)/tree/$', 'view_tree',),       (r'^(?P<repo>[\w\-\_]*)/tree/(?P<hash>[0-9a-z]{40})/$', 'view_tree',),  -    (r'^(?P<repo>[\w\-\_]*)/tree/(?P<hash>[0-9a-z]{40})/gz/$', 'view_tree',),  -    (r'^(?P<repo>[\w\-\_]*)/tree/(?P<hash>[0-9a-z]{40})/tar/$', 'view_tree',),  +    (r'^(?P<repo>[\w\-\_]*)/tree/(?P<hash>[0-9a-z]{40})/zip/$', 'view_tree',),   ) diff --git a/bn_django/git_browse/views.py b/bn_django/git_browse/views.py index e27d949..f28aa76 100644 --- a/bn_django/git_browse/views.py +++ b/bn_django/git_browse/views.py @@ -66,7 +66,7 @@ def view_tree(request, repo, hash=None,branch=None):                              hash=hash,                              all_objs=tree_objs+blob_objs,)) -def view_log(request, repo, tree_hash=None, branch=None): +def view_log(request, repo, hash=None):      therepo = get_object_or_404(Repository, slug=repo)      (GITPREFIX, heads, tags) = therepo.scan() @@ -96,17 +96,30 @@ def view_log(request, repo, tree_hash=None, branch=None):      return render_to_response('git_browse/full_log.html',                        dict(object=therepo,                              log_objs=log_objs,)) -def view_blob(request, repo, hash, branch=None): + +def view_blob(request, repo, hash):      therepo = get_object_or_404(Repository, slug=repo)      (GITPREFIX, heads, tags) = therepo.scan() -    blob = Blob(hash=hash,repo=therepo) -    blob.update() +    b = Blob(id=hash,repo=therepo) +    b.update() -    return render_to_response('git_browse/obj.html', +    return render_to_response('git_browse/blob.html',                        dict(object=therepo, -                        hash=blob.id, -                        size=blob.size, -                        contents=blob.contents)) +                        heads=heads, +                        tags=tags, +                        hash=b.id, +                        size=b.size, +                        contents=b.contents)) + +def view_commit(request, repo, hash): +    therepo = get_object_or_404(Repository, slug=repo) +    (GITPREFIX, heads, tags) = therepo.scan() +    c = Commit(id=hash,repo=therepo) +    c.update() + +    return render_to_response('git_browse/commit.html', +                      dict(object=therepo, heads=heads, tags=tags, +                      commit=c))  def view_obj(request, repo, hash, branch=None):      therepo = get_object_or_404(Repository, slug=repo) diff --git a/static/style/default.css b/static/style/default.css index 58c3011..2c63d93 100644 --- a/static/style/default.css +++ b/static/style/default.css @@ -9,7 +9,11 @@ body {  a {      text-decoration: none; }  a:hover { -    border-bottom: 1px solid blue; } +    text-decoration: underline; +    border-top: 0px solid blue;  +    border-left: 0px solid blue;  +    border-right: 0px solid blue;  +    border-bottom: 0px solid blue; }  a.subtle {      color: black;      text-decoration: none; } | 
