Ejemplo n.º 1
0
 /**
  * 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;
 }
Ejemplo n.º 2
0
 /**
  * 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();
 }