cgilsxml.py: nouvelles options --first-spec et all-specs

This commit is contained in:
Jephté Clain 2017-03-13 15:39:17 +04:00
parent 6970b5dcec
commit ab4148c0ac
1 changed files with 42 additions and 17 deletions

View File

@ -179,7 +179,7 @@ class File:
else: self.vars[name] = value
def __repr__(self): return 'File<%s>' % (self.pf)
def find_files(basedir, filters):
def find_files(basedir, filters, spec_method='all'):
basedir = path.abspath(basedir)
files = []
deep_filters = [filter for filter in filters if filter.re_spec is not None and filter.deep_scan]
@ -190,11 +190,21 @@ def find_files(basedir, filters):
# exception se produit
try: file = File(dirpath, filename)
except: continue
matched = False
allowed = False
matched1 = matched = False
allowed1 = allowed = False
for filter in deep_filters:
matched = filter.match_fill(file, basedir) or matched
allowed = filter.match_allow(file) or allowed
if spec_method == 'all' or \
(spec_method == 'first' and not matched):
matched1 = filter.match_fill(file, basedir)
else:
matched1 = False
matched = matched1 or matched
if spec_method == 'all' or \
(spec_method == 'first' and matched and not allowed):
allowed1 = filter.match_allow(file)
else:
allowed1 = False
allowed = allowed1 or allowed
if matched: pass
elif allowed: file.dontlist = True
else: continue
@ -207,11 +217,21 @@ def find_files(basedir, filters):
try: file = File(basedir, name)
except: continue
if not file.isfile(): continue
matched = False
allowed = False
matched1 = matched = False
allowed1 = allowed = False
for filter in simple_filters:
matched = filter.match_fill(file) or matched
allowed = filter.match_allow(file) or allowed
if spec_method == 'all' or \
(spec_method == 'first' and not matched):
matched1 = filter.match_fill(file, basedir)
else:
matched1 = False
matched = matched1 or matched
if spec_method == 'all' or \
(spec_method == 'first' and matched and not allowed):
allowed1 = filter.match_allow(file)
else:
allowed1 = False
allowed = allowed1 or allowed
if matched: pass
elif allowed: file.dontlist = True
else: continue
@ -411,6 +431,7 @@ def run_cgilsxml():
charset = 'utf-8'
default_content = ContentInfos()
default_filter = Filter(r'(.*)')
env = dict(filters=[], filter=None)
def add_spec(option, opt, value, parser, *args, **kw):
if env['filter'] is not None: env['filters'].append(env['filter'])
env['filter'] = Filter(spec=value)
@ -420,16 +441,16 @@ def run_cgilsxml():
def allow_spec(option, opt, value, parser, *args, **kw):
if env['filter'] is None: env['filter'] = default_filter
env['filter'].allow_spec(value)
def add_var(option, opt_str, value, parser, *args, **kw):
def add_var(option, opt, value, parser, *args, **kw):
if env['filter'] is None: env['filter'] = default_filter
env['filter'].add_var(value)
def set_group(option, opt_str, value, parser, *args, **kw):
def set_group(option, opt, value, parser, *args, **kw):
if env['filter'] is None: env['filter'] = default_filter
env['filter'].set_group(value)
def set_break_on(option, opt_str, value, parser, *args, **kw):
def set_break_on(option, opt, value, parser, *args, **kw):
if env['filter'] is None: env['filter'] = default_filter
env['filter'].set_break_on(value)
def set_content_disposition(option, opt_str, value, parser, *args, **kw):
def set_content_disposition(option, opt, value, parser, *args, **kw):
if value in ('attachment', 'inline'): pass
elif value == 'none': value = None
else:
@ -441,15 +462,16 @@ def run_cgilsxml():
sys.exit(1)
if env['filter'] is None: default_content.disposition = value
else: env['filter'].force_disposition = value
def set_content_type(option, opt_str, value, parser, *args, **kw):
def set_content_type(option, opt, value, parser, *args, **kw):
if env['filter'] is None: default_content.type = value
else: env['filter'].force_type = value
def set_content_charset(option, opt_str, value, parser, *args, **kw):
def set_content_charset(option, opt, value, parser, *args, **kw):
if env['filter'] is None: default_content.charset = value
else: env['filter'].force_charset = value
from optparse import OptionParser
OP = OptionParser(usage=u"\n\t%prog [options] /path/to/dir", description=__doc__)
OP.set_defaults(spec_method='all')
OP.add_option('-e', '--spec', dest='spec', action='callback', callback=add_spec, type='string',
help=u"Spécifier l'expression régulière permettant de sélectionner les fichiers à lister. "
+ u"La correspondance est tentée sur le nom du fichier avec la fonction match(). "
@ -460,6 +482,10 @@ def run_cgilsxml():
+ u"\n Il est possible de spécifier cette option plusieurs fois."
+ u"\n Note: TOUTES les expressions régulières sont testées par rapport au nom du fichier, et pour celles qui correspondent, les variables correspondantes sont définies. "
+ u"Il faut donc ordonner les expressions régulières de la plus générale à la plus spécifique, contrairement à ce qui se fait d'habitude.")
OP.add_option('--all-specs', dest='spec_method', action='store_const', const='all',
help=u"Avec l'option -e, tester toutes les expressions régulières dans l'ordre de définition. C'est le comportement par défaut.")
OP.add_option('--first-spec', dest='spec_method', action='store_const', const='first',
help=u"Avec l'option -e, arrêter à la première expression régulière qui correspond")
OP.add_option('--glob', dest='pattern', action='callback', callback=add_glob, type='string',
help=u"Comme --spec, mais en utilisant les patterns du shell *, ?, [seq], [!seq]. "
+ u"Si l'expression contient un caractère '/', la correspondance se fait sur le chemin complet du fichier avec le module glob. "
@ -533,7 +559,6 @@ def run_cgilsxml():
+ u"Il est possible de spécifier plusieurs paramètres en les séparant par des virgules.")
OP.add_option('-p', '--prefix', dest="prefix",
help=u"Ajouter les paramètres supplémentaires spécifiés à /result/env/query_string.")
env = dict(filters=[], filter=None)
o, args = OP.parse_args()
filters = env['filters']
filter = env['filter']
@ -577,7 +602,7 @@ def run_cgilsxml():
files = []
for basedir in args:
files.extend(find_files(basedir, filters))
files.extend(find_files(basedir, filters, o.spec_method))
sortfunc = build_sortfunc(sortby)
files = sort_files(files, sortfunc)
fgroups = build_fgroups(files)