~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/inventory_ui.py

convert revision view too

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#
2
 
# Copyright (C) 2008  Canonical Ltd.
3
2
# Copyright (C) 2006  Robey Pointer <robey@lag.net>
4
3
# Copyright (C) 2006  Goffredo Baroncelli <kreijack@inwind.it>
5
4
#
20
19
 
21
20
import logging
22
21
import posixpath
23
 
import urllib
24
 
 
25
 
from paste.httpexceptions import HTTPNotFound
26
 
 
27
 
from bzrlib import errors
28
 
from bzrlib.revision import is_null as is_null_rev
 
22
import time
 
23
 
 
24
import turbogears
 
25
from cherrypy import InternalError
29
26
 
30
27
from loggerhead import util
31
 
from loggerhead.controllers import TemplatedBranchView
 
28
from loggerhead.templatefunctions import templatefunctions
32
29
 
33
30
 
34
31
log = logging.getLogger("loggerhead.controllers")
35
32
 
36
 
 
37
33
def dirname(path):
38
 
    if path is not None:
39
 
        path = path.rstrip('/')
40
 
        path = urllib.quote(posixpath.dirname(path))
 
34
    while path.endswith('/'):
 
35
        path = path[:-1]
 
36
    path = posixpath.dirname(path)
41
37
    return path
42
38
 
43
 
 
44
 
class InventoryUI(TemplatedBranchView):
45
 
 
46
 
    template_path = 'loggerhead.templates.inventory'
47
 
 
48
 
    def get_filelist(self, inv, path, sort_type):
49
 
        """
50
 
        return the list of all files (and their attributes) within a given
51
 
        path subtree.
52
 
 
53
 
        @param inv: The inventory.
54
 
        @param path: The path of a directory within the inventory.
55
 
        @param sort_type: How to sort the results... XXX.
56
 
        """
57
 
        file_id = inv.path2id(path)
58
 
        dir_ie = inv[file_id]
59
 
        file_list = []
60
 
 
61
 
        revid_set = set()
62
 
 
63
 
        for filename, entry in dir_ie.children.iteritems():
64
 
            revid_set.add(entry.revision)
65
 
 
66
 
        change_dict = {}
67
 
        for change in self._history.get_changes(list(revid_set)):
68
 
            change_dict[change.revid] = change
69
 
 
70
 
        for filename, entry in dir_ie.children.iteritems():
71
 
            pathname = filename
72
 
            if entry.kind == 'directory':
73
 
                pathname += '/'
74
 
            if path == '':
75
 
                absolutepath = pathname
76
 
            else:
77
 
                absolutepath = path + '/' + pathname
78
 
            revid = entry.revision
79
 
 
80
 
            file = util.Container(
81
 
                filename=filename, executable=entry.executable,
82
 
                kind=entry.kind, absolutepath=absolutepath,
83
 
                file_id=entry.file_id, size=entry.text_size, revid=revid,
84
 
                change=change_dict[revid])
85
 
            file_list.append(file)
86
 
 
87
 
        if sort_type == 'filename':
88
 
            file_list.sort(key=lambda x: x.filename.lower()) # case-insensitive
89
 
        elif sort_type == 'size':
90
 
            file_list.sort(key=lambda x: x.size)
91
 
        elif sort_type == 'date':
92
 
            file_list.sort(key=lambda x: x.change.date)
93
 
 
94
 
        # Always sort directories first.
95
 
        file_list.sort(key=lambda x: x.kind != 'directory')
96
 
 
97
 
        return file_list
98
 
 
99
 
    def get_values(self, path, kwargs, headers):
100
 
        history = self._history
101
 
        branch = history._branch
 
39
        
 
40
class InventoryUI (object):
 
41
 
 
42
    def __init__(self, branch):
 
43
        # BranchView object
 
44
        self._branch = branch
 
45
        self.log = branch.log
 
46
 
 
47
    @util.strip_whitespace
 
48
    @turbogears.expose(html='zpt:loggerhead.templates.inventory')
 
49
    def default(self, *args, **kw):
 
50
        z = time.time()
 
51
        h = self._branch.get_history()
 
52
        util.set_context(kw)
 
53
 
 
54
        h._branch.lock_read()
102
55
        try:
103
 
            revid = self.get_revid()
104
 
            rev_tree = branch.repository.revision_tree(revid)
105
 
        except errors.NoSuchRevision:
106
 
            raise HTTPNotFound()
107
 
 
108
 
        file_id = kwargs.get('file_id', None)
109
 
        start_revid = kwargs.get('start_revid', None)
110
 
        sort_type = kwargs.get('sort', 'filename')
111
 
 
112
 
        # no navbar for revisions
113
 
        navigation = util.Container()
114
 
 
115
 
        if path is not None:
116
 
            path = path.rstrip('/')
117
 
            file_id = rev_tree.path2id(path)
118
 
            if file_id is None:
119
 
                raise HTTPNotFound()
120
 
        else:
121
 
            if file_id is None:
122
 
                path = ''
123
 
            else:
124
 
                try:
125
 
                    path = rev_tree.id2path(file_id)
126
 
                except errors.NoSuchId:
127
 
                    raise HTTPNotFound()
128
 
 
129
 
        # Are we at the top of the tree
130
 
        if path in ['/', '']:
131
 
            updir = None
132
 
        else:
133
 
            updir = dirname(path)
134
 
 
135
 
        # Directory Breadcrumbs
136
 
        directory_breadcrumbs = util.directory_breadcrumbs(
137
 
                self._branch.friendly_name,
138
 
                self._branch.is_root,
139
 
                'files')
140
 
 
141
 
        if not is_null_rev(revid):
142
 
 
143
 
            change = history.get_changes([ revid ])[0]
144
 
            # If we're looking at the tip, use head: in the URL instead
145
 
            if revid == branch.last_revision():
146
 
                revno_url = 'head:'
147
 
            else:
148
 
                revno_url = history.get_revno(revid)
149
 
            history.add_branch_nicks(change)
150
 
 
151
 
            # Create breadcrumb trail for the path within the branch
152
 
            branch_breadcrumbs = util.branch_breadcrumbs(path, rev_tree, 'files')
153
 
            filelist = self.get_filelist(rev_tree.inventory, path, sort_type)
154
 
        else:
155
 
            start_revid = None
156
 
            change = None
157
 
            path = "/"
158
 
            updir = None
159
 
            revno_url = 'head:'
160
 
            branch_breadcrumbs = []
161
 
            filelist = []
162
 
 
163
 
        return {
164
 
            'branch': self._branch,
165
 
            'util': util,
166
 
            'revid': revid,
167
 
            'revno_url': revno_url,
168
 
            'change': change,
169
 
            'path': path,
170
 
            'updir': updir,
171
 
            'filelist': filelist,
172
 
            'navigation': navigation,
173
 
            'url': self._branch.context_url,
174
 
            'start_revid': start_revid,
175
 
            'fileview_active': True,
176
 
            'directory_breadcrumbs': directory_breadcrumbs,
177
 
            'branch_breadcrumbs': branch_breadcrumbs,
178
 
        }
 
56
            if len(args) > 0:
 
57
                revid = h.fix_revid(args[0])
 
58
            else:
 
59
                revid = h.last_revid
 
60
 
 
61
            try:
 
62
                inv = h.get_inventory(revid)
 
63
            except:
 
64
                self.log.exception('Exception fetching changes')
 
65
                raise InternalError('Could not fetch changes')
 
66
 
 
67
            file_id = kw.get('file_id', inv.root.file_id)
 
68
            start_revid = kw.get('start_revid', None)
 
69
            sort_type = kw.get('sort', None)
 
70
 
 
71
            # no navbar for revisions
 
72
            navigation = util.Container()
 
73
 
 
74
            change = h.get_changes([ revid ])[0]
 
75
            # add parent & merge-point branch-nick info, in case it's useful
 
76
            h.get_branch_nicks([ change ])
 
77
 
 
78
            path = inv.id2path(file_id)
 
79
            if not path.startswith('/'):
 
80
                path = '/' + path
 
81
            idpath = inv.get_idpath(file_id)
 
82
            if len(idpath) > 1:
 
83
                updir = dirname(path)
 
84
                updir_file_id = idpath[-2]
 
85
            else:
 
86
                updir = None
 
87
                updir_file_id = None
 
88
            if updir == '/':
 
89
                updir_file_id = None
 
90
 
 
91
            vals = {
 
92
                'branch': self._branch,
 
93
                'util': util,
 
94
                'revid': revid,
 
95
                'change': change,
 
96
                'file_id': file_id,
 
97
                'path': path,
 
98
                'updir': updir,
 
99
                'updir_file_id': updir_file_id,
 
100
                'filelist': h.get_filelist(inv, file_id, sort_type),
 
101
                'history': h,
 
102
                'posixpath': posixpath,
 
103
                'navigation': navigation,
 
104
                'url': self._branch.context_url,
 
105
                'start_revid': start_revid,
 
106
            }
 
107
            vals.update(templatefunctions)
 
108
            self.log.info('/inventory %r: %r secs' % (revid, time.time() - z))
 
109
            return vals
 
110
        finally:
 
111
            h._branch.unlock()