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

« back to all changes in this revision

Viewing changes to services/diffservice

  • Committer: William Grant
  • Date: 2010-07-28 04:13:05 UTC
  • mfrom: (1801.1.2 die-cjson-die)
  • Revision ID: grantw@unimelb.edu.au-20100728041305-xwypm3cn1l1mnki1
Port from cjson to (simple)json.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
# along with this program; if not, write to the Free Software
18
18
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
19
 
20
 
# Script: diffservice
21
 
# Author: David Coles
22
 
# Date:   26/2/2008
23
 
 
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.
26
 
 
27
 
import cgi
28
 
import os.path
 
20
# Author: David Coles, Will Grant
 
21
 
 
22
'''
 
23
A script for generating a Subversion diff. It is intended to be run via
 
24
trampoline by ivle.webapp.filesystem.diff.DiffView.
 
25
'''
 
26
 
 
27
import os
 
28
import sys
 
29
import locale
 
30
 
 
31
try:
 
32
    import json
 
33
except ImportError:
 
34
    import simplejson as json
29
35
import pysvn
30
 
import re
31
36
 
32
 
from ivle import cgirequest
 
37
import ivle.conf
33
38
import ivle.svn
34
39
 
35
 
def htmlfy_diff(difftext):
36
 
    """Adds HTML markup to a udiff string"""
37
 
    output = cgi.escape(difftext)
38
 
    subs = {
39
 
     r'^([\+\-]{3})\s(\S+)\s\((.+)\)$':
40
 
         r'<span class="diff-files">\1 \2 <em>(\3)</em></span>',
41
 
     r'^\@\@ (.*) \@\@$':
42
 
         r'<span class="diff-range">@@ \1 @@</span>',
43
 
     r'^\+(.*)$':
44
 
         r'<span class="diff-add">+\1</span>',
45
 
     r'^\-(.*)$':
46
 
         r'<span class="diff-sub">-\1</span>',
47
 
     r'^\\(.*)$':
48
 
         r'<span class="diff-special">\\\1</span>'
49
 
    }
50
 
 
51
 
    for match in subs:
52
 
        output = re.compile(match, re.MULTILINE).sub(subs[match], output)
53
 
 
54
 
    return output
55
 
 
56
 
# Use a CGIRequest object to make the CGI environment look like the normal
57
 
# IVLE handler environment.
58
 
 
59
 
req = cgirequest.CGIRequest()
60
 
req.install_error_handler()
61
 
req.content_type = "text/html"
62
 
 
63
 
# Beginning of the page
64
 
req.write('<div id="ivle_padding">\n')
65
 
req.write('<h1>Diff</h1>\n')
 
40
# Set locale to UTF-8
 
41
locale.setlocale(locale.LC_CTYPE, "en_US.UTF-8")
66
42
 
67
43
# Default revisions
68
44
revs = [pysvn.Revision(x) for x in [pysvn.opt_revision_kind.base,
69
45
                                    pysvn.opt_revision_kind.working]]
70
 
# Override revisions from query string
71
 
fields = req.get_fieldstorage()
72
 
field_r = fields.getlist("r")
73
 
for ri in range(len(field_r)):
74
 
    r = ivle.svn.revision_from_string(field_r[ri])
 
46
 
 
47
# Override revisions from argv.
 
48
for ri in range(len(sys.argv[2:4])):
 
49
    r = ivle.svn.revision_from_string(sys.argv[2 + ri])
75
50
    if r is not None:
76
51
        revs[ri] = r
77
52
 
78
53
# Attempt to get the diff for these revisons
79
54
try:
80
 
    svnclient = pysvn.Client()
 
55
    svnclient = ivle.svn.create_auth_svn_client(username=ivle.conf.login,
 
56
                                                password=ivle.conf.svn_pass)
 
57
    svnclient.exception_style = 1
81
58
    diff = svnclient.diff
82
 
    diff_text = diff( '/tmp/svndiff',
83
 
        os.path.join('/home', req.path),
 
59
 
 
60
    # pysvn's diff tempfile behaviour changes with Subversion 1.6.x.
 
61
    # < 1.6 wants a filename, >= 1.6 wants a directory.
 
62
    if pysvn.svn_version > (1, 6):
 
63
        tmp_path = '/tmp'
 
64
    else:
 
65
        tmp_path = '/tmp/svndiff'
 
66
 
 
67
    diff_text = diff(tmp_path,
 
68
        os.path.join('/home', sys.argv[1]),
84
69
        revision1=revs[0],
85
70
        revision2=revs[1]
86
71
    )
87
 
 
88
 
    # Split up the udiff into individual files
89
 
    diff_matcher = re.compile(
90
 
        r'^Index: (.*)\n\=+\n((?:[^I].*\n)*)',re.MULTILINE
91
 
    )
92
 
    split_diff = diff_matcher.findall(diff_text)
93
 
 
94
 
    # Prints output
95
 
    for filediff in split_diff:
96
 
        filename = filediff[0]
97
 
        diffbody = htmlfy_diff(filediff[1])
98
 
        req.write('<p><b>File:</b> %s</p>\n'
99
 
            % cgi.escape(filename))
100
 
        req.write('<pre class="diff">%s</pre>\n' % diffbody)
101
 
 
102
 
except pysvn._pysvn_2_5.ClientError, e:
103
 
    req.write('<p><b>Error:</b></p>\n')
104
 
    req.write('<pre class="diff">%s</pre>\n' % cgi.escape(str(e)))
105
 
 
106
 
req.write('</div>\n')
 
72
    print json.dumps({'diff': diff_text.decode('utf-8')})
 
73
except pysvn.ClientError, e:
 
74
    error = e[0]
 
75
 
 
76
    try:
 
77
        code = e[1][0][1]
 
78
        # See subversion/include/svn_error_codes.h.
 
79
        # 150000: ERR_ENTRY_NOT_FOUND
 
80
        # 155007: WC_NOT_DIRECTORY.
 
81
        # 160013: FS_NOT_FOUND
 
82
        # 200005: UNVERSIONED_RESOURCE
 
83
        if code in (150000, 155007, 160013, 200005):
 
84
            error = 'notfound'
 
85
        else:
 
86
            error = '%s (code %d)' % (error, code) 
 
87
    except IndexError:
 
88
        pass
 
89
 
 
90
    print json.dumps({'error': error})