Improve error handling and reporting (partially resolves issue 695)

This commit is contained in:
Thomas Keller 2011-06-04 01:03:30 +02:00
parent 32cde534bd
commit 8ff15368ce

View File

@ -132,7 +132,7 @@ class IDF_Plugin_SyncMonotone
foreach ($confdir_contents as $content) { foreach ($confdir_contents as $content) {
if (!file_exists($confdir.$content)) { if (!file_exists($confdir.$content)) {
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('The configuration file %s is missing.'), $content __('The configuration file "%s" is missing.'), $content
)); ));
} }
} }
@ -141,13 +141,16 @@ class IDF_Plugin_SyncMonotone
$projectpath = sprintf($projecttempl, $shortname); $projectpath = sprintf($projecttempl, $shortname);
if (file_exists($projectpath)) { if (file_exists($projectpath)) {
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('The project path %s already exists.'), $projectpath __('The project path "%s" already exists.'), $projectpath
)); ));
} }
if (!mkdir($projectpath)) { if (!@mkdir($projectpath)) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('The project path %s could not be created.'), $projectpath __('The project path "%s" could not be created: %s'),
$projectpath, $err
)); ));
} }
@ -182,9 +185,12 @@ class IDF_Plugin_SyncMonotone
// //
$keydir = Pluf::f('tmp_folder').'/mtn-client-keys'; $keydir = Pluf::f('tmp_folder').'/mtn-client-keys';
if (!file_exists($keydir)) { if (!file_exists($keydir)) {
if (!mkdir($keydir)) { if (!@mkdir($keydir)) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('The key directory %s could not be created.'), $keydir __('The key directory "%s" could not be created: %s'),
$keydir, $err
)); ));
} }
} }
@ -238,18 +244,24 @@ class IDF_Plugin_SyncMonotone
foreach ($confdir_contents as $content) { foreach ($confdir_contents as $content) {
$filepath = $projectpath.'/'.$content; $filepath = $projectpath.'/'.$content;
if (substr($content, -1) == '/') { if (substr($content, -1) == '/') {
if (!mkdir($filepath)) { if (!@mkdir($filepath)) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('Could not create configuration directory "%s"'), $filepath __('Could not create configuration directory "%s": %s'),
$filepath, $err
)); ));
} }
continue; continue;
} }
if (substr($content, -3) != '.in') { if (substr($content, -3) != '.in') {
if (!symlink($confdir.$content, $filepath)) { if (!@symlink($confdir.$content, $filepath)) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
IDF_Scm_Exception(sprintf( IDF_Scm_Exception(sprintf(
__('Could not create symlink "%s"'), $filepath __('Could not create symlink for configuration file "%s": %s'),
$filepath, $err
)); ));
} }
continue; continue;
@ -264,9 +276,12 @@ class IDF_Plugin_SyncMonotone
// remove the .in // remove the .in
$filepath = substr($filepath, 0, -3); $filepath = substr($filepath, 0, -3);
if (file_put_contents($filepath, $filecontents, LOCK_EX) === false) { if (@file_put_contents($filepath, $filecontents, LOCK_EX) === false) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('Could not write configuration file "%s"'), $filepath __('Could not write configuration file "%s": %s'),
$filepath, $err
)); ));
} }
} }
@ -315,9 +330,12 @@ class IDF_Plugin_SyncMonotone
// FIXME: more sanity - what happens on failing writes? we do not // FIXME: more sanity - what happens on failing writes? we do not
// have a backup copy of usher.conf around... // have a backup copy of usher.conf around...
if (file_put_contents($usher_config, $usher_rc, LOCK_EX) === false) { if (@file_put_contents($usher_config, $usher_rc, LOCK_EX) === false) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('Could not write usher configuration file "%s"'), $usher_config __('Could not write usher configuration file "%s": %s'),
$usher_config, $err
)); ));
} }
@ -361,9 +379,12 @@ class IDF_Plugin_SyncMonotone
$write_permissions = implode("\n", $key_ids); $write_permissions = implode("\n", $key_ids);
$rcfile = $projectpath.'/write-permissions'; $rcfile = $projectpath.'/write-permissions';
if (file_put_contents($rcfile, $write_permissions, LOCK_EX) === false) { if (@file_put_contents($rcfile, $write_permissions, LOCK_EX) === false) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('Could not write write-permissions file "%s"'), $rcfile __('Could not write write-permissions file "%s": %s'),
$rcfile, $err
)); ));
} }
@ -384,9 +405,12 @@ class IDF_Plugin_SyncMonotone
} }
$read_permissions = IDF_Scm_Monotone_BasicIO::compile(array($stanza)); $read_permissions = IDF_Scm_Monotone_BasicIO::compile(array($stanza));
$rcfile = $projectpath.'/read-permissions'; $rcfile = $projectpath.'/read-permissions';
if (file_put_contents($rcfile, $read_permissions, LOCK_EX) === false) { if (@file_put_contents($rcfile, $read_permissions, LOCK_EX) === false) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('Could not write read-permissions file "%s"'), $rcfile __('Could not write read-permissions file "%s": %s'),
$rcfile, $err
)); ));
} }
@ -401,17 +425,19 @@ class IDF_Plugin_SyncMonotone
$serverRestartRequired = false; $serverRestartRequired = false;
if ($project->private && file_exists($projectfile) && is_link($projectfile)) { if ($project->private && file_exists($projectfile) && is_link($projectfile)) {
if (!unlink($projectfile)) { if (!@unlink($projectfile)) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
IDF_Scm_Exception(sprintf( IDF_Scm_Exception(sprintf(
__('Could not remove symlink "%s"'), $projectfile __('Could not remove symlink "%s": %s'), $projectfile, $err
)); ));
} }
$serverRestartRequired = true; $serverRestartRequired = true;
} else } else
if (!$project->private && !file_exists($projectfile)) { if (!$project->private && !file_exists($projectfile)) {
if (!symlink($templatefile, $projectfile)) { if (!@symlink($templatefile, $projectfile)) {
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('Could not create symlink "%s"'), $projectfile __('Could not create symlink "%s": %s'), $projectfile, $err
)); ));
} }
$serverRestartRequired = true; $serverRestartRequired = true;
@ -473,8 +499,11 @@ class IDF_Plugin_SyncMonotone
if ($keyname && $keyhash && if ($keyname && $keyhash &&
file_exists($keydir .'/'. $keyname . '.' . $keyhash)) { file_exists($keydir .'/'. $keyname . '.' . $keyhash)) {
if (!@unlink($keydir .'/'. $keyname . '.' . $keyhash)) { if (!@unlink($keydir .'/'. $keyname . '.' . $keyhash)) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('Could not delete client private key %s'), $keyname __('Could not delete client private key "%s": %s'),
$keyname, $err
)); ));
} }
} }
@ -505,9 +534,12 @@ class IDF_Plugin_SyncMonotone
// FIXME: more sanity - what happens on failing writes? we do not // FIXME: more sanity - what happens on failing writes? we do not
// have a backup copy of usher.conf around... // have a backup copy of usher.conf around...
if (file_put_contents($usher_config, $usher_rc, LOCK_EX) === false) { if (@file_put_contents($usher_config, $usher_rc, LOCK_EX) === false) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('Could not write usher configuration file "%s"'), $usher_config __('Could not write usher configuration file "%s": %s'),
$usher_config, $err
)); ));
} }
@ -598,10 +630,13 @@ class IDF_Plugin_SyncMonotone
$read_perms = IDF_Scm_Monotone_BasicIO::compile($parsed_read_perms); $read_perms = IDF_Scm_Monotone_BasicIO::compile($parsed_read_perms);
if (file_put_contents($projectpath.'/read-permissions', if (@file_put_contents($projectpath.'/read-permissions',
$read_perms, LOCK_EX) === false) { $read_perms, LOCK_EX) === false) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('Could not write read-permissions for project "%s"'), $shortname __('Could not write read-permissions for project "%s": %s'),
$shortname, $err
)); ));
} }
} }
@ -611,11 +646,13 @@ class IDF_Plugin_SyncMonotone
if (!in_array('*', $lines) && !in_array($mtn_key_id, $lines)) { if (!in_array('*', $lines) && !in_array($mtn_key_id, $lines)) {
$lines[] = $mtn_key_id; $lines[] = $mtn_key_id;
} }
if (file_put_contents($projectpath.'/write-permissions', if (@file_put_contents($projectpath.'/write-permissions',
implode("\n", $lines) . "\n", LOCK_EX) === false) { implode("\n", $lines) . "\n", LOCK_EX) === false) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('Could not write write-permissions file for project "%s"'), __('Could not write write-permissions file for project "%s": %s'),
$shortname $shortname, $err
)); ));
} }
@ -693,10 +730,13 @@ class IDF_Plugin_SyncMonotone
$read_perms = IDF_Scm_Monotone_BasicIO::compile($parsed_read_perms); $read_perms = IDF_Scm_Monotone_BasicIO::compile($parsed_read_perms);
if (file_put_contents($projectpath.'/read-permissions', if (@file_put_contents($projectpath.'/read-permissions',
$read_perms, LOCK_EX) === false) { $read_perms, LOCK_EX) === false) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('Could not write read-permissions for project "%s"'), $shortname __('Could not write read-permissions for project "%s": %s'),
$shortname, $err
)); ));
} }
} }
@ -711,11 +751,13 @@ class IDF_Plugin_SyncMonotone
continue; continue;
} }
} }
if (file_put_contents($projectpath.'/write-permissions', if (@file_put_contents($projectpath.'/write-permissions',
implode("\n", $lines) . "\n", LOCK_EX) === false) { implode("\n", $lines) . "\n", LOCK_EX) === false) {
$err = error_get_last();
$err = $err == null ? 'unknown error' : $err['message'];
throw new IDF_Scm_Exception(sprintf( throw new IDF_Scm_Exception(sprintf(
__('Could not write write-permissions file for project "%s"'), __('Could not write write-permissions file for project "%s": %s'),
$shortname $shortname, $err
)); ));
} }
@ -823,7 +865,7 @@ class IDF_Plugin_SyncMonotone
foreach ($scan as $subpath) { foreach ($scan as $subpath) {
$status |= self::_delete_recursive($subpath); $status |= self::_delete_recursive($subpath);
} }
$status |= rmdir($path); $status |= @rmdir($path);
return $status; return $status;
} }
} }