#include #include #include #include #include "projet.h" #include "projetx.m" /* V‚rifie si un livraison est pr‚sente dans un path. Retourne != 0 si oui. */ static int export_check ( char *path) { char zip[MAXSIZ_PATH],tar[MAXSIZ_PATH]; file_chgext (path,zip,"zip"); file_chgext (path,tar,"tar.gz"); return file_type(tar)==0 || file_type(zip)==0 || file_type(path)==1; } /* Localise le r‚pertoire (ou fichier .zip) d'une livraison. Retourne -1 si trouve pas. */ static int export_locate( USERINFO *user, const char *revpath, // R‚vision en format path _x_y_z_2 char *path) { /* #Sp‚cification: admin / export / provenance des fichiers Les fichiers requis pour l'exportation (une r‚vision) proviennent soit de /kit/livre ou d'un des /kit/sync/site. Ceux de /kit/livre proviennent des livraisons locales. Ceux de /kit/sync/site proviennent des livraisons recus de ces sites. De plus, ces livraisons peuvent ˆtre en format .zip ou ‚tal‚e dans un sous-r‚pertoire. La commande envoie devra traiter les deux cas. */ user->maklivpath (revpath,path); int ret = 0; if (export_check(path)){ ret = 1; }else{ // Il faut chercher dans /kit/sync /* #Sp‚cification: admin / export / limite Le nombre de site dans /kit/sync est limit‚ arbitrairement … 100. */ char *tb[100]; /* #Sp‚cification: admin / export / /kit/sync Lorsqu'on recoie une r‚vision d'un site, on la place dans le sous-r‚pertoire de /kit/sync appropri‚. L'importation (Option admin/import de projetx) pourra alors import‚ la r‚vision et d‚truire le fichier. projetx pourra alors r‚viser le contenu de /kit/sync/XX/version.dat. L'exportation consulte aussi les diff‚rents r‚pertoire /kit/sync/sites pour retrouver les livraisons. */ int nb = dir_getlistd (user->getsyncpath(),WILD_ALLFILE,0,tb,100); for (int i=0; i=0){ char buf[1000]; while (pop.readout(buf,sizeof(buf)-1)!=-1){ fputs (buf,stdout); } while (pop.readerr(buf,sizeof(buf)-1)!=-1){ fputs (buf,stderr); } } ret = pop.getstatus(); } return ret; } /* D‚termine toutes les r‚visions qui doivent ˆtre export‚ vers un site et d‚clenche le traitement pour r‚aliser. Retourne -1 si erreur. */ int export_site ( USERINFO *user, VERSION_DAT &princ, const char *site, PROJET_LOG &log) { /* #Sp‚cification: admin / export / /kit/sync /kit/livre opŠre avec un autre systŠme, soit /kit/sync. /kit/sync contient un r‚pertoire pour chaque site qui doit ˆtre mis … jour. Dans chaque sous-r‚pertoire de /kit/sync, il y a au moins deux fichiers et parfois quelques .zip. */ int ret = 0; /* #Sp‚cification: admin / export / /kit/sync Le fichier /kit/sync/XX/version.dat est une copie du fichier /kit/ombre/version.dat du site XX. En calculant la diff‚rence entre ce fichier et la version locale de ce fichier (/kit/ombre/version.dat), on peut ‚tablir la liste des r‚visions qui doivent ˆtre transmises au site XX. Ces r‚visions sont dans /kit/livre et aussi dans les autres r‚pertoires /kit/sync/sites. */ char path[MAXSIZ_PATH]; user->maksyncpath (site,path); char vpath[MAXSIZ_PATH]; path_make (path,"version.dat",vpath); VERSION_DAT exp (vpath); int save_exp = 0; int nb=princ.getnb(); for (int i=0; igetprog()!=NULL){ int no; const REVISION *rev = one->getrev(); VERSION_ONE *sone = exp.get(rev,no); if (sone == NULL){ // Il faut exporter cette r‚vision au site char revstr[MAXSIZ_REVISION]; rev->format (revstr); char revpath[MAXSIZ_NAME]; rev->formatpath(revpath); char basedir[MAXSIZ_PATH]; if (export_locate (user,revpath,basedir)){ /* #Sp‚cification: admin / export / script Le fichier /kit/sync/XX/envoie est script UNIX qui est activ‚ par le programme prjexpr et transmet chaque r‚vision selon le m‚canisme appropri‚ pour un site. Il recoit comme seul argument le path absolue (sans extension) du repertoire ou du fichier .zip qui contient la livraison. */ char cmd[MAXSIZ_PATH]; path_make (path,"envoie",cmd); path_2os (cmd,cmd); strcat (cmd," "); path_2os (basedir,basedir); strcat (cmd,basedir); strcat (cmd," "); strcat (cmd,revpath); if (prjexpr_system(cmd)==0){ log.printf ("exporte %s\n",revstr); VERSION_ONE *newone = new VERSION_ONE (one); if (newone != NULL){ exp.add (newone); save_exp = 1; } }else{ log.printf ("**** Erreur durant l'exportation de %s\n" ,revstr); xconf_error (MSG_U(E_ERREXP ,"Erreur durant l'exportation\n" "de la révision %s") ,revstr); ret = -1; } }else{ log.printf ("**** Pas de livraison disponible pour" " exporter %s\n",revstr); xconf_error (MSG_U(E_MISSEXP ,"Pas de livraison disponible\n" "pour exporter la révision %s") ,revstr); ret = -1; } } } } if (save_exp) exp.save(user); return ret; }