~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/inventory_ui.py

  • Committer: John Arbash Meinel
  • Date: 2011-03-16 12:29:36 UTC
  • Revision ID: john@arbash-meinel.com-20110316122936-u1u98hqpwyv08ry9
Import sys at the start of loggerhead/__init__.py we use it as part of startup.
And sys is always loaded, no need to avoid importing it.

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, HTTPMovedPermanently
 
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, revno_url):
 
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
        if dir_ie.kind != 'directory':
 
62
            raise HTTPMovedPermanently(self._branch.context_url(['/view', revno_url, path]))
 
63
 
 
64
        revid_set = set()
 
65
 
 
66
        for filename, entry in dir_ie.children.iteritems():
 
67
            revid_set.add(entry.revision)
 
68
 
 
69
        change_dict = {}
 
70
        for change in self._history.get_changes(list(revid_set)):
 
71
            change_dict[change.revid] = change
 
72
 
 
73
        for filename, entry in dir_ie.children.iteritems():
 
74
            pathname = filename
 
75
            if entry.kind == 'directory':
 
76
                pathname += '/'
 
77
            if path == '':
 
78
                absolutepath = pathname
 
79
            else:
 
80
                absolutepath = path + '/' + pathname
 
81
            revid = entry.revision
 
82
 
 
83
            file = util.Container(
 
84
                filename=filename, executable=entry.executable,
 
85
                kind=entry.kind, absolutepath=absolutepath,
 
86
                file_id=entry.file_id, size=entry.text_size, revid=revid,
 
87
                change=change_dict[revid])
 
88
            file_list.append(file)
 
89
 
 
90
        if sort_type == 'filename':
 
91
            file_list.sort(key=lambda x: x.filename.lower()) # case-insensitive
 
92
        elif sort_type == 'size':
 
93
            file_list.sort(key=lambda x: x.size)
 
94
        elif sort_type == 'date':
 
95
            file_list.sort(key=lambda x: x.change.date)
 
96
 
 
97
        # Always sort directories first.
 
98
        file_list.sort(key=lambda x: x.kind != 'directory')
 
99
 
 
100
        return file_list
 
101
 
 
102
    def get_values(self, path, kwargs, headers):
 
103
        history = self._history
 
104
        branch = history._branch
48
105
        try:
49
 
            inv = h.get_inventory(revid)
50
 
        except:
51
 
            self.log.exception('Exception fetching changes')
52
 
            raise HTTPServerError('Could not fetch changes')
 
106
            revid = self.get_revid()
 
107
            rev_tree = branch.repository.revision_tree(revid)
 
108
        except errors.NoSuchRevision:
 
109
            raise HTTPNotFound()
53
110
 
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
        file_id = kwargs.get('file_id', None)
 
112
        start_revid = kwargs.get('start_revid', None)
 
113
        sort_type = kwargs.get('sort', 'filename')
57
114
 
58
115
        # no navbar for revisions
59
116
        navigation = util.Container()
60
117
 
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 ])
 
118
        if path is not None:
 
119
            path = path.rstrip('/')
 
120
            file_id = rev_tree.path2id(path)
 
121
            if file_id is None:
 
122
                raise HTTPNotFound()
 
123
        else:
 
124
            if file_id is None:
 
125
                path = ''
 
126
            else:
 
127
                try:
 
128
                    path = rev_tree.id2path(file_id)
 
129
                except errors.NoSuchId:
 
130
                    raise HTTPNotFound()
64
131
 
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:
 
132
        # Are we at the top of the tree
 
133
        if path in ['/', '']:
 
134
            updir = None
 
135
        else:
70
136
            updir = dirname(path)
71
 
            updir_file_id = idpath[-2]
 
137
 
 
138
        # Directory Breadcrumbs
 
139
        directory_breadcrumbs = util.directory_breadcrumbs(
 
140
                self._branch.friendly_name,
 
141
                self._branch.is_root,
 
142
                'files')
 
143
 
 
144
        if not is_null_rev(revid):
 
145
 
 
146
            change = history.get_changes([ revid ])[0]
 
147
            # If we're looking at the tip, use head: in the URL instead
 
148
            if revid == branch.last_revision():
 
149
                revno_url = 'head:'
 
150
            else:
 
151
                revno_url = history.get_revno(revid)
 
152
            history.add_branch_nicks(change)
 
153
 
 
154
            # Create breadcrumb trail for the path within the branch
 
155
            branch_breadcrumbs = util.branch_breadcrumbs(path, rev_tree, 'files')
 
156
            filelist = self.get_filelist(rev_tree.inventory, path, sort_type, revno_url)
72
157
        else:
 
158
            start_revid = None
 
159
            change = None
 
160
            path = "/"
73
161
            updir = None
74
 
            updir_file_id = None
75
 
        if updir == '/':
76
 
            updir_file_id = None
 
162
            revno_url = 'head:'
 
163
            branch_breadcrumbs = []
 
164
            filelist = []
77
165
 
78
166
        return {
79
167
            'branch': self._branch,
80
168
            'util': util,
81
169
            'revid': revid,
 
170
            'revno_url': revno_url,
82
171
            'change': change,
83
 
            'file_id': file_id,
84
172
            'path': path,
85
173
            'updir': updir,
86
 
            'updir_file_id': updir_file_id,
87
 
            'filelist': h.get_filelist(inv, file_id, sort_type),
88
 
            'history': h,
89
 
            'posixpath': posixpath,
 
174
            'filelist': filelist,
90
175
            'navigation': navigation,
91
176
            'url': self._branch.context_url,
92
177
            'start_revid': start_revid,
93
178
            'fileview_active': True,
 
179
            'directory_breadcrumbs': directory_breadcrumbs,
 
180
            'branch_breadcrumbs': branch_breadcrumbs,
94
181
        }