/loggerhead/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/loggerhead/trunk

« back to all changes in this revision

Viewing changes to loggerhead/controllers/directory_ui.py

  • Committer: Jelmer Vernooij
  • Date: 2018-10-20 17:34:46 UTC
  • mto: (491.6.1 breezy)
  • mto: This revision was merged to the branch mainline in revision 494.
  • Revision ID: jelmer@jelmer.uk-20181020173446-eywejowpq25sg8pw
Rename serve-branches to loggerhead-serve.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2008  Canonical Ltd.
 
2
#                     (Authored by Martin Albisetti <argentina@gmail.com>)
 
3
#
 
4
# This program is free software; you can redistribute it and/or modify
 
5
# it under the terms of the GNU General Public License as published by
 
6
# the Free Software Foundation; either version 2 of the License, or
 
7
# (at your option) any later version.
 
8
#
 
9
# This program is distributed in the hope that it will be useful,
 
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
# GNU General Public License for more details.
 
13
#
 
14
# You should have received a copy of the GNU General Public License
 
15
# along with this program; if not, write to the Free Software
 
16
# Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335  USA
 
17
#
 
18
 
 
19
import datetime
 
20
import logging
 
21
import stat
 
22
import urllib
 
23
 
 
24
from breezy import branch, errors
 
25
 
 
26
from .. import util
 
27
from ..controllers import TemplatedBranchView
 
28
 
 
29
 
 
30
class DirEntry(object):
 
31
 
 
32
    def __init__(self, dirname, parity, branch):
 
33
        self.dirname = urllib.unquote(dirname)
 
34
        self.parity = parity
 
35
        self.branch = branch
 
36
        if branch is not None:
 
37
            # If a branch is empty, bzr raises an exception when trying this
 
38
            try:
 
39
                self.last_revision = branch.repository.get_revision(branch.last_revision())
 
40
                self.last_change_time = datetime.datetime.utcfromtimestamp(self.last_revision.timestamp)
 
41
            except errors.NoSuchRevision:
 
42
                self.last_revision = None
 
43
                self.last_change_time = None
 
44
 
 
45
 
 
46
class DirectoryUI(TemplatedBranchView):
 
47
    """
 
48
    """
 
49
 
 
50
    template_name = 'directory'
 
51
 
 
52
    def __init__(self, static_url_base, transport, name):
 
53
 
 
54
        class _branch(object):
 
55
            context_url = 1
 
56
 
 
57
            @staticmethod
 
58
            def static_url(path):
 
59
                return self._static_url_base + path
 
60
        self._branch = _branch
 
61
        self._history_callable = lambda: None
 
62
        self._name = name
 
63
        self._static_url_base = static_url_base
 
64
        self.transport = transport
 
65
        self.log = logging.getLogger('')
 
66
 
 
67
    def get_values(self, path, kwargs, response):
 
68
        listing = [d for d in self.transport.list_dir('.')
 
69
                   if not d.startswith('.')]
 
70
        listing.sort(key=lambda x: x.lower())
 
71
        dirs = []
 
72
        parity = 0
 
73
        for d in listing:
 
74
            try:
 
75
                b = branch.Branch.open_from_transport(self.transport.clone(d))
 
76
            except:
 
77
                # TODO(jelmer): don't catch all exceptions here
 
78
                try:
 
79
                    if not stat.S_ISDIR(self.transport.stat(d).st_mode):
 
80
                        continue
 
81
                except errors.NoSuchFile:
 
82
                    continue
 
83
                b = None
 
84
            else:
 
85
                if not b.get_config().get_user_option_as_bool('http_serve', default=True):
 
86
                    continue
 
87
            dirs.append(DirEntry(d, parity, b))
 
88
            parity = 1 - parity
 
89
        # Create breadcrumb trail
 
90
        directory_breadcrumbs = util.directory_breadcrumbs(
 
91
                self._name,
 
92
                False,
 
93
                'directory')
 
94
        return {
 
95
            'dirs': dirs,
 
96
            'name': self._name,
 
97
            'directory_breadcrumbs': directory_breadcrumbs,
 
98
            }