{"id":1650,"date":"2011-03-18T13:28:01","date_gmt":"2011-03-18T11:28:01","guid":{"rendered":"http:\/\/yeti.albascout.ro\/blog\/?p=1650"},"modified":"2011-03-18T13:52:52","modified_gmt":"2011-03-18T11:52:52","slug":"proiect-nou-trac-svn-intr-un-pas","status":"publish","type":"post","link":"https:\/\/yeti.albascout.ro\/blog\/proiect-nou-trac-svn-intr-un-pas\/","title":{"rendered":"Proiect nou Trac + SVN, \u00eentr-un pas"},"content":{"rendered":"<p>At\u00e2t pentru proiecte personale, c\u00e2t \u0219i pentru chestii comerciale, folosesc SVN pentru <em>version control. <\/em>\u00cemi e la \u00eendem\u00e2n\u0103, de\u0219i, av\u00e2nd \u00een vedere c\u0103 de cele mai multe ori folosesc un GUI pentru accesarea lor (gen Eclipse sau RabbitVCS sau ceva de genul \u0103sta) &#8211; a\u0219 putea folosi pentru ce fac eu \u0219i orice altceva &#8211; Dan ne-a trecut, spre exemplu, la robot, pe Mercurial.<\/p>\n<p>Trac este util mai ales pentru echipe \u0219i pentru bugtracking, este scris \u00een Python \u0219i are \u0219i o interfa\u021b\u0103 XMLRPC (pe care eu \u00eenc\u0103 nu am reu\u0219it s\u0103 o folosesc din Eclipse &#8211; pentru Trac 0.12 cu Mylyn).<\/p>\n<p>De fiecare dat\u0103 c\u00e2nd vreau s\u0103 pornesc un proiect nou &#8211; poate \u0219i pentru c\u0103 nu se \u00eent\u00e2mpl\u0103 foarte des, trebuie s\u0103 dau un google sau s\u0103 verific pagina de <em>man<\/em> pentru cum se creeaz\u0103 un repo \u00een SVN, care sunt permisiunile care trebuie setate, cum se creeaz\u0103 un environment \u00een Trac, <em>pe unde am pus eu folder-ul care con\u021bine site-urile de Trac pe server, <\/em>\u0219i alte chestii cu care \u00eemi cheltui timpul aiurea.<\/p>\n<p><!--more--><\/p>\n<p>Pornind de la un script de aici (am ruginit puternic la capitolul <em>bash scripting<\/em>, de\u0219i <em>la vremea mea <\/em>eram as &#8211; pe vremea c\u00e2nd f\u0103ceam SO cu <a href=\"http:\/\/kaciula.ro\">k\u0103<\/a> :P) am inventat un scriptule\u021b care creeaz\u0103 un repo SVN \u0219i apoi creaz\u0103 pentru el un environment Trac. Fa\u021b\u0103 de script-ul original am f\u0103cut c\u00e2teva modific\u0103ri:<\/p>\n<ul>\n<li>am scos \u00een variabile path-urile c\u0103tre folder-ul \u00een care se g\u0103sesc proiectele Trac, path-ul \u00een care se g\u0103sesc repo-urile SVN \u0219i root-ul URL-ului la care pot fi accesate<\/li>\n<li>am ad\u0103ugat structura recomandat\u0103 pentru repo-uri SVN, care se commit-uieste automat, acum<\/li>\n<li>\u00eencep\u00e2nd cu Trac 0.12, pot exista mai multe repo-uri pe environment, \u0219i, \u00eenafar\u0103 de cel (default), care nu mai este obligatoriu, se salveaz\u0103 \u00een baza de date \u0219i se pot modifica cu <em>trac-admin. <\/em>De aceea, repo-ul SVN este ad\u0103ugat separat, cu <em>trac-admin repository add<\/em>.<\/li>\n<li>am ad\u0103ugat user-ul meu ca Trac admin &#8211; ca s\u0103 am acces direct la interfa\u021ba web<\/li>\n<li>am ad\u0103ugat hook-urile pentru sincronizarea Trac cu repo-ul SVN, despre care am citit <a href=\"http:\/\/trac.edgewall.org\/wiki\/0.12\/TracRepositoryAdmin\">aici<\/a>, ca totul s\u0103 mearg\u0103 smooth :)<\/li>\n<\/ul>\n<p>Script-ul presupune c\u0103 exist\u0103 o scheletul pentru layout-ul repo-ului SVN \u00een folder-ul care con\u021bine repo-uri (la mine, <em>\/home\/svn<\/em>), \u00een folderul <em>skel<\/em>. De asemenea, pentru hook-urile pentru Trac, se presupune c\u0103 exist\u0103 tot acolo un folder <em>hooktemplates, <\/em>care con\u021bine template-ul pentru hook-uri (<a href=\"http:\/\/yeti.albascout.ro\/~yeti\/post-commit\">post-commit<\/a>, <a href=\"http:\/\/yeti.albascout.ro\/~yeti\/post-revprop-change\">post-revprop-change<\/a>).<\/p>\n<pre lang=\"Bash\">#!\/bin\/bash\r\n# createproject.sh\r\n# Based on a script by Hans de Ruiter (http:\/\/hdrlab.org.nz\/articles\/a-linux-server-for-software-developers\/setting-up-and-using-a-secure-trac-and-svn-server\/adding-deleting-a-project-to-trac-and-svn\/)\r\n\r\nEXPECTED_ARGS=1\r\n\r\nif [ $# -ne $EXPECTED_ARGS ]; then\r\n\techo \"$0 creates a new Trac project complete with a new SVN repository\"\r\n\techo \"USAGE: $0 [newprojname]\"\r\n\techo \"e.g., $0 \\\"New Project\\\"\"\r\n\texit 1\r\nfi\r\n\r\nif [ $(whoami) != \"root\" ]; then\r\n\techo \"You need to run this script as root.\"\r\n\tscriptname=`basename \"$0\"`\r\n\techo \"Use 'sudo .\/$scriptname' then enter your password when prompted. Or\"\r\n\techo \"use su, enter your password, and then execute .\/$scriptname\"\r\n\texit 1\r\nfi\r\n\r\nproj_name=$1\r\nproj_dirname=`echo \"$proj_name\" | tr \" \" \"_\"`\r\n\r\ntrac_root=`echo \"\/path\/to\/trac\/sites\/\"`\r\nsvn_root=`echo \"\/path\/to\/svn\/repos\/\"`\r\nsite_root=`echo \"http:\/\/yoursite.com\"`\r\n\r\necho \"The project repository will be found in $site_root\/$proj_dirname\"\r\necho \"The Trac pages will be found in $site_root\/$proj_dirname\"\r\n\r\n#\tCreating SVN repo\r\ncd $svn_root\r\nsu www-data -c \"svnadmin create $proj_dirname\"\r\nsvn import $svn_root\/skel file:\/\/$svn_root\/$proj_dirname\/ -m \"Creating basic folder structure $proj_name\"\r\nchown www-data:subversion $svn_root\/$proj_dirname -R\r\n\r\n#\tCreating Trac site\r\nsu www-data -c \"mkdir $trac_root\/$proj_dirname\"\r\ncd $trac_root\/$proj_dirname\r\ntrac-admin $trac_root\/$proj_dirname initenv \"$proj_name\" sqlite:db\/trac.db #svn \/home\/svn\/$proj_dirname\r\ntrac-admin $trac_root\/$proj_dirname repository add default \/home\/svn\/$proj_dirname svn\r\ntrac-admin $trac_root\/$proj_dirname repository set default \"url\" \"$site_root\/svn\/$proj_dirname\"\r\ntrac-admin $trac_root\/$proj_dirname repository resync default\r\ntrac-admin $trac_root\/$proj_dirname permission add yeti TRAC_ADMIN\r\nchown -R www-data $trac_root\/$proj_dirname\r\n\r\n# subversion hooks\r\nsu www-data -c \"sed 's\/PROJ_NAME\/$proj_dirname\/g' $svn_root\/hooktemplates\/post-commit &gt; $svn_root\/$proj_dirname\/hooks\/post-commit\"\r\nchmod ug+x $svn_root\/$proj_dirname\/hooks\/post-commit\r\nsu www-data -c \"sed 's\/PROJ_NAME\/$proj_dirname\/g' $svn_root\/hooktemplates\/post-revprop-change &gt; $svn_root\/$proj_dirname\/hooks\/post-revprop-change\"\r\nchmod ug+x $svn_root\/$proj_dirname\/hooks\/post-revprop-change\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>At\u00e2t pentru proiecte personale, c\u00e2t \u0219i pentru chestii comerciale, folosesc SVN pentru version control. \u00cemi e la \u00eendem\u00e2n\u0103, de\u0219i, av\u00e2nd \u00een vedere c\u0103 de cele mai multe ori folosesc un GUI pentru accesarea lor (gen Eclipse sau RabbitVCS sau ceva de genul \u0103sta) &#8211; a\u0219 putea folosi pentru ce fac eu \u0219i orice altceva &#8211; &hellip; <a href=\"https:\/\/yeti.albascout.ro\/blog\/proiect-nou-trac-svn-intr-un-pas\/\" class=\"more-link\">Continu\u0103 s\u0103 cite\u0219ti <span class=\"screen-reader-text\">Proiect nou Trac + SVN, \u00eentr-un pas<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[559,557],"tags":[736,727,643],"class_list":["post-1650","post","type-post","status-publish","format-standard","hentry","category-ideas","category-facultate","tag-cod","tag-cs-pub","tag-idee"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/posts\/1650","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/comments?post=1650"}],"version-history":[{"count":13,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/posts\/1650\/revisions"}],"predecessor-version":[{"id":1653,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/posts\/1650\/revisions\/1653"}],"wp:attachment":[{"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/media?parent=1650"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/categories?post=1650"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yeti.albascout.ro\/blog\/wp-json\/wp\/v2\/tags?post=1650"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}