~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/inventory_ui.py

  • Committer: Matt Nordhoff
  • Date: 2009-05-18 05:08:36 UTC
  • mfrom: (346.1.1 serve-http-config)
  • Revision ID: mnordhoff@mattnordhoff.com-20090518050836-r9uj0c2kfjfpbqf8
Fix 'bzr serve --http' (bug #377551).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#
 
2
# Copyright (C) 2008  Canonical Ltd.
2
3
# Copyright (C) 2006  Robey Pointer <robey@lag.net>
3
4
# Copyright (C) 2006  Goffredo Baroncelli <kreijack@inwind.it>
4
5
#
19
20
 
20
21
import logging
21
22
import posixpath
22
 
 
23
 
from paste.httpexceptions import HTTPServerError
 
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
24
29
 
25
30
from loggerhead import util
26
31
from loggerhead.controllers import TemplatedBranchView
28
33
 
29
34
log = logging.getLogger("loggerhead.controllers")
30
35
 
 
36
 
31
37
def dirname(path):
32
 
    while path.endswith('/'):
33
 
        path = path[:-1]
34
 
    path = posixpath.dirname(path)
 
38
    if path is not None:
 
39
        path = path.rstrip('/')
 
40
        path = urllib.quote(posixpath.dirname(path))
35
41
    return path
36
42
 
37
43
 
39
45
 
40
46
    template_path = 'loggerhead.templates.inventory'
41
47
 
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
 
 
 
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
48
102
        try:
49
 
            inv = h.get_inventory(revid)
50
 
        except:
51
 
            self.log.exception('Exception fetching changes')
52
 
            raise HTTPServerError('Could not fetch changes')
 
103
            revid = self.get_revid()
 
104
            rev_tree = branch.repository.revision_tree(revid)
 
105
        except errors.NoSuchRevision:
 
106
            raise HTTPNotFound()
53
107
 
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)
 
108
        file_id = kwargs.get('file_id', None)
 
109
        start_revid = kwargs.get('start_revid', None)
 
110
        sort_type = kwargs.get('sort', 'filename')
57
111
 
58
112
        # no navbar for revisions
59
113
        navigation = util.Container()
60
114
 
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 ])
 
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()
64
128
 
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:
 
129
        # Are we at the top of the tree
 
130
        if path in ['/', '']:
 
131
            updir = None
 
132
        else:
70
133
            updir = dirname(path)
71
 
            updir_file_id = idpath[-2]
72
 
        else:
73
 
            updir = None
74
 
            updir_file_id = None
75
 
        if updir == '/':
76
 
            updir_file_id = None
77
134
 
78
135
        # Directory Breadcrumbs
79
136
        directory_breadcrumbs = util.directory_breadcrumbs(
81
138
                self._branch.is_root,
82
139
                'files')
83
140
 
84
 
        # Create breadcrumb trail for the path within the branch
85
 
        branch_breadcrumbs = util.branch_breadcrumbs(path, inv, 'files')
86
 
        
 
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
 
87
163
        return {
88
164
            'branch': self._branch,
89
165
            'util': util,
90
166
            'revid': revid,
 
167
            'revno_url': revno_url,
91
168
            'change': change,
92
 
            'file_id': file_id,
93
169
            'path': path,
94
170
            'updir': updir,
95
 
            'updir_file_id': updir_file_id,
96
 
            'filelist': h.get_filelist(inv, file_id, sort_type),
97
 
            'history': h,
98
 
            'posixpath': posixpath,
 
171
            'filelist': filelist,
99
172
            'navigation': navigation,
100
173
            'url': self._branch.context_url,
101
174
            'start_revid': start_revid,