/** * Retorna todas las migraciones disponibles desde la actual hasta la versión parametro * * @param toba_version $hasta * @param string $path_migraciones Path opcional de donde se ubican las migraciones (solo para tests) */ function get_secuencia_migraciones($hasta, $path_migraciones = null) { if (!isset($path_migraciones)) { $dir = $this->path_migraciones(); } else { $dir = $path_migraciones; } $exp = "/migracion_(.+)\\.php/"; $archivos = toba_manejador_archivos::get_archivos_directorio($dir, $exp, false); $versiones = array(); foreach ($archivos as $archivo) { $partes = array(); preg_match($exp, $archivo, $partes); $numero = str_replace('_', '.', $partes[1]); $version = new toba_version($numero); if ($this->es_menor($version) && $hasta->es_mayor_igual($version)) { $versiones[] = $version; } } usort($versiones, array('toba_version', 'comparar_versiones')); return $versiones; }
/** * Dado un release en trunk_versiones genera una version en versiones * @consola_parametros -r release -u usuario_svn [-s url_svn] [-t path temporal] [-d path destino] */ function opcion__versionar() { $error = null; $salida = null; $url_svn = 'https://repositorio.siu.edu.ar/svn/toba'; $dir_temp = '/tmp'; $destino = '/tmp/toba'; $rama_branch = 'trunk_versiones'; $rama_versiones = 'versiones'; $mensaje_commit = 'Rama %s: Preparacion lanzamiento version %s'; $mensaje_copy = "Lanzamiento Version %s:"; $param = $this->get_parametros(); if (!isset($param['-r']) || trim($param['-r']) == '') { throw new toba_error("Es necesario indicar el release con '-r'"); } if (!isset($param['-u']) || trim($param['-u']) == '') { throw new toba_error("Es necesario indicar el usuario svn con '-u'"); } if (isset($param['-s']) && trim($param['-s']) != '') { $url_svn = $param['-s']; } if (isset($param['-t']) && trim($param['-t']) != '') { $dir_temp = $param['t']; } if (isset($param['-d']) && trim($param['-d']) != '') { $destino = $param['d']; } $release = $param['-r']; $usuario = $param['-u']; if (!file_exists($destino)) { mkdir($destino); } //-- Averiguo cual es el siguiente numero $versiones = explode("\n", trim(`svn ls {$url_svn}/{$rama_versiones}`)); $siguiente = new toba_version($release . '.0'); foreach ($versiones as $numero) { $version = new toba_version(str_replace('/', '', $numero)); if ($version->es_cambio_menor_version($siguiente) && $version->es_mayor_igual($siguiente)) { $siguiente = $version->get_siguiente_menor(); } } if (!$this->consola->dialogo_simple('Lanzando version ' . $siguiente->__toString() . " a partir del release {$release}", 's')) { return; } //-- Pongo ese numero en el archivo VERSION (de todos los proyectos) $this->consola->mensaje("Checkout y commit del archivo VERSION de {$rama_branch}/{$release} .", false); if (is_writable($dir_temp) === false) { throw new toba_error("El usuario actual no tiene permisos de escritura sobre '{$dir_temp}'"); } $co_temp = $dir_temp . '/' . uniqid('toba_'); `svn co --username {$usuario} --non-recursive {$url_svn}/{$rama_branch}/{$release} {$co_temp}`; $this->consola->progreso_avanzar(); file_put_contents($co_temp . '/VERSION', $siguiente->__toString()); //-- Arma mensaje de commit $mensaje_commit = utf8_encode(sprintf($mensaje_commit, $release, $siguiente->__toString())); $cmd = "svn ci {$co_temp} -m '{$mensaje_commit}'"; exec($cmd, $salida, $error); if ($error) { throw new toba_error("No fue posible hacer el commit. Comando:\n{$cmd}"); } $this->consola->progreso_fin(); //-- Hago el copy a versiones $this->consola->mensaje("Haciendo copy a {$rama_versiones}.", false); $mensaje_copy = sprintf($mensaje_copy, $siguiente->__toString()); if (file_exists($co_temp . '/notas_version.txt')) { //-- Incluye en el commit el changelog de la versión $notas_version = file_get_contents($co_temp . '/notas_version.txt'); $resultado = preg_split('/===\\s*(\\d+\\.\\d+\\.\\d+)\\s*===/i', $notas_version, null, 2); if (isset($resultado) && is_array($resultado)) { foreach ($resultado as $i => $nota) { if ($nota == $siguiente->__toString()) { $mensaje_copy .= $resultado[$i + 1]; break; } } } } $archivo_msg = tempnam($dir_temp, 'log_svn'); file_put_contents($archivo_msg, $mensaje_copy); $cmd = "svn cp --username {$usuario} {$url_svn}/{$rama_branch}/{$release} {$url_svn}/{$rama_versiones}/{$siguiente} -F {$archivo_msg}"; exec($cmd, $salida, $error); toba_manejador_archivos::eliminar_directorio($co_temp); unlink($archivo_msg); if ($error) { throw new toba_error("No fue posible hacer el copy. Comando:\n{$cmd}"); } $this->consola->progreso_fin(); //-- Hago el export a una carpeta $this->consola->mensaje("Export a carpeta temporal.", false); $export_dir = $dir_temp . "/toba_{$siguiente}"; if (file_exists($export_dir)) { toba_manejador_archivos::eliminar_directorio($export_dir); } $cmd = "svn export {$url_svn}/{$rama_versiones}/{$siguiente} {$export_dir}"; exec($cmd, $salida, $error); if ($error) { toba_manejador_archivos::eliminar_directorio($export_dir); throw new toba_error("No fue posible hacer el export. Comando:\n{$cmd}"); } $this->consola->progreso_fin(); //-- Armo el .zip $this->consola->mensaje("Creando ZIP.", false); if (file_exists("{$destino}/toba_{$siguiente}.zip")) { unlink("{$destino}/toba_{$siguiente}.zip"); } $cmd = "cd {$dir_temp}; zip -r {$destino}/toba_{$siguiente}.zip toba_{$siguiente}"; exec($cmd, $salida, $error); if ($error) { toba_manejador_archivos::eliminar_directorio($export_dir); throw new toba_error("Error armando el .zip. Comando:\n{$cmd}"); } $this->consola->progreso_fin(); //-- Armo el .tar.gz $this->consola->mensaje("Creando TAR.GZ.", false); if (file_exists("{$destino}/toba_{$siguiente}.tar.gz")) { unlink("{$destino}/toba_{$siguiente}.tar.gz"); } $cmd = "cd {$dir_temp}; tar -czvf {$destino}/toba_{$siguiente}.tar.gz toba_{$siguiente}"; exec($cmd, $salida, $error); if ($error) { toba_manejador_archivos::eliminar_directorio($export_dir); throw new toba_error("Error armando el .tar.gz. Comando:\n{$cmd}"); } $this->consola->progreso_fin(); //-- Borro temporales $this->consola->mensaje("Borrando archivos temporales.", false); toba_manejador_archivos::eliminar_directorio($export_dir); $this->consola->progreso_fin(); }