~azzar1/unity/add-show-desktop-key

562 by dcoles
Added new app: Diff (SVN diff application)
1
#!/usr/bin/python
2
3
# IVLE - Informatics Virtual Learning Environment
4
# Copyright (C) 2007-2008 The University of Melbourne
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
# GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
20
# Script: diffservice
586 by dcoles
diffservice: Fixed oops in cleaned up code, also changed the date and author
21
# Author: David Coles
22
# Date:   26/2/2008
562 by dcoles
Added new app: Diff (SVN diff application)
23
586 by dcoles
diffservice: Fixed oops in cleaned up code, also changed the date and author
24
# A CGI script for generating a diff report page in HTML. It is intended to be 
25
# run from the trampoline by the Diff application.
562 by dcoles
Added new app: Diff (SVN diff application)
26
27
from common import cgirequest
772 by mattgiuca
diffservice: HTML-escape the output.
28
import cgi
823 by wagrant
diffservice: Refactor and polish. URL revision retrieval is less
29
import os.path
562 by dcoles
Added new app: Diff (SVN diff application)
30
import pysvn
31
import re
32
33
def htmlfy_diff(difftext):
34
    """Adds HTML markup to a udiff string"""
772 by mattgiuca
diffservice: HTML-escape the output.
35
    output = cgi.escape(difftext)
826 by wagrant
diffservice: Refactor regexing.
36
    subs = {
37
     r'^([\+\-]{3})\s(\S+)\s\((.+)\)$':
38
         r'<span class="diff-files">\1 \2 <em>(\3)</em></span>',
39
     r'^\@\@ (.*) \@\@$':
40
         r'<span class="diff-range">@@ \1 @@</span>',
41
     r'^\+(.*)$':
42
         r'<span class="diff-add">+\1</span>',
43
     r'^\-(.*)$':
44
         r'<span class="diff-sub">-\1</span>',
45
     r'^\\(.*)$':
46
         r'<span class="diff-special">\\\1</span>'
47
    }
48
49
    for match in subs:
50
        output = re.compile(match, re.MULTILINE).sub(subs[match], output)
51
562 by dcoles
Added new app: Diff (SVN diff application)
52
    return output
53
54
def get_revision(r_str):
55
    """ Returns a Revison object for pysvn from a r query string """
56
    if r_str == "HEAD":
57
        return pysvn.Revision( pysvn.opt_revision_kind.head )
58
    elif r_str == "WORKING":
59
        return pysvn.Revision( pysvn.opt_revision_kind.working )
60
    elif r_str == "BASE":
61
        return pysvn.Revision( pysvn.opt_revision_kind.base )
576 by dcoles
diffservice: Small code cleanup
62
    else:
63
        try:
64
            r = int(r_str)
586 by dcoles
diffservice: Fixed oops in cleaned up code, also changed the date and author
65
            return pysvn.Revision( pysvn.opt_revision_kind.number, r)
576 by dcoles
diffservice: Small code cleanup
66
        except:
67
            return None
562 by dcoles
Added new app: Diff (SVN diff application)
68
        
69
# Use a CGIRequest object to make the CGI environment look like the normal
566 by dcoles
diff.css: Foreground colours for hilighting of changes
70
# IVLE handler environment.
562 by dcoles
Added new app: Diff (SVN diff application)
71
72
req = cgirequest.CGIRequest()
854 by wagrant
Enable the new CGIRequest error handler in the diff, file and svnlog
73
req.install_error_handler()
773 by mattgiuca
cgirequest.py: Fixed req.path attribute, so it now DOES NOT include the
74
req.content_type = "text/html"
562 by dcoles
Added new app: Diff (SVN diff application)
75
566 by dcoles
diff.css: Foreground colours for hilighting of changes
76
# Beginning of the page
773 by mattgiuca
cgirequest.py: Fixed req.path attribute, so it now DOES NOT include the
77
req.write('<div id="ivle_padding">\n')
78
req.write('<h1>Diff</h1>\n')
562 by dcoles
Added new app: Diff (SVN diff application)
79
823 by wagrant
diffservice: Refactor and polish. URL revision retrieval is less
80
# Default revisions
81
revs = [pysvn.Revision(x) for x in [pysvn.opt_revision_kind.base,
82
                                    pysvn.opt_revision_kind.working]]
83
# Override revisions from query string
773 by mattgiuca
cgirequest.py: Fixed req.path attribute, so it now DOES NOT include the
84
fields = req.get_fieldstorage()
85
field_r = fields.getlist("r")
823 by wagrant
diffservice: Refactor and polish. URL revision retrieval is less
86
for ri in range(len(field_r)):
87
    r = get_revision(field_r[ri])
88
    if r is not None:
89
        revs[ri] = r
562 by dcoles
Added new app: Diff (SVN diff application)
90
91
# Attempt to get the diff for these revisons
92
try:
93
    svnclient = pysvn.Client()
94
    diff = svnclient.diff
95
    diff_text = diff( '/tmp/svndiff',
823 by wagrant
diffservice: Refactor and polish. URL revision retrieval is less
96
        os.path.join('/home', req.path),
97
        revision1=revs[0],
98
        revision2=revs[1]
562 by dcoles
Added new app: Diff (SVN diff application)
99
    )
100
101
    # Split up the udiff into individual files
102
    diff_matcher = re.compile(
103
        r'^Index: (.*)\n\=+\n((?:[^I].*\n)*)',re.MULTILINE
104
    )
105
    split_diff = diff_matcher.findall(diff_text)
106
107
    # Prints output
108
    for filediff in split_diff:
109
        filename = filediff[0]
110
        diffbody = htmlfy_diff(filediff[1])
774 by mattgiuca
scripts/diffservice, diff.css: HTML refactor (simpler layout - it's not valid
111
        req.write('<p><b>File:</b> %s</p>\n'
112
            % cgi.escape(filename))
113
        req.write('<pre class="diff">%s</pre>\n' % diffbody)
562 by dcoles
Added new app: Diff (SVN diff application)
114
115
except pysvn._pysvn_2_5.ClientError, e:
774 by mattgiuca
scripts/diffservice, diff.css: HTML refactor (simpler layout - it's not valid
116
    req.write('<p><b>Error:</b></p>\n')
822 by wagrant
diffservice: Exceptions don't print well, so convert them to strings
117
    req.write('<pre class="diff">%s</pre>\n' % cgi.escape(str(e)))
562 by dcoles
Added new app: Diff (SVN diff application)
118
773 by mattgiuca
cgirequest.py: Fixed req.path attribute, so it now DOES NOT include the
119
req.write('</div>\n')