comparison pylons_app/controllers/changeset.py @ 294:42f5c36820ef

few validation bugfixes/ new repo changesets, first commit changesets
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 14 Jun 2010 01:16:57 +0200
parents cad478edb1c7
children fdf9f6ee5217
comparison
equal deleted inserted replaced
292:c4caeca9dd66 294:42f5c36820ef
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # encoding: utf-8 2 # encoding: utf-8
3 # changeset controller for pylons 3 # changeset controller for pylons
4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com> 4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
5 from pylons import tmpl_context as c, url
6 from pylons.controllers.util import redirect
7 from pylons_app.lib.auth import LoginRequired
8 from pylons_app.lib.base import BaseController, render
9 from pylons_app.model.hg_model import HgModel
10 from vcs.exceptions import RepositoryError
11 from vcs.nodes import FileNode
12 from vcs.utils import diffs as differ
13 import logging
14 import traceback
5 15
6 # This program is free software; you can redistribute it and/or 16 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License 17 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; version 2 18 # as published by the Free Software Foundation; version 2
9 # of the License or (at your opinion) any later version of the license. 19 # of the License or (at your opinion) any later version of the license.
20 """ 30 """
21 Created on April 25, 2010 31 Created on April 25, 2010
22 changeset controller for pylons 32 changeset controller for pylons
23 @author: marcink 33 @author: marcink
24 """ 34 """
25 from pylons import tmpl_context as c
26 from pylons_app.lib.auth import LoginRequired
27 from pylons_app.lib.base import BaseController, render
28 from pylons_app.model.hg_model import HgModel
29 from vcs.utils import diffs as differ
30 import logging
31 from vcs.nodes import FileNode
32 35
33 36
34 log = logging.getLogger(__name__) 37 log = logging.getLogger(__name__)
35 38
36 class ChangesetController(BaseController): 39 class ChangesetController(BaseController):
39 def __before__(self): 42 def __before__(self):
40 super(ChangesetController, self).__before__() 43 super(ChangesetController, self).__before__()
41 44
42 def index(self, revision): 45 def index(self, revision):
43 hg_model = HgModel() 46 hg_model = HgModel()
44 c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision) 47 try:
45 c.changeset_old = c.changeset.parents[0] 48 c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision)
46 c.changes = [] 49 except RepositoryError:
47 50 log.error(traceback.format_exc())
51 return redirect(url('hg_home'))
52 else:
53 try:
54 c.changeset_old = c.changeset.parents[0]
55 except IndexError:
56 c.changeset_old = None
57 c.changes = []
58
59 for node in c.changeset.added:
60 filenode_old = FileNode(node.path, '')
61 if filenode_old.is_binary or node.is_binary:
62 diff = 'binary file'
63 else:
64 f_udiff = differ.get_udiff(filenode_old, node)
65 diff = differ.DiffProcessor(f_udiff).as_html()
66 try:
67 diff = unicode(diff)
68 except:
69 log.warning('Decoding failed of %s', filenode_old)
70 log.warning('Decoding failed of %s', node)
71 diff = 'unsupported type'
72 cs1 = None
73 cs2 = node.last_changeset.raw_id
74 c.changes.append(('added', node, diff, cs1, cs2))
48 75
49 for node in c.changeset.added: 76 for node in c.changeset.changed:
50 filenode_old = FileNode(node.path, '') 77 filenode_old = c.changeset_old.get_node(node.path)
51 if filenode_old.is_binary or node.is_binary: 78 if filenode_old.is_binary or node.is_binary:
52 diff = 'binary file' 79 diff = 'binary file'
53 else: 80 else:
54 f_udiff = differ.get_udiff(filenode_old, node) 81 f_udiff = differ.get_udiff(filenode_old, node)
55 diff = differ.DiffProcessor(f_udiff).as_html() 82 diff = differ.DiffProcessor(f_udiff).as_html()
56 try: 83 try:
57 diff = unicode(diff) 84 diff = unicode(diff)
58 except: 85 except:
59 log.warning('Decoding failed of %s', filenode_old) 86 log.warning('Decoding failed of %s', filenode_old)
60 log.warning('Decoding failed of %s', node) 87 log.warning('Decoding failed of %s', node)
61 diff = 'unsupported type' 88 diff = 'unsupported type'
62 cs1 = None 89 cs1 = filenode_old.last_changeset.raw_id
63 cs2 = node.last_changeset.raw_id 90 cs2 = node.last_changeset.raw_id
64 c.changes.append(('added', node, diff, cs1, cs2)) 91 c.changes.append(('changed', node, diff, cs1, cs2))
65 92
66 for node in c.changeset.changed: 93 for node in c.changeset.removed:
67 filenode_old = c.changeset_old.get_node(node.path) 94 c.changes.append(('removed', node, None, None, None))
68 if filenode_old.is_binary or node.is_binary:
69 diff = 'binary file'
70 else:
71 f_udiff = differ.get_udiff(filenode_old, node)
72 diff = differ.DiffProcessor(f_udiff).as_html()
73 try:
74 diff = unicode(diff)
75 except:
76 log.warning('Decoding failed of %s', filenode_old)
77 log.warning('Decoding failed of %s', node)
78 diff = 'unsupported type'
79 cs1 = filenode_old.last_changeset.raw_id
80 cs2 = node.last_changeset.raw_id
81 c.changes.append(('changed', node, diff, cs1, cs2))
82
83 for node in c.changeset.removed:
84 c.changes.append(('removed', node, None, None, None))
85 95
86 return render('changeset/changeset.html') 96 return render('changeset/changeset.html')