##// END OF EJS Templates
fixed error when browsing revisions on path that doesn't exist. Fixed files browsing. Fixed templates in branches and tags
marcink -
r145:3f01d02c default
parent child Browse files
Show More
@@ -1,67 +1,76 b''
1 import logging
1 import logging
2
2
3 from pylons import request, response, session, tmpl_context as c, url, config, app_globals as g
3 from pylons import request, response, session, tmpl_context as c, url, config, app_globals as g
4 from pylons.controllers.util import abort, redirect
4 from pylons.controllers.util import abort, redirect
5
5
6 from pylons_app.lib.base import BaseController, render
6 from pylons_app.lib.base import BaseController, render
7 from pylons_app.lib.utils import get_repo_slug
7 from pylons_app.lib.utils import get_repo_slug
8 from pylons_app.model.hg_model import HgModel
8 from pylons_app.model.hg_model import HgModel
9 from difflib import unified_diff
9 from difflib import unified_diff
10 from pylons_app.lib.differ import render_udiff
10 from pylons_app.lib.differ import render_udiff
11 from vcs.exceptions import RepositoryError
11 from vcs.exceptions import RepositoryError, ChangesetError
12
12
13 log = logging.getLogger(__name__)
13 log = logging.getLogger(__name__)
14
14
15 class FilesController(BaseController):
15 class FilesController(BaseController):
16 def __before__(self):
16 def __before__(self):
17 c.repos_prefix = config['repos_name']
17 c.repos_prefix = config['repos_name']
18 c.repo_name = get_repo_slug(request)
18 c.repo_name = get_repo_slug(request)
19
19
20 def index(self, repo_name, revision, f_path):
20 def index(self, repo_name, revision, f_path):
21 revision = request.POST.get('at_rev', None) or revision
22 hg_model = HgModel()
21 hg_model = HgModel()
23 c.repo = repo = hg_model.get_repo(c.repo_name)
22 c.repo = repo = hg_model.get_repo(c.repo_name)
23
24 revision = request.POST.get('at_rev', None) or revision
25 if request.POST.get('view_low'):
26 revision = int(revision) - 1
27 if request.POST.get('view_high'):
28 revision = int(revision) + 1
29 max_rev = len(c.repo.revisions) - 1
30 if revision > max_rev:
31 revision = max_rev
32
24 c.f_path = f_path
33 c.f_path = f_path
25 try:
34 try:
26 c.changeset = repo.get_changeset(repo._get_revision(revision))
35 c.changeset = repo.get_changeset(repo._get_revision(revision))
27 c.cur_rev = c.changeset.raw_id
36 c.cur_rev = c.changeset.raw_id
28 c.rev_nr = c.changeset.revision
37 c.rev_nr = c.changeset.revision
29 c.files_list = c.changeset.get_node(f_path)
38 c.files_list = c.changeset.get_node(f_path)
30 c.file_history = self._get_history(repo, c.files_list, f_path)
39 c.file_history = self._get_history(repo, c.files_list, f_path)
31 except RepositoryError:
40 except (RepositoryError, ChangesetError):
32 c.files_list = None
41 c.files_list = None
33
42
34 return render('files/files.html')
43 return render('files/files.html')
35
44
36 def diff(self, repo_name, f_path):
45 def diff(self, repo_name, f_path):
37 hg_model = HgModel()
46 hg_model = HgModel()
38 diff1 = request.GET.get('diff1')
47 diff1 = request.GET.get('diff1')
39 diff2 = request.GET.get('diff2')
48 diff2 = request.GET.get('diff2')
40 c.no_changes = diff1 == diff2
49 c.no_changes = diff1 == diff2
41 c.f_path = f_path
50 c.f_path = f_path
42 c.repo = hg_model.get_repo(c.repo_name)
51 c.repo = hg_model.get_repo(c.repo_name)
43 c.changeset_1 = c.repo.get_changeset(diff1)
52 c.changeset_1 = c.repo.get_changeset(diff1)
44 c.changeset_2 = c.repo.get_changeset(diff2)
53 c.changeset_2 = c.repo.get_changeset(diff2)
45
54
46 c.file_1 = c.changeset_1.get_node(f_path).content
55 c.file_1 = c.changeset_1.get_node(f_path).content
47 c.file_2 = c.changeset_2.get_node(f_path).content
56 c.file_2 = c.changeset_2.get_node(f_path).content
48 c.diff1 = 'r%s:%s' % (c.changeset_1.revision, c.changeset_1._short)
57 c.diff1 = 'r%s:%s' % (c.changeset_1.revision, c.changeset_1._short)
49 c.diff2 = 'r%s:%s' % (c.changeset_2.revision, c.changeset_2._short)
58 c.diff2 = 'r%s:%s' % (c.changeset_2.revision, c.changeset_2._short)
50
59
51 d2 = unified_diff(c.file_1.splitlines(1), c.file_2.splitlines(1))
60 d2 = unified_diff(c.file_1.splitlines(1), c.file_2.splitlines(1))
52 c.diff_files = render_udiff(udiff=d2)
61 c.diff_files = render_udiff(udiff=d2)
53
62
54 if len(c.diff_files) < 1:
63 if len(c.diff_files) < 1:
55 c.no_changes = True
64 c.no_changes = True
56 return render('files/file_diff.html')
65 return render('files/file_diff.html')
57
66
58 def _get_history(self, repo, node, f_path):
67 def _get_history(self, repo, node, f_path):
59 from vcs.nodes import NodeKind
68 from vcs.nodes import NodeKind
60 if not node.kind is NodeKind.FILE:
69 if not node.kind is NodeKind.FILE:
61 return []
70 return []
62 changesets = node.history
71 changesets = node.history
63 hist_l = []
72 hist_l = []
64 for chs in changesets:
73 for chs in changesets:
65 n_desc = 'r%s:%s' % (chs.revision, chs._short)
74 n_desc = 'r%s:%s' % (chs.revision, chs._short)
66 hist_l.append((chs._short, n_desc,))
75 hist_l.append((chs._short, n_desc,))
67 return hist_l
76 return hist_l
@@ -1,46 +1,45 b''
1 <%inherit file="/base/base.html"/>
1 <%inherit file="/base/base.html"/>
2 <%! from pylons_app.lib import filters %>
2 <%! from pylons_app.lib import filters %>
3 <%def name="title()">
3 <%def name="title()">
4 ${_('Branches')}
4 ${_('Branches')}
5 </%def>
5 </%def>
6 <%def name="breadcrumbs()">
6 <%def name="breadcrumbs()">
7 ${h.link_to(u'Home',h.url('/'))}
7 ${h.link_to(u'Home',h.url('/'))}
8 /
8 /
9 ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))}
9 ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))}
10 /
10 /
11 ${_('branches')}
11 ${_('branches')}
12 </%def>
12 </%def>
13 <%def name="page_nav()">
13 <%def name="page_nav()">
14 <form action="log">
14 <form action="log">
15 <dl class="search">
15 <dl class="search">
16 <dt><label>Search: </label></dt>
16 <dt><label>Search: </label></dt>
17 <dd><input type="text" name="rev" /></dd>
17 <dd><input type="text" name="rev" /></dd>
18 </dl>
18 </dl>
19 </form>
19 </form>
20
20
21 ${self.menu('branches')}
21 ${self.menu('branches')}
22 </%def>
22 </%def>
23 <%def name="main()">
23 <%def name="main()">
24
24
25 <h2 class="no-link no-border">${_('Branches')}</h2>
25 <h2 class="no-link no-border">${_('Branches')}</h2>
26
26
27 <table>
27 <table>
28 %for cnt,branch in enumerate(c.repo_branches):
28 %for cnt,branch in enumerate(c.repo_branches):
29 <tr class="parity${cnt%2}">
29 <tr class="parity${cnt%2}">
30 <td>${branch._ctx.date()|n,filters.age}</td>
30 <td>${branch._ctx.date()|n,filters.age}</td>
31 <td></td>
32 <td>
31 <td>
33 <span class="logtags">
32 <span class="logtags">
34 <span class="branchtag">${h.link_to(branch.branch,h.url('changeset_home',repo_name=c.repo_name,revision=branch._short))}</span>
33 <span class="branchtag">${h.link_to(branch.branch,h.url('changeset_home',repo_name=c.repo_name,revision=branch._short))}</span>
35 </span>
34 </span>
36 </td>
35 </td>
37 <td class="nowrap">
36 <td class="nowrap">
38 ${h.link_to(_('changeset'),h.url('changeset_home',repo_name=c.repo_name,revision=branch._short))}
37 ${h.link_to(_('changeset'),h.url('changeset_home',repo_name=c.repo_name,revision=branch._short))}
39 |
38 |
40 ${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name,revision=branch._short))}
39 ${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name,revision=branch._short))}
41 </td>
40 </td>
42 </tr>
41 </tr>
43 %endfor
42 %endfor
44 </table>
43 </table>
45
44
46 </%def> No newline at end of file
45 </%def>
@@ -1,43 +1,43 b''
1 <%inherit file="/base/base.html"/>
1 <%inherit file="/base/base.html"/>
2
2
3 <%def name="title()">
3 <%def name="title()">
4 ${_('Repository managment')}
4 ${_('Repository managment')}
5 </%def>
5 </%def>
6 <%def name="breadcrumbs()">
6 <%def name="breadcrumbs()">
7 ${h.link_to(u'Home',h.url('/'))}
7 ${h.link_to(u'Home',h.url('/'))}
8 /
8 /
9 ${h.link_to(c.repo_name,h.url('files_home',repo_name=c.repo_name))}
9 ${h.link_to(c.repo_name,h.url('files_home',repo_name=c.repo_name))}
10 /
10 /
11 ${_('files')}
11 ${_('files')}
12 </%def>
12 </%def>
13 <%def name="page_nav()">
13 <%def name="page_nav()">
14 <form action="log">
14 <form action="log">
15 <dl class="search">
15 <dl class="search">
16 <dt><label>Search: </label></dt>
16 <dt><label>Search: </label></dt>
17 <dd><input type="text" name="rev" /></dd>
17 <dd><input type="text" name="rev" /></dd>
18 </dl>
18 </dl>
19 </form>
19 </form>
20
20
21 ${self.menu('files')}
21 ${self.menu('files')}
22 </%def>
22 </%def>
23 <%def name="css()">
23 <%def name="css()">
24 <link rel="stylesheet" href="/css/monoblue_custom.css" type="text/css" />
24 <link rel="stylesheet" href="/css/monoblue_custom.css" type="text/css" />
25 <link rel="stylesheet" href="/css/pygments.css" type="text/css" />
25 <link rel="stylesheet" href="/css/pygments.css" type="text/css" />
26 </%def>
26 </%def>
27 <%def name="main()">
27 <%def name="main()">
28
28
29 <h2 class="no-link no-border">${_('Files')}</h2>
29 <h2 class="no-link no-border">${_('Files')}</h2>
30 <div id="files_data">
30 <div id="files_data">
31 %if c.files_list:
31 %if c.files_list:
32 <h2>${_('Location')}: ${h.files_breadcrumbs(c.repo_name,c.cur_rev,c.files_list.path)}</h2>
32 <h2>${_('Location')}: ${h.files_breadcrumbs(c.repo_name,c.cur_rev,c.files_list.path)}</h2>
33 %if c.files_list.is_dir():
33 %if c.files_list.is_dir():
34 <%include file='files_browser.html'/>
34 <%include file='files_browser.html'/>
35 %else:
35 %else:
36 <%include file='files_source.html'/>
36 <%include file='files_source.html'/>
37 %endif
37 %endif
38 %else:
38 %else:
39 <h2>${_('No files')}</h2>
39 <h2><a href="#" onClick="javascript:parent.history.back();" target="main">${_('Go back')}</a> ${_('No files at given path')}: "${c.f_path or "/"}" </h2>
40 %endif
40 %endif
41
41
42 </div>
42 </div>
43 </%def> No newline at end of file
43 </%def>
@@ -1,66 +1,66 b''
1 <%def name="file_class(node)">
1 <%def name="file_class(node)">
2 %if node.is_file():
2 %if node.is_file():
3 <%return "browser-file" %>
3 <%return "browser-file" %>
4 %else:
4 %else:
5 <%return "browser-dir"%>
5 <%return "browser-dir"%>
6 %endif
6 %endif
7 </%def>
7 </%def>
8 <div id="body" class="browserblock">
8 <div id="body" class="browserblock">
9 <div class="browser-header">
9 <div class="browser-header">
10 ${h.form(h.url.current())}
10 ${h.form(h.url.current())}
11 <span>${_('view')}@rev:${h.text('at_rev',value=c.rev_nr,size='5')}</span>
11 <span>${_('view')}@rev ${h.submit('view_low','-')}${h.text('at_rev',value=c.rev_nr,size='5')}${h.submit('view_high','+')}</span>
12 ${h.submit('view','view')}
12 ${h.submit('view','view')}
13 ${h.end_form()}
13 ${h.end_form()}
14 </div>
14 </div>
15 <div class="browser-body">
15 <div class="browser-body">
16 <table class="code-browser">
16 <table class="code-browser">
17 <thead>
17 <thead>
18 <tr>
18 <tr>
19 <th>${_('Name')}</th>
19 <th>${_('Name')}</th>
20 <th>${_('Size')}</th>
20 <th>${_('Size')}</th>
21 <th>${_('Revision')}</th>
21 <th>${_('Revision')}</th>
22 <th>${_('Last modified')}</th>
22 <th>${_('Last modified')}</th>
23 <th>${_('Last commiter')}</th>
23 <th>${_('Last commiter')}</th>
24 </tr>
24 </tr>
25 </thead>
25 </thead>
26 <tr class="parity0">
26 <tr class="parity0">
27 <td>
27 <td>
28 % if c.files_list.parent:
28 % if c.files_list.parent:
29 ${h.link_to('..',h.url('files_home',repo_name=c.repo_name,revision=c.cur_rev,f_path=c.files_list.parent.path),class_="browser-dir")}
29 ${h.link_to('..',h.url('files_home',repo_name=c.repo_name,revision=c.cur_rev,f_path=c.files_list.parent.path),class_="browser-dir")}
30 %endif
30 %endif
31 </td>
31 </td>
32 <td></td>
32 <td></td>
33 <td></td>
33 <td></td>
34 <td></td>
34 <td></td>
35 <td></td>
35 <td></td>
36 </tr>
36 </tr>
37 %for cnt,node in enumerate(c.files_list,1):
37 %for cnt,node in enumerate(c.files_list,1):
38 <tr class="parity${cnt%2}">
38 <tr class="parity${cnt%2}">
39 <td>
39 <td>
40 ${h.link_to(node.name,h.url('files_home',repo_name=c.repo_name,revision=c.cur_rev,f_path=node.path),class_=file_class(node))}
40 ${h.link_to(node.name,h.url('files_home',repo_name=c.repo_name,revision=c.cur_rev,f_path=node.path),class_=file_class(node))}
41 </td>
41 </td>
42 <td>
42 <td>
43 %if node.is_file():
43 %if node.is_file():
44 ${h.filesizeformat(node.size)}
44 ${h.filesizeformat(node.size)}
45 %endif
45 %endif
46 </td>
46 </td>
47 <td>
47 <td>
48 %if node.is_file():
48 %if node.is_file():
49 ${node.last_changeset.revision}
49 ${node.last_changeset.revision}
50 %endif
50 %endif
51 </td>
51 </td>
52 <td>
52 <td>
53 %if node.is_file():
53 %if node.is_file():
54 ${node.last_changeset.date}
54 ${node.last_changeset.date}
55 %endif
55 %endif
56 </td>
56 </td>
57 <td>
57 <td>
58 %if node.is_file():
58 %if node.is_file():
59 ${node.last_changeset.author}
59 ${node.last_changeset.author}
60 %endif
60 %endif
61 </td>
61 </td>
62 </tr>
62 </tr>
63 %endfor
63 %endfor
64 </table>
64 </table>
65 </div>
65 </div>
66 </div> No newline at end of file
66 </div>
@@ -1,48 +1,47 b''
1 <%inherit file="/base/base.html"/>
1 <%inherit file="/base/base.html"/>
2 <%!
2 <%!
3 from pylons_app.lib import filters
3 from pylons_app.lib import filters
4 %>
4 %>
5 <%def name="title()">
5 <%def name="title()">
6 ${_('Tags')}
6 ${_('Tags')}
7 </%def>
7 </%def>
8 <%def name="breadcrumbs()">
8 <%def name="breadcrumbs()">
9 ${h.link_to(u'Home',h.url('/'))}
9 ${h.link_to(u'Home',h.url('/'))}
10 /
10 /
11 ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))}
11 ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))}
12 /
12 /
13 ${_('tags')}
13 ${_('tags')}
14 </%def>
14 </%def>
15 <%def name="page_nav()">
15 <%def name="page_nav()">
16 <form action="log">
16 <form action="log">
17 <dl class="search">
17 <dl class="search">
18 <dt><label>Search: </label></dt>
18 <dt><label>Search: </label></dt>
19 <dd><input type="text" name="rev" /></dd>
19 <dd><input type="text" name="rev" /></dd>
20 </dl>
20 </dl>
21 </form>
21 </form>
22
22
23 ${self.menu('tags')}
23 ${self.menu('tags')}
24 </%def>
24 </%def>
25 <%def name="main()">
25 <%def name="main()">
26
26
27 <h2 class="no-link no-border">${_('Tags')}</h2>
27 <h2 class="no-link no-border">${_('Tags')}</h2>
28
28
29 <table>
29 <table>
30 %for cnt,tag in enumerate(c.repo_tags):
30 %for cnt,tag in enumerate(c.repo_tags):
31 <tr class="parity${cnt%2}">
31 <tr class="parity${cnt%2}">
32 <td>${tag._ctx.date()|n,filters.age}</td>
32 <td>${tag._ctx.date()|n,filters.age}</td>
33 <td></td>
34 <td>
33 <td>
35 <span class="logtags">
34 <span class="logtags">
36 <span class="tagtag">${h.link_to(tag.tags[-1],h.url('changeset_home',repo_name=c.repo_name,revision=tag._short))}</span>
35 <span class="tagtag">${h.link_to(tag.tags[-1],h.url('changeset_home',repo_name=c.repo_name,revision=tag._short))}</span>
37 </span>
36 </span>
38 </td>
37 </td>
39 <td class="nowrap">
38 <td class="nowrap">
40 ${h.link_to(_('changeset'),h.url('changeset_home',repo_name=c.repo_name,revision=tag._short))}
39 ${h.link_to(_('changeset'),h.url('changeset_home',repo_name=c.repo_name,revision=tag._short))}
41 |
40 |
42 ${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name,revision=tag._short))}
41 ${h.link_to(_('files'),h.url('files_home',repo_name=c.repo_name,revision=tag._short))}
43 </td>
42 </td>
44 </tr>
43 </tr>
45 %endfor
44 %endfor
46 </table>
45 </table>
47
46
48 </%def> No newline at end of file
47 </%def>
General Comments 0
You need to be logged in to leave comments. Login now