* [gentoo-commits] proj/R_overlay:master commit in: roverlay/tools/, roverlay/config/, roverlay/
@ 2013-09-06 11:10 André Erdmann
0 siblings, 0 replies; 4+ messages in thread
From: André Erdmann @ 2013-09-06 11:10 UTC (permalink / raw
To: gentoo-commits
commit: da689634856bb83123b209fab64106e2937d4ba6
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Fri Sep 6 11:08:57 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Fri Sep 6 11:08:57 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=da689634
roverlay: --sync-in-hooks
allows syncing in hooks (ignores --no-sync and sets NOSYNC=n).t
---
roverlay/argparser.py | 7 +++++++
roverlay/config/const.py | 7 ++++---
roverlay/tools/shenv.py | 12 +++++++++---
3 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/roverlay/argparser.py b/roverlay/argparser.py
index e1ded67..ed0561c 100644
--- a/roverlay/argparser.py
+++ b/roverlay/argparser.py
@@ -147,6 +147,7 @@ class RoverlayArgumentParserBase ( roverlay.argutil.ArgumentParserProxy ):
self.do_extraconf ( (), 'REPO.config_files' )
self.do_extraconf ( True, 'nosync' )
+ conf_ifdef ( 'sync_in_hooks', 'sync_in_hooks' )
# overlay creation
conf_ifdef ( 'distmap_verify', 'OVERLAY.DISTDIR.verify' )
@@ -424,6 +425,12 @@ class RoverlayArgumentParserBase ( roverlay.argutil.ArgumentParserProxy ):
)
arg (
+ '--sync-in-hooks', dest='sync_in_hooks', default=argparse.SUPPRESS,
+ flags=self.ARG_WITH_DEFAULT|self.ARG_OPT_IN,
+ help='allow syncing in hooks even if sync is forbidden',
+ )
+
+ arg (
'--distroot', dest='distroot', default=argparse.SUPPRESS,
flags=self.ARG_WITH_DEFAULT|self.ARG_META_DIR,
type=couldbe_fs_dir,
diff --git a/roverlay/config/const.py b/roverlay/config/const.py
index f6492d7..20e5aad 100644
--- a/roverlay/config/const.py
+++ b/roverlay/config/const.py
@@ -12,9 +12,10 @@ import time
__all__ = [ 'clone', 'lookup' ]
_CONSTANTS = dict (
- debug = False,
- nosync = False,
- #installed = False,
+ debug = False,
+ nosync = False,
+ #sync_in_hooks = None,
+ #installed = False,
portdir = '/usr/portage',
diff --git a/roverlay/tools/shenv.py b/roverlay/tools/shenv.py
index 27566e8..5587e6d 100644
--- a/roverlay/tools/shenv.py
+++ b/roverlay/tools/shenv.py
@@ -99,9 +99,11 @@ NULL_PHASE = 'null'
SH_TRUE = 'y'
SH_FALSE = 'n'
-def shbool ( value ):
+def shbool ( value, flip=False ):
"""Converts value into a shbool."""
- return SH_TRUE if value else SH_FALSE
+ # SH_TRUE := value XOR invert
+ # -> SH_FALSE := value <=> invert
+ return SH_FALSE if bool ( value ) is bool ( flip ) else SH_TRUE
# --- end of shbool (...) ---
def get_shbool ( value, empty_is_false=True, undef_is_false=True ):
@@ -295,7 +297,11 @@ def setup_env():
setup_self ( 'GIT_ASKPASS', 'GIT_EDITOR' )
# shbool $NOSYNC
- setup ( 'NOSYNC', shbool ( roverlay.config.get_or_fail ( 'nosync' ) ) )
+ sync_in_hooks = roverlay.config.get ( 'sync_in_hooks', None )
+ if sync_in_hooks is None:
+ setup ( 'NOSYNC', shbool ( roverlay.config.get_or_fail ( 'nosync' ) ) )
+ else:
+ setup ( 'NOSYNC', shbool ( not sync_in_hooks ) )
# shbool $NO_COLOR
#
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/tools/, roverlay/config/, roverlay/
@ 2013-09-05 10:24 André Erdmann
0 siblings, 0 replies; 4+ messages in thread
From: André Erdmann @ 2013-09-05 10:24 UTC (permalink / raw
To: gentoo-commits
commit: c1bf14a427cfa55c7dc2c4659caf821b7ac56795
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Thu Sep 5 10:16:24 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Thu Sep 5 10:16:24 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=c1bf14a4
change 'STATS_DB' config key
store STATS_DB as STATS.dbfile and not as RRD_DB.file
---
roverlay/config/entrymap.py | 2 +-
roverlay/runtime.py | 2 +-
roverlay/tools/shenv.py | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/roverlay/config/entrymap.py b/roverlay/config/entrymap.py
index c7b1493..f3396f7 100644
--- a/roverlay/config/entrymap.py
+++ b/roverlay/config/entrymap.py
@@ -583,7 +583,7 @@ CONFIG_ENTRY_MAP = dict (
),
stats_db = dict (
- path = [ 'RRD_DB', 'file', ],
+ path = [ 'STATS', 'dbfile', ],
value_type = 'fs_file',
description = 'stats database file',
),
diff --git a/roverlay/runtime.py b/roverlay/runtime.py
index c88a590..de20f91 100644
--- a/roverlay/runtime.py
+++ b/roverlay/runtime.py
@@ -143,7 +143,7 @@ class RuntimeEnvironment ( RuntimeEnvironmentBase ):
self.do_setup_parser()
self.do_setup_config()
- self.stats_db_file = self.config.get ( 'RRD_DB.file', None )
+ self.stats_db_file = self.config.get ( 'STATS.dbfile', None )
# want_logging <=> <have a command that uses hooks>
if self.options ['want_logging']:
diff --git a/roverlay/tools/shenv.py b/roverlay/tools/shenv.py
index 1b06ca9..27566e8 100644
--- a/roverlay/tools/shenv.py
+++ b/roverlay/tools/shenv.py
@@ -219,7 +219,7 @@ def setup_env():
setup_conf ( 'WORKDIR', 'CACHEDIR.root' )
# str::filepath $STATS_DB (optional)
- setup_conf_optional ( 'STATS_DB', 'RRD_DB.file' )
+ setup_conf_optional ( 'STATS_DB', 'STATS.dbfile' )
# str::dirpath $TMPDIR := <default>
setup (
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/tools/, roverlay/config/, roverlay/
@ 2013-06-30 15:58 André Erdmann
0 siblings, 0 replies; 4+ messages in thread
From: André Erdmann @ 2013-06-30 15:58 UTC (permalink / raw
To: gentoo-commits
commit: df58d07cbadab7bdd5f6a494355c8dac9f840d09
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Tue Jun 25 21:08:01 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Tue Jun 25 21:08:01 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=df58d07c
EVENT_HOOK_RESTRICT, roverlay.hook
---
roverlay/config/const.py | 4 ++
roverlay/config/entrymap.py | 29 +++++---
roverlay/hook.py | 169 ++++++++++++++++++++++++++++++++++++++++++++
roverlay/main.py | 7 +-
roverlay/tools/shenv.py | 22 ++----
5 files changed, 204 insertions(+), 27 deletions(-)
diff --git a/roverlay/config/const.py b/roverlay/config/const.py
index 4ee9d45..f9a2e14 100644
--- a/roverlay/config/const.py
+++ b/roverlay/config/const.py
@@ -78,6 +78,10 @@ _CONSTANTS = dict (
manifest_implementation = 'default',
),
+ EVENT_HOOK = dict (
+ default_exe_relpath = [ 'hooks', 'mux.sh' ],
+ ),
+
TOOLS = dict (
EBUILD = dict (
exe = "/usr/bin/ebuild",
diff --git a/roverlay/config/entrymap.py b/roverlay/config/entrymap.py
index 136b4b5..6a282d9 100644
--- a/roverlay/config/entrymap.py
+++ b/roverlay/config/entrymap.py
@@ -306,6 +306,12 @@ CONFIG_ENTRY_MAP = dict (
value_type = yesno,
),
+ overlay_distmap_file = dict (
+ path = [ 'OVERLAY', 'DISTMAP', 'dbfile', ]
+ value_type = 'fs_file',
+ description = 'distmap file',
+ ),
+
# * alias
backup_desc = 'overlay_backup_desc',
eclass = 'overlay_eclass',
@@ -316,6 +322,7 @@ CONFIG_ENTRY_MAP = dict (
distdir_strategy = 'overlay_distdir_strategy',
distdir_flat = 'overlay_distdir_flat',
distdir_verify = 'overlay_distdir_verify',
+ distmap_file = 'overlay_distmap_file',
# --- overlay
@@ -449,14 +456,22 @@ CONFIG_ENTRY_MAP = dict (
description = 'filter shell env',
),
- hook_script = dict (
- path = [ 'SHELL_ENV', 'hook', ],
- value_type = 'fs_file',
+ event_hook = dict (
+ path = [ 'EVENT_HOOK', 'exe', ],
+ value_type = 'fs_file',
description = 'script that is run on certain events, e.g. overlay_success',
),
+ event_hook_restrict = dict (
+ path = [ 'EVENT_HOOK', 'restrict', ],
+ value_type = 'list:str',
+ description = 'mask for running hooks',
+ ),
+
+
# * alias
- hook = 'hook_script',
+ hook = 'event_hook',
+ hook_restrict = 'event_hook_restrict',
# == other ==
@@ -467,12 +482,6 @@ CONFIG_ENTRY_MAP = dict (
description = 'directory for cache data',
),
- tmpdir = dict (
- path = [ 'TMPDIR', 'root', ],
- value_type = 'fs_dir',
- description = 'directory for temporary data',
- ),
-
nosync = dict (
value_type = yesno,
description = 'forbid/allow syncing with remotes',
diff --git a/roverlay/hook.py b/roverlay/hook.py
new file mode 100644
index 0000000..3b13315
--- /dev/null
+++ b/roverlay/hook.py
@@ -0,0 +1,169 @@
+# R overlay -- run roverlay hooks (shell scripts)
+# -*- coding: utf-8 -*-
+# Copyright (C) 2013 André Erdmann <dywi@mailerd.de>
+# Distributed under the terms of the GNU General Public License;
+# either version 2 of the License, or (at your option) any later version.
+
+import os.path
+import logging
+
+import roverlay.config
+import roverlay.tools.shenv
+
+__all__ = [ 'run_hook', 'phase_allowed', ]
+
+LOGGER = logging.getLogger ( 'event_hook' )
+
+
+_EVENT_SCRIPT = None
+
+# None|iterable _EVENT_RESTRICT
+_EVENT_RESTRICT = None
+
+# int _EVENT_POLICY
+# -1: no policy (allow all)
+# 0: not configured
+# 1: allow unless in _EVENT_RESTRICT (blacklist)
+# 2: deny unless in _EVENT_RESTRICT (whitelist)
+# 4: deny all
+_EVENT_POLICY = 0
+
+def setup():
+ global _EVENT_SCRIPT
+ global _EVENT_POLICY
+ global _EVENT_RESTRICT
+
+ _EVENT_SCRIPT = roverlay.config.get ( 'EVENT_HOOK.exe', False )
+ if _EVENT_SCRIPT is False:
+ a_dir = roverlay.config.get ( 'OVERLAY.additions_dir', None )
+ if a_dir:
+ s = os.path.join (
+ a_dir,
+ *roverlay.config.get_or_fail ( 'EVENT_HOOK.default_exe_relpath' )
+ )
+ if os.path.isfile ( s ):
+ _EVENT_SCRIPT = s
+ # -- end if _EVENT_SCRIPT
+
+ conf_restrict = roverlay.config.get ( 'EVENT_HOOK.restrict', False )
+
+ if conf_restrict:
+ # tristate None,False,True
+ is_whitelist = None
+ allow = set()
+ deny = set()
+ for p in conf_restrict:
+ if p == '*':
+ # "allow all"
+ is_whitelist = False
+ elif p == '-*':
+ # "deny all"
+ is_whitelist = True
+ elif p == '-' or p == '+':
+ # empty
+ pass
+ elif p[0] == '-':
+ # deny <k>
+ k = p[1:].lower()
+ deny.add ( k )
+ try:
+ allow.remove ( k )
+ except KeyError:
+ pass
+ else:
+ # allow <k>
+ k = ( p[1:] if p[0] == '+' else p ).lower()
+ allow.add ( k )
+ try:
+ deny.remove ( k )
+ except KeyError:
+ pass
+ # -- end for;
+
+ if is_whitelist is None:
+ # allow is set => is whitelist
+ # neither allow nor deny are set => deny allow
+ is_whitelist = bool ( allow or not deny )
+ # -- end if is_whitelist #1
+
+ if is_whitelist:
+ if allow:
+ _EVENT_RESTRICT = frozenset ( allow )
+ _EVENT_POLICY = 2
+ else:
+ _EVENT_POLICY = 4
+ elif deny:
+ _EVENT_RESTRICT = frozenset ( deny )
+ _EVENT_POLICY = 1
+ else:
+ _EVENT_POLICY = -1
+ # -- end if is_whitelist #2
+ else:
+ _EVENT_POLICY = -1
+ # -- end if conf_restrict
+# --- end of setup (...) ---
+
+def phase_allowed ( phase ):
+ if _EVENT_POLICY == -1:
+ return True
+ elif _EVENT_POLICY == 1:
+ # allow unless in restrict
+ if phase not in _EVENT_RESTRICT:
+ return True
+ else:
+ LOGGER.debug (
+ "phase {!r} denied by blacklist policy.".format ( phase )
+ )
+ elif _EVENT_POLICY == 2:
+ # deny unless in restrict
+ if phase in _EVENT_RESTRICT:
+ return True
+ else:
+ LOGGER.debug (
+ "phase {!r} denied by whitelist policy.".format ( phase )
+ )
+ elif _EVENT_POLICY == 4:
+ LOGGER.debug (
+ "phase {!r} denied by 'deny all' policy".format ( phase )
+ )
+ else:
+ LOGGER.warning (
+ "phase {!r} denied by undefined policy {} (fix this)".format (
+ phase, _EVENT_POLICY
+ )
+ )
+ # -- end if _EVENT_POLICY
+
+ # default return
+ return False
+# --- end of phase_allowed (...) ---
+
+def phase_allowed_nolog ( phase ):
+ return (
+ _EVENT_POLICY == -1
+ ) or (
+ _EVENT_POLICY == 1 and phase not in _EVENT_RESTRICT
+ ) or (
+ _EVENT_POLICY == 2 and phase in _EVENT_RESTRICT
+ )
+# --- end of phase_allowed_nolog (...) ---
+
+def run ( phase ):
+ if _EVENT_SCRIPT is None:
+ LOGGER.warning (
+ "hook module not initialized - doing that now (FIXME!)"
+ )
+ setup()
+
+
+
+ if _EVENT_SCRIPT and phase_allowed ( phase ):
+ return roverlay.tools.shenv.run_script (
+ _EVENT_SCRIPT, phase, return_success=True
+ )
+ else:
+ # nop
+ return True
+# --- end of run (...) ---
+
+run_hook = run
diff --git a/roverlay/main.py b/roverlay/main.py
index 901cbcf..4822e21 100644
--- a/roverlay/main.py
+++ b/roverlay/main.py
@@ -289,7 +289,7 @@ def main (
# this hook should be called _after_ verifying the overlay
# (verification is not implemented yet)
#
- if not roverlay.tools.shenv.run_hook ( 'overlay_success' ):
+ if not roverlay.hook.run ( 'overlay_success' ):
die ( "overlay_success hook returned non-zero", DIE.OV_CREATE )
set_action_done ( "create" )
@@ -476,7 +476,7 @@ def main (
from roverlay.overlay.creator import OverlayCreator
import roverlay.config
- import roverlay.tools.shenv
+ import roverlay.hook
except ImportError:
if HIDE_EXCEPTIONS:
die ( "Cannot import roverlay modules!", DIE.IMPORT )
@@ -491,6 +491,9 @@ def main (
# -- run
+ # initialize roverlay.hook
+ roverlay.hook.setup()
+
# always run sync 'cause commands = {create,sync,apply_rules}
# and create,apply_rules implies (no)sync
run_sync()
diff --git a/roverlay/tools/shenv.py b/roverlay/tools/shenv.py
index 85644d4..f0c054b 100644
--- a/roverlay/tools/shenv.py
+++ b/roverlay/tools/shenv.py
@@ -1,4 +1,4 @@
-# R overlay -- tools, run roverlay hooks (shell scripts)
+# R overlay -- tools, shell script environment
# -*- coding: utf-8 -*-
# Copyright (C) 2013 André Erdmann <dywi@mailerd.de>
# Distributed under the terms of the GNU General Public License;
@@ -8,6 +8,7 @@ import logging
import os
import subprocess
import tempfile
+import time
import roverlay.config
@@ -18,7 +19,6 @@ import roverlay.util
# _SHELL_ENV, _SHELL_INTPR are created when calling run_script()
#
_SHELL_ENV = None
-_SHELL_ENV_SCRIPT = None
#_SHELL_INTPR = None
LOGGER = logging.getLogger ( 'shenv' )
@@ -287,7 +287,11 @@ def run_script ( script, phase, return_success=False, logger=None ):
output = script_call.communicate()
except:
- script_call.kill()
+ try:
+ script_call.terminate()
+ time.sleep ( 1 )
+ finally:
+ script_call.kill()
raise
@@ -327,15 +331,3 @@ def run_script ( script, phase, return_success=False, logger=None ):
else:
return script_call
# --- end of run_script (...) ---
-
-def run_hook ( phase ):
- global _SHELL_ENV_SCRIPT
- if _SHELL_ENV_SCRIPT is None:
- _SHELL_ENV_SCRIPT = roverlay.config.get ( 'SHELL_ENV.hook', False )
-
- if _SHELL_ENV_SCRIPT:
- return run_script ( _SHELL_ENV_SCRIPT, phase, return_success=True )
- else:
- # nop
- return True
-# --- end of run_hook (...) ---
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [gentoo-commits] proj/R_overlay:gsoc13/next commit in: roverlay/tools/, roverlay/config/, roverlay/
@ 2013-06-26 17:29 André Erdmann
2013-06-30 15:58 ` [gentoo-commits] proj/R_overlay:master " André Erdmann
0 siblings, 1 reply; 4+ messages in thread
From: André Erdmann @ 2013-06-26 17:29 UTC (permalink / raw
To: gentoo-commits
commit: cbde5b6151f882ac7e2f53d57cb65cb1a7333fe8
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Wed Jun 26 17:23:26 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Wed Jun 26 17:23:26 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=cbde5b61
roverlay/: misc "distmap"/"run hook" changes
* config
-> added 'installed' and 'INSTALLINFO' to the config tree
-> added OVERLAY_DISTMAP_COMPRESSION to the config entry map
* roverlay.hook
-> allow only one asterisk statement in EVENT_HOOK_RESTRICT
-> catch hook script failure in run() and raise an exception
* roverlay.tools.shenv
-> $SHLIB env var is a list now (see previous commit)
---
roverlay/config/const.py | 25 ++++++++++---------
roverlay/config/entrymap.py | 10 +++++++-
roverlay/hook.py | 59 +++++++++++++++++++++++++++++++++++----------
roverlay/main.py | 7 +++---
roverlay/tools/shenv.py | 46 ++++++++++++++++++++++++++---------
5 files changed, 106 insertions(+), 41 deletions(-)
diff --git a/roverlay/config/const.py b/roverlay/config/const.py
index f9a2e14..c78e27c 100644
--- a/roverlay/config/const.py
+++ b/roverlay/config/const.py
@@ -12,11 +12,13 @@ import time
__all__ = [ 'clone', 'lookup' ]
_CONSTANTS = dict (
- # FIXME: capslock? ;)
- DEBUG = False,
- debug = False,
+ debug = False,
+ nosync = False,
+ #installed = False,
- nosync = False,
+ INSTALLINFO = dict (
+ libexec = '/usr/libexec/roverlay', # ::LIBEXEC::
+ ),
# logging defaults are in recipe/easylogger
@@ -33,14 +35,13 @@ _CONSTANTS = dict (
),
EBUILD = dict (
- default_header = '\n'.join ( (
- '# Copyright 1999-%i Gentoo Foundation' % ( time.gmtime() [0] ),
- '# Distributed under the terms of the GNU General Public License v2',
- '# $Header: $',
- '',
- # EAPI=N and inherit <eclasses> are no longer part
- # of the default header
- ) ),
+ default_header = (
+ '# Copyright 1999-{year:d} Gentoo Foundation\n'
+ '# Distributed under the terms of the GNU General Public License v2\n'
+ '# $Header: $\n'
+ '\n'
+ ).format ( year=time.gmtime()[0] ),
+ # EAPI=N and inherit <eclasses> are no longer part of the default header
eapi = 4,
# number of workers used by OverlayCreator
diff --git a/roverlay/config/entrymap.py b/roverlay/config/entrymap.py
index 6a282d9..87b4973 100644
--- a/roverlay/config/entrymap.py
+++ b/roverlay/config/entrymap.py
@@ -306,8 +306,15 @@ CONFIG_ENTRY_MAP = dict (
value_type = yesno,
),
+ overlay_distmap_compression = dict (
+ description = 'distmap compression format (none, bzip2 or gzip)',
+ choices = frozenset ({
+ 'none', 'default', 'bz2', 'bzip2', 'gz', 'gzip'
+ }),
+ ),
+
overlay_distmap_file = dict (
- path = [ 'OVERLAY', 'DISTMAP', 'dbfile', ]
+ path = [ 'OVERLAY', 'DISTMAP', 'dbfile', ],
value_type = 'fs_file',
description = 'distmap file',
),
@@ -322,6 +329,7 @@ CONFIG_ENTRY_MAP = dict (
distdir_strategy = 'overlay_distdir_strategy',
distdir_flat = 'overlay_distdir_flat',
distdir_verify = 'overlay_distdir_verify',
+ distmap_compression = 'overlay_distmap_compression',
distmap_file = 'overlay_distmap_file',
# --- overlay
diff --git a/roverlay/hook.py b/roverlay/hook.py
index 3b13315..3392e4e 100644
--- a/roverlay/hook.py
+++ b/roverlay/hook.py
@@ -28,6 +28,10 @@ _EVENT_RESTRICT = None
# 4: deny all
_EVENT_POLICY = 0
+
+class HookException ( Exception ):
+ pass
+
def setup():
global _EVENT_SCRIPT
global _EVENT_POLICY
@@ -35,14 +39,29 @@ def setup():
_EVENT_SCRIPT = roverlay.config.get ( 'EVENT_HOOK.exe', False )
if _EVENT_SCRIPT is False:
- a_dir = roverlay.config.get ( 'OVERLAY.additions_dir', None )
- if a_dir:
+ if roverlay.config.get_or_fail ( 'installed' ):
s = os.path.join (
- a_dir,
+ roverlay.config.get_or_fail ( 'INSTALLINFO.libexec' ),
*roverlay.config.get_or_fail ( 'EVENT_HOOK.default_exe_relpath' )
)
if os.path.isfile ( s ):
_EVENT_SCRIPT = s
+ else:
+ LOGGER.error (
+ 'missing {!r} - '
+ 'has roverlay been installed properly?'.format ( s )
+ )
+ else:
+ a_dir = roverlay.config.get ( 'OVERLAY.additions_dir', None )
+ if a_dir:
+ s = os.path.join (
+ a_dir, *roverlay.config.get_or_fail (
+ 'EVENT_HOOK.default_exe_relpath'
+ )
+ )
+ if os.path.isfile ( s ):
+ _EVENT_SCRIPT = s
+ # -- end if installed
# -- end if _EVENT_SCRIPT
conf_restrict = roverlay.config.get ( 'EVENT_HOOK.restrict', False )
@@ -53,12 +72,16 @@ def setup():
allow = set()
deny = set()
for p in conf_restrict:
- if p == '*':
- # "allow all"
- is_whitelist = False
- elif p == '-*':
- # "deny all"
- is_whitelist = True
+ if p in { '*', '+*', '-*' }:
+ # "allow all" / "deny all"
+ # to avoid confusion, only one "[+-]*" statement is allowed
+ if is_whitelist is None:
+ is_whitelist = bool ( p[0] == '-' )
+ else:
+ raise Exception (
+ 'EVENT_HOOK_RESTRICT must not contain more than one '
+ '"*"/"+*"/"-*" statement'
+ )
elif p == '-' or p == '+':
# empty
pass
@@ -148,19 +171,29 @@ def phase_allowed_nolog ( phase ):
)
# --- end of phase_allowed_nolog (...) ---
-def run ( phase ):
+def run ( phase, catch_failure=True ):
if _EVENT_SCRIPT is None:
LOGGER.warning (
"hook module not initialized - doing that now (FIXME!)"
)
setup()
-
+ # -- end if
if _EVENT_SCRIPT and phase_allowed ( phase ):
- return roverlay.tools.shenv.run_script (
+ if roverlay.tools.shenv.run_script (
_EVENT_SCRIPT, phase, return_success=True
- )
+ ):
+ return True
+ elif catch_failure:
+ raise HookException (
+ "hook {h!r} returned non-zero for phase {p!r}".format (
+ h=_EVENT_SCRIPT, p=phase
+ )
+ )
+ #return False
+ else:
+ return False
else:
# nop
return True
diff --git a/roverlay/main.py b/roverlay/main.py
index 4822e21..8bfecf6 100644
--- a/roverlay/main.py
+++ b/roverlay/main.py
@@ -289,8 +289,7 @@ def main (
# this hook should be called _after_ verifying the overlay
# (verification is not implemented yet)
#
- if not roverlay.hook.run ( 'overlay_success' ):
- die ( "overlay_success hook returned non-zero", DIE.OV_CREATE )
+ roverlay.hook.run ( 'overlay_success' )
set_action_done ( "create" )
@@ -348,11 +347,13 @@ def main (
DEFAULT_CONFIG_FILE = CONFIG_FILE_NAME
- commands, config_file, additional_config, extra_opts = \
+ commands, config_file, additional_config, extra_opts = (
roverlay.argutil.parse_argv (
command_map=COMMAND_DESCRIPTION,
default_config_file=DEFAULT_CONFIG_FILE,
)
+ )
+ additional_config ['installed'] = ROVERLAY_INSTALLED
OPTION = extra_opts.get
diff --git a/roverlay/tools/shenv.py b/roverlay/tools/shenv.py
index f0c054b..794ed1e 100644
--- a/roverlay/tools/shenv.py
+++ b/roverlay/tools/shenv.py
@@ -90,6 +90,10 @@ NULL_PHASE = 'null'
def setup_env():
"""Returns a 'well-defined' env dict for running scripts."""
+ ROVERLAY_INSTALLED = roverlay.config.get_or_fail ( 'installed' )
+ SHLIB_DIRNAME = 'shlib'
+ SHFUNC_FILENAME = 'functions.sh'
+
# @typedef shbool is SH_TRUE|SH_FALSE, where:
SH_TRUE = 'y'
SH_FALSE = 'n'
@@ -175,30 +179,48 @@ def setup_env():
# shell file with "core" functions
#
additions_dir = roverlay.config.get ( 'OVERLAY.additions_dir', None )
+ shlib_path = []
+
+ if ROVERLAY_INSTALLED:
+ installed_shlib = (
+ roverlay.config.get_or_fail ( 'INSTALLINFO.libexec' )
+ + os.sep + SHLIB_DIRNAME
+ )
+ if os.path.isdir ( installed_shlib ):
+ shlib_path.append ( installed_shlib )
+ shlib_file = installed_shlib + os.sep + SHFUNC_FILENAME
+ if os.path.isfile ( shlib_file ):
+ setup ( 'FUNCTIONS', shlib_file )
+ else:
+ LOGGER.error (
+ "roverlay is installed, but $FUNCTIONS file is missing."
+ )
+ else:
+ LOGGER.error ( "roverlay is installed, but shlib dir is missing." )
+ # -- end if installed~shlib
+
if additions_dir:
setup ( 'ADDITIONS_DIR', additions_dir )
setup_self ( 'FILESDIR', 'ADDITIONS_DIR' )
- shlib_root = additions_dir + os.sep + 'shlib'
- shlib_file = None
- SHFUNC_FILENAME = 'functions.sh'
+ shlib_root = additions_dir + os.sep + 'shlib'
if os.path.isdir ( shlib_root ):
- setup ( 'SHLIB', shlib_root )
- shlib_file = shlib_root + os.sep + SHFUNC_FILENAME
+ shlib_path.append ( shlib_root )
+# if not ROVERLAY_INSTALLED:
+ shlib_file = shlib_root + os.sep + SHFUNC_FILENAME
if os.path.isfile ( shlib_file ):
setup ( 'FUNCTIONS', shlib_file )
- else:
- shlib_file = None
# -- end if shlib_root;
-
- if not shlib_file:
- shlib_file = additions_dir + os.sep + SHFUNC_FILENAME
- if os.path.isfile ( shlib_file ):
- setup ( 'FUNCTIONS', shlib_file )
# -- end if additions_dir;
+ if shlib_path:
+ # reversed shlib_path:
+ # assuming that user-provided function files are more important
+ #
+ setup ( 'SHLIB', ':'.join ( reversed ( shlib_path ) ) )
+
# str::exe $EBUILD
setup_conf ( 'EBUILD', 'TOOLS.EBUILD.exe' )
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/tools/, roverlay/config/, roverlay/
2013-06-26 17:29 [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann
@ 2013-06-30 15:58 ` André Erdmann
0 siblings, 0 replies; 4+ messages in thread
From: André Erdmann @ 2013-06-30 15:58 UTC (permalink / raw
To: gentoo-commits
commit: cbde5b6151f882ac7e2f53d57cb65cb1a7333fe8
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Wed Jun 26 17:23:26 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Wed Jun 26 17:23:26 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=cbde5b61
roverlay/: misc "distmap"/"run hook" changes
* config
-> added 'installed' and 'INSTALLINFO' to the config tree
-> added OVERLAY_DISTMAP_COMPRESSION to the config entry map
* roverlay.hook
-> allow only one asterisk statement in EVENT_HOOK_RESTRICT
-> catch hook script failure in run() and raise an exception
* roverlay.tools.shenv
-> $SHLIB env var is a list now (see previous commit)
---
roverlay/config/const.py | 25 ++++++++++---------
roverlay/config/entrymap.py | 10 +++++++-
roverlay/hook.py | 59 +++++++++++++++++++++++++++++++++++----------
roverlay/main.py | 7 +++---
roverlay/tools/shenv.py | 46 ++++++++++++++++++++++++++---------
5 files changed, 106 insertions(+), 41 deletions(-)
diff --git a/roverlay/config/const.py b/roverlay/config/const.py
index f9a2e14..c78e27c 100644
--- a/roverlay/config/const.py
+++ b/roverlay/config/const.py
@@ -12,11 +12,13 @@ import time
__all__ = [ 'clone', 'lookup' ]
_CONSTANTS = dict (
- # FIXME: capslock? ;)
- DEBUG = False,
- debug = False,
+ debug = False,
+ nosync = False,
+ #installed = False,
- nosync = False,
+ INSTALLINFO = dict (
+ libexec = '/usr/libexec/roverlay', # ::LIBEXEC::
+ ),
# logging defaults are in recipe/easylogger
@@ -33,14 +35,13 @@ _CONSTANTS = dict (
),
EBUILD = dict (
- default_header = '\n'.join ( (
- '# Copyright 1999-%i Gentoo Foundation' % ( time.gmtime() [0] ),
- '# Distributed under the terms of the GNU General Public License v2',
- '# $Header: $',
- '',
- # EAPI=N and inherit <eclasses> are no longer part
- # of the default header
- ) ),
+ default_header = (
+ '# Copyright 1999-{year:d} Gentoo Foundation\n'
+ '# Distributed under the terms of the GNU General Public License v2\n'
+ '# $Header: $\n'
+ '\n'
+ ).format ( year=time.gmtime()[0] ),
+ # EAPI=N and inherit <eclasses> are no longer part of the default header
eapi = 4,
# number of workers used by OverlayCreator
diff --git a/roverlay/config/entrymap.py b/roverlay/config/entrymap.py
index 6a282d9..87b4973 100644
--- a/roverlay/config/entrymap.py
+++ b/roverlay/config/entrymap.py
@@ -306,8 +306,15 @@ CONFIG_ENTRY_MAP = dict (
value_type = yesno,
),
+ overlay_distmap_compression = dict (
+ description = 'distmap compression format (none, bzip2 or gzip)',
+ choices = frozenset ({
+ 'none', 'default', 'bz2', 'bzip2', 'gz', 'gzip'
+ }),
+ ),
+
overlay_distmap_file = dict (
- path = [ 'OVERLAY', 'DISTMAP', 'dbfile', ]
+ path = [ 'OVERLAY', 'DISTMAP', 'dbfile', ],
value_type = 'fs_file',
description = 'distmap file',
),
@@ -322,6 +329,7 @@ CONFIG_ENTRY_MAP = dict (
distdir_strategy = 'overlay_distdir_strategy',
distdir_flat = 'overlay_distdir_flat',
distdir_verify = 'overlay_distdir_verify',
+ distmap_compression = 'overlay_distmap_compression',
distmap_file = 'overlay_distmap_file',
# --- overlay
diff --git a/roverlay/hook.py b/roverlay/hook.py
index 3b13315..3392e4e 100644
--- a/roverlay/hook.py
+++ b/roverlay/hook.py
@@ -28,6 +28,10 @@ _EVENT_RESTRICT = None
# 4: deny all
_EVENT_POLICY = 0
+
+class HookException ( Exception ):
+ pass
+
def setup():
global _EVENT_SCRIPT
global _EVENT_POLICY
@@ -35,14 +39,29 @@ def setup():
_EVENT_SCRIPT = roverlay.config.get ( 'EVENT_HOOK.exe', False )
if _EVENT_SCRIPT is False:
- a_dir = roverlay.config.get ( 'OVERLAY.additions_dir', None )
- if a_dir:
+ if roverlay.config.get_or_fail ( 'installed' ):
s = os.path.join (
- a_dir,
+ roverlay.config.get_or_fail ( 'INSTALLINFO.libexec' ),
*roverlay.config.get_or_fail ( 'EVENT_HOOK.default_exe_relpath' )
)
if os.path.isfile ( s ):
_EVENT_SCRIPT = s
+ else:
+ LOGGER.error (
+ 'missing {!r} - '
+ 'has roverlay been installed properly?'.format ( s )
+ )
+ else:
+ a_dir = roverlay.config.get ( 'OVERLAY.additions_dir', None )
+ if a_dir:
+ s = os.path.join (
+ a_dir, *roverlay.config.get_or_fail (
+ 'EVENT_HOOK.default_exe_relpath'
+ )
+ )
+ if os.path.isfile ( s ):
+ _EVENT_SCRIPT = s
+ # -- end if installed
# -- end if _EVENT_SCRIPT
conf_restrict = roverlay.config.get ( 'EVENT_HOOK.restrict', False )
@@ -53,12 +72,16 @@ def setup():
allow = set()
deny = set()
for p in conf_restrict:
- if p == '*':
- # "allow all"
- is_whitelist = False
- elif p == '-*':
- # "deny all"
- is_whitelist = True
+ if p in { '*', '+*', '-*' }:
+ # "allow all" / "deny all"
+ # to avoid confusion, only one "[+-]*" statement is allowed
+ if is_whitelist is None:
+ is_whitelist = bool ( p[0] == '-' )
+ else:
+ raise Exception (
+ 'EVENT_HOOK_RESTRICT must not contain more than one '
+ '"*"/"+*"/"-*" statement'
+ )
elif p == '-' or p == '+':
# empty
pass
@@ -148,19 +171,29 @@ def phase_allowed_nolog ( phase ):
)
# --- end of phase_allowed_nolog (...) ---
-def run ( phase ):
+def run ( phase, catch_failure=True ):
if _EVENT_SCRIPT is None:
LOGGER.warning (
"hook module not initialized - doing that now (FIXME!)"
)
setup()
-
+ # -- end if
if _EVENT_SCRIPT and phase_allowed ( phase ):
- return roverlay.tools.shenv.run_script (
+ if roverlay.tools.shenv.run_script (
_EVENT_SCRIPT, phase, return_success=True
- )
+ ):
+ return True
+ elif catch_failure:
+ raise HookException (
+ "hook {h!r} returned non-zero for phase {p!r}".format (
+ h=_EVENT_SCRIPT, p=phase
+ )
+ )
+ #return False
+ else:
+ return False
else:
# nop
return True
diff --git a/roverlay/main.py b/roverlay/main.py
index 4822e21..8bfecf6 100644
--- a/roverlay/main.py
+++ b/roverlay/main.py
@@ -289,8 +289,7 @@ def main (
# this hook should be called _after_ verifying the overlay
# (verification is not implemented yet)
#
- if not roverlay.hook.run ( 'overlay_success' ):
- die ( "overlay_success hook returned non-zero", DIE.OV_CREATE )
+ roverlay.hook.run ( 'overlay_success' )
set_action_done ( "create" )
@@ -348,11 +347,13 @@ def main (
DEFAULT_CONFIG_FILE = CONFIG_FILE_NAME
- commands, config_file, additional_config, extra_opts = \
+ commands, config_file, additional_config, extra_opts = (
roverlay.argutil.parse_argv (
command_map=COMMAND_DESCRIPTION,
default_config_file=DEFAULT_CONFIG_FILE,
)
+ )
+ additional_config ['installed'] = ROVERLAY_INSTALLED
OPTION = extra_opts.get
diff --git a/roverlay/tools/shenv.py b/roverlay/tools/shenv.py
index f0c054b..794ed1e 100644
--- a/roverlay/tools/shenv.py
+++ b/roverlay/tools/shenv.py
@@ -90,6 +90,10 @@ NULL_PHASE = 'null'
def setup_env():
"""Returns a 'well-defined' env dict for running scripts."""
+ ROVERLAY_INSTALLED = roverlay.config.get_or_fail ( 'installed' )
+ SHLIB_DIRNAME = 'shlib'
+ SHFUNC_FILENAME = 'functions.sh'
+
# @typedef shbool is SH_TRUE|SH_FALSE, where:
SH_TRUE = 'y'
SH_FALSE = 'n'
@@ -175,30 +179,48 @@ def setup_env():
# shell file with "core" functions
#
additions_dir = roverlay.config.get ( 'OVERLAY.additions_dir', None )
+ shlib_path = []
+
+ if ROVERLAY_INSTALLED:
+ installed_shlib = (
+ roverlay.config.get_or_fail ( 'INSTALLINFO.libexec' )
+ + os.sep + SHLIB_DIRNAME
+ )
+ if os.path.isdir ( installed_shlib ):
+ shlib_path.append ( installed_shlib )
+ shlib_file = installed_shlib + os.sep + SHFUNC_FILENAME
+ if os.path.isfile ( shlib_file ):
+ setup ( 'FUNCTIONS', shlib_file )
+ else:
+ LOGGER.error (
+ "roverlay is installed, but $FUNCTIONS file is missing."
+ )
+ else:
+ LOGGER.error ( "roverlay is installed, but shlib dir is missing." )
+ # -- end if installed~shlib
+
if additions_dir:
setup ( 'ADDITIONS_DIR', additions_dir )
setup_self ( 'FILESDIR', 'ADDITIONS_DIR' )
- shlib_root = additions_dir + os.sep + 'shlib'
- shlib_file = None
- SHFUNC_FILENAME = 'functions.sh'
+ shlib_root = additions_dir + os.sep + 'shlib'
if os.path.isdir ( shlib_root ):
- setup ( 'SHLIB', shlib_root )
- shlib_file = shlib_root + os.sep + SHFUNC_FILENAME
+ shlib_path.append ( shlib_root )
+# if not ROVERLAY_INSTALLED:
+ shlib_file = shlib_root + os.sep + SHFUNC_FILENAME
if os.path.isfile ( shlib_file ):
setup ( 'FUNCTIONS', shlib_file )
- else:
- shlib_file = None
# -- end if shlib_root;
-
- if not shlib_file:
- shlib_file = additions_dir + os.sep + SHFUNC_FILENAME
- if os.path.isfile ( shlib_file ):
- setup ( 'FUNCTIONS', shlib_file )
# -- end if additions_dir;
+ if shlib_path:
+ # reversed shlib_path:
+ # assuming that user-provided function files are more important
+ #
+ setup ( 'SHLIB', ':'.join ( reversed ( shlib_path ) ) )
+
# str::exe $EBUILD
setup_conf ( 'EBUILD', 'TOOLS.EBUILD.exe' )
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-09-06 11:11 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-06 11:10 [gentoo-commits] proj/R_overlay:master commit in: roverlay/tools/, roverlay/config/, roverlay/ André Erdmann
-- strict thread matches above, loose matches on Subject: below --
2013-09-05 10:24 André Erdmann
2013-06-30 15:58 André Erdmann
2013-06-26 17:29 [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann
2013-06-30 15:58 ` [gentoo-commits] proj/R_overlay:master " André Erdmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox