#include #include #include #include #include #include #include "projet.h" #include "prjlist.h" #include "projetx.m" /* Elimine les ‚l‚ments de tbsub[] de tb[]. tb[] -= tbsub[]. Retourne nombre d'‚l‚ment restant dans tb[]. */ static int tbstr_sub ( char *tb[], int nbtb, char *tbsub[], int nbsub) { for (int i=0; i maxtb){ xconf_error (MSG_U(E_PRJTOOMANY ,"Trop de répertoires projets dans %s: %d\n" " Maximum %d") ,path,nbprj,maxtb); tbstr_free (tbtmp+maxtb,nbprj-maxtb); nbprj = maxtb; } memcpy (tbprj,tbtmp,nbprj*sizeof(tbprj[0])); return nbprj; } /* Construit une liste avec la s‚lection des r‚visions-projets Balaye un r‚pertoire et extrait les sous-r‚pertoires qui correspondent … des r‚visions. Le r‚sultat est en ordre de r‚vision et non pas en ordre alphab‚tique. '_' > '9'. */ int projet_getrevdir ( const char *path, char *tbrev[], int maxtb) { int nbrev = dir_getlistd (path,"*",0,tbrev,maxtb); for (int i=0; igetusrpath(),"*",0,tbuser,100); for (int i=0; igetrevsrc(); MAKEFILE master ((char*)NULL,false,revsrc,"",user); master.setiter(); MAKEFILE_FILE *file; int nbprj = 0; while ((file=master.iter("*/makefile.dat"))!=NULL){ char newprojet[MAXSIZ_PATH]; path_splitlex (file->getnom(),newprojet,NULL); tbprj[nbprj++] = strdup_err(newprojet); if (nbprj == maxtb) break; } tbstr_sort (tbprj,nbprj); return nbprj; } static void near prjlist_copy2info ( char *tbprj[], PRJ_INFO tbiprj[], int nbprj) { for (int i=0; igetombre(),tbprj,maxtb); char *tbrev[200]; int nbrev = prjlist_getrevdir (user,tbrev,200); nbprj = tbstr_sub (tbprj,nbprj,tbrev,nbrev); tbstr_free (tbrev,nbrev); nbprj = subuser (user,tbprj,nbprj); prjlist_copy2info (tbprj,tbiprj,nbprj); return nbprj; } PUBLIC int PRJLISTE_GET::exec ( USERINFO *user, int , // Op‚ration command‚. const char *tbprj[], // Projets s‚lectionn‚s int nbprj) { // Le programmeur veut une copie du ou des projets return projet_setup (user,tbprj,nbprj); } PUBLIC const char **PRJLISTE_GET::getbutton() { static const char *tb[]={MSG_U(B_GET,"Prend"),NULL}; return tb; } PUBLIC int PRJLISTE_LIVRE::getlist( USERINFO *user, PRJ_INFO tbiprj[], int maxtb) { char *tbprj[200]; int nbprj = projetp_getprjdir (user->getusrpath(),tbprj,maxtb); prjlist_copy2info (tbprj,tbiprj,nbprj); return nbprj; } PUBLIC void PRJLISTE_LIVRE::setupdia (DIALOG &dia) { dia.newf_str (MSG_U(F_NEWVERNAME,"Nom de version(opt)"),newversion); dia.newf_textarea (MSG_U(F_COMMENT,"Commentaire"),comment,70,15); } struct VIEW_CHANGE_PARMS{ USERINFO *user; SSTRINGS tbold,tbnew,tbdel; VIEW_CHANGE_PARMS(USERINFO *_user){ user = _user; } }; static void fct_view_change (void *p) { VIEW_CHANGE_PARMS *parms = (VIEW_CHANGE_PARMS *)p; view_changes (parms->user,parms->tbold,parms->tbnew,parms->tbdel); delete parms; } PUBLIC int PRJLISTE_LIVRE::exec ( USERINFO *user, int opr, // Op‚ration command‚. const char *tbprj[], // Projets s‚lectionn‚s int nbprj) { int ret = -1; if (nbprj == 0){ xconf_error (MSG_R(E_AUMOINS1)); }else{ switch (opr){ case 0: // Le programmeur ne veut plus de sa copie du projet { for (int i=0; i 1){ xconf_error (MSG_U(E_UNPRJ,"Un projet à la fois")); }else{ // Documente les changements avant livraison change_edit (user,tbprj[0]); // Le -1 fait que le dialogue qui a d‚clench‚ // cette fonction ne termine pas. ret = -1; } #else { PRJCTRL ctrl(user); VIEW_CHANGE_PARMS *parms = new VIEW_CHANGE_PARMS(user); for (int i=0; itbold,parms->tbnew,parms->tbdel); } if (parms->tbold.getnb()==0 && parms->tbnew.getnb()==0 && parms->tbdel.getnb()==0){ xconf_error (MSG_U(E_PASCHANGE,"Aucun changement, rien de livrable")); delete parms; }else{ // Le thread détruira parms uithread (fct_view_change,parms); } } #endif break; case 2: // Livre une r‚vision d'un projet ret = projet_livre (user,tbprj,nbprj,newversion.get(),comment.get()); break; } } return ret; } PUBLIC const char **PRJLISTE_LIVRE::getbutton() { static const char *tb[]={ MSG_U(B_UNGET,"Abandon"), MSG_U(B_DOCUMENT,"Document"), MSG_U(B_LIVRE,"Livre"), NULL }; return tb; } /* Extrait la liste de tous les projets qui font partie de la r‚vision cible. Retourne le nombre de projet dans tbprj[]. */ PUBLIC int PRJLISTE_BUILD::getlist( USERINFO *user, PRJ_INFO tbiprj[], int maxtb) { char *tbprj[200]; int nbprj = prjlist_getrevdir (user,tbprj,maxtb); prjlist_copy2info (tbprj,tbiprj,nbprj); return nbprj; } /* Extrait la liste de tous les projets excluant ceux qui font partie de la r‚vision cible. Retourne le nombre de projet dans tbprj[]. */ PUBLIC int PRJLISTE_BUILDALL::getlist( USERINFO *user, PRJ_INFO tbiprj[], int maxtb) { char *tbprj[200]; int nbprj = projetp_getprjdir (user->getombre(),tbprj,maxtb); prjlist_copy2info (tbprj,tbiprj,nbprj); return nbprj; } PUBLIC int PRJLISTE_BUILD::exec ( USERINFO *user, int opr, // Op‚ration command‚. const char *tbprj[], // Projets s‚lectionn‚s int nbprj) { int ret = -1; if (nbprj == 0){ xconf_error (MSG_R(E_AUMOINS1)); }else{ switch (opr){ case 0: ret = projet_setupbuild (user,tbprj,nbprj); break; } } return ret; } PUBLIC const char **PRJLISTE_BUILD::getbutton() { static const char *tb[]={MSG_U(B_BUILD,"Build"),NULL}; return tb; } PUBLIC int PRJLISTE_LIVREB::getlist( USERINFO *user, PRJ_INFO tbiprj[], int maxtb) { char path[MAXSIZ_PATH]; user->makbldpath("",path); char *tbprj[200]; int nbprj = projetp_getprjdir (path,tbprj,maxtb); prjlist_copy2info (tbprj,tbiprj,nbprj); return nbprj; }