Alien-SVN
view release on metacpan or search on metacpan
src/subversion/tools/server-side/svnpubsub/svnwcsub.py view on Meta::CPAN
# For giggles, let's clean up the working copy in case something
# happened earlier.
self._cleanup(wc)
logging.info("updating: %s", wc.path)
### we need to move some of these args into the config. these are
### still specific to the ASF setup.
args = [self.svnbin, 'switch',
'--quiet',
'--non-interactive',
'--trust-server-cert',
'--ignore-externals',
'--config-option',
'config:miscellany:use-commit-times=on',
'--',
wc.url,
wc.path]
check_call(args, env=self.env)
### check the loglevel before running 'svn info'?
info = svn_info(self.svnbin, self.env, wc.path)
logging.info("updated: %s now at r%s", wc.path, info['Revision'])
## Run the hook
if self.hook:
hook_mode = ['post-update', 'boot'][boot]
logging.info('running hook: %s at revision %s due to %s',
wc.path, info['Revision'], hook_mode)
args = [self.hook, hook_mode,
wc.path, info['Revision'], wc.url]
check_call(args, env=self.env)
def _cleanup(self, wc):
"Run a cleanup on the specified working copy."
### we need to move some of these args into the config. these are
### still specific to the ASF setup.
args = [self.svnbin, 'cleanup',
'--non-interactive',
'--trust-server-cert',
'--config-option',
'config:miscellany:use-commit-times=on',
wc.path]
check_call(args, env=self.env)
class ReloadableConfig(ConfigParser.SafeConfigParser):
def __init__(self, fname):
ConfigParser.SafeConfigParser.__init__(self)
self.fname = fname
self.read(fname)
### install a signal handler to set SHOULD_RELOAD. BDEC should
### poll this flag, and then adjust its internal structures after
### the reload.
self.should_reload = False
def reload(self):
# Delete everything. Just re-reading would overlay, and would not
# remove sections/options. Note that [DEFAULT] will not be removed.
for section in self.sections():
self.remove_section(section)
# Now re-read the configuration file.
self.read(fname)
def get_value(self, which):
return self.get(ConfigParser.DEFAULTSECT, which)
def get_optional_value(self, which, default=None):
if self.has_option(ConfigParser.DEFAULTSECT, which):
return self.get(ConfigParser.DEFAULTSECT, which)
else:
return default
def get_env(self):
env = os.environ.copy()
default_options = self.defaults().keys()
for name, value in self.items('env'):
if name not in default_options:
env[name] = value
return env
def get_track(self):
"Return the {PATH: URL} dictionary of working copies to track."
track = dict(self.items('track'))
for name in self.defaults().keys():
del track[name]
return track
def optionxform(self, option):
# Do not lowercase the option name.
return str(option)
class Daemon(daemonize.Daemon):
def __init__(self, logfile, pidfile, umask, bdec):
daemonize.Daemon.__init__(self, logfile, pidfile)
self.umask = umask
self.bdec = bdec
def setup(self):
# There is no setup which the parent needs to wait for.
pass
def run(self):
logging.info('svnwcsub started, pid=%d', os.getpid())
# Set the umask in the daemon process. Defaults to 000 for
# daemonized processes. Foreground processes simply inherit
# the value from the parent process.
if self.umask is not None:
umask = int(self.umask, 8)
os.umask(umask)
logging.info('umask set to %03o', umask)
# Start the BDEC (on the main thread), then start the client
self.bdec.start()
( run in 2.330 seconds using v1.01-cache-2.11-cpan-140bd7fdf52 )