Bug#762944: debsources: make .pc/ exclusion a configuration parameter
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 <jason@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
Reply to: