Updated patch that fixes an error if hidden_files is empty Sorry for the noise :)
>From 275b94fe8031ac81c75388190dcd58709b14f8d7 Mon Sep 17 00:00:00 2001 From: Jason Pleau <ja...@jpleau.ca> Date: Mon, 9 Mar 2015 12:34:06 -0400 Subject: [PATCH] add a new hidden_files setting in config.ini
Right now the .pc/ exclusion in directory listings is hardcoded. This new hidden_files configuration allows us to be more flexible in what is shown or hidden in those listings. */.pc/ is added as a default value for this configuration setting. Closes #762944 --- debsources/app/templates/source_folder.html | 48 ++++++++++++++++------------- debsources/app/views.py | 5 ++- debsources/models.py | 18 +++++++---- debsources/tests/test_webapp.py | 21 +++++++++++++ doc/examples/sample-config.local.ini | 4 +++ etc/config.ini | 4 +++ 6 files changed, 69 insertions(+), 31 deletions(-) diff --git a/debsources/app/templates/source_folder.html b/debsources/app/templates/source_folder.html index 444194a..99ca1c1 100644 --- a/debsources/app/templates/source_folder.html +++ b/debsources/app/templates/source_folder.html @@ -32,31 +32,35 @@ </tr> {% for dir in subdirs %} - <tr> - <td class="item-img"><img src="{{ config['ICONS_FOLDER'] }}22x22/places/folder.png" alt="d " /></td> - {% if config["DIR_LS_LONG"] %}<td class="stat-type"><span>{{ dir.stat.type }}</span></td>{% endif %} - <td class="stat-perms"><span>{{ dir.stat.perms }}</span></td> - {% if config["DIR_LS_LONG"] %}<td class="stat-size"><span>{{ "{:,d}".format(dir.stat.size) }}</span></td>{% endif %} - <td class="item-name"><a href="{{ url_for('source_html', path_to=path+'/'+dir.name) }}">{{ dir.name }}</a> - {% if config["DIR_LS_LONG"] %} - {% if dir.stat.symlink_dest is not none %}{{ " â " + dir.stat.symlink_dest }}{% endif %} - {% endif %} - </td> - </tr> + {% if not dir['hidden'] %} + <tr> + <td class="item-img"><img src="{{ config['ICONS_FOLDER'] }}22x22/places/folder.png" alt="d " /></td> + {% if config["DIR_LS_LONG"] %}<td class="stat-type"><span>{{ dir.stat.type }}</span></td>{% endif %} + <td class="stat-perms"><span>{{ dir.stat.perms }}</span></td> + {% if config["DIR_LS_LONG"] %}<td class="stat-size"><span>{{ "{:,d}".format(dir.stat.size) }}</span></td>{% endif %} + <td class="item-name"><a href="{{ url_for('source_html', path_to=path+'/'+dir.name) }}">{{ dir.name }}</a> + {% if config["DIR_LS_LONG"] %} + {% if dir.stat.symlink_dest is not none %}{{ " â " + dir.stat.symlink_dest }}{% endif %} + {% endif %} + </td> + </tr> + {% endif %} {% endfor %} {% for file_ in subfiles %} - <tr> - <td class="item-img"><img src="{{ config['ICONS_FOLDER'] }}22x22/mimetypes/ascii.png" alt="- " /></td> - {% if config["DIR_LS_LONG"] %}<td class="stat-type"><span>{{ file_.stat.type }}</span></td>{% endif %} - <td class="stat-perms"><span>{{ file_.stat.perms }}</span></td> - {% if config["DIR_LS_LONG"] %}<td class="stat-size"><span>{{ "{:,d}".format(file_.stat.size) }}</span></td>{% endif %} - <td class="item-name"><a href="{{ url_for('source_html', path_to=path+'/'+file_.name) }}">{{ file_.name }}</a> - {% if config["DIR_LS_LONG"] %} - {% if file_.stat.symlink_dest is not none %}{{ " â " + file_.stat.symlink_dest }}{% endif %} - {% endif %} - </td> - </tr> + {% if not file_['hidden'] %} + <tr> + <td class="item-img"><img src="{{ config['ICONS_FOLDER'] }}22x22/mimetypes/ascii.png" alt="- " /></td> + {% if config["DIR_LS_LONG"] %}<td class="stat-type"><span>{{ file_.stat.type }}</span></td>{% endif %} + <td class="stat-perms"><span>{{ file_.stat.perms }}</span></td> + {% if config["DIR_LS_LONG"] %}<td class="stat-size"><span>{{ "{:,d}".format(file_.stat.size) }}</span></td>{% endif %} + <td class="item-name"><a href="{{ url_for('source_html', path_to=path+'/'+file_.name) }}">{{ file_.name }}</a> + {% if config["DIR_LS_LONG"] %} + {% if file_.stat.symlink_dest is not none %}{{ " â " + file_.stat.symlink_dest }}{% endif %} + {% endif %} + </td> + </tr> + {% endif %} {% endfor %} </table> diff --git a/debsources/app/views.py b/debsources/app/views.py index 2519c5f..6a99377 100644 --- a/debsources/app/views.py +++ b/debsources/app/views.py @@ -554,10 +554,9 @@ class SourceView(GeneralView): """ renders a directory, lists subdirs and subfiles """ - directory = Directory(location, toplevel=(location.get_path() == "")) - # (if path == "", then the dir is toplevel, and we don't want - # the .pc directory) + hidden_files = app.config['HIDDEN_FILES'].split(" ") + directory = Directory(location, hidden_files) pkg_infos = Infobox(session, location.get_package(), diff --git a/debsources/models.py b/debsources/models.py index e4d05fc..de015db 100644 --- a/debsources/models.py +++ b/debsources/models.py @@ -19,6 +19,7 @@ import os import magic import stat +import fnmatch from collections import namedtuple from sqlalchemy import Column, ForeignKey @@ -652,11 +653,10 @@ class Location(object): class Directory(object): """ a folder in a package """ - def __init__(self, location, toplevel=False): - # if the directory is a toplevel one, we remove the .pc folder + def __init__(self, location, hidden_files=[]): self.sources_path = location.sources_path - self.toplevel = toplevel self.location = location + self.hidden_files = hidden_files def get_listing(self): """ @@ -670,11 +670,17 @@ class Directory(object): else: return "file" get_stat, join_path = self.location.get_stat, os.path.join - listing = sorted(dict(name=f, type=get_type(f), + listing = sorted(dict(name=f, type=get_type(f),hidden=False, stat=get_stat(join_path(self.sources_path, f))) for f in os.listdir(self.sources_path)) - if self.toplevel: - listing = filter(lambda x: x['name'] != ".pc", listing) + + for hidden_file in self.hidden_files: + for f in listing: + full_path = os.path.join(self.location.sources_path, f['name']) + if f['type'] == "directory": + full_path += "/" + f['hidden'] = (f['hidden'] + or fnmatch.fnmatch(full_path, hidden_file)) return listing diff --git a/debsources/tests/test_webapp.py b/debsources/tests/test_webapp.py index 57e6d1f..6bae6cc 100644 --- a/debsources/tests/test_webapp.py +++ b/debsources/tests/test_webapp.py @@ -272,12 +272,33 @@ class DebsourcesTestCase(unittest.TestCase, DbTestFixture): self.assertEqual(rv['directory'], "2.01-6") self.assertIn({"type": "file", "name": "ledit.ml", + "hidden": False, "stat": {"perms": "rw-r--r--", "size": 45858, "type": "-", "symlink_dest": None} }, rv['content']) + def test_api_hidden_files_folder(self): + rv = json.loads(self.app.get('/api/src/nvidia-xconfig/319.72-1/').data) + self.assertIn({"type": "directory", + "name": ".pc", + "hidden": True, + "stat": {"perms": "rwxr-xr-x", + "size": 4096, + "type": "d", + "symlink_dest": None} + }, rv['content']) + + self.assertIn({"type": "file", + "name": "lscf.c", + "hidden": False, + "stat": {"perms": "rw-r--r--", + "size": 11940, + "type": "-", + "symlink_dest": None} + }, rv['content']) + def test_api_symlink_dest(self): rv = json.loads(self.app.get('/api/src/beignet/1.0.0-1/').data) self.assertIn({"type": "file", diff --git a/doc/examples/sample-config.local.ini b/doc/examples/sample-config.local.ini index 96973d6..1487066 100644 --- a/doc/examples/sample-config.local.ini +++ b/doc/examples/sample-config.local.ini @@ -78,3 +78,7 @@ serve_static_files: true # where to log webapp specific information log_file: %(log_dir)s/webapp.log + +# space-separated list of files or directories patterns to hide in +# directory listings +hidden_files: */.pc/ diff --git a/etc/config.ini b/etc/config.ini index 1f27d17..675c64c 100644 --- a/etc/config.ini +++ b/etc/config.ini @@ -85,3 +85,7 @@ log_file: %(log_dir)s/webapp.log # whether to enable the blueprint blueprint_copyright: true + +# space-separated list of files or directories patterns to hide in +# directory listings +hidden_files: */.pc/ -- 2.1.4