~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/inventory_ui.py

  • Committer: Martin Albisetti
  • Date: 2008-08-20 23:37:59 UTC
  • Revision ID: argentina@gmail.com-20080820233759-y57h48eon7kig1fh
Tweak footer to look better.

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
 
 
23
from paste.httpexceptions import HTTPServerError
29
24
 
30
25
from loggerhead import util
31
26
from loggerhead.controllers import TemplatedBranchView
33
28
 
34
29
log = logging.getLogger("loggerhead.controllers")
35
30
 
36
 
 
37
31
def dirname(path):
38
 
    if path is not None:
39
 
        path = path.rstrip('/')
40
 
        path = urllib.quote(posixpath.dirname(path))
 
32
    while path.endswith('/'):
 
33
        path = path[:-1]
 
34
    path = posixpath.dirname(path)
41
35
    return path
42
36
 
43
37
 
45
39
 
46
40
    template_path = 'loggerhead.templates.inventory'
47
41
 
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
 
42
    def get_values(self, h, args, kw, headers):
 
43
        if len(args) > 0:
 
44
            revid = h.fix_revid(args[0])
 
45
        else:
 
46
            revid = h.last_revid
 
47
 
102
48
        try:
103
 
            revid = self.get_revid()
104
 
            rev_tree = branch.repository.revision_tree(revid)
105
 
        except errors.NoSuchRevision:
106
 
            raise HTTPNotFound()
 
49
            inv = h.get_inventory(revid)
 
50
        except:
 
51
            self.log.exception('Exception fetching changes')
 
52
            raise HTTPServerError('Could not fetch changes')
107
53
 
108
 
        file_id = kwargs.get('file_id', None)
109
 
        start_revid = kwargs.get('start_revid', None)
110
 
        sort_type = kwargs.get('sort', 'filename')
 
54
        file_id = kw.get('file_id', inv.root.file_id)
 
55
        start_revid = kw.get('start_revid', None)
 
56
        sort_type = kw.get('sort', None)
111
57
 
112
58
        # no navbar for revisions
113
59
        navigation = util.Container()
114
60
 
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()
 
61
        change = h.get_changes([ revid ])[0]
 
62
        # add parent & merge-point branch-nick info, in case it's useful
 
63
        h.get_branch_nicks([ change ])
128
64
 
129
 
        # Are we at the top of the tree
130
 
        if path in ['/', '']:
131
 
            updir = None
132
 
        else:
 
65
        path = inv.id2path(file_id)
 
66
        if not path.startswith('/'):
 
67
            path = '/' + path
 
68
        idpath = inv.get_idpath(file_id)
 
69
        if len(idpath) > 1:
133
70
            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)
 
71
            updir_file_id = idpath[-2]
154
72
        else:
155
 
            start_revid = None
156
 
            change = None
157
 
            path = "/"
158
73
            updir = None
159
 
            revno_url = 'head:'
160
 
            branch_breadcrumbs = []
161
 
            filelist = []
 
74
            updir_file_id = None
 
75
        if updir == '/':
 
76
            updir_file_id = None
162
77
 
163
78
        return {
164
79
            'branch': self._branch,
165
80
            'util': util,
166
81
            'revid': revid,
167
 
            'revno_url': revno_url,
168
82
            'change': change,
 
83
            'file_id': file_id,
169
84
            'path': path,
170
85
            'updir': updir,
171
 
            'filelist': filelist,
 
86
            'updir_file_id': updir_file_id,
 
87
            'filelist': h.get_filelist(inv, file_id, sort_type),
 
88
            'history': h,
 
89
            'posixpath': posixpath,
172
90
            'navigation': navigation,
173
91
            'url': self._branch.context_url,
174
92
            'start_revid': start_revid,
175
93
            'fileview_active': True,
176
 
            'directory_breadcrumbs': directory_breadcrumbs,
177
 
            'branch_breadcrumbs': branch_breadcrumbs,
178
94
        }