~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/controllers/inventory_ui.py

  • Committer: Robey Pointer
  • Date: 2007-01-14 23:45:53 UTC
  • Revision ID: robey@lag.net-20070114234553-l8zu9z144flojfpn
slight cleanup, and add '-f' option for running in the foreground.

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
#
18
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
18
#
20
19
 
 
20
import datetime
21
21
import logging
 
22
import os
22
23
import posixpath
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
import textwrap
 
25
import time
 
26
 
 
27
import turbogears
 
28
from cherrypy import HTTPRedirect, session
29
29
 
30
30
from loggerhead import util
31
 
from loggerhead.controllers import TemplatedBranchView
32
31
 
33
32
 
34
33
log = logging.getLogger("loggerhead.controllers")
35
34
 
36
 
 
37
35
def dirname(path):
38
 
    if path is not None:
39
 
        path = path.rstrip('/')
40
 
        path = urllib.quote(posixpath.dirname(path))
 
36
    while path.endswith('/'):
 
37
        path = path[:-1]
 
38
    path = posixpath.dirname(path)
41
39
    return path
42
40
 
43
 
 
44
 
class InventoryUI(TemplatedBranchView):
45
 
 
46
 
    template_path = 'loggerhead.templates.inventory'
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
 
41
        
 
42
class InventoryUI (object):
 
43
 
 
44
    def __init__(self, branch):
 
45
        # BranchView object
 
46
        self._branch = branch
 
47
        self.log = branch.log
 
48
 
 
49
    @turbogears.expose(html='loggerhead.templates.inventory')
 
50
    def default(self, *args, **kw):
 
51
        z = time.time()
 
52
        h = self._branch.get_history()
 
53
        
 
54
        if len(args) > 0:
 
55
            revid = h.fix_revid(args[0])
 
56
        else:
 
57
            revid = None
 
58
        
 
59
        file_id = kw.get('file_id', None)
 
60
        sort_type = kw.get('sort', None)
 
61
 
105
62
        try:
106
 
            revid = self.get_revid()
107
 
            rev_tree = branch.repository.revision_tree(revid)
108
 
        except errors.NoSuchRevision:
109
 
            raise HTTPNotFound()
110
 
 
111
 
        file_id = kwargs.get('file_id', None)
112
 
        start_revid = kwargs.get('start_revid', None)
113
 
        sort_type = kwargs.get('sort', 'filename')
 
63
            revid_list, revid = h.get_file_view(revid, file_id)
 
64
            rev = h.get_revision(revid)
 
65
            inv = h.get_inventory(revid)
 
66
        except Exception, x:
 
67
            self.log.error('Exception fetching changes: %s' % (x,))
 
68
            util.log_exception(self.log)
 
69
            raise HTTPRedirect(self._branch.url('/changes'))
114
70
 
115
71
        # no navbar for revisions
116
72
        navigation = util.Container()
117
73
 
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()
131
 
 
132
 
        # Are we at the top of the tree
133
 
        if path in ['/', '']:
134
 
            updir = None
135
 
        else:
 
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:
136
83
            updir = dirname(path)
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)
 
84
            updir_file_id = idpath[-2]
157
85
        else:
158
 
            start_revid = None
159
 
            change = None
160
 
            path = "/"
161
86
            updir = None
162
 
            revno_url = 'head:'
163
 
            branch_breadcrumbs = []
164
 
            filelist = []
 
87
            updir_file_id = None
 
88
        if updir == '/':
 
89
            updir_file_id = None
165
90
 
166
 
        return {
 
91
        vals = {
167
92
            'branch': self._branch,
168
93
            'util': util,
169
94
            'revid': revid,
170
 
            'revno_url': revno_url,
171
95
            'change': change,
 
96
            'file_id': file_id,
172
97
            'path': path,
173
98
            'updir': updir,
174
 
            'filelist': filelist,
 
99
            'updir_file_id': updir_file_id,
 
100
            'filelist': h.get_filelist(inv, path, sort_type),
 
101
            'history': h,
 
102
            'posixpath': posixpath,
175
103
            'navigation': navigation,
176
 
            'url': self._branch.context_url,
177
 
            'start_revid': start_revid,
178
 
            'fileview_active': True,
179
 
            'directory_breadcrumbs': directory_breadcrumbs,
180
 
            'branch_breadcrumbs': branch_breadcrumbs,
181
104
        }
 
105
        h.flush_cache()
 
106
        self.log.info('/inventory %r: %r secs' % (revid, time.time() - z))
 
107
        return vals