/* controle interactif des transfert de fichier entre l'espace de l'usager et la r‚f‚rence de groupe */ #include #include #include #include #include #include #include #include "projet.h" #include "projetx.m" /* initialise le projet dans l'espace de l'usager. Cr‚ation des sous-r‚pertoires et extractions des fichiers makefile.dat. retourne -1 si abandon ou erreur. */ int projet_get ( USERINFO *user, const char *tbprj[], int nbprj, bool dolog, // Enregistre que le projet a ‚t‚ pris bool getsub, // Prend r‚cursivement les sous-r‚pertoires. bool getobj, // Cr‚ation des sous-r‚pertoires pour compilation PROJET_LOG *log) // Peut ˆtre NULL { int ret = -1; foper_setlog (log); char dpath[MAXSIZ_PATH]; user->makusrpath("",dpath); if (file_mkdiranc (dpath) == -1){ xconf_error (MSG_U(E_NOMKDIR ,"Ne peut créer le répertoire\n%s") ,dpath); }else{ // Localise et charge le makefile.dat principal const REVISION *revsrc = user->getrevsrc(); if (log != NULL){ char srcstr[MAXSIZ_REVISION]; revsrc->format (srcstr); char dststr[MAXSIZ_REVISION]; user->getrevdst()->format (dststr); log->printf ("Extraction de %s -> %s\n",srcstr,dststr); } MAKEFILE master ((char*)NULL,false,revsrc,"",user); if (!master.isok()){ user->logerr ("Master pas ok\n"); }else{ ret = 0; for (int i=0; iprintf ("%s/\n",projet); // Obtient le path du makefile.dat appropri‚ pour // le projet. char makpath[MAXSIZ_PATH]; path_make (projet,"makefile.dat",makpath); MAKEFILE_FILE *file = master.locate (makpath); if (file == NULL){ /* #Sp‚cification: installe / projet inexistant Lorsqu'on commande l'installation d'un projet qui n'existe pas dans la r‚vision que l'on a s‚lectionn‚, il y a simplement cr‚ation d'un r‚pertoire vide. En fait, une nouvelle option permettra d'installer une r‚vision sp‚cifique d'un projet dans une autre r‚vision. Par exemple, on s‚lectionnera un r‚vision 0.2 qui ne contient pas le projet X. On s‚lectionne les projets de 0.2 sur lesquels on veut travailler. Ensuite on s‚lectionne une r‚vision particuliŠre du projet X que l'on installe dans l'environnement 0.2. On peut d‚j… simuler manuellement ce traitement. On installe la version 0.2 et ensuite la r‚vision qui contient le projet X. On copie ensuite le r‚pertoire X dans l'environnement 0.2. */ char dirpath[MAXSIZ_PATH]; user->makusrpath(projet,dirpath); file_mkdir(dirpath); if (log != NULL){ log->printf (" Nouveau projet: %s\n",dirpath); } }else{ master.extract (file,0); ret = prjenv_get (user,projet,file->getrelpath() ,getsub,getobj,log); if (ret != -1){ if (dolog){ PRJLOCK prjlock (user,projet); if (prjlock.isok()){ char path[MAXSIZ_PATH]; user->makusrpath (projet,path); prjlock.add (0,projet,path); prjlock.save(); } } } } } } } foper_setlog (NULL); return ret; } /* initialise le projet dans l'espace de l'usager. Cr‚ation des sous-r‚pertoires et extractions des fichiers makefile.dat. Affiche les op‚rations dans une fenˆtre. retourne -1 si abandon ou erreur. */ int projet_get ( USERINFO *user, const char *tbprj[], int nbprj, int dolog, // Enregistre que le projet a ‚t‚ pris int getsub, // Prend r‚cursivement les sous-r‚pertoires. int getobj) // Cr‚ation des sous-r‚pertoires pour compilation { WINDOW_LOG log("prend",0); log.show(); return projet_get (user,tbprj,nbprj,dolog,getsub,getobj,&log); } /* initialise le projet dans l'espace de l'usager. Cr‚ation des sous-r‚pertoires et extractions des fichiers makefile.dat. Retourne -1 si abandon ou erreur. */ int projet_setup ( USERINFO *user, const char *tbprj[], int nbprj) { int ret = -1; if (projet_chkusrenv(user)!=-1){ if (!user->nobuild()){ // V‚rifie que la version int‚gr‚e est disponible dans /kit/build int nbok = 0; for (int i=0; imakbldpath(projet,path); if (file_type(path) == 1){ nbok++; }else{ xconf_error (MSG_U(E_NOBUILD ,"Pas de répertoire d'intégration\n" "pour le projet %s") ,path); } } if (nbok == nbprj){ ret = projet_get (user,tbprj,nbprj,true,true,false); } }else{ ret = projet_get (user,tbprj,nbprj,true,true,false); } } return ret; } /* V‚rifie que l'environnement usager existe et on commande la cr‚ation si requis. Retourne -1 si l'environnement n'est pas ok et que usager a refus‚ de cr‚‚. */ int projet_chkusrenv (USERINFO *user) { int ret = 0; char usrpath[MAXSIZ_PATH]; user->makusrpath ("",usrpath); char objpath[MAXSIZ_PATH]; user->makobjpath ("",objpath); if (file_type(usrpath) != 1){ ret = -1; char buf[PATH_MAX]; sprintf (buf,MSG_U(Q_SETBUILDDIR,"Création du répertoire\n\n%s") ,usrpath); if (xconf_yesno("",buf,help_nil) == MENU_YES){ /* Cr‚ation de /kit/build/version. Les r‚pertoires doc et h sont cr‚‚s dans prjenv_get() appel‚ par projet_get(). */ ret = file_mkdiranc (usrpath); if (!ret){ // Il faut extraire le projet racine static const char *tb[]={""}; ret = projet_get (user,tb,1,false,false,false,NULL); }else{ xconf_error (MSG_R(E_DIRCREATE),usrpath); user->logerr ("Ne peut pas creer le r‚pertoire %s (%d)\n" ,usrpath,ret); } } } return ret; } /* Efface le contenu de l'environnement usager. Retourne 0 si ok, -1 si abandon ou erreur */ int projet_deluserdir ( USERINFO *user, const char *tbprj[], int nbprj) { int ret = -1; DIALOG dia; char srcdir = 1; char objdir = 1; dia.newf_chk ("",srcdir,MSG_U(F_DELUSR,"Efface les sources des projets")); dia.newf_chk ("",objdir,MSG_U(F_DELOBJ,"Efface les objets des projets")); //page.setspec (but); int nof = 0; while (1){ MENU_STATUS code = dia.edit (MSG_U(T_ABANDON,"Abandon de la révision") ,MSG_U(I_ABANDON ,"Vous ne voulez plus travailler sur cette révision du projet\n" "et vous vous préparez à effacer les objets et les sources\n" "de votre répertoire personnel.") ,help_nil,nof); if (code == MENU_CANCEL || code == MENU_ESCAPE){ break; }else if (code == MENU_ACCEPT){ for (int i=0; i0){ ret = -1; DIALOG dia; int nb = tbnew.getnb(); char sel[nb]; memset (sel,0,nb); for (int i=0; iget()); } dia.setbutinfo (MENU_USR1,MSG_R(B_ALL),MSG_R(B_ALL)); dia.setbutinfo (MENU_USR2,MSG_R(B_NONE),MSG_R(B_NONE)); int nof = 0; while (1){ MENU_STATUS code = dia.edit (MSG_U(T_NEWFILES,"Nouveaux fichiers") ,MSG_U(I_NEWFILE,"Voici la liste des nouveau fichier sources\n" "à archiver. Sélectionner ceux que vous souhaitez ajouter\n" "à l'archive (les autres resteront là).") ,help_nil,nof,MENUBUT_ACCEPT|MENUBUT_CANCEL|MENUBUT_USR1 |MENUBUT_USR2); if (code == MENU_CANCEL || code == MENU_ESCAPE){ break; }else if (code == MENU_USR1 || code == MENU_USR2){ memset (sel,code ==MENU_USR1 ? 1 : 0 , nb); dia.reload(); }else{ // On doit conserver uniquement les nouveau fichiers // accepté. int pos = 0; for (int i=0; iisok()){ break; } } if (nblock == nbprj){ WINDOW_LOG log ("livre.log",1); foper_setlog (&log); int err = 0; int nb = 0; PRJCTRL ctrl(user); SSTRINGS tbnew,tbold,tbdel; for (int i=0; i 0){ err = -1; for (int j=0; jget()); } } } if (err == -1){ xconf_error (MSG_U(E_LIVRETEST ,"Certain fichier ne sont pas\n" "livrables, soit parce que non documentés\n")); }else if (projet_selectnew (tbnew) != -1){ #if 0 for (int i=0; iget()); } #endif log.show(); REVISION_TYPE revtype = user->isbuild() ? REVISION_INTEGRE : REVISION_LIVRE; for (int i=0; i 0 && livre_revision (user,&ctrl,&log,"",comment,revtype ,version,tbnew) != -1){ /* #Specification: livraison / succŠs Lorsque la livraison est un succŠs. Les makefile.dat ont ‚t‚ modifi‚s. L'environnement de l'usager correspond donc … une nouvelle version. Il faut donc renommer les r‚pertoires pour r‚fl‚ter ce changement. Le r‚pertoire source est renomm‚ ainsi que le r‚pertoire objet. Un erreur est signal‚ si le r‚pertoire objets n'existe pas, mais ca ne nuit pas … l'int‚grit‚ de l'archive. */ user->chgenv(revtype,1,&log); } } foper_setlog (NULL); } for (int i=0; i