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 |
|
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