Index: head/www/Makefile =================================================================== --- head/www/Makefile (revision 393307) +++ head/www/Makefile (revision 393308) @@ -1,2356 +1,2357 @@ # $FreeBSD$ # COMMENT = Ports related to the World Wide Web SUBDIR += MT SUBDIR += R-cran-RgoogleMaps SUBDIR += R-cran-Rpad SUBDIR += R-cran-httpuv SUBDIR += R-cran-scrapeR SUBDIR += R-cran-shiny SUBDIR += WebMagick SUBDIR += ach SUBDIR += adzap SUBDIR += alef-webfont SUBDIR += amphetadesk SUBDIR += analog SUBDIR += anyremote2html SUBDIR += anyterm SUBDIR += apache-forrest SUBDIR += apache-mode.el SUBDIR += apache22 SUBDIR += apache22-event-mpm SUBDIR += apache22-itk-mpm SUBDIR += apache22-peruser-mpm SUBDIR += apache22-worker-mpm SUBDIR += apache24 SUBDIR += apercu SUBDIR += aria2 SUBDIR += aria2fe SUBDIR += arora SUBDIR += asp2php SUBDIR += asql SUBDIR += asterisk-stat SUBDIR += atutor SUBDIR += august SUBDIR += autoindex2 SUBDIR += awffull SUBDIR += aws SUBDIR += aws-demos SUBDIR += awstats SUBDIR += axis SUBDIR += axis2 SUBDIR += b2evolution SUBDIR += bacula-web SUBDIR += baikal SUBDIR += bblog SUBDIR += bigbluebutton SUBDIR += bins SUBDIR += bkmrkconv SUBDIR += blastbeat SUBDIR += blogsum SUBDIR += bluefish SUBDIR += boa SUBDIR += bookmarkbridge SUBDIR += bozohttpd SUBDIR += c-icap SUBDIR += c-icap-modules SUBDIR += cadaver SUBDIR += cakephp11 SUBDIR += cakephp13 SUBDIR += cakephp21 SUBDIR += cakephp22 SUBDIR += cakephp23 SUBDIR += calamaris SUBDIR += calendarserver SUBDIR += castget SUBDIR += caudium14 SUBDIR += cblog SUBDIR += cgi-lib SUBDIR += cgi-lib.pl SUBDIR += cgicc SUBDIR += cgichk SUBDIR += cgihtml SUBDIR += cgiparse SUBDIR += cgiwrap SUBDIR += checkbot SUBDIR += chems SUBDIR += cherokee SUBDIR += choqok SUBDIR += chpasswd SUBDIR += chromium SUBDIR += chtml SUBDIR += ckeditor SUBDIR += cl-lml SUBDIR += cl-lml-sbcl SUBDIR += claroline SUBDIR += clearsilver SUBDIR += clearsilver-python SUBDIR += closure-compiler SUBDIR += closure-linter SUBDIR += cmsmadesimple SUBDIR += cntlm SUBDIR += cocoon SUBDIR += codeigniter SUBDIR += coppermine SUBDIR += cplanet SUBDIR += cppcms SUBDIR += crawl SUBDIR += crp SUBDIR += css-mode.el SUBDIR += cssed SUBDIR += csso SUBDIR += csstidy SUBDIR += ctemplate SUBDIR += cutycapt SUBDIR += dalbum SUBDIR += davical SUBDIR += dddbl SUBDIR += decss SUBDIR += deforaos-surfer SUBDIR += demoroniser SUBDIR += dfileserver SUBDIR += dhttpd SUBDIR += dillo2 SUBDIR += dojo SUBDIR += dojo-shrinksafe SUBDIR += dokuwiki SUBDIR += dotclear SUBDIR += dotproject SUBDIR += download-gemist SUBDIR += drood SUBDIR += drraw SUBDIR += drupal6 SUBDIR += drupal6-advanced_help SUBDIR += drupal6-cck SUBDIR += drupal6-chaos SUBDIR += drupal6-ckeditor SUBDIR += drupal6-content_access SUBDIR += drupal6-geshifilter SUBDIR += drupal6-google_analytics SUBDIR += drupal6-image SUBDIR += drupal6-imce SUBDIR += drupal6-menu_block SUBDIR += drupal6-mimedetect SUBDIR += drupal6-nice_menus SUBDIR += drupal6-nodewords SUBDIR += drupal6-page_title SUBDIR += drupal6-panels SUBDIR += drupal6-path_redirect SUBDIR += drupal6-pathauto SUBDIR += drupal6-print SUBDIR += drupal6-seo_checklist SUBDIR += drupal6-services SUBDIR += drupal6-tagadelic SUBDIR += drupal6-token SUBDIR += drupal6-views SUBDIR += drupal6-webform SUBDIR += drupal6-wysiwyg SUBDIR += drupal6-zeropoint SUBDIR += drupal7 SUBDIR += drupal7-wysiwyg SUBDIR += drush SUBDIR += dtse SUBDIR += dummyflash SUBDIR += e107 SUBDIR += e2guardian SUBDIR += eaccelerator SUBDIR += edbrowse SUBDIR += efront SUBDIR += elgg SUBDIR += elinks SUBDIR += eliom SUBDIR += elixir-html_entities SUBDIR += elixir-httpoison SUBDIR += elixir-httpotion SUBDIR += elixir-joken SUBDIR += elixir-maru SUBDIR += elixir-phoenix SUBDIR += elixir-phoenix_ecto SUBDIR += elixir-phoenix_html SUBDIR += elixir-webassembly SUBDIR += emacs-w3m SUBDIR += encode-explorer SUBDIR += entrans SUBDIR += ephemera SUBDIR += epiphany SUBDIR += erlang-cowboy SUBDIR += erlang-cowlib SUBDIR += erlang-hackney SUBDIR += erlang-ibrowse SUBDIR += erlang-mochiweb SUBDIR += erlang-mochiweb-basho SUBDIR += erlang-webmachine SUBDIR += erwn SUBDIR += eventum SUBDIR += extjs SUBDIR += fancybox SUBDIR += faup SUBDIR += fcgi SUBDIR += fcgiwrap SUBDIR += feedjack SUBDIR += feedonfeeds SUBDIR += ffproxy SUBDIR += fira-webfont SUBDIR += firefox SUBDIR += firefox-esr SUBDIR += firefox-esr-i18n SUBDIR += firefox-i18n SUBDIR += flat-frog SUBDIR += flickcurl SUBDIR += flood SUBDIR += flot SUBDIR += fluxbb SUBDIR += fluxcms SUBDIR += fnord SUBDIR += formication SUBDIR += foswiki SUBDIR += fpc-fastcgi SUBDIR += fpc-httpd22 SUBDIR += fpc-httpd24 SUBDIR += free-sa-devel SUBDIR += freeway SUBDIR += fswiki SUBDIR += ftasv SUBDIR += fusionpbx SUBDIR += g-cows SUBDIR += g-gcl SUBDIR += gaeo SUBDIR += gaeutilities SUBDIR += gallery2 SUBDIR += gallery3 SUBDIR += gatling SUBDIR += gecko-mediaplayer SUBDIR += gecko-sharp20 SUBDIR += geeklog SUBDIR += geeknote SUBDIR += geneweb SUBDIR += geolizer SUBDIR += geronimo SUBDIR += get_flash_videos SUBDIR += getleft SUBDIR += gist SUBDIR += glassfish SUBDIR += glpi SUBDIR += gnome-user-share SUBDIR += gnome-web-photo SUBDIR += google-appengine SUBDIR += google-sitemapgen SUBDIR += googlebook_dl SUBDIR += goose SUBDIR += gpx2map SUBDIR += grafana SUBDIR += grails SUBDIR += gregarius SUBDIR += groupoffice SUBDIR += grr SUBDIR += gstreamer-plugins-neon SUBDIR += gstreamer1-plugins-neon SUBDIR += gtkhtml3 SUBDIR += gtkhtml4 SUBDIR += guile-www SUBDIR += gurlchecker SUBDIR += h2o SUBDIR += habari SUBDIR += hastymail SUBDIR += hastymail2 SUBDIR += hastymail2-devel SUBDIR += havp SUBDIR += helma SUBDIR += hiawatha SUBDIR += hinventory-client SUBDIR += horde-ansel SUBDIR += horde-base SUBDIR += horde-passwd SUBDIR += horde-trean SUBDIR += horde-wicked SUBDIR += hotcrp SUBDIR += hs-DAV SUBDIR += hs-HTTP SUBDIR += hs-activehs SUBDIR += hs-authenticate SUBDIR += hs-cgi SUBDIR += hs-cookie SUBDIR += hs-css-text SUBDIR += hs-fastcgi SUBDIR += hs-gitit SUBDIR += hs-hS3 SUBDIR += hs-happstack SUBDIR += hs-happstack-server SUBDIR += hs-heist SUBDIR += hs-hjsmin SUBDIR += hs-http-client SUBDIR += hs-http-client-tls SUBDIR += hs-http-conduit SUBDIR += hs-http-date SUBDIR += hs-http-reverse-proxy SUBDIR += hs-http-server SUBDIR += hs-http-types SUBDIR += hs-oeis SUBDIR += hs-path-pieces SUBDIR += hs-recaptcha SUBDIR += hs-scgi SUBDIR += hs-shakespeare SUBDIR += hs-snap SUBDIR += hs-snap-core SUBDIR += hs-snap-server SUBDIR += hs-url SUBDIR += hs-wai SUBDIR += hs-wai-app-static SUBDIR += hs-wai-extra SUBDIR += hs-wai-logger SUBDIR += hs-warp SUBDIR += hs-warp-tls SUBDIR += hs-webkit SUBDIR += hs-xss-sanitize SUBDIR += hs-yesod SUBDIR += hs-yesod-auth SUBDIR += hs-yesod-auth-hashdb SUBDIR += hs-yesod-bin SUBDIR += hs-yesod-core SUBDIR += hs-yesod-form SUBDIR += hs-yesod-persistent SUBDIR += hs-yesod-platform SUBDIR += hs-yesod-routes SUBDIR += hs-yesod-static SUBDIR += hs-yesod-test SUBDIR += htdigest SUBDIR += htdump SUBDIR += html2hdml SUBDIR += html2wml SUBDIR += htmlcompressor SUBDIR += htmlcxx SUBDIR += htmlpp SUBDIR += httest SUBDIR += http-analyze SUBDIR += http_get SUBDIR += http_load SUBDIR += http_post SUBDIR += httpasyncclient SUBDIR += httpclient SUBDIR += httpcore SUBDIR += httpie SUBDIR += httpsqs SUBDIR += httptunnel SUBDIR += httrack SUBDIR += hudson SUBDIR += hydra SUBDIR += hypermail SUBDIR += igal2 SUBDIR += ikiwiki SUBDIR += ilias SUBDIR += imgsizer SUBDIR += impresscms SUBDIR += interchange SUBDIR += iojs SUBDIR += ismail SUBDIR += itop SUBDIR += iwebcal SUBDIR += jawstats SUBDIR += jdresolve SUBDIR += jericho-html SUBDIR += jesred SUBDIR += jetty SUBDIR += jinzora SUBDIR += jmeter SUBDIR += joomla15 SUBDIR += joomla25 SUBDIR += joomla31 SUBDIR += jspacker SUBDIR += jspwiki SUBDIR += jtoolkit SUBDIR += junkbuster SUBDIR += kanboard SUBDIR += kannel SUBDIR += kannel-sqlbox SUBDIR += kcgi SUBDIR += kdewebdev4 SUBDIR += kpartsplugin SUBDIR += kplaylist SUBDIR += kwebkitpart SUBDIR += larbin SUBDIR += lessc SUBDIR += libapreq2 SUBDIR += libecap SUBDIR += libepc SUBDIR += libevhtp SUBDIR += libgtkhtml SUBDIR += libhpack SUBDIR += libhtp-suricata SUBDIR += libmicrohttpd SUBDIR += libsocialweb SUBDIR += libwww SUBDIR += libxul SUBDIR += lightsquid SUBDIR += lighttpd SUBDIR += lighttpd-mod_geoip SUBDIR += lighttpd-mod_h264_streaming SUBDIR += lilurl SUBDIR += limesurvey SUBDIR += linkcheck SUBDIR += linkchecker SUBDIR += linklint SUBDIR += links SUBDIR += links-hacked SUBDIR += links1 SUBDIR += linux-c6-flashplugin11 SUBDIR += linux-c6-qt47-webkit SUBDIR += linux-f10-flashplugin11 SUBDIR += linux-firefox SUBDIR += linux-libgtkembedmoz SUBDIR += linux-opera SUBDIR += linux-seamonkey SUBDIR += lionwiki SUBDIR += litmus SUBDIR += ljdeps SUBDIR += ljdump SUBDIR += llgal SUBDIR += logtools SUBDIR += luakit SUBDIR += lynx SUBDIR += lynx-current SUBDIR += madsonic SUBDIR += madsonic-standalone SUBDIR += magento SUBDIR += mahara SUBDIR += man2web SUBDIR += mathjax SUBDIR += mathopd SUBDIR += mediawiki119 SUBDIR += mediawiki123 SUBDIR += mediawiki124 SUBDIR += mediawiki125 SUBDIR += mergelog SUBDIR += mgstat SUBDIR += mhonarc SUBDIR += micro_httpd SUBDIR += middleman SUBDIR += midori SUBDIR += mimetex SUBDIR += mini_httpd SUBDIR += mitmproxy SUBDIR += mkapachepw SUBDIR += mknmz-wwwoffle SUBDIR += mnogosearch SUBDIR += mod_amazon_proxy SUBDIR += mod_antiloris SUBDIR += mod_asn SUBDIR += mod_auth_cas SUBDIR += mod_auth_cookie_mysql2 SUBDIR += mod_auth_external2 SUBDIR += mod_auth_imap2 SUBDIR += mod_auth_kerb2 SUBDIR += mod_auth_mysql2 SUBDIR += mod_auth_mysql_another SUBDIR += mod_auth_openid SUBDIR += mod_auth_pam2 SUBDIR += mod_auth_pgsql2 SUBDIR += mod_auth_pubtkt SUBDIR += mod_auth_tkt SUBDIR += mod_auth_xradius SUBDIR += mod_authn_otp SUBDIR += mod_authn_sasl SUBDIR += mod_authnz_crowd SUBDIR += mod_authnz_external22 SUBDIR += mod_authnz_external24 SUBDIR += mod_authz_unixgroup22 SUBDIR += mod_authz_unixgroup24 SUBDIR += mod_backtrace SUBDIR += mod_bw SUBDIR += mod_cband SUBDIR += mod_cfg_ldap SUBDIR += mod_chroot SUBDIR += mod_clamav SUBDIR += mod_cloudflare SUBDIR += mod_cvs2 SUBDIR += mod_dav_svn SUBDIR += mod_dnssd SUBDIR += mod_domaintree SUBDIR += mod_encoding SUBDIR += mod_evasive SUBDIR += mod_extract_forwarded SUBDIR += mod_fastcgi SUBDIR += mod_fcgid SUBDIR += mod_fileiri SUBDIR += mod_flickr SUBDIR += mod_geoip2 SUBDIR += mod_gzip2 SUBDIR += mod_h264_streaming SUBDIR += mod_hosts_access SUBDIR += mod_jail SUBDIR += mod_jk SUBDIR += mod_layout22 SUBDIR += mod_limitipconn2 SUBDIR += mod_line_edit SUBDIR += mod_log_config-st SUBDIR += mod_log_firstbyte SUBDIR += mod_log_mysql SUBDIR += mod_log_sql2 SUBDIR += mod_log_sql2-dtc SUBDIR += mod_macro22 SUBDIR += mod_memcache SUBDIR += mod_memcache_block SUBDIR += mod_mono SUBDIR += mod_mpm_itk SUBDIR += mod_musicindex SUBDIR += mod_myvhost SUBDIR += mod_ntlm2 SUBDIR += mod_perl2 SUBDIR += mod_php5 SUBDIR += mod_php55 SUBDIR += mod_php56 SUBDIR += mod_proctitle SUBDIR += mod_proxy_html SUBDIR += mod_proxy_uwsgi SUBDIR += mod_proxy_xml SUBDIR += mod_python33 SUBDIR += mod_python35 SUBDIR += mod_qos SUBDIR += mod_realdoc SUBDIR += mod_remoteip SUBDIR += mod_reproxy SUBDIR += mod_rivet SUBDIR += mod_rpaf2 SUBDIR += mod_scgi SUBDIR += mod_security SUBDIR += mod_setenvifplus SUBDIR += mod_spdy SUBDIR += mod_tidy SUBDIR += mod_tsa SUBDIR += mod_uid SUBDIR += mod_umask SUBDIR += mod_vhost_ldap SUBDIR += mod_vhs SUBDIR += mod_webkit SUBDIR += mod_whatkilledus SUBDIR += mod_wsgi4 SUBDIR += mod_xml2enc SUBDIR += mod_xmlns SUBDIR += mod_xsendfile SUBDIR += mohawk SUBDIR += moinmoin SUBDIR += monast SUBDIR += mongoose SUBDIR += mongrel2 SUBDIR += moodle27 SUBDIR += moodle28 SUBDIR += moodle29 SUBDIR += mozplugger SUBDIR += multisort SUBDIR += multiwatch SUBDIR += mybb SUBDIR += myfaces SUBDIR += mysar SUBDIR += mysqlphp2postgres SUBDIR += mythplugin-mythweb SUBDIR += nanoblogger SUBDIR += nanoblogger-extra SUBDIR += neon SUBDIR += netoffice SUBDIR += netrik SUBDIR += netstiff SUBDIR += netsurf SUBDIR += newsbeuter SUBDIR += nghttp2 SUBDIR += nginx SUBDIR += nginx-devel SUBDIR += nibbleblog SUBDIR += node SUBDIR += node-devel SUBDIR += node010 SUBDIR += nostromo SUBDIR += npapi-vlc SUBDIR += npapi-xine SUBDIR += npc SUBDIR += npm SUBDIR += nspluginwrapper SUBDIR += ocaml-net SUBDIR += ocsigen SUBDIR += ojs2 SUBDIR += ompload SUBDIR += opencart SUBDIR += openxmldir SUBDIR += opera SUBDIR += opera-linuxplugins SUBDIR += orangehrm SUBDIR += oscommerce SUBDIR += otrs SUBDIR += otter-browser SUBDIR += owncloud SUBDIR += p5-AMF-Perl SUBDIR += p5-Acme-Monta SUBDIR += p5-Amon2 SUBDIR += p5-Amon2-Lite SUBDIR += p5-Amon2-Plugin-LogDispatch SUBDIR += p5-Amon2-Plugin-Web-CSRFDefender SUBDIR += p5-Amon2-Plugin-Web-MobileAgent SUBDIR += p5-Any-Template SUBDIR += p5-Any-URI-Escape SUBDIR += p5-AnyEvent-HTTP SUBDIR += p5-AnyEvent-HTTP-LWP-UserAgent SUBDIR += p5-AnyEvent-HTTPD SUBDIR += p5-AnyEvent-Mojo SUBDIR += p5-AnyEvent-ReverseHTTP SUBDIR += p5-AnyEvent-SCGI SUBDIR += p5-Apache-ASP SUBDIR += p5-Apache-Admin-Config SUBDIR += p5-Apache-AuthCookie SUBDIR += p5-Apache-AuthTicket SUBDIR += p5-Apache-Clean2 SUBDIR += p5-Apache-ConfigFile SUBDIR += p5-Apache-ConfigParser SUBDIR += p5-Apache-DB SUBDIR += p5-Apache-DBI SUBDIR += p5-Apache-Gallery SUBDIR += p5-Apache-Htgroup SUBDIR += p5-Apache-LogFormat-Compiler SUBDIR += p5-Apache-MP3 SUBDIR += p5-Apache-ParseFormData SUBDIR += p5-Apache-Profiler SUBDIR += p5-Apache-Session SUBDIR += p5-Apache-Session-PHP SUBDIR += p5-Apache-Session-SQLite3 SUBDIR += p5-Apache-Session-SharedMem SUBDIR += p5-Apache-Session-Wrapper SUBDIR += p5-Apache-SessionX SUBDIR += p5-Apache-Singleton SUBDIR += p5-Apache2-SiteControl SUBDIR += p5-ApacheBench SUBDIR += p5-App-Nopaste SUBDIR += p5-App-gist SUBDIR += p5-Ark SUBDIR += p5-Bigtop SUBDIR += p5-Blog-Spam SUBDIR += p5-Browser-Open SUBDIR += p5-Business-PayPal SUBDIR += p5-CGI SUBDIR += p5-CGI-Ajax SUBDIR += p5-CGI-Application SUBDIR += p5-CGI-Application-Dispatch SUBDIR += p5-CGI-Application-Dispatch-Server SUBDIR += p5-CGI-Application-PSGI SUBDIR += p5-CGI-Application-Plugin-AnyTemplate SUBDIR += p5-CGI-Application-Plugin-Apache SUBDIR += p5-CGI-Application-Plugin-Authentication SUBDIR += p5-CGI-Application-Plugin-Authorization SUBDIR += p5-CGI-Application-Plugin-AutoRunmode SUBDIR += p5-CGI-Application-Plugin-Config-YAML SUBDIR += p5-CGI-Application-Plugin-ConfigAuto SUBDIR += p5-CGI-Application-Plugin-DBH SUBDIR += p5-CGI-Application-Plugin-DebugScreen SUBDIR += p5-CGI-Application-Plugin-DevPopup SUBDIR += p5-CGI-Application-Plugin-Forward SUBDIR += p5-CGI-Application-Plugin-HTDot SUBDIR += p5-CGI-Application-Plugin-HTMLPrototype SUBDIR += p5-CGI-Application-Plugin-HtmlTidy SUBDIR += p5-CGI-Application-Plugin-JSON SUBDIR += p5-CGI-Application-Plugin-LinkIntegrity SUBDIR += p5-CGI-Application-Plugin-LogDispatch SUBDIR += p5-CGI-Application-Plugin-MessageStack SUBDIR += p5-CGI-Application-Plugin-Redirect SUBDIR += p5-CGI-Application-Plugin-Session SUBDIR += p5-CGI-Application-Plugin-Stream SUBDIR += p5-CGI-Application-Plugin-TT SUBDIR += p5-CGI-Application-Plugin-ValidateRM SUBDIR += p5-CGI-Application-Plugin-ViewCode SUBDIR += p5-CGI-Application-Server SUBDIR += p5-CGI-ArgChecker SUBDIR += p5-CGI-Builder SUBDIR += p5-CGI-Builder-TT2 SUBDIR += p5-CGI-Cache SUBDIR += p5-CGI-Compile SUBDIR += p5-CGI-Compress-Gzip SUBDIR += p5-CGI-Cookie-Splitter SUBDIR += p5-CGI-Cookie-XS SUBDIR += p5-CGI-Deurl-XS SUBDIR += p5-CGI-Emulate-PSGI SUBDIR += p5-CGI-EncryptForm SUBDIR += p5-CGI-Enurl SUBDIR += p5-CGI-Ex SUBDIR += p5-CGI-Expand SUBDIR += p5-CGI-ExtDirect SUBDIR += p5-CGI-FCKeditor SUBDIR += p5-CGI-Fast SUBDIR += p5-CGI-FastTemplate SUBDIR += p5-CGI-FormBuilder SUBDIR += p5-CGI-Framework SUBDIR += p5-CGI-Kwiki SUBDIR += p5-CGI-Minimal SUBDIR += p5-CGI-PSGI SUBDIR += p5-CGI-Pager SUBDIR += p5-CGI-Prototype SUBDIR += p5-CGI-Response SUBDIR += p5-CGI-SSI SUBDIR += p5-CGI-Session SUBDIR += p5-CGI-Session-ExpireSessions SUBDIR += p5-CGI-Simple SUBDIR += p5-CGI-SpeedyCGI SUBDIR += p5-CGI-Struct SUBDIR += p5-CGI-Thin SUBDIR += p5-CGI-Untaint SUBDIR += p5-CGI-Untaint-date SUBDIR += p5-CGI-Untaint-email SUBDIR += p5-CGI-Upload SUBDIR += p5-CGI-Utils SUBDIR += p5-CGI-XMLApplication SUBDIR += p5-CGI.pm SUBDIR += p5-CGI_Lite SUBDIR += p5-CIF-Client SUBDIR += p5-CSS-DOM SUBDIR += p5-CSS-Inliner SUBDIR += p5-Catalyst-Action-REST SUBDIR += p5-Catalyst-Action-RenderView SUBDIR += p5-Catalyst-Action-Serialize-XML-Hash-LX SUBDIR += p5-Catalyst-ActionRole-ACL SUBDIR += p5-Catalyst-Authentication-Credential-HTTP SUBDIR += p5-Catalyst-Authentication-Credential-OpenID SUBDIR += p5-Catalyst-Authentication-Store-DBIx-Class SUBDIR += p5-Catalyst-Authentication-Store-LDAP SUBDIR += p5-Catalyst-Component-ACCEPT_CONTEXT SUBDIR += p5-Catalyst-Component-InstancePerContext SUBDIR += p5-Catalyst-Controller-ActionRole SUBDIR += p5-Catalyst-Controller-BindLex SUBDIR += p5-Catalyst-Controller-FormBuilder SUBDIR += p5-Catalyst-Controller-HTML-FormFu SUBDIR += p5-Catalyst-Controller-RateLimit SUBDIR += p5-Catalyst-Controller-RequestToken SUBDIR += p5-Catalyst-Controller-SOAP SUBDIR += p5-Catalyst-Devel SUBDIR += p5-Catalyst-DispatchType-Regex SUBDIR += p5-Catalyst-Engine-Apache SUBDIR += p5-Catalyst-Engine-HTTP-Prefork SUBDIR += p5-Catalyst-Engine-PSGI SUBDIR += p5-Catalyst-Enzyme SUBDIR += p5-Catalyst-Helper-Controller-Scaffold SUBDIR += p5-Catalyst-Manual SUBDIR += p5-Catalyst-Model-Adaptor SUBDIR += p5-Catalyst-Model-CDBI SUBDIR += p5-Catalyst-Model-CDBI-Plain SUBDIR += p5-Catalyst-Model-CDBI-Sweet SUBDIR += p5-Catalyst-Model-DBIC-Plain SUBDIR += p5-Catalyst-Model-DBIC-Schema SUBDIR += p5-Catalyst-Model-DynamicAdaptor SUBDIR += p5-Catalyst-Model-LDAP SUBDIR += p5-Catalyst-Model-Memcached SUBDIR += p5-Catalyst-Model-Oryx SUBDIR += p5-Catalyst-Model-Tarantool SUBDIR += p5-Catalyst-Model-XML-Feed SUBDIR += p5-Catalyst-Model-Xapian SUBDIR += p5-Catalyst-Model-Xapian10 SUBDIR += p5-Catalyst-Plugin-AtomServer SUBDIR += p5-Catalyst-Plugin-Authentication SUBDIR += p5-Catalyst-Plugin-Authentication-CDBI SUBDIR += p5-Catalyst-Plugin-Authentication-OpenID SUBDIR += p5-Catalyst-Plugin-Authentication-Store-Htpasswd SUBDIR += p5-Catalyst-Plugin-Authorization-ACL SUBDIR += p5-Catalyst-Plugin-Authorization-Roles SUBDIR += p5-Catalyst-Plugin-AutoCRUD SUBDIR += p5-Catalyst-Plugin-Browser SUBDIR += p5-Catalyst-Plugin-C3 SUBDIR += p5-Catalyst-Plugin-Cache SUBDIR += p5-Catalyst-Plugin-Cache-FastMmap SUBDIR += p5-Catalyst-Plugin-Cache-Memcached SUBDIR += p5-Catalyst-Plugin-Cache-Memcached-Fast SUBDIR += p5-Catalyst-Plugin-Captcha SUBDIR += p5-Catalyst-Plugin-ConfigLoader SUBDIR += p5-Catalyst-Plugin-ConfigLoader-Environment SUBDIR += p5-Catalyst-Plugin-CookiedSession SUBDIR += p5-Catalyst-Plugin-DateTime SUBDIR += p5-Catalyst-Plugin-DefaultEnd SUBDIR += p5-Catalyst-Plugin-Email SUBDIR += p5-Catalyst-Plugin-ErrorCatcher SUBDIR += p5-Catalyst-Plugin-FillInForm SUBDIR += p5-Catalyst-Plugin-FormBuilder SUBDIR += p5-Catalyst-Plugin-FormValidator SUBDIR += p5-Catalyst-Plugin-I18N SUBDIR += p5-Catalyst-Plugin-Log-Dispatch SUBDIR += p5-Catalyst-Plugin-Log-Handler SUBDIR += p5-Catalyst-Plugin-LogWarnings SUBDIR += p5-Catalyst-Plugin-PageCache SUBDIR += p5-Catalyst-Plugin-Params-Nested SUBDIR += p5-Catalyst-Plugin-Pluggable SUBDIR += p5-Catalyst-Plugin-Prototype SUBDIR += p5-Catalyst-Plugin-RunAfterRequest SUBDIR += p5-Catalyst-Plugin-Scheduler SUBDIR += p5-Catalyst-Plugin-Server SUBDIR += p5-Catalyst-Plugin-Session SUBDIR += p5-Catalyst-Plugin-Session-FastMmap SUBDIR += p5-Catalyst-Plugin-Session-PerUser SUBDIR += p5-Catalyst-Plugin-Session-State-Cookie SUBDIR += p5-Catalyst-Plugin-Session-State-URI SUBDIR += p5-Catalyst-Plugin-Session-Store-Cache SUBDIR += p5-Catalyst-Plugin-Session-Store-DBI SUBDIR += p5-Catalyst-Plugin-Session-Store-DBIC SUBDIR += p5-Catalyst-Plugin-Session-Store-Delegate SUBDIR += p5-Catalyst-Plugin-Session-Store-FastMmap SUBDIR += p5-Catalyst-Plugin-Session-Store-File SUBDIR += p5-Catalyst-Plugin-Session-Store-Memcached SUBDIR += p5-Catalyst-Plugin-Session-Store-Memcached-Fast SUBDIR += p5-Catalyst-Plugin-Setenv SUBDIR += p5-Catalyst-Plugin-Singleton SUBDIR += p5-Catalyst-Plugin-SmartURI SUBDIR += p5-Catalyst-Plugin-StackTrace SUBDIR += p5-Catalyst-Plugin-Static SUBDIR += p5-Catalyst-Plugin-Static-Simple SUBDIR += p5-Catalyst-Plugin-StatusMessage SUBDIR += p5-Catalyst-Plugin-SubRequest SUBDIR += p5-Catalyst-Plugin-Textile SUBDIR += p5-Catalyst-Plugin-Unicode SUBDIR += p5-Catalyst-Plugin-XMLRPC SUBDIR += p5-Catalyst-Runtime SUBDIR += p5-Catalyst-TraitFor-Controller-DBIC-DoesPaging SUBDIR += p5-Catalyst-TraitFor-Request-BrowserDetect SUBDIR += p5-Catalyst-View-ClearSilver SUBDIR += p5-Catalyst-View-Email SUBDIR += p5-Catalyst-View-GraphViz SUBDIR += p5-Catalyst-View-HTML-Template SUBDIR += p5-Catalyst-View-HTML-Template-Compiled SUBDIR += p5-Catalyst-View-JSON SUBDIR += p5-Catalyst-View-Jemplate SUBDIR += p5-Catalyst-View-Mason SUBDIR += p5-Catalyst-View-REST-XML SUBDIR += p5-Catalyst-View-RRDGraph SUBDIR += p5-Catalyst-View-TT SUBDIR += p5-Catalyst-View-TT-ControllerLocal SUBDIR += p5-Catalyst-View-Template-Declare SUBDIR += p5-Catalyst-View-Templated SUBDIR += p5-Catalyst-View-XML-Feed SUBDIR += p5-Catalyst-View-XML-Simple SUBDIR += p5-Catalyst-View-XSLT SUBDIR += p5-CatalystX-Component-Traits SUBDIR += p5-CatalystX-InjectComponent SUBDIR += p5-CatalystX-LeakChecker SUBDIR += p5-CatalystX-Profile SUBDIR += p5-CatalystX-REPL SUBDIR += p5-CatalystX-RoleApplicator SUBDIR += p5-CatalystX-SimpleLogin SUBDIR += p5-Class-DBI-FromForm SUBDIR += p5-ClearSilver SUBDIR += p5-Compress-LeadingBlankSpaces SUBDIR += p5-Continuity SUBDIR += p5-Cookie-Baker SUBDIR += p5-Corona SUBDIR += p5-Dancer SUBDIR += p5-Dancer-Logger-Log4perl SUBDIR += p5-Dancer-Plugin-ExtDirect SUBDIR += p5-Dancer-Plugin-Feed SUBDIR += p5-Dancer-Plugin-Lexicon SUBDIR += p5-Dancer-Plugin-Memcached SUBDIR += p5-Dancer-Plugin-REST SUBDIR += p5-Dancer-Plugin-SiteMap SUBDIR += p5-Dancer-Plugin-ValidationClass SUBDIR += p5-Dancer-Session-Cookie SUBDIR += p5-Dancer-Template-Xslate SUBDIR += p5-Dancer2 SUBDIR += p5-Dancer2-Plugin-Ajax SUBDIR += p5-Dancer2-Plugin-Deferred SUBDIR += p5-Dancer2-Plugin-Path-Class SUBDIR += p5-Data-TreeDumper-Renderer-DHTML SUBDIR += p5-Data-Validate-URI SUBDIR += p5-Emplacken SUBDIR += p5-FAQ-OMatic SUBDIR += p5-FCGI SUBDIR += p5-FCGI-Async SUBDIR += p5-FCGI-Client SUBDIR += p5-FCGI-Engine SUBDIR += p5-FCGI-ProcManager SUBDIR += p5-FCGI-Spawn SUBDIR += p5-FEAR-API SUBDIR += p5-Facebook-Graph SUBDIR += p5-Feed-Find SUBDIR += p5-Feersum SUBDIR += p5-File-Mork SUBDIR += p5-Flea SUBDIR += p5-Flickr-API SUBDIR += p5-Flickr-Upload SUBDIR += p5-Fliggy SUBDIR += p5-Furl SUBDIR += p5-FurlX-Coro SUBDIR += p5-Gantry SUBDIR += p5-Geo-Caching SUBDIR += p5-Google-Search SUBDIR += p5-Gtk2-WebKit SUBDIR += p5-Gungho SUBDIR += p5-GunghoX-FollowLinks SUBDIR += p5-HTML-Adsense SUBDIR += p5-HTML-Breadcrumbs SUBDIR += p5-HTML-CalendarMonthSimple SUBDIR += p5-HTML-Chunks SUBDIR += p5-HTML-Clean SUBDIR += p5-HTML-ContentExtractor SUBDIR += p5-HTML-DOM SUBDIR += p5-HTML-Declare SUBDIR += p5-HTML-Defaultify SUBDIR += p5-HTML-Diff SUBDIR += p5-HTML-Display SUBDIR += p5-HTML-Element-Extended SUBDIR += p5-HTML-Element-Library SUBDIR += p5-HTML-Element-Replacer SUBDIR += p5-HTML-Encoding SUBDIR += p5-HTML-ExtractContent SUBDIR += p5-HTML-ExtractMain SUBDIR += p5-HTML-Field SUBDIR += p5-HTML-FillInForm SUBDIR += p5-HTML-FillInForm-ForceUTF8 SUBDIR += p5-HTML-FillInForm-Lite SUBDIR += p5-HTML-Form SUBDIR += p5-HTML-FormFu SUBDIR += p5-HTML-FormFu-Imager SUBDIR += p5-HTML-FormFu-Model-DBIC SUBDIR += p5-HTML-FormHandler SUBDIR += p5-HTML-FromANSI SUBDIR += p5-HTML-FromText SUBDIR += p5-HTML-GenToc SUBDIR += p5-HTML-GenerateUtil SUBDIR += p5-HTML-GoogleMaps SUBDIR += p5-HTML-Highlight SUBDIR += p5-HTML-LinkExtractor SUBDIR += p5-HTML-LinkList SUBDIR += p5-HTML-Lint SUBDIR += p5-HTML-Location SUBDIR += p5-HTML-Macro SUBDIR += p5-HTML-Mason SUBDIR += p5-HTML-Mason-PSGIHandler SUBDIR += p5-HTML-MobileConverter SUBDIR += p5-HTML-Pager SUBDIR += p5-HTML-Parser SUBDIR += p5-HTML-Parser-Simple SUBDIR += p5-HTML-Perlinfo SUBDIR += p5-HTML-PrettyPrinter SUBDIR += p5-HTML-Prototype SUBDIR += p5-HTML-Query SUBDIR += p5-HTML-QuickCheck SUBDIR += p5-HTML-RSSAutodiscovery SUBDIR += p5-HTML-ResolveLink SUBDIR += p5-HTML-RobotsMETA SUBDIR += p5-HTML-Scrubber SUBDIR += p5-HTML-Seamstress SUBDIR += p5-HTML-Selector-XPath SUBDIR += p5-HTML-Shakan SUBDIR += p5-HTML-SimpleLinkExtor SUBDIR += p5-HTML-SimpleParse SUBDIR += p5-HTML-StickyQuery SUBDIR += p5-HTML-StickyQuery-DoCoMoGUID SUBDIR += p5-HTML-Stream SUBDIR += p5-HTML-Strip SUBDIR += p5-HTML-StripScripts SUBDIR += p5-HTML-StripScripts-Parser SUBDIR += p5-HTML-Summary SUBDIR += p5-HTML-Table SUBDIR += p5-HTML-TableContentParser SUBDIR += p5-HTML-TableExtract SUBDIR += p5-HTML-TableLayout SUBDIR += p5-HTML-TableParser SUBDIR += p5-HTML-TableTiler SUBDIR += p5-HTML-TagCloud SUBDIR += p5-HTML-TagCloud-Extended SUBDIR += p5-HTML-TagParser SUBDIR += p5-HTML-Tagset SUBDIR += p5-HTML-Template SUBDIR += p5-HTML-Template-Associate SUBDIR += p5-HTML-Template-Compiled SUBDIR += p5-HTML-Template-Expr SUBDIR += p5-HTML-Template-HashWrapper SUBDIR += p5-HTML-Template-JIT SUBDIR += p5-HTML-Template-Pluggable SUBDIR += p5-HTML-Template-Pro SUBDIR += p5-HTML-Toc SUBDIR += p5-HTML-TokeParser-Simple SUBDIR += p5-HTML-Tree SUBDIR += p5-HTML-TreeBuilder-LibXML SUBDIR += p5-HTML-TreeBuilder-XPath SUBDIR += p5-HTML-Widgets-SelectLayers SUBDIR += p5-HTML-WikiConverter SUBDIR += p5-HTML-WikiConverter-DokuWiki SUBDIR += p5-HTML-WikiConverter-GoogleCode SUBDIR += p5-HTML-WikiConverter-Kwiki SUBDIR += p5-HTML-WikiConverter-Markdown SUBDIR += p5-HTML-WikiConverter-MediaWiki SUBDIR += p5-HTML-WikiConverter-MoinMoin SUBDIR += p5-HTML-WikiConverter-Oddmuse SUBDIR += p5-HTML-WikiConverter-PbWiki SUBDIR += p5-HTML-WikiConverter-PhpWiki SUBDIR += p5-HTML-WikiConverter-PmWiki SUBDIR += p5-HTML-WikiConverter-SnipSnap SUBDIR += p5-HTML-WikiConverter-Socialtext SUBDIR += p5-HTML-WikiConverter-TikiWiki SUBDIR += p5-HTML-WikiConverter-UseMod SUBDIR += p5-HTML-WikiConverter-WakkaWiki SUBDIR += p5-HTML-WikiConverter-WikkaWiki SUBDIR += p5-HTTP-Async SUBDIR += p5-HTTP-Body SUBDIR += p5-HTTP-BrowserDetect SUBDIR += p5-HTTP-Cache-Transparent SUBDIR += p5-HTTP-CookieJar SUBDIR += p5-HTTP-Cookies SUBDIR += p5-HTTP-Cookies-Mozilla SUBDIR += p5-HTTP-Cookies-iCab SUBDIR += p5-HTTP-Cookies-w3m SUBDIR += p5-HTTP-DAV SUBDIR += p5-HTTP-Daemon SUBDIR += p5-HTTP-Daemon-SSL SUBDIR += p5-HTTP-Date SUBDIR += p5-HTTP-Engine SUBDIR += p5-HTTP-Engine-Middleware SUBDIR += p5-HTTP-Exception SUBDIR += p5-HTTP-HeaderParser-XS SUBDIR += p5-HTTP-Headers-Fast SUBDIR += p5-HTTP-Link-Parser SUBDIR += p5-HTTP-Lite SUBDIR += p5-HTTP-MHTTP SUBDIR += p5-HTTP-Message SUBDIR += p5-HTTP-MobileAgent SUBDIR += p5-HTTP-MobileAgent-Plugin-Charset SUBDIR += p5-HTTP-MobileAgent-Plugin-Locator SUBDIR += p5-HTTP-Negotiate SUBDIR += p5-HTTP-Parser SUBDIR += p5-HTTP-Parser-XS SUBDIR += p5-HTTP-Proxy SUBDIR += p5-HTTP-Recorder SUBDIR += p5-HTTP-Request-AsCGI SUBDIR += p5-HTTP-Request-Params SUBDIR += p5-HTTP-Response-Encoding SUBDIR += p5-HTTP-Router SUBDIR += p5-HTTP-Server-Simple SUBDIR += p5-HTTP-Server-Simple-Authen SUBDIR += p5-HTTP-Server-Simple-Mason SUBDIR += p5-HTTP-Server-Simple-PSGI SUBDIR += p5-HTTP-Server-Simple-Recorder SUBDIR += p5-HTTP-Server-Simple-Static SUBDIR += p5-HTTP-Session SUBDIR += p5-HTTP-Session-State-MobileAgentID SUBDIR += p5-HTTP-Session-Store-DBI SUBDIR += p5-HTTP-Session2 SUBDIR += p5-HTTP-SimpleLinkChecker SUBDIR += p5-HTTP-Size SUBDIR += p5-HTTP-Tiny SUBDIR += p5-HTTP-Tiny-SPDY SUBDIR += p5-HTTP-WebTest SUBDIR += p5-HTTPD-Log-Filter SUBDIR += p5-HTTPD-User-Manage SUBDIR += p5-Hijk SUBDIR += p5-I18N-AcceptLanguage SUBDIR += p5-IMDB-Film SUBDIR += p5-Image-Delivery SUBDIR += p5-JE SUBDIR += p5-Jemplate SUBDIR += p5-Jifty SUBDIR += p5-Kwiki SUBDIR += p5-LWP-Authen-Negotiate SUBDIR += p5-LWP-Authen-OAuth SUBDIR += p5-LWP-Authen-Wsse SUBDIR += p5-LWP-ConnCache-MaxKeepAliveRequests SUBDIR += p5-LWP-MediaTypes SUBDIR += p5-LWP-Online SUBDIR += p5-LWP-Protocol-PSGI SUBDIR += p5-LWP-Protocol-connect SUBDIR += p5-LWP-Protocol-http10 SUBDIR += p5-LWP-Protocol-https SUBDIR += p5-LWP-UserAgent-Determined SUBDIR += p5-LWP-UserAgent-POE SUBDIR += p5-LWP-UserAgent-WithCache SUBDIR += p5-LWPx-ParanoidAgent SUBDIR += p5-LWPx-TimedHTTP SUBDIR += p5-Markup-Perl SUBDIR += p5-Mason SUBDIR += p5-MasonX-Interp-WithCallbacks SUBDIR += p5-MasonX-Profiler SUBDIR += p5-MasonX-Request-WithApacheSession SUBDIR += p5-MasonX-WebApp SUBDIR += p5-Maypole SUBDIR += p5-Maypole-Authentication-UserSessionCookie SUBDIR += p5-Maypole-Component SUBDIR += p5-McBain SUBDIR += p5-McBain-WithPSGI SUBDIR += p5-MediaWiki SUBDIR += p5-MediaWiki-API SUBDIR += p5-Mobile-UserAgent SUBDIR += p5-ModPerl-VersionUtil SUBDIR += p5-Mojo-Server-FastCGI SUBDIR += p5-MojoMojo SUBDIR += p5-Mojolicious SUBDIR += p5-Mojolicious-Plugin-Authentication SUBDIR += p5-Mojolicious-Plugin-Database SUBDIR += p5-Mojolicious-Plugin-Mongodb SUBDIR += p5-Mojolicious-Plugin-SetUserGroup SUBDIR += p5-Mojolicious-Plugin-TtRenderer SUBDIR += p5-Mojolicious-Plugin-YamlConfig SUBDIR += p5-Monoceros SUBDIR += p5-Mozilla-CA SUBDIR += p5-Net-Akismet SUBDIR += p5-Net-Amazon-AWIS SUBDIR += p5-Net-Async-FastCGI SUBDIR += p5-Net-Async-HTTP SUBDIR += p5-Net-FastCGI SUBDIR += p5-Net-FireEagle SUBDIR += p5-Net-Flickr-API SUBDIR += p5-Net-Flickr-Backup SUBDIR += p5-Net-Flickr-RDF SUBDIR += p5-Net-FreshBooks-API SUBDIR += p5-Net-GeoPlanet SUBDIR += p5-Net-Plurk SUBDIR += p5-Net-STF-Client SUBDIR += p5-Net-Trac SUBDIR += p5-Net-YAP SUBDIR += p5-Net-eBay SUBDIR += p5-Newsletter SUBDIR += p5-Nginx-ReadBody SUBDIR += p5-Nginx-Simple SUBDIR += p5-PHP-Session SUBDIR += p5-POE-Component-Client-HTTP SUBDIR += p5-POE-Component-Client-UserAgent SUBDIR += p5-POE-Component-Server-HTTP SUBDIR += p5-POE-Component-Server-HTTPServer SUBDIR += p5-POE-Component-Server-PSGI SUBDIR += p5-POE-Component-Server-SOAP SUBDIR += p5-POE-Component-Server-SimpleHTTP SUBDIR += p5-POE-Filter-HTTP-Parser SUBDIR += p5-POEx-Role-PSGIServer SUBDIR += p5-PSGI SUBDIR += p5-ParallelUA SUBDIR += p5-Parse-HTTP-UserAgent SUBDIR += p5-Path-Class-URI SUBDIR += p5-Perlanet SUBDIR += p5-Perlbal-Plugin-PSGI SUBDIR += p5-Plack SUBDIR += p5-Plack-App-Proxy SUBDIR += p5-Plack-Builder-Conditionals SUBDIR += p5-Plack-Handler-AnyEvent-HTTPD SUBDIR += p5-Plack-Handler-AnyEvent-ReverseHTTP SUBDIR += p5-Plack-Handler-AnyEvent-SCGI SUBDIR += p5-Plack-Handler-CLI SUBDIR += p5-Plack-Handler-SCGI SUBDIR += p5-Plack-Middleware-AMF SUBDIR += p5-Plack-Middleware-AddDefaultCharset SUBDIR += p5-Plack-Middleware-Auth-Digest SUBDIR += p5-Plack-Middleware-AutoRefresh SUBDIR += p5-Plack-Middleware-ConsoleLogger SUBDIR += p5-Plack-Middleware-Debug SUBDIR += p5-Plack-Middleware-Deflater SUBDIR += p5-Plack-Middleware-Expires SUBDIR += p5-Plack-Middleware-File-Sass SUBDIR += p5-Plack-Middleware-FixMissingBodyInRedirect SUBDIR += p5-Plack-Middleware-ForceEnv SUBDIR += p5-Plack-Middleware-Header SUBDIR += p5-Plack-Middleware-IEnosniff SUBDIR += p5-Plack-Middleware-InteractiveDebugger SUBDIR += p5-Plack-Middleware-JSConcat SUBDIR += p5-Plack-Middleware-MemoryUsage SUBDIR += p5-Plack-Middleware-MethodOverride SUBDIR += p5-Plack-Middleware-Precompressed SUBDIR += p5-Plack-Middleware-RemoveRedundantBody SUBDIR += p5-Plack-Middleware-Reproxy SUBDIR += p5-Plack-Middleware-ReverseProxy SUBDIR += p5-Plack-Middleware-Rewrite SUBDIR += p5-Plack-Middleware-ServerStatus-Lite SUBDIR += p5-Plack-Middleware-Session SUBDIR += p5-Plack-Middleware-SocketIO SUBDIR += p5-Plack-Middleware-Status SUBDIR += p5-Plack-Middleware-Test-StashWarnings SUBDIR += p5-Plack-Middleware-Throttle SUBDIR += p5-Plack-Middleware-XForwardedFor SUBDIR += p5-Plack-Server-Coro SUBDIR += p5-Plack-Server-POE SUBDIR += p5-Plack-Server-ReverseHTTP SUBDIR += p5-Plack-Test-ExternalServer SUBDIR += p5-PocketIO SUBDIR += p5-Pod-Site SUBDIR += p5-PodToHTML SUBDIR += p5-Protocol-HTTP2 SUBDIR += p5-Protocol-SocketIO SUBDIR += p5-Protocol-WebSocket SUBDIR += p5-Protocol-XMLRPC SUBDIR += p5-REST-Client SUBDIR += p5-REST-Google-Apps-Provisioning SUBDIR += p5-RPC-ExtDirect SUBDIR += p5-RT-Authen-ExternalAuth SUBDIR += p5-RT-Client-REST SUBDIR += p5-RT-Extension-LDAPImport SUBDIR += p5-RT-Extension-MandatoryOnTransition SUBDIR += p5-RT-Extension-SLA SUBDIR += p5-RTx-Calendar SUBDIR += p5-Reaction SUBDIR += p5-Reddit SUBDIR += p5-Reddit-Client SUBDIR += p5-Rose-HTML-Objects SUBDIR += p5-Router-Boom SUBDIR += p5-Router-Simple SUBDIR += p5-Router-Simple-Sinatraish SUBDIR += p5-SCGI SUBDIR += p5-SOAP-Transport-HTTP-Plack SUBDIR += p5-SRU SUBDIR += p5-STF-Dispatcher-PSGI SUBDIR += p5-SWF-Chart SUBDIR += p5-Scrappy SUBDIR += p5-Selenium-Remote-Driver SUBDIR += p5-Session-Storage-Secure SUBDIR += p5-Squatting SUBDIR += p5-Squatting-On-PSGI SUBDIR += p5-Starlet SUBDIR += p5-Starman SUBDIR += p5-Syntax-Highlight-HTML SUBDIR += p5-Syntax-Highlight-Shell SUBDIR += p5-Task-Catalyst SUBDIR += p5-Task-Plack SUBDIR += p5-Tatsumaki SUBDIR += p5-Template-Alloy SUBDIR += p5-Template-GD SUBDIR += p5-Template-Iterator-AlzaboWrapperCursor SUBDIR += p5-Template-Multilingual SUBDIR += p5-Template-Mustache SUBDIR += p5-Template-Plugin-Class SUBDIR += p5-Template-Plugin-Clickable SUBDIR += p5-Template-Plugin-Clickable-Email SUBDIR += p5-Template-Plugin-Comma SUBDIR += p5-Template-Plugin-FillInForm SUBDIR += p5-Template-Plugin-JSON SUBDIR += p5-Template-Plugin-JavaScript SUBDIR += p5-Template-Plugin-MP3 SUBDIR += p5-Template-Plugin-Markdown SUBDIR += p5-Template-Plugin-Monta SUBDIR += p5-Template-Plugin-Number-Format SUBDIR += p5-Template-Plugin-StripScripts SUBDIR += p5-Template-Plugin-Subst SUBDIR += p5-Template-Plugin-VMethods SUBDIR += p5-Template-Provider-Encoding SUBDIR += p5-Template-Provider-FromDATA SUBDIR += p5-Template-Simple SUBDIR += p5-Template-Stash-AutoEscape SUBDIR += p5-Template-Timer SUBDIR += p5-Template-Toolkit SUBDIR += p5-Template-Toolkit-Simple SUBDIR += p5-Tenjin SUBDIR += p5-Test-HTTP SUBDIR += p5-Test-HTTP-Server-Simple SUBDIR += p5-Test-LWP-UserAgent SUBDIR += p5-Test-Nginx SUBDIR += p5-TestGen4Web-Runner SUBDIR += p5-Text-MultiMarkdown-ApacheHandler SUBDIR += p5-Tie-TinyURL SUBDIR += p5-Toader SUBDIR += p5-Toadfarm SUBDIR += p5-Twiggy SUBDIR += p5-Twiggy-TLS SUBDIR += p5-URI-Encode SUBDIR += p5-URI-Escape-JavaScript SUBDIR += p5-URI-Escape-XS SUBDIR += p5-URI-Fetch SUBDIR += p5-URI-ParseSearchString SUBDIR += p5-URI-Sequin SUBDIR += p5-URI-Title SUBDIR += p5-URI-ToDisk SUBDIR += p5-URL-Encode SUBDIR += p5-URL-Encode-XS SUBDIR += p5-VUser-Google-ProvisioningAPI SUBDIR += p5-W3C-LinkChecker SUBDIR += p5-W3C-LogValidator SUBDIR += p5-WWW-AtMovies-TV SUBDIR += p5-WWW-Babelfish SUBDIR += p5-WWW-Baseball-NPB SUBDIR += p5-WWW-Comic SUBDIR += p5-WWW-Contact SUBDIR += p5-WWW-Curl SUBDIR += p5-WWW-DHL SUBDIR += p5-WWW-Dilbert SUBDIR += p5-WWW-Facebook-API SUBDIR += p5-WWW-FreeProxy SUBDIR += p5-WWW-GitHub-Gist SUBDIR += p5-WWW-Google-Calculator SUBDIR += p5-WWW-Google-News SUBDIR += p5-WWW-Google-News-TW SUBDIR += p5-WWW-Google-Notebook SUBDIR += p5-WWW-Google-PageRank SUBDIR += p5-WWW-Google-Video SUBDIR += p5-WWW-HatenaDiary SUBDIR += p5-WWW-HatenaLogin SUBDIR += p5-WWW-HatenaStar SUBDIR += p5-WWW-IMDb SUBDIR += p5-WWW-Instapaper-Client SUBDIR += p5-WWW-LongURL SUBDIR += p5-WWW-Mechanize SUBDIR += p5-WWW-Mechanize-CGI SUBDIR += p5-WWW-Mechanize-Cached SUBDIR += p5-WWW-Mechanize-DecodedContent SUBDIR += p5-WWW-Mechanize-FormFiller SUBDIR += p5-WWW-Mechanize-GZip SUBDIR += p5-WWW-Mechanize-Meta SUBDIR += p5-WWW-Mechanize-PhantomJS SUBDIR += p5-WWW-Mechanize-Pluggable SUBDIR += p5-WWW-Mechanize-Plugin-phpBB SUBDIR += p5-WWW-Mechanize-Shell SUBDIR += p5-WWW-Mechanize-SpamCop SUBDIR += p5-WWW-Mechanize-TreeBuilder SUBDIR += p5-WWW-Mediawiki-Client SUBDIR += p5-WWW-Mixi SUBDIR += p5-WWW-Mixi-Scraper SUBDIR += p5-WWW-Myspace SUBDIR += p5-WWW-NicoVideo-Download SUBDIR += p5-WWW-NioTV SUBDIR += p5-WWW-OpenSVN SUBDIR += p5-WWW-OpenSearch SUBDIR += p5-WWW-Pastebin-PastebinCom-Create SUBDIR += p5-WWW-Plurk SUBDIR += p5-WWW-Robot SUBDIR += p5-WWW-RobotRules SUBDIR += p5-WWW-RobotRules-Parser SUBDIR += p5-WWW-Scraper-ISBN SUBDIR += p5-WWW-Scraper-ISBN-Amazon_Driver SUBDIR += p5-WWW-Scraper-ISBN-ORA_Driver SUBDIR += p5-WWW-Scripter SUBDIR += p5-WWW-Scripter-Plugin-Ajax SUBDIR += p5-WWW-Scripter-Plugin-JavaScript SUBDIR += p5-WWW-Search SUBDIR += p5-WWW-Search-AltaVista SUBDIR += p5-WWW-Search-Google SUBDIR += p5-WWW-Search-MSN SUBDIR += p5-WWW-Shorten SUBDIR += p5-WWW-Shorten-0rz SUBDIR += p5-WWW-Shorten-Bitly SUBDIR += p5-WWW-Shorten-Googl SUBDIR += p5-WWW-Shorten-KUSO SUBDIR += p5-WWW-Shorten-NotLong SUBDIR += p5-WWW-Shorten-Yourls SUBDIR += p5-WWW-Shorten-isgd SUBDIR += p5-WWW-SourceForge SUBDIR += p5-WWW-Spinn3r SUBDIR += p5-WWW-TV SUBDIR += p5-WWW-TWSMS SUBDIR += p5-WWW-TinySong SUBDIR += p5-WWW-Tumblr SUBDIR += p5-WWW-VenusEnvy SUBDIR += p5-WWW-WebArchive SUBDIR += p5-WWW-Wikipedia SUBDIR += p5-WWW-Yandex-TIC SUBDIR += p5-WWW-iTunesConnect SUBDIR += p5-Web-Query SUBDIR += p5-Web-Scraper SUBDIR += p5-Web-Scraper-Config SUBDIR += p5-Web-oEmbed SUBDIR += p5-WebDAO SUBDIR += p5-WebService-Basecamp SUBDIR += p5-WebService-Bloglines SUBDIR += p5-WebService-BuzzurlAPI SUBDIR += p5-WebService-CIA SUBDIR += p5-WebService-GData SUBDIR += p5-WebService-Google-Reader SUBDIR += p5-WebService-Google-Sets SUBDIR += p5-WebService-IMDB SUBDIR += p5-WebService-ISBNDB SUBDIR += p5-WebService-Linode SUBDIR += p5-WebService-MoviePosterDB SUBDIR += p5-WebService-MusicBrainz SUBDIR += p5-WebService-NoPaste SUBDIR += p5-WebService-Pushover SUBDIR += p5-WebService-Rakuten SUBDIR += p5-WebService-Redmine SUBDIR += p5-WebService-Simple SUBDIR += p5-WebService-Technorati SUBDIR += p5-WebService-YouTube SUBDIR += p5-WordPress-XMLRPC SUBDIR += p5-Yahoo-Lifestyle SUBDIR += p5-Yahoo-Search SUBDIR += p5-ZConf-RSS SUBDIR += p5-ZConf-RSS-GUI-GTK SUBDIR += p5-chklinks SUBDIR += p5-jQuery-File-Upload SUBDIR += p5-libapreq2 SUBDIR += p5-libservlet SUBDIR += p5-libwww SUBDIR += p5-pQuery SUBDIR += p5-webservice-validator-css-w3c SUBDIR += p5-webservice-validator-html-w3c SUBDIR += paros SUBDIR += pear-HTML_AJAX SUBDIR += pear-HTML_TagCloud SUBDIR += pear-HTTP SUBDIR += pear-HTTP_Client SUBDIR += pear-HTTP_Download SUBDIR += pear-HTTP_FloodControl SUBDIR += pear-HTTP_Header SUBDIR += pear-HTTP_Request SUBDIR += pear-HTTP_Request2 SUBDIR += pear-HTTP_Server SUBDIR += pear-HTTP_Session2 SUBDIR += pear-HTTP_Upload SUBDIR += pear-HTTP_WebDAV_Client SUBDIR += pear-HTTP_WebDAV_Server SUBDIR += pear-Horde_Browser SUBDIR += pear-Horde_Css_Parser SUBDIR += pear-Horde_Dav SUBDIR += pear-Horde_Editor SUBDIR += pear-Horde_Feed SUBDIR += pear-Horde_Form SUBDIR += pear-Horde_Http SUBDIR += pear-Horde_Routes SUBDIR += pear-Horde_Service_Facebook SUBDIR += pear-Horde_Service_Twitter SUBDIR += pear-Horde_Service_UrlShortener SUBDIR += pear-Horde_Service_Weather SUBDIR += pear-Horde_SessionHandler SUBDIR += pear-Horde_Template SUBDIR += pear-Services_Amazon SUBDIR += pear-Services_Amazon_S3 SUBDIR += pear-Services_Blogging SUBDIR += pear-Services_Compete SUBDIR += pear-Services_Delicious SUBDIR += pear-Services_Digg SUBDIR += pear-Services_Facebook SUBDIR += pear-Services_GeoNames SUBDIR += pear-Services_Google SUBDIR += pear-Services_OpenSearch SUBDIR += pear-Services_SharedBook SUBDIR += pear-Services_ShortURL SUBDIR += pear-Services_TinyURL SUBDIR += pear-Services_TwitPic SUBDIR += pear-Services_W3C_CSSValidator SUBDIR += pear-Services_W3C_HTMLValidator SUBDIR += pear-Services_Yadis SUBDIR += pear-Services_Yahoo SUBDIR += pear-Services_urlTea SUBDIR += pear-Structures_DataGrid_Renderer_Flexy SUBDIR += pear-Structures_DataGrid_Renderer_Pager SUBDIR += pear-Structures_DataGrid_Renderer_Smarty SUBDIR += pear-Text_Wiki SUBDIR += pear-UDDI SUBDIR += pear-XML_GRDDL SUBDIR += pear-twig SUBDIR += pebble SUBDIR += pecl-APC SUBDIR += pecl-amfext SUBDIR += pecl-http SUBDIR += pecl-http1 SUBDIR += pecl-solr SUBDIR += pecl-sphinx SUBDIR += pecl-swish SUBDIR += pecl-twig SUBDIR += pecl-varnish SUBDIR += pecl-yaf SUBDIR += pecl-yar SUBDIR += pecl-zendopcache SUBDIR += pelican SUBDIR += perlbal SUBDIR += pglogd SUBDIR += phalcon SUBDIR += photo_gallery SUBDIR += php-plurk-api SUBDIR += php-screw SUBDIR += php-templates SUBDIR += php5-session SUBDIR += php5-tidy SUBDIR += php55-opcache SUBDIR += php55-session SUBDIR += php55-tidy SUBDIR += php56-opcache SUBDIR += php56-session SUBDIR += php56-tidy SUBDIR += phpbb SUBDIR += phpbb3 SUBDIR += phpgroupware SUBDIR += phpmp SUBDIR += phpmustache SUBDIR += phpmyfaq SUBDIR += phprecipebook SUBDIR += phproxy SUBDIR += phpsysinfo SUBDIR += phpvirtualbox SUBDIR += phpwebapp SUBDIR += pivotx SUBDIR += piwigo SUBDIR += piwik SUBDIR += planet SUBDIR += pligg SUBDIR += plone SUBDIR += plugger SUBDIR += pmwiki SUBDIR += pnews SUBDIR += podcastamatic SUBDIR += polipo SUBDIR += pound SUBDIR += privoxy SUBDIR += protovis SUBDIR += pserv SUBDIR += publicfile SUBDIR += punbb SUBDIR += pwebstats SUBDIR += py-GinGin SUBDIR += py-HTMLgen SUBDIR += py-Lightbox SUBDIR += py-Products.CMFPlone SUBDIR += py-Products.PloneLDAP SUBDIR += py-Products.TinyMCE SUBDIR += py-WebError SUBDIR += py-WebFlash SUBDIR += py-WebTest SUBDIR += py-aiohttp SUBDIR += py-albatross SUBDIR += py-amf SUBDIR += py-apachelog SUBDIR += py-autobahn SUBDIR += py-beaker SUBDIR += py-beautifulsoup SUBDIR += py-beautifulsoup32 SUBDIR += py-bjoern SUBDIR += py-bleach SUBDIR += py-blogofile SUBDIR += py-bottle SUBDIR += py-bottle-cork SUBDIR += py-cherrypy SUBDIR += py-cherrypy-old SUBDIR += py-clientform SUBDIR += py-collective.easytemplate SUBDIR += py-collective.templateengines SUBDIR += py-cssmin SUBDIR += py-cssselect SUBDIR += py-cssutils SUBDIR += py-django SUBDIR += py-django-allauth SUBDIR += py-django-annoying SUBDIR += py-django-app-plugins SUBDIR += py-django-appconf SUBDIR += py-django-appmedia SUBDIR += py-django-assets SUBDIR += py-django-auth-ldap SUBDIR += py-django-caching-app-plugins SUBDIR += py-django-classy-tags SUBDIR += py-django-cms SUBDIR += py-django-contrib-comments SUBDIR += py-django-crispy-forms SUBDIR += py-django-datetime-widget SUBDIR += py-django-debug-toolbar SUBDIR += py-django-devel SUBDIR += py-django-dpaste SUBDIR += py-django-evolution SUBDIR += py-django-extensions SUBDIR += py-django-filer SUBDIR += py-django-haystack SUBDIR += py-django-json-rpc SUBDIR += py-django-keyedcache SUBDIR += py-django-ldapdb SUBDIR += py-django-livesettings SUBDIR += py-django-mezzanine SUBDIR += py-django-mezzanine-filebrowser SUBDIR += py-django-mezzanine-grappelli SUBDIR += py-django-mptt SUBDIR += py-django-openid-auth SUBDIR += py-django-photologue SUBDIR += py-django-picklefield SUBDIR += py-django-pipeline SUBDIR += py-django-pipeline12 SUBDIR += py-django-piston SUBDIR += py-django-profiles SUBDIR += py-django-redis SUBDIR += py-django-registration SUBDIR += py-django-registration-defaults SUBDIR += py-django-reversion SUBDIR += py-django-sekizai SUBDIR += py-django-signals-ahoy SUBDIR += py-django-simple-captcha SUBDIR += py-django-storages SUBDIR += py-django-subdomains SUBDIR += py-django-tables2 SUBDIR += py-django-tagging SUBDIR += py-django-taggit SUBDIR += py-django-tastypie SUBDIR += py-django-threaded-multihost SUBDIR += py-django-tinymce SUBDIR += py-django-voting SUBDIR += py-django14 SUBDIR += py-django16 SUBDIR += py-django16-tastypie SUBDIR += py-django17 SUBDIR += py-django_compressor SUBDIR += py-djangotoolbox SUBDIR += py-djblets SUBDIR += py-dojango SUBDIR += py-dotcloud.cli SUBDIR += py-dtflickr SUBDIR += py-evernote SUBDIR += py-falcon SUBDIR += py-fcgi SUBDIR += py-fedex SUBDIR += py-feedfinder SUBDIR += py-feedgenerator SUBDIR += py-flask SUBDIR += py-flask-admin SUBDIR += py-flask-bootstrap SUBDIR += py-flask-cache SUBDIR += py-flask-cors SUBDIR += py-flask-flatpages SUBDIR += py-flask-oauthlib SUBDIR += py-flask-restful SUBDIR += py-flask-sockets SUBDIR += py-flask-uploads SUBDIR += py-flask-wtf SUBDIR += py-flexget SUBDIR += py-flup SUBDIR += py-formalchemy SUBDIR += py-formencode + SUBDIR += py-frappe-bench SUBDIR += py-frozen-flask SUBDIR += py-funkload SUBDIR += py-gandi.cli SUBDIR += py-gevent-websocket SUBDIR += py-google-api-python-client SUBDIR += py-graphite-web SUBDIR += py-grequests SUBDIR += py-gunicorn SUBDIR += py-html5lib SUBDIR += py-http-parser SUBDIR += py-httplib2 SUBDIR += py-hyper SUBDIR += py-imdbpy SUBDIR += py-jonpy SUBDIR += py-jswebkit SUBDIR += py-mechanize SUBDIR += py-meld SUBDIR += py-meld3 SUBDIR += py-mt SUBDIR += py-nevow SUBDIR += py-openssl-proxy SUBDIR += py-pafy SUBDIR += py-paste SUBDIR += py-pastedeploy SUBDIR += py-pastescript SUBDIR += py-plone.alterego SUBDIR += py-plone.app.blob SUBDIR += py-plone.app.caching SUBDIR += py-plone.app.collection SUBDIR += py-plone.app.content SUBDIR += py-plone.app.contentlisting SUBDIR += py-plone.app.contentmenu SUBDIR += py-plone.app.contentrules SUBDIR += py-plone.app.controlpanel SUBDIR += py-plone.app.customerize SUBDIR += py-plone.app.dexterity SUBDIR += py-plone.app.discussion SUBDIR += py-plone.app.folder SUBDIR += py-plone.app.form SUBDIR += py-plone.app.i18n SUBDIR += py-plone.app.imaging SUBDIR += py-plone.app.iterate SUBDIR += py-plone.app.jquery SUBDIR += py-plone.app.jquerytools SUBDIR += py-plone.app.layout SUBDIR += py-plone.app.ldap SUBDIR += py-plone.app.linkintegrity SUBDIR += py-plone.app.locales SUBDIR += py-plone.app.portlets SUBDIR += py-plone.app.querystring SUBDIR += py-plone.app.redirector SUBDIR += py-plone.app.registry SUBDIR += py-plone.app.search SUBDIR += py-plone.app.testing SUBDIR += py-plone.app.textfield SUBDIR += py-plone.app.theming SUBDIR += py-plone.app.upgrade SUBDIR += py-plone.app.users SUBDIR += py-plone.app.uuid SUBDIR += py-plone.app.viewletmanager SUBDIR += py-plone.app.vocabularies SUBDIR += py-plone.app.workflow SUBDIR += py-plone.app.z3cform SUBDIR += py-plone.autoform SUBDIR += py-plone.batching SUBDIR += py-plone.behavior SUBDIR += py-plone.browserlayer SUBDIR += py-plone.cachepurging SUBDIR += py-plone.caching SUBDIR += py-plone.contentrules SUBDIR += py-plone.dexterity SUBDIR += py-plone.fieldsets SUBDIR += py-plone.folder SUBDIR += py-plone.formwidget.namedfile SUBDIR += py-plone.i18n SUBDIR += py-plone.indexer SUBDIR += py-plone.intelligenttext SUBDIR += py-plone.locking SUBDIR += py-plone.memoize SUBDIR += py-plone.namedfile SUBDIR += py-plone.outputfilters SUBDIR += py-plone.portlet.collection SUBDIR += py-plone.portlet.static SUBDIR += py-plone.portlets SUBDIR += py-plone.registry SUBDIR += py-plone.resource SUBDIR += py-plone.resourceeditor SUBDIR += py-plone.rfc822 SUBDIR += py-plone.scale SUBDIR += py-plone.schemaeditor SUBDIR += py-plone.stringinterp SUBDIR += py-plone.subrequest SUBDIR += py-plone.supermodel SUBDIR += py-plone.synchronize SUBDIR += py-plone.testing SUBDIR += py-plone.theme SUBDIR += py-plone.transformchain SUBDIR += py-plone.uuid SUBDIR += py-plone.z3cform SUBDIR += py-plonetheme.classic SUBDIR += py-plonetheme.sunburst SUBDIR += py-poster SUBDIR += py-postmarkup SUBDIR += py-praw SUBDIR += py-prewikka SUBDIR += py-puppetboard SUBDIR += py-py-restclient SUBDIR += py-pyjwt SUBDIR += py-pylons SUBDIR += py-pyquery SUBDIR += py-pyramid SUBDIR += py-pyramid_rpc SUBDIR += py-pysearch SUBDIR += py-python-digitalocean SUBDIR += py-pywebdav SUBDIR += py-qp SUBDIR += py-qpy SUBDIR += py-qt4-webkit SUBDIR += py-rackspace-monitoring SUBDIR += py-recaptcha SUBDIR += py-requestbuilder SUBDIR += py-requests SUBDIR += py-requests-oauth-hook SUBDIR += py-requests-oauthlib SUBDIR += py-requests-toolbelt SUBDIR += py-requests1 SUBDIR += py-restclient SUBDIR += py-rfc3987 SUBDIR += py-rhodecode SUBDIR += py-routes SUBDIR += py-satchmo SUBDIR += py-scgi SUBDIR += py-scrapy SUBDIR += py-scriptaculous SUBDIR += py-seafdav SUBDIR += py-seafobj SUBDIR += py-selector SUBDIR += py-selenium SUBDIR += py-slimit SUBDIR += py-slimmer SUBDIR += py-slumber SUBDIR += py-splinter SUBDIR += py-spyne SUBDIR += py-surl SUBDIR += py-textile SUBDIR += py-tgwebservices SUBDIR += py-tmdb3 SUBDIR += py-tornado SUBDIR += py-trello SUBDIR += py-turbogears SUBDIR += py-turbogears2 SUBDIR += py-tvdb_api SUBDIR += py-twistedWeb SUBDIR += py-twistedWeb2 SUBDIR += py-uliweb SUBDIR += py-urlgrabber SUBDIR += py-urljr SUBDIR += py-utidy SUBDIR += py-w3lib SUBDIR += py-waitress SUBDIR += py-webassets SUBDIR += py-webhelpers SUBDIR += py-webkitgtk SUBDIR += py-webob SUBDIR += py-websocket-client SUBDIR += py-webunit SUBDIR += py-webware SUBDIR += py-webware-component SUBDIR += py-werkzeug SUBDIR += py-wikipedia SUBDIR += py-wikitools SUBDIR += py-ws4py SUBDIR += py-wsaccel SUBDIR += py-wsgiauth SUBDIR += py-wsgidav SUBDIR += py-zope.app.wsgi SUBDIR += pyblosxom SUBDIR += pycarddav SUBDIR += pydio SUBDIR += pyjamas SUBDIR += pylot SUBDIR += pyweblib SUBDIR += qdecoder SUBDIR += qooxdoo SUBDIR += qt5-webchannel SUBDIR += qt5-websockets SUBDIR += quickie SUBDIR += qupzilla-qt4 SUBDIR += qupzilla-qt5 SUBDIR += radicale SUBDIR += red5 SUBDIR += redaxo SUBDIR += redmine SUBDIR += redmine-backlogs SUBDIR += redmine-basecamp SUBDIR += redmine-http-auth SUBDIR += redmine-sidebar_hide SUBDIR += rejik SUBDIR += rekonq SUBDIR += reportmagic SUBDIR += repos-style SUBDIR += resin3 SUBDIR += retawq SUBDIR += reviewboard SUBDIR += revive-adserver SUBDIR += rnews SUBDIR += roundup SUBDIR += rsskit SUBDIR += rssowl SUBDIR += rssroll SUBDIR += rsstail SUBDIR += rsstool SUBDIR += rt40 SUBDIR += rt42 SUBDIR += ruby-aws SUBDIR += ruby-google SUBDIR += ruby-wgettsv SUBDIR += rubygem-ace-rails-ap SUBDIR += rubygem-actionpack SUBDIR += rubygem-actionpack4 SUBDIR += rubygem-activeresource SUBDIR += rubygem-activeresource4 SUBDIR += rubygem-acts-as-taggable-on SUBDIR += rubygem-acts-as-taggable-on3 SUBDIR += rubygem-acts_as_taggable SUBDIR += rubygem-addressable SUBDIR += rubygem-akami SUBDIR += rubygem-amazon-ecs SUBDIR += rubygem-anemone SUBDIR += rubygem-asana SUBDIR += rubygem-async_sinatra SUBDIR += rubygem-bluecloth SUBDIR += rubygem-bootstrap-sass SUBDIR += rubygem-browser SUBDIR += rubygem-cal-heatmap-rails SUBDIR += rubygem-cal-heatmap-rails-rails4 SUBDIR += rubygem-carrierwave SUBDIR += rubygem-cgi_multipart_eof_fix SUBDIR += rubygem-chosen-rails SUBDIR += rubygem-cookiejar SUBDIR += rubygem-crass SUBDIR += rubygem-cuba SUBDIR += rubygem-d3_rails SUBDIR += rubygem-d3_rails-rails4 SUBDIR += rubygem-dashing SUBDIR += rubygem-davclient SUBDIR += rubygem-domainatrix SUBDIR += rubygem-dropzonejs-rails SUBDIR += rubygem-em-http-request SUBDIR += rubygem-em-socksify SUBDIR += rubygem-em-twitter SUBDIR += rubygem-em-websocket SUBDIR += rubygem-emk-sinatra-url-for SUBDIR += rubygem-erubis SUBDIR += rubygem-ethon SUBDIR += rubygem-eventmachine_httpserver SUBDIR += rubygem-faraday SUBDIR += rubygem-faraday_middleware SUBDIR += rubygem-fcgi SUBDIR += rubygem-feed-normalizer SUBDIR += rubygem-feedjira SUBDIR += rubygem-flowdock SUBDIR += rubygem-geminabox SUBDIR += rubygem-gitlab-flowdock-git-hook SUBDIR += rubygem-gitlab-gollum-lib SUBDIR += rubygem-gitlab-grack SUBDIR += rubygem-gollum-grit_adapter SUBDIR += rubygem-gollum-lib SUBDIR += rubygem-gon SUBDIR += rubygem-gon-rails4 SUBDIR += rubygem-haml SUBDIR += rubygem-haml-coderay SUBDIR += rubygem-haml-contrib SUBDIR += rubygem-haml-rails SUBDIR += rubygem-haml-rails-rails4 SUBDIR += rubygem-hashicorp-checkpoint SUBDIR += rubygem-heroku SUBDIR += rubygem-heroku-api SUBDIR += rubygem-heroku-nav SUBDIR += rubygem-hpricot SUBDIR += rubygem-html2haml SUBDIR += rubygem-http SUBDIR += rubygem-http-cookie SUBDIR += rubygem-http-form_data SUBDIR += rubygem-http_router SUBDIR += rubygem-httparty SUBDIR += rubygem-httpclient SUBDIR += rubygem-httpi SUBDIR += rubygem-innate SUBDIR += rubygem-jekyll SUBDIR += rubygem-jekyll-watch SUBDIR += rubygem-journey SUBDIR += rubygem-jquery-atwho-rails SUBDIR += rubygem-jquery-atwho-rails-rails4 SUBDIR += rubygem-jquery-rails SUBDIR += rubygem-jquery-rails4 SUBDIR += rubygem-jquery-scrollto-rails SUBDIR += rubygem-jquery-turbolinks SUBDIR += rubygem-jquery-ui-rails SUBDIR += rubygem-jquery-ui-rails-rails4 SUBDIR += rubygem-jruby-rack SUBDIR += rubygem-jsobfu SUBDIR += rubygem-jwt SUBDIR += rubygem-kaminari SUBDIR += rubygem-kaminari-rails4 SUBDIR += rubygem-kensa SUBDIR += rubygem-layout_yullio_generator SUBDIR += rubygem-less SUBDIR += rubygem-lighthouse-api SUBDIR += rubygem-maruku SUBDIR += rubygem-mechanize SUBDIR += rubygem-mechanize26 SUBDIR += rubygem-merb-assets SUBDIR += rubygem-merb-core SUBDIR += rubygem-merb-haml SUBDIR += rubygem-merb-helpers SUBDIR += rubygem-merb-param-protection SUBDIR += rubygem-modernizr SUBDIR += rubygem-mousetrap-rails SUBDIR += rubygem-multipart-post SUBDIR += rubygem-nanoc SUBDIR += rubygem-net-http-digest_auth SUBDIR += rubygem-net-http-digest_auth11 SUBDIR += rubygem-net-http-persistent SUBDIR += rubygem-net-http-persistent25 SUBDIR += rubygem-net-http-pipeline SUBDIR += rubygem-nicovideo SUBDIR += rubygem-ntlm-http SUBDIR += rubygem-pagerduty SUBDIR += rubygem-passenger SUBDIR += rubygem-puma SUBDIR += rubygem-pusher-client SUBDIR += rubygem-rabbirack SUBDIR += rubygem-rack SUBDIR += rubygem-rack-accept SUBDIR += rubygem-rack-attack SUBDIR += rubygem-rack-cache SUBDIR += rubygem-rack-contrib SUBDIR += rubygem-rack-cors SUBDIR += rubygem-rack-mount SUBDIR += rubygem-rack-openid SUBDIR += rubygem-rack-protection SUBDIR += rubygem-rack-ssl SUBDIR += rubygem-rack-test SUBDIR += rubygem-rack15 SUBDIR += rubygem-rack16 SUBDIR += rubygem-rails SUBDIR += rubygem-rails4 SUBDIR += rubygem-rails_autolink SUBDIR += rubygem-railties SUBDIR += rubygem-railties4 SUBDIR += rubygem-raindrops SUBDIR += rubygem-ramaze SUBDIR += rubygem-raphael-rails SUBDIR += rubygem-redcloth SUBDIR += rubygem-redis-rack SUBDIR += rubygem-redis-rails SUBDIR += rubygem-redmine_acts_as_taggable_on SUBDIR += rubygem-responders SUBDIR += rubygem-responders-rails3 SUBDIR += rubygem-rest-client SUBDIR += rubygem-rfacebook SUBDIR += rubygem-rfeedfinder SUBDIR += rubygem-rinku SUBDIR += rubygem-rkelly-remix SUBDIR += rubygem-robotex SUBDIR += rubygem-robots SUBDIR += rubygem-rqrcode SUBDIR += rubygem-rtlit SUBDIR += rubygem-ruby-readability SUBDIR += rubygem-savon SUBDIR += rubygem-sawyer SUBDIR += rubygem-scrapi SUBDIR += rubygem-select2-rails SUBDIR += rubygem-selenium-webdriver SUBDIR += rubygem-semantic-ui-sass SUBDIR += rubygem-simple-rss SUBDIR += rubygem-sinatra SUBDIR += rubygem-sinatra-contrib SUBDIR += rubygem-sinatra-r18n SUBDIR += rubygem-sinatra-respond_to SUBDIR += rubygem-thin SUBDIR += rubygem-tinyatom SUBDIR += rubygem-tinymce-rails SUBDIR += rubygem-tumblr_client SUBDIR += rubygem-turbolinks SUBDIR += rubygem-typhoeus SUBDIR += rubygem-uglifier SUBDIR += rubygem-underscore-rails SUBDIR += rubygem-unicorn SUBDIR += rubygem-unicorn-worker-killer SUBDIR += rubygem-url-mount SUBDIR += rubygem-url_escape SUBDIR += rubygem-wasabi SUBDIR += rubygem-webkit-gtk SUBDIR += rubygem-webkit-gtk2 SUBDIR += rubygem-webmock SUBDIR += rubygem-webrobots SUBDIR += rubygem-websocket SUBDIR += rubygem-yapra SUBDIR += sabredav SUBDIR += sahi SUBDIR += sakai SUBDIR += samidare SUBDIR += sams2 SUBDIR += sarg SUBDIR += scloader SUBDIR += script4rss SUBDIR += seahub SUBDIR += seamonkey SUBDIR += seamonkey-i18n SUBDIR += selenium SUBDIR += serendipity SUBDIR += serf SUBDIR += servlet-api SUBDIR += session2 SUBDIR += sfnt2woff SUBDIR += shellinabox SUBDIR += shttpd SUBDIR += simplog SUBDIR += sit SUBDIR += sitebar SUBDIR += sitecopy SUBDIR += siteframe SUBDIR += skytemplate SUBDIR += smarty2 SUBDIR += smarty3 SUBDIR += smb_auth SUBDIR += snarf SUBDIR += spawn-fcgi SUBDIR += spdylay SUBDIR += speedtest-mini SUBDIR += spreadlogd SUBDIR += sqstat SUBDIR += squid SUBDIR += squid_radius_auth SUBDIR += squidclamav SUBDIR += squidguard SUBDIR += squidpurge SUBDIR += squidstats SUBDIR += squidview SUBDIR += srg SUBDIR += subsonic SUBDIR += subsonic-standalone SUBDIR += suphp SUBDIR += surf SUBDIR += surfraw SUBDIR += sventon SUBDIR += swfdec-plugin SUBDIR += swiggle SUBDIR += swish++ SUBDIR += swish-e SUBDIR += sws SUBDIR += sxweb SUBDIR += syndigator SUBDIR += tclhttpd SUBDIR += tclwebtest SUBDIR += tdiary SUBDIR += tdom SUBDIR += template_ SUBDIR += templatelite SUBDIR += tengine SUBDIR += testlink SUBDIR += textpattern SUBDIR += thttpd SUBDIR += thumbnail_index SUBDIR += thundercache SUBDIR += thundersnarf SUBDIR += tickr SUBDIR += tidy SUBDIR += tidy-devel SUBDIR += tidy-html5 SUBDIR += tidy-lib SUBDIR += tikiwiki SUBDIR += tinymce SUBDIR += tinymce3 SUBDIR += tinyproxy SUBDIR += tinytinyhttpd SUBDIR += tivoka SUBDIR += tntnet SUBDIR += tokyopromenade SUBDIR += tomcat-native SUBDIR += tomcat6 SUBDIR += tomcat7 SUBDIR += tomcat8 SUBDIR += trac SUBDIR += trac-OhlohWidgetsMacro SUBDIR += trac-TracGoogleAnalytics SUBDIR += trac-accountmanager SUBDIR += trac-advancedticketworkflow SUBDIR += trac-attachmentpolicy SUBDIR += trac-autocomplete SUBDIR += trac-bzr SUBDIR += trac-ccselector SUBDIR += trac-childtickets SUBDIR += trac-customfieldadmin SUBDIR += trac-datefield SUBDIR += trac-defaultcc SUBDIR += trac-discussion SUBDIR += trac-down SUBDIR += trac-downloads SUBDIR += trac-email2trac SUBDIR += trac-email2trac-postfix SUBDIR += trac-estimator SUBDIR += trac-fivestarvote SUBDIR += trac-fullblog SUBDIR += trac-fullblognotification SUBDIR += trac-gantt SUBDIR += trac-graphviz SUBDIR += trac-iniadmin SUBDIR += trac-keywords SUBDIR += trac-keywordsecretticket SUBDIR += trac-mastertickets SUBDIR += trac-math SUBDIR += trac-mercurial SUBDIR += trac-navadd SUBDIR += trac-permredirect SUBDIR += trac-privatetickets SUBDIR += trac-pydotorgtheme SUBDIR += trac-robotstxt SUBDIR += trac-scrumburndown SUBDIR += trac-spam-filter SUBDIR += trac-subtickets SUBDIR += trac-tags SUBDIR += trac-themeengine SUBDIR += trac-ticketimport SUBDIR += trac-tickettemplate SUBDIR += trac-timingandestimation SUBDIR += trac-tocmacro SUBDIR += trac-tracdragdrop SUBDIR += trac-tweakui SUBDIR += trac-vote SUBDIR += trac-watchlist SUBDIR += trac-wikigoodies SUBDIR += trac-wikinotification SUBDIR += trac-wikitemplates SUBDIR += trac-wikitopdf SUBDIR += trac-wysiwyg SUBDIR += trac-xmlrpc SUBDIR += trafficserver SUBDIR += transmission-web SUBDIR += transproxy SUBDIR += trytond28_google_maps SUBDIR += trytond_google_maps SUBDIR += tt-rss SUBDIR += ttf2eot SUBDIR += twig SUBDIR += twiki SUBDIR += twiki-BehaviourContrib SUBDIR += twiki-BlogAddOn SUBDIR += twiki-BugzillaLinkPlugin SUBDIR += twiki-ClassicSkin SUBDIR += twiki-CommentPlugin SUBDIR += twiki-EditTablePlugin SUBDIR += twiki-EmptyPlugin SUBDIR += twiki-GluePlugin SUBDIR += twiki-InterwikiPlugin SUBDIR += twiki-JSCalendarContrib SUBDIR += twiki-LDAPPasswordChangerPlugin SUBDIR += twiki-LdapContrib SUBDIR += twiki-LdapNgPlugin SUBDIR += twiki-MailerContrib SUBDIR += twiki-MathModePlugin SUBDIR += twiki-NewUserPlugin SUBDIR += twiki-PatternSkin SUBDIR += twiki-PreferencesPlugin SUBDIR += twiki-RenderListPlugin SUBDIR += twiki-SlideShowPlugin SUBDIR += twiki-SmiliesPlugin SUBDIR += twiki-SpreadSheetPlugin SUBDIR += twiki-SubscribePlugin SUBDIR += twiki-TWikiUserMappingContrib SUBDIR += twiki-TablePlugin SUBDIR += twiki-TagMePlugin SUBDIR += twiki-TinyMCEPlugin SUBDIR += twiki-TipsContrib SUBDIR += twiki-TopicVarsPlugin SUBDIR += twiki-TwistyContrib SUBDIR += twiki-TwistyPlugin SUBDIR += twiki-WysiwygPlugin SUBDIR += twill SUBDIR += twms SUBDIR += typo3 SUBDIR += typo3-lts SUBDIR += typolight SUBDIR += udmsearch SUBDIR += uglifyjs SUBDIR += usermanager SUBDIR += uwsgi SUBDIR += uwsgitop SUBDIR += uzbl SUBDIR += validator SUBDIR += varnish-libvmod-header SUBDIR += varnish-nagios SUBDIR += varnish4 SUBDIR += vdr-plugin-live SUBDIR += vdradmin-am SUBDIR += vee SUBDIR += vertx SUBDIR += vimb-gtk2 SUBDIR += vimb-gtk3 SUBDIR += visitors SUBDIR += volta SUBDIR += w3m SUBDIR += w3m-img SUBDIR += w3mir SUBDIR += waccess SUBDIR += wadcomblog SUBDIR += web2ldap SUBDIR += webalizer SUBDIR += webbrowser SUBDIR += webcalendar SUBDIR += webcheck SUBDIR += webcopy SUBDIR += webcrawl SUBDIR += webfs SUBDIR += webgo SUBDIR += webgrind SUBDIR += webinject SUBDIR += webkit-gtk2 SUBDIR += webkit-gtk3 SUBDIR += webkit-qt4 SUBDIR += webkit-qt5 SUBDIR += webkit-sharp SUBDIR += webkit2-gtk3 SUBDIR += weblint SUBDIR += weblint++ SUBDIR += webpy SUBDIR += webreport SUBDIR += webresolve SUBDIR += websh SUBDIR += webstats SUBDIR += webstone SUBDIR += webstone-ssl SUBDIR += webtrees SUBDIR += wgetpaste SUBDIR += wikicalc SUBDIR += wikindx SUBDIR += wml SUBDIR += woof SUBDIR += wordpress SUBDIR += wsdlpull SUBDIR += wsmake SUBDIR += www6to4 SUBDIR += wwwoffle SUBDIR += wwwstat SUBDIR += xapian-omega SUBDIR += xaraya SUBDIR += xcache SUBDIR += xfce4-smartbookmark-plugin SUBDIR += xist SUBDIR += xombrero SUBDIR += xoops SUBDIR += xpi-adblock SUBDIR += xpi-adblock_plus SUBDIR += xpi-bookmarkdd SUBDIR += xpi-clear_cache_button SUBDIR += xpi-clearfields SUBDIR += xpi-close-all-tabs SUBDIR += xpi-colorfultabs SUBDIR += xpi-conkeror SUBDIR += xpi-cookiesafe SUBDIR += xpi-cssviewer SUBDIR += xpi-cutemenus-crystalsvg SUBDIR += xpi-default_full_zoom_level SUBDIR += xpi-delicious SUBDIR += xpi-downthemall SUBDIR += xpi-errorzilla SUBDIR += xpi-fasterfox SUBDIR += xpi-firebug SUBDIR += xpi-firefox-showcase SUBDIR += xpi-firemobilesimulator SUBDIR += xpi-fission SUBDIR += xpi-flagfox SUBDIR += xpi-flashblock SUBDIR += xpi-flashgot SUBDIR += xpi-flatbmark SUBDIR += xpi-forecastfox SUBDIR += xpi-formfox SUBDIR += xpi-foxmarks SUBDIR += xpi-foxyproxy SUBDIR += xpi-gbrain SUBDIR += xpi-gdata_provider SUBDIR += xpi-ghostery SUBDIR += xpi-gmail-manager SUBDIR += xpi-google-notebook SUBDIR += xpi-google_shortcuts SUBDIR += xpi-grab_and_drag SUBDIR += xpi-greasemonkey SUBDIR += xpi-httpfox SUBDIR += xpi-imagezoom SUBDIR += xpi-imdbpreview SUBDIR += xpi-imglikeopera SUBDIR += xpi-infolister SUBDIR += xpi-informenter SUBDIR += xpi-inline-google-definitions SUBDIR += xpi-it_s_all_text SUBDIR += xpi-jslib SUBDIR += xpi-jsview SUBDIR += xpi-jv SUBDIR += xpi-leechblock SUBDIR += xpi-linkification SUBDIR += xpi-live_http_headers SUBDIR += xpi-live_pagerank SUBDIR += xpi-locale-switcher SUBDIR += xpi-menueditor SUBDIR += xpi-mldonkey SUBDIR += xpi-modify_headers SUBDIR += xpi-mrtech-local-install SUBDIR += xpi-neo-diggler SUBDIR += xpi-no-referrer SUBDIR += xpi-noscript SUBDIR += xpi-passwordmaker SUBDIR += xpi-pdf_download SUBDIR += xpi-pencil SUBDIR += xpi-pentadactyl SUBDIR += xpi-permatabs SUBDIR += xpi-prism SUBDIR += xpi-quick-locale-switcher SUBDIR += xpi-quickproxy SUBDIR += xpi-resurrectpages SUBDIR += xpi-sameplace SUBDIR += xpi-scrapbook SUBDIR += xpi-searchstatus SUBDIR += xpi-server_spy SUBDIR += xpi-server_switcher SUBDIR += xpi-sessionmanager SUBDIR += xpi-showip SUBDIR += xpi-speed-dial SUBDIR += xpi-splash SUBDIR += xpi-stumbleupon SUBDIR += xpi-stylish SUBDIR += xpi-table2clipboard SUBDIR += xpi-tabletools SUBDIR += xpi-tabmixplus SUBDIR += xpi-tagzilla SUBDIR += xpi-togglewordwrap SUBDIR += xpi-torbutton SUBDIR += xpi-twitterfox SUBDIR += xpi-unplug SUBDIR += xpi-urllink SUBDIR += xpi-user_agent_switcher SUBDIR += xpi-vimperator SUBDIR += xpi-web_developer SUBDIR += xpi-wmlbrowser SUBDIR += xpi-xhtml-ruby-support SUBDIR += xpi-xmpp4moz SUBDIR += xpi-yslow SUBDIR += xshttpd SUBDIR += xshttpd-devel SUBDIR += xsp SUBDIR += yabb SUBDIR += yahoo-ui SUBDIR += yanopaste SUBDIR += yaws SUBDIR += yii SUBDIR += yourls SUBDIR += youtube_dl SUBDIR += yuicompressor SUBDIR += zen-cart SUBDIR += zend-framework SUBDIR += zend-framework1 SUBDIR += zenphoto SUBDIR += zerowait-httpd SUBDIR += zikula SUBDIR += zope213 .include Index: head/www/py-frappe-bench/Makefile =================================================================== --- head/www/py-frappe-bench/Makefile (nonexistent) +++ head/www/py-frappe-bench/Makefile (revision 393308) @@ -0,0 +1,33 @@ +# Created by: loader +# $FreeBSD$ + +PORTNAME= frappe-bench +PORTVERSION= 0.92 +DISTVERSIONPREFIX= v +CATEGORIES= www python +PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} + +MAINTAINER= loader@FreeBSD.org +COMMENT= Frappe / ERPNext apps setup tool + +LICENSE= GPLv3 +LICENSE_FILE= ${WRKSRC}/LICENSE.md + +RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}click>0:${PORTSDIR}/devel/py-click \ + ${PYTHON_PKGNAMEPREFIX}Jinja2>0:${PORTSDIR}/devel/py-Jinja2 \ + ${PYTHON_PKGNAMEPREFIX}virtualenv>0:${PORTSDIR}/devel/py-virtualenv \ + ${PYTHON_PKGNAMEPREFIX}requests>0:${PORTSDIR}/www/py-requests \ + ${PYTHON_PKGNAMEPREFIX}honcho>0:${PORTSDIR}/sysutils/py-honcho \ + ${PYTHON_PKGNAMEPREFIX}semantic_version>0:${PORTSDIR}/devel/py-semantic_version \ + ${PYTHON_PKGNAMEPREFIX}GitPython>=1.0.1:${PORTSDIR}/devel/py-gitpython \ + ${PYTHON_PKGNAMEPREFIX}pip>0:${PORTSDIR}/devel/py-pip \ + git:${PORTSDIR}/devel/git + +USE_GITHUB= yes +GH_ACCOUNT= frappe +GH_PROJECT= bench + +USES= python +USE_PYTHON= autoplist distutils concurrent + +.include Property changes on: head/www/py-frappe-bench/Makefile ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/py-frappe-bench/distinfo =================================================================== --- head/www/py-frappe-bench/distinfo (nonexistent) +++ head/www/py-frappe-bench/distinfo (revision 393308) @@ -0,0 +1,2 @@ +SHA256 (frappe-bench-v0.92_GH0.tar.gz) = 4095b752bd777166d48054df6fb198ad1349e0bdf60d112e632ea622a9b99587 +SIZE (frappe-bench-v0.92_GH0.tar.gz) = 30835 Property changes on: head/www/py-frappe-bench/distinfo ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/py-frappe-bench/files/patch-a93acec =================================================================== --- head/www/py-frappe-bench/files/patch-a93acec (nonexistent) +++ head/www/py-frappe-bench/files/patch-a93acec (revision 393308) @@ -0,0 +1,1763 @@ +--- README.md.orig 2014-11-19 06:36:44 UTC ++++ README.md +@@ -5,7 +5,7 @@ The bench allows you to setup Frappe / E + + To do this install, you must have basic information on how Linux works and should be able to use the command-line. If you are looking easier ways to get started and evaluate ERPNext, [download the Virtual Machine or take a free trial at FrappeCloud.com](https://erpnext.com/use). + +-For questions, please join the [developer forum](https://groups.google.com/group/erpnext-developer-forum). ++For questions, please join the [developer forum](https://discuss.frappe.io/). + + Installation + ============ +@@ -37,6 +37,15 @@ Install pre-requisites, + * Redis + * [wkhtmltopdf](http://wkhtmltopdf.org/downloads.html) (optional, required for pdf generation) + * Memcached ++ ++For installing MaraiDB on OSX, use: ++``` ++brew install mariadb ++mysql_install_db ++mysql.server start ++mysqladmin -uroot password ROOTPASSWORD ++``` ++ + + Install bench as a *non root* user, + +@@ -105,11 +114,9 @@ To setup a bench that runs ERPNext, run + cd ~ + bench init frappe-bench + cd frappe-bench +-bench get-app erpnext https://github.com/frappe/erpnext # Add ERPNext to your bench apps +-bench get-app shopping_cart https://github.com/frappe/shopping-cart # Add Shopping cart to your bench apps +-bench new-site site1.local # Create a new site +-bench frappe --install_app erpnext site1.local # Install ERPNext for the site +-bench frappe --install_app shopping_cart site1.local # Install Shopping cart for the site ++bench get-app erpnext https://github.com/frappe/erpnext # Add ERPNext to your bench apps ++bench new-site site1.local # Create a new site ++bench install-app erpnext # Install ERPNext for the site + ``` + + You can now either use `bench start` or setup the bench for production use. +@@ -162,7 +169,7 @@ Frappe Processes + * WSGI Server + + * The WSGI server is responsible for responding to the HTTP requests to +- frappe. In development scenario (`frappe --serve` or `bench start`), the ++ frappe. In development scenario (`bench serve` or `bench start`), the + Werkzeug WSGI server is used and in production, gunicorn (automatically + configured in supervisor) is used. + +--- bench/app.py.orig 2014-11-19 06:36:44 UTC ++++ bench/app.py +@@ -1,12 +1,22 @@ + import os +-from .utils import exec_cmd, get_frappe, check_git_for_shallow_clone, get_config, build_assets, restart_supervisor_processes, get_cmd_output ++from .utils import exec_cmd, get_frappe, check_git_for_shallow_clone, get_config, build_assets, restart_supervisor_processes, get_cmd_output, run_frappe_cmd + + import logging + import requests ++import semantic_version + import json ++import re ++import subprocess ++ + + logger = logging.getLogger(__name__) + ++class MajorVersionUpgradeException(Exception): ++ def __init__(self, message, upstream_version, local_version): ++ super(MajorVersionUpgradeException, self).__init__(message) ++ self.upstream_version = upstream_version ++ self.local_version = local_version ++ + def get_apps(bench='.'): + try: + with open(os.path.join(bench, 'sites', 'apps.txt')) as f: +@@ -18,10 +28,19 @@ def add_to_appstxt(app, bench='.'): + apps = get_apps(bench=bench) + if app not in apps: + apps.append(app) +- with open(os.path.join(bench, 'sites', 'apps.txt'), 'w') as f: +- return f.write('\n'.join(apps)) ++ return write_appstxt(apps, bench=bench) + +-def get_app(app, git_url, branch=None, bench='.'): ++def remove_from_appstxt(app, bench='.'): ++ apps = get_apps(bench=bench) ++ if app in apps: ++ apps.remove(app) ++ return write_appstxt(apps, bench=bench) ++ ++def write_appstxt(apps, bench='.'): ++ with open(os.path.join(bench, 'sites', 'apps.txt'), 'w') as f: ++ return f.write('\n'.join(apps)) ++ ++def get_app(app, git_url, branch=None, bench='.', build_asset_files=True): + logger.info('getting app {}'.format(app)) + shallow_clone = '--depth 1' if check_git_for_shallow_clone() and get_config().get('shallow_clone') else '' + branch = '--branch {branch}'.format(branch=branch) if branch else '' +@@ -33,14 +52,20 @@ def get_app(app, git_url, branch=None, b + cwd=os.path.join(bench, 'apps')) + print 'installing', app + install_app(app, bench=bench) +- build_assets(bench=bench) ++ if build_asset_files: ++ build_assets(bench=bench) + conf = get_config() + if conf.get('restart_supervisor_on_update'): + restart_supervisor_processes(bench=bench) + + def new_app(app, bench='.'): + logger.info('creating new app {}'.format(app)) +- exec_cmd("{frappe} --make_app {apps}".format(frappe=get_frappe(bench=bench), apps=os.path.join(bench, 'apps'))) ++ apps = os.path.abspath(os.path.join(bench, 'apps')) ++ if FRAPPE_VERSION == 4: ++ exec_cmd("{frappe} --make_app {apps} {app}".format(frappe=get_frappe(bench=bench), ++ apps=apps, app=app)) ++ else: ++ run_frappe_cmd('make-app', apps, app, bench=bench) + install_app(app, bench=bench) + + def install_app(app, bench='.'): +@@ -57,19 +82,112 @@ def pull_all_apps(bench='.'): + apps_dir = os.path.join(bench, 'apps') + apps = [app for app in os.listdir(apps_dir) if os.path.isdir(os.path.join(apps_dir, app))] + rebase = '--rebase' if get_config().get('rebase_on_pull') else '' ++ frappe_dir = os.path.join(apps_dir, 'frappe') ++ + for app in apps: + app_dir = os.path.join(apps_dir, app) + if os.path.exists(os.path.join(app_dir, '.git')): + logger.info('pulling {0}'.format(app)) + exec_cmd("git pull {rebase} upstream {branch}".format(rebase=rebase, branch=get_current_branch(app_dir)), cwd=app_dir) + ++def is_version_upgrade(bench='.', branch=None): ++ apps_dir = os.path.join(bench, 'apps') ++ frappe_dir = os.path.join(apps_dir, 'frappe') ++ ++ fetch_upstream(frappe_dir) ++ upstream_version = get_upstream_version(frappe_dir, branch=branch) ++ ++ if not upstream_version: ++ raise Exception("Current branch of 'frappe' not in upstream") ++ ++ local_version = get_major_version(get_current_version(frappe_dir)) ++ upstream_version = get_major_version(upstream_version) ++ ++ if upstream_version - local_version > 0: ++ return (local_version, upstream_version) ++ return False ++ ++def get_current_frappe_version(bench='.'): ++ apps_dir = os.path.join(bench, 'apps') ++ frappe_dir = os.path.join(apps_dir, 'frappe') ++ ++ try: ++ return get_major_version(get_current_version(frappe_dir)) ++ except IOError: ++ return '' ++ + def get_current_branch(repo_dir): + return get_cmd_output("basename $(git symbolic-ref -q HEAD)", cwd=repo_dir) + ++def fetch_upstream(repo_dir): ++ return exec_cmd("git fetch upstream", cwd=repo_dir) ++ ++def get_current_version(repo_dir): ++ with open(os.path.join(repo_dir, 'setup.py')) as f: ++ return get_version_from_string(f.read()) ++ ++def get_upstream_version(repo_dir, branch=None): ++ if not branch: ++ branch = get_current_branch(repo_dir) ++ try: ++ contents = subprocess.check_output(['git', 'show', 'upstream/{branch}:setup.py'.format(branch=branch)], cwd=repo_dir, stderr=subprocess.STDOUT) ++ except subprocess.CalledProcessError, e: ++ if "Invalid object" in e.output: ++ return None ++ else: ++ raise ++ return get_version_from_string(contents) ++ ++def switch_branch(branch, apps=None, bench='.', upgrade=False): ++ from .utils import update_requirements, backup_all_sites, patch_sites, build_assets, pre_upgrade, post_upgrade ++ import utils ++ apps_dir = os.path.join(bench, 'apps') ++ version_upgrade = is_version_upgrade(bench=bench, branch=branch) ++ if version_upgrade and not upgrade: ++ raise MajorVersionUpgradeException("Switching to {0} will cause upgrade from {1} to {2}. Pass --upgrade to confirm".format(branch, version_upgrade[0], version_upgrade[1]), version_upgrade[0], version_upgrade[1]) ++ ++ if not apps: ++ apps = ('frappe', 'erpnext', 'shopping_cart') ++ for app in apps: ++ app_dir = os.path.join(apps_dir, app) ++ if os.path.exists(app_dir): ++ unshallow = "--unshallow" if os.path.exists(os.path.join(app_dir, ".git", "shallow")) else "" ++ exec_cmd("git config --unset-all remote.upstream.fetch", cwd=app_dir) ++ exec_cmd("git config --add remote.upstream.fetch '+refs/heads/*:refs/remotes/upstream/*'", cwd=app_dir) ++ exec_cmd("git fetch upstream {unshallow}".format(unshallow=unshallow), cwd=app_dir) ++ exec_cmd("git checkout {branch}".format(branch=branch), cwd=app_dir) ++ exec_cmd("git merge upstream/{branch}".format(branch=branch), cwd=app_dir) ++ ++ if version_upgrade and upgrade: ++ update_requirements() ++ pre_upgrade(version_upgrade[0], version_upgrade[1]) ++ reload(utils) ++ backup_all_sites() ++ patch_sites() ++ build_assets() ++ post_upgrade(version_upgrade[0], version_upgrade[1]) ++ ++def switch_to_master(apps=None, bench='.', upgrade=False): ++ switch_branch('master', apps=apps, bench=bench, upgrade=upgrade) ++ ++def switch_to_develop(apps=None, bench='.', upgrade=False): ++ switch_branch('develop', apps=apps, bench=bench, upgrade=upgrade) ++ ++def switch_to_v4(apps=None, bench='.', upgrade=False): ++ switch_branch('v4.x.x', apps=apps, bench=bench, upgrade=upgrade) ++ ++def get_version_from_string(contents): ++ match = re.search(r"^(\s*%s\s*=\s*['\\\"])(.+?)(['\"])(?sm)" % 'version', ++ contents) ++ return match.group(2) ++ ++def get_major_version(version): ++ return semantic_version.Version(version).major ++ + def install_apps_from_path(path, bench='.'): + apps = get_apps_json(path) + for app in apps: +- get_app(app['name'], app['url'], branch=app.get('branch'), bench=bench) ++ get_app(app['name'], app['url'], branch=app.get('branch'), bench=bench, build_asset_files=False) + + def get_apps_json(path): + if path.startswith('http'): +@@ -78,3 +196,5 @@ def get_apps_json(path): + else: + with open(path) as f: + return json.load(f) ++ ++FRAPPE_VERSION = get_current_frappe_version() +--- bench/cli.py.orig 2014-11-19 06:36:44 UTC ++++ bench/cli.py +@@ -8,32 +8,54 @@ from .utils import setup_sudoers as _set + from .utils import start as _start + from .utils import setup_procfile as _setup_procfile + from .utils import set_nginx_port as _set_nginx_port +-from .utils import set_nginx_port as _set_nginx_port ++from .utils import set_url_root as _set_url_root + from .utils import set_default_site as _set_default_site +-from .utils import (build_assets, patch_sites, exec_cmd, update_bench, get_frappe, setup_logging, ++from .utils import (build_assets, patch_sites, exec_cmd, update_bench, get_env_cmd, get_frappe, setup_logging, + get_config, update_config, restart_supervisor_processes, put_config, default_config, update_requirements, +- backup_all_sites, backup_site, get_sites, prime_wheel_cache, is_root, set_mariadb_host, drop_privileges) ++ backup_all_sites, backup_site, get_sites, prime_wheel_cache, is_root, set_mariadb_host, drop_privileges, ++ fix_file_perms, fix_prod_setup_perms, set_ssl_certificate, set_ssl_certificate_key, get_cmd_output, post_upgrade, ++ pre_upgrade, PatchError, download_translations_p) + from .app import get_app as _get_app + from .app import new_app as _new_app +-from .app import pull_all_apps +-from .config import generate_nginx_config, generate_supervisor_config ++from .app import pull_all_apps, get_apps, get_current_frappe_version, is_version_upgrade, switch_to_v4, switch_to_master, switch_to_develop ++from .config import generate_nginx_config, generate_supervisor_config, generate_redis_config + from .production_setup import setup_production as _setup_production ++from .migrate_to_v5 import migrate_to_v5 + import os + import sys + import logging + import copy ++import json + import pwd + import grp ++import subprocess + + logger = logging.getLogger('bench') + ++global FRAPPE_VERSION ++ + def cli(): + check_uid() + change_dir() + change_uid() + if len(sys.argv) > 2 and sys.argv[1] == "frappe": +- return frappe() +- return bench() ++ return old_frappe_cli() ++ elif len(sys.argv) > 1 and sys.argv[1] in get_frappe_commands(): ++ return frappe_cmd() ++ elif len(sys.argv) > 1 and sys.argv[1] in ("--site", "--verbose", "--force", "--profile"): ++ return frappe_cmd() ++ elif len(sys.argv) > 1 and sys.argv[1]=="--help": ++ print click.Context(bench).get_help() ++ print ++ print get_frappe_help() ++ return ++ elif len(sys.argv) > 1 and sys.argv[1] in get_apps(): ++ return app_cmd() ++ else: ++ try: ++ bench() ++ except PatchError: ++ sys.exit(1) + + def cmd_requires_root(): + if len(sys.argv) > 2 and sys.argv[2] in ('production', 'sudoers'): +@@ -57,17 +79,51 @@ def change_uid(): + sys.exit(1) + + def change_dir(): ++ if os.path.exists('config.json') or "init" in sys.argv: ++ return + dir_path_file = '/etc/frappe_bench_dir' + if os.path.exists(dir_path_file): + with open(dir_path_file) as f: + dir_path = f.read().strip() +- os.chdir(dir_path) ++ if os.path.exists(dir_path): ++ os.chdir(dir_path) + +-def frappe(bench='.'): ++def old_frappe_cli(bench='.'): + f = get_frappe(bench=bench) + os.chdir(os.path.join(bench, 'sites')) + os.execv(f, [f] + sys.argv[2:]) + ++def app_cmd(bench='.'): ++ f = get_env_cmd('python', bench=bench) ++ os.chdir(os.path.join(bench, 'sites')) ++ os.execv(f, [f] + ['-m', 'frappe.utils.bench_helper'] + sys.argv[1:]) ++ ++def frappe_cmd(bench='.'): ++ f = get_env_cmd('python', bench=bench) ++ os.chdir(os.path.join(bench, 'sites')) ++ os.execv(f, [f] + ['-m', 'frappe.utils.bench_helper', 'frappe'] + sys.argv[1:]) ++ ++def get_frappe_commands(bench='.'): ++ python = get_env_cmd('python', bench=bench) ++ sites_path = os.path.join(bench, 'sites') ++ if not os.path.exists(sites_path): ++ return [] ++ try: ++ return json.loads(get_cmd_output("{python} -m frappe.utils.bench_helper get-frappe-commands".format(python=python), cwd=sites_path)) ++ except subprocess.CalledProcessError: ++ return [] ++ ++def get_frappe_help(bench='.'): ++ python = get_env_cmd('python', bench=bench) ++ sites_path = os.path.join(bench, 'sites') ++ if not os.path.exists(sites_path): ++ return [] ++ try: ++ out = get_cmd_output("{python} -m frappe.utils.bench_helper get-frappe-help".format(python=python), cwd=sites_path) ++ return "Framework commands:\n" + out.split('Commands:')[1] ++ except subprocess.CalledProcessError: ++ return "" ++ + @click.command() + def shell(bench='.'): + if not os.environ.get('SHELL'): +@@ -86,6 +142,8 @@ def shell(bench='.'): + def bench(bench='.'): + "Bench manager for Frappe" + # TODO add bench path context ++ global FRAPPE_VERSION ++ FRAPPE_VERSION = get_current_frappe_version() + setup_logging(bench=bench) + + @click.command() +@@ -134,8 +192,9 @@ def new_site(site, mariadb_root_password + @click.option('--requirements',flag_value=True, type=bool, help="Update requirements") + @click.option('--restart-supervisor',flag_value=True, type=bool, help="restart supervisor processes after update") + @click.option('--auto',flag_value=True, type=bool) ++@click.option('--upgrade',flag_value=True, type=bool) + @click.option('--no-backup',flag_value=True, type=bool) +-def update(pull=False, patch=False, build=False, bench=False, auto=False, restart_supervisor=False, requirements=False, no_backup=False): ++def update(pull=False, patch=False, build=False, bench=False, auto=False, restart_supervisor=False, requirements=False, no_backup=False, upgrade=False): + "Update bench" + + if not (pull or patch or build or bench or requirements): +@@ -155,12 +214,36 @@ def update(pull=False, patch=False, buil + 'build': build, + 'requirements': requirements, + 'no-backup': no_backup, +- 'restart-supervisor': restart_supervisor ++ 'restart-supervisor': restart_supervisor, ++ 'upgrade': upgrade + }) ++ ++ version_upgrade = is_version_upgrade() ++ ++ if version_upgrade and not upgrade: ++ print ++ print ++ print "This update will cause a major version change in Frappe/ERPNext from {0} to {1} (beta).".format(*version_upgrade) ++ print "This would take significant time to migrate and might break custom apps. Please run `bench update --upgrade` to confirm." ++ print ++ # print "You can also pin your bench to {0} by running `bench swtich-to-v{0}`".format(version_upgrade[0]) ++ print "You can stay on the latest stable release by running `bench switch-to-master` or pin your bench to {0} by running `bench swtich-to-v{0}`".format(version_upgrade[0]) ++ sys.exit(1) ++ elif not version_upgrade and upgrade: ++ upgrade = False ++ + if pull: + pull_all_apps() ++ + if requirements: + update_requirements() ++ ++ if upgrade: ++ pre_upgrade(version_upgrade[0], version_upgrade[1]) ++ import utils, app ++ reload(utils) ++ reload(app) ++ + if patch: + if not no_backup: + backup_all_sites() +@@ -169,14 +252,23 @@ def update(pull=False, patch=False, buil + build_assets() + if restart_supervisor or conf.get('restart_supervisor_on_update'): + restart_supervisor_processes() ++ if upgrade: ++ post_upgrade(version_upgrade[0], version_upgrade[1]) + + print "_"*80 + print "https://frappe.io/buy - Donate to help make better free and open source tools" + print + ++@click.command('retry-upgrade') ++@click.option('--version', default=5) ++def retry_upgrade(version): ++ pull_all_apps() ++ patch_sites() ++ build_assets() ++ post_upgrade(version-1, version) ++ + def restart_update(kwargs): + args = ['--'+k for k, v in kwargs.items() if v] +- print 'restarting ' + os.execv(sys.argv[0], sys.argv[:2] + args) + + @click.command('restart') +@@ -198,6 +290,33 @@ def migrate_3to4(path): + migrate_3to4=os.path.join(os.path.dirname(__file__), 'migrate3to4.py'), + site=path)) + ++@click.command('switch-to-master') ++@click.option('--upgrade',flag_value=True, type=bool) ++def _switch_to_master(upgrade=False): ++ "Switch frappe and erpnext to master branch" ++ switch_to_master(upgrade=upgrade) ++ print ++ print 'Switched to master' ++ print 'Please run `bench update --patch` to be safe from any differences in database schema' ++ ++@click.command('switch-to-develop') ++@click.option('--upgrade',flag_value=True, type=bool) ++def _switch_to_develop(upgrade=False): ++ "Switch frappe and erpnext to develop branch" ++ switch_to_develop(upgrade=upgrade) ++ print ++ print 'Switched to develop' ++ print 'Please run `bench update --patch` to be safe from any differences in database schema' ++ ++@click.command('switch-to-v4') ++@click.option('--upgrade',flag_value=True, type=bool) ++def _switch_to_v4(upgrade=False): ++ "Switch frappe and erpnext to v4 branch" ++ switch_to_v4(upgrade=upgrade) ++ print ++ print 'Switched to v4' ++ print 'Please run `bench update --patch` to be safe from any differences in database schema' ++ + @click.command('set-nginx-port') + @click.argument('site') + @click.argument('port', type=int) +@@ -205,6 +324,27 @@ def set_nginx_port(site, port): + "Set nginx port for site" + _set_nginx_port(site, port) + ++@click.command('set-ssl-certificate') ++@click.argument('site') ++@click.argument('ssl-certificate-path') ++def _set_ssl_certificate(site, ssl_certificate_path): ++ "Set ssl certificate path for site" ++ set_ssl_certificate(site, ssl_certificate_path) ++ ++@click.command('set-ssl-key') ++@click.argument('site') ++@click.argument('ssl-certificate-key-path') ++def _set_ssl_certificate_key(site, ssl_certificate_key_path): ++ "Set ssl certificate private key path for site" ++ set_ssl_certificate_key(site, ssl_certificate_key_path) ++ ++@click.command('set-url-root') ++@click.argument('site') ++@click.argument('url-root') ++def set_url_root(site, url_root): ++ "Set url root for site" ++ _set_url_root(site, url_root) ++ + @click.command('set-mariadb-host') + @click.argument('host') + def _set_mariadb_host(host): +@@ -239,11 +379,13 @@ def _prime_wheel_cache(): + @click.command('release') + @click.argument('app', type=click.Choice(['frappe', 'erpnext', 'shopping_cart'])) + @click.argument('bump-type', type=click.Choice(['major', 'minor', 'patch'])) +-def _release(app, bump_type): ++@click.option('--develop', default='develop') ++@click.option('--master', default='master') ++def _release(app, bump_type, develop, master): + "Release app (internal to the Frappe team)" + from .release import release + repo = os.path.join('apps', app) +- release(repo, bump_type) ++ release(repo, bump_type, develop, master) + + ## Setup + @click.group() +@@ -267,6 +409,11 @@ def setup_supervisor(): + "generate config for supervisor" + generate_supervisor_config() + ++@click.command('redis-cache') ++def setup_redis_cache(): ++ "generate config for redis cache" ++ generate_redis_config() ++ + @click.command('production') + @click.argument('user') + def setup_production(user): +@@ -305,6 +452,7 @@ def setup_config(): + setup.add_command(setup_nginx) + setup.add_command(setup_sudoers) + setup.add_command(setup_supervisor) ++setup.add_command(setup_redis_cache) + setup.add_command(setup_auto_update) + setup.add_command(setup_dnsmasq) + setup.add_command(setup_backups) +@@ -380,40 +528,32 @@ config.add_command(config_http_timeout) + def patch(): + pass + +-@click.command('fix-perms') +-def _fix_perms(): ++@click.command('fix-prod-perms') ++def _fix_prod_perms(): ++ "Fix permissions if supervisor processes were run as root" + if os.path.exists("config/supervisor.conf"): + exec_cmd("supervisorctl stop frappe:") + +- "Fix permissions if supervisor processes were run as root" +- files = [ +- "logs/web.error.log", +- "logs/web.log", +- "logs/workerbeat.error.log", +- "logs/workerbeat.log", +- "logs/worker.error.log", +- "logs/worker.log", +- "config/nginx.conf", +- "config/supervisor.conf", +- ] +- +- frappe_user = get_config().get('frappe_user') +- if not frappe_user: +- print "frappe user not set" +- sys.exit(1) +- +- for path in files: +- if os.path.exists(path): +- uid = pwd.getpwnam(frappe_user).pw_uid +- gid = grp.getgrnam(frappe_user).gr_gid +- os.chown(path, uid, gid) ++ fix_prod_setup_perms() + + if os.path.exists("config/supervisor.conf"): + exec_cmd("{bench} setup supervisor".format(bench=sys.argv[0])) + exec_cmd("supervisorctl reload") + + +-patch.add_command(_fix_perms) ++@click.command('fix-file-perms') ++def _fix_file_perms(): ++ "Fix file permissions" ++ fix_file_perms() ++ ++patch.add_command(_fix_file_perms) ++patch.add_command(_fix_prod_perms) ++ ++ ++@click.command('download-translations') ++def _download_translations(): ++ "Download latest translations" ++ download_translations_p() + + #Bench commands + +@@ -427,12 +567,20 @@ bench.add_command(restart) + bench.add_command(config) + bench.add_command(start) + bench.add_command(set_nginx_port) ++bench.add_command(_set_ssl_certificate) ++bench.add_command(_set_ssl_certificate_key) + bench.add_command(_set_mariadb_host) + bench.add_command(set_default_site) + bench.add_command(migrate_3to4) ++bench.add_command(_switch_to_master) ++bench.add_command(_switch_to_develop) ++bench.add_command(_switch_to_v4) + bench.add_command(shell) + bench.add_command(_backup_all_sites) + bench.add_command(_backup_site) + bench.add_command(_prime_wheel_cache) + bench.add_command(_release) + bench.add_command(patch) ++bench.add_command(set_url_root) ++bench.add_command(retry_upgrade) ++bench.add_command(_download_translations) +--- bench/config.py.orig 2014-11-19 06:36:44 UTC ++++ bench/config.py +@@ -1,12 +1,27 @@ + import os + import getpass + import json ++import subprocess ++import shutil + from jinja2 import Environment, PackageLoader +-from .utils import get_sites, get_config, update_config ++from .utils import get_sites, get_config, update_config, get_redis_version + + env = Environment(loader=PackageLoader('bench', 'templates'), trim_blocks=True) + ++def write_config_file(bench, file_name, config): ++ config_path = os.path.join(bench, 'config') ++ file_path = os.path.join(config_path, file_name) ++ number = (len([path for path in os.listdir(config_path) if path.startswith(file_name)]) -1 ) or '' ++ if number: ++ number = '.' + str(number) ++ if os.path.exists(file_path): ++ shutil.move(file_path, file_path + '.save' + number) ++ ++ with open(file_path, 'wb') as f: ++ f.write(config) ++ + def generate_supervisor_config(bench='.', user=None): ++ from .app import get_current_frappe_version + template = env.get_template('supervisor.conf') + bench_dir = os.path.abspath(bench) + sites_dir = os.path.join(bench_dir, "sites") +@@ -20,9 +35,11 @@ def generate_supervisor_config(bench='.' + "sites_dir": sites_dir, + "user": user, + "http_timeout": config.get("http_timeout", 120), ++ "redis_server": subprocess.check_output('which redis-server', shell=True).strip(), ++ "redis_config": os.path.join(bench_dir, 'config', 'redis.conf'), ++ "frappe_version": get_current_frappe_version() + }) +- with open("config/supervisor.conf", 'w') as f: +- f.write(config) ++ write_config_file(bench, 'supervisor.conf', config) + update_config({'restart_supervisor_on_update': True}) + + def get_site_config(site, bench='.'): +@@ -31,10 +48,16 @@ def get_site_config(site, bench='.'): + + def get_sites_with_config(bench='.'): + sites = get_sites() +- return [{ +- "name": site, +- "port": get_site_config(site, bench=bench).get('nginx_port') +- } for site in sites] ++ ret = [] ++ for site in sites: ++ site_config = get_site_config(site, bench=bench) ++ ret.append({ ++ "name": site, ++ "port": site_config.get('nginx_port'), ++ "ssl_certificate": site_config.get('ssl_certificate'), ++ "ssl_certificate_key": site_config.get('ssl_certificate_key') ++ }) ++ return ret + + def generate_nginx_config(bench='.'): + template = env.get_template('nginx.conf') +@@ -59,5 +82,14 @@ def generate_nginx_config(bench='.'): + "dns_multitenant": get_config().get('dns_multitenant'), + "sites": sites + }) +- with open("config/nginx.conf", 'w') as f: +- f.write(config) ++ write_config_file(bench, 'nginx.conf', config) ++ ++def generate_redis_config(bench='.'): ++ template = env.get_template('redis.conf') ++ conf = { ++ "maxmemory": get_config().get('cache_maxmemory', '50'), ++ "port": get_config().get('redis_cache_port', '11311'), ++ "redis_version": get_redis_version() ++ } ++ config = template.render(**conf) ++ write_config_file(bench, 'redis.conf', config) +--- bench/migrate_to_v5.py.orig 2015-07-31 10:19:27 UTC ++++ bench/migrate_to_v5.py +@@ -0,0 +1,46 @@ ++from .utils import exec_cmd, get_frappe, run_frappe_cmd ++from .release import get_current_version ++from .app import remove_from_appstxt ++import os ++import shutil ++import sys ++ ++repos = ('frappe', 'erpnext') ++ ++def migrate_to_v5(bench='.'): ++ validate_v4(bench=bench) ++ for repo in repos: ++ checkout_v5(repo, bench=bench) ++ remove_shopping_cart(bench=bench) ++ exec_cmd("{bench} update".format(bench=sys.argv[0])) ++ ++def remove_shopping_cart(bench='.'): ++ archived_apps_dir = os.path.join(bench, 'archived_apps') ++ shopping_cart_dir = os.path.join(bench, 'apps', 'shopping_cart') ++ ++ if not os.path.exists(shopping_cart_dir): ++ return ++ ++ run_frappe_cmd('--site', 'all', 'remove-from-installed-apps', 'shopping_cart', bench=bench) ++ remove_from_appstxt('shopping_cart', bench=bench) ++ exec_cmd("{pip} --no-input uninstall -y shopping_cart".format(pip=os.path.join(bench, 'env', 'bin', 'pip'))) ++ ++ if not os.path.exists(archived_apps_dir): ++ os.mkdir(archived_apps_dir) ++ shutil.move(shopping_cart_dir, archived_apps_dir) ++ ++def validate_v4(bench='.'): ++ for repo in repos: ++ path = os.path.join(bench, 'apps', repo) ++ if os.path.exists(path): ++ current_version = get_current_version(path) ++ if not current_version.startswith('4'): ++ raise Exception("{} is not on v4.x.x".format(repo)) ++ ++def checkout_v5(repo, bench='.'): ++ cwd = os.path.join(bench, 'apps', repo) ++ if os.path.exists(cwd): ++ exec_cmd("git fetch upstream", cwd=cwd) ++ exec_cmd("git checkout v5.0", cwd=cwd) ++ exec_cmd("git clean -df", cwd=cwd) ++ +--- bench/production_setup.py.orig 2014-11-19 06:36:44 UTC ++++ bench/production_setup.py +@@ -1,17 +1,16 @@ +-from .utils import get_program, exec_cmd, get_cmd_output ++from .utils import get_program, exec_cmd, get_cmd_output, fix_prod_setup_perms + from .config import generate_nginx_config, generate_supervisor_config + from jinja2 import Environment, PackageLoader + import os + import shutil + + def restart_service(service): +- program = get_program(['systemctl', 'service']) +- if not program: ++ if os.path.basename(get_program(['systemctl']) or '') == 'systemctl' and is_running_systemd(): ++ exec_cmd("{prog} restart {service}".format(prog='systemctl', service=service)) ++ elif os.path.basename(get_program(['service']) or '') == 'service': ++ exec_cmd("{prog} {service} restart ".format(prog='service', service=service)) ++ else: + raise Exception, 'No service manager found' +- elif os.path.basename(program) == 'systemctl': +- exec_cmd("{prog} restart {service}".format(prog=program, service=service)) +- elif os.path.basename(program) == 'service': +- exec_cmd("{prog} {service} restart ".format(prog=program, service=service)) + + def get_supervisor_confdir(): + possiblities = ('/etc/supervisor/conf.d', '/etc/supervisor.d/', '/etc/supervisord/conf.d', '/etc/supervisord.d') +@@ -30,6 +29,14 @@ def remove_default_nginx_configs(): + def is_centos7(): + return os.path.exists('/etc/redhat-release') and get_cmd_output("cat /etc/redhat-release | sed 's/Linux\ //g' | cut -d' ' -f3 | cut -d. -f1").strip() == '7' + ++def is_running_systemd(): ++ with open('/proc/1/comm') as f: ++ comm = f.read().strip() ++ if comm == "init": ++ return False ++ elif comm == "systemd": ++ return True ++ return False + + def copy_default_nginx_config(): + shutil.copy(os.path.join(os.path.dirname(__file__), 'templates', 'nginx_default.conf'), '/etc/nginx/nginx.conf') +@@ -37,6 +44,7 @@ def copy_default_nginx_config(): + def setup_production(user, bench='.'): + generate_supervisor_config(bench=bench, user=user) + generate_nginx_config(bench=bench) ++ fix_prod_setup_perms(frappe_user=user) + remove_default_nginx_configs() + + if is_centos7(): +--- bench/release.py.orig 2014-11-19 06:36:44 UTC ++++ bench/release.py +@@ -34,10 +34,10 @@ def create_release(repo_path, version, r + g.merge(master_branch) + return tag_name + +-def push_release(repo_path): ++def push_release(repo_path, develop_branch='develop', master_branch='master'): + repo = git.Repo(repo_path) + g = repo.git +- print g.push('upstream', 'master:master', 'develop:develop', '--tags') ++ print g.push('upstream', '{master}:{master}'.format(master=master_branch), '{develop}:{develop}'.format(develop=develop_branch), '--tags') + + def create_github_release(owner, repo, tag_name, log, gh_username=None, gh_password=None): + global github_username, github_password +@@ -137,25 +137,40 @@ def get_current_version(repo): + contents) + return match.group(2) + +-def bump_repo(repo, bump_type): +- update_branch(repo, 'master', remote='upstream') +- update_branch(repo, 'develop', remote='upstream') +- git.Repo(repo).git.checkout('develop') +- current_version = get_current_version(repo) +- new_version = get_bumped_version(current_version, bump_type) +- set_version(repo, new_version) +- return new_version ++def check_for_unmerged_changelog(repo): ++ current = os.path.join(repo, os.path.basename(repo), 'change_log', 'current') ++ if os.path.exists(current) and [f for f in os.listdir(current) if f != "readme.md"]: ++ raise Exception("Unmerged change log! in " + repo) + +-def bump(repo, bump_type): ++def bump_repo(repo, bump_type, develop='develop', master='master', remote='upstream'): ++ update_branch(repo, master, remote=remote) ++ update_branch(repo, develop, remote=remote) ++ git.Repo(repo).git.checkout(develop) ++ check_for_unmerged_changelog(repo) ++ current_version = get_current_version(repo) ++ new_version = get_bumped_version(current_version, bump_type) ++ set_version(repo, new_version) ++ return new_version ++ ++def get_release_message(repo_path, develop_branch='develop', master_branch='master'): ++ repo = git.Repo(repo_path) ++ g = repo.git ++ return "* " + g.log('upstream/{master_branch}..upstream/{develop_branch}'.format(master_branch=master_branch, develop_branch=develop_branch), '--format=format:%s', '--no-merges').replace('\n', '\n* ') ++ ++def bump(repo, bump_type, develop='develop', master='master', remote='upstream'): + assert bump_type in ['minor', 'major', 'patch'] +- new_version = bump_repo(repo, bump_type) ++ new_version = bump_repo(repo, bump_type, develop=develop, master=master, remote=remote) ++ message = get_release_message(repo, develop_branch=develop, master_branch=master) ++ print ++ print message ++ print + commit_changes(repo, new_version) +- tag_name = create_release(repo, new_version) +- push_release(repo) +- create_github_release('frappe', repo, tag_name, '') ++ tag_name = create_release(repo, new_version, develop_branch=develop, master_branch=master) ++ push_release(repo, develop_branch=develop, master_branch=master) ++ create_github_release('frappe', repo, tag_name, message) + print 'Released {tag} for {repo}'.format(tag=tag_name, repo=repo) + +-def release(repo, bump_type): ++def release(repo, bump_type, develop, master): + if not get_config().get('release_bench'): + print 'bench not configured to release' + sys.exit(1) +@@ -164,7 +179,7 @@ def release(repo, bump_type): + github_password = getpass.getpass() + r = requests.get('https://api.github.com/user', auth=HTTPBasicAuth(github_username, github_password)) + r.raise_for_status() +- bump(repo, bump_type) ++ bump(repo, bump_type, develop=develop, master=master) + + if __name__ == "__main__": + main() +--- bench/templates/nginx.conf.orig 2014-11-19 06:36:44 UTC ++++ bench/templates/nginx.conf +@@ -5,15 +5,7 @@ upstream frappe { + server 127.0.0.1:8000 fail_timeout=0; + } + +-{% macro server_block(site, port=80, default=False, server_name=None, sites=None, dns_multitenant=False) -%} +- server { +- listen {{ site.port if not default and site.port else port }} {% if default %} default {% endif %}; +- client_max_body_size 4G; +- {% if dns_multitenant and sites %} +- server_name {% for site in sites %} {{ site.name }} {% endfor %}; +- {% else %} +- server_name {{ site.name if not server_name else server_name }}; +- {% endif %} ++{% macro location_block(site, port=80, default=False, server_name=None, sites=None, dns_multitenant=False) -%} + keepalive_timeout 5; + sendfile on; + root {{ sites_dir }}; +@@ -34,30 +26,66 @@ upstream frappe { + location @magic { + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + {% if not dns_multitenant %} +- proxy_set_header Host {{ site.name }}; +- {% else %} +- proxy_set_header Host $host; ++ proxy_set_header X-Frappe-Site-Name {{ site.name }}; + {% endif %} ++ proxy_set_header Host $host; + proxy_set_header X-Use-X-Accel-Redirect True; + proxy_read_timeout {{http_timeout}}; + proxy_redirect off; + proxy_pass http://frappe; + } ++{%- endmacro %} ++ ++{% macro server_name_block(site, default=False, server_name=None, sites=None, dns_multitenant=False) -%} ++ client_max_body_size 4G; ++ {% if dns_multitenant and sites %} ++ server_name {% for site in sites %} {{ site.name }} {% endfor %}; ++ {% else %} ++ server_name {{ site.name if not server_name else server_name }}; ++ {% endif %} ++{%- endmacro %} ++ ++{% macro server_block_http(site, port=80, default=False, server_name=None, sites=None, dns_multitenant=False) -%} ++ server { ++ listen {{ site.port if not default and site.port else port }} {% if default %} default {% endif %}; ++ {{ server_name_block(site, default=default, server_name=server_name, sites=sites, dns_multitenant=dns_multitenant) }} ++ {{ location_block(site, port=port, default=default, server_name=server_name, sites=sites, dns_multitenant=dns_multitenant) }} ++ } ++{%- endmacro %} ++ ++{% macro server_block_https(site, port=443, default=False, server_name=None, sites=None, dns_multitenant=False) -%} ++ server { ++ listen {{ site.ssl_port if not default and site.ssl_port else port }} {% if default %} default {% endif %}; ++ {{ server_name_block(site, default=default, server_name=server_name, sites=sites, dns_multitenant=dns_multitenant) }} ++ ++ ssl on; ++ ssl_certificate {{ site.ssl_certificate }}; ++ ssl_certificate_key {{ site.ssl_certificate_key }}; ++ ssl_session_timeout 5m; ++ ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ++ ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS"; ++ ssl_prefer_server_ciphers on; ++ ++ {{ location_block(site, port=port, default=default, server_name=server_name, sites=sites, dns_multitenant=dns_multitenant) }} + } + {%- endmacro %} + + {% for site in sites %} + + {% if site.port %} +-{{ server_block(site) }} ++{{ server_block_http(site) }} ++{% endif %} ++ ++{% if site.ssl_certificate_key and site.ssl_certificate %} ++{{ server_block_https(site) }} + {% endif %} + + {% endfor %} + + {% if default_site %} +-{{ server_block(default_site, default=True, server_name="frappe_default_site") }} ++{{ server_block_http(default_site, default=True, server_name="frappe_default_site") }} + {% endif %} + + {% if dns_multitenant and sites %} +-{{ server_block(None, default=False, sites=sites, dns_multitenant=True) }} ++{{ server_block_http(None, default=False, sites=sites, dns_multitenant=True) }} + {% endif %} +--- bench/templates/redis.conf.orig 2015-07-31 10:19:27 UTC ++++ bench/templates/redis.conf +@@ -0,0 +1,72 @@ ++activerehashing yes ++appendfsync everysec ++appendonly no ++auto-aof-rewrite-min-size 64mb ++auto-aof-rewrite-percentage 100 ++daemonize no ++databases 16 ++dbfilename dump.rdb ++list-max-ziplist-entries 512 ++list-max-ziplist-value 64 ++no-appendfsync-on-rewrite no ++pidfile /var/run/redis.pid ++port {{port}} ++rdbcompression yes ++set-max-intset-entries 512 ++slave-serve-stale-data yes ++slowlog-log-slower-than 10000 ++slowlog-max-len 128 ++timeout 0 ++zset-max-ziplist-entries 128 ++zset-max-ziplist-value 64 ++ ++maxmemory {{maxmemory}}mb ++maxmemory-policy allkeys-lru ++ ++{% if redis_version == "2.4"%} ++hash-max-zipmap-entries 512 ++hash-max-zipmap-value 64 ++loglevel verbose ++vm-enabled no ++vm-max-memory 0 ++vm-max-threads 4 ++vm-page-size 32 ++vm-pages 134217728 ++vm-swap-file /tmp/redis.swap ++{% endif %} ++ ++{% if redis_version == "2.6"%} ++aof-rewrite-incremental-fsync yes ++client-output-buffer-limit normal 0 0 0 ++client-output-buffer-limit pubsub 32mb 8mb 60 ++client-output-buffer-limit slave 256mb 64mb 60 ++hash-max-ziplist-entries 512 ++hash-max-ziplist-value 64 ++hz 10 ++loglevel notice ++lua-time-limit 5000 ++rdbchecksum yes ++repl-disable-tcp-nodelay no ++slave-read-only yes ++stop-writes-on-bgsave-error yes ++tcp-keepalive 0 ++{% endif %} ++ ++{% if redis_version == "2.8"%} ++aof-rewrite-incremental-fsync yes ++appendfilename "appendonly.aof" ++client-output-buffer-limit normal 0 0 0 ++client-output-buffer-limit pubsub 32mb 8mb 60 ++client-output-buffer-limit slave 256mb 64mb 60 ++hash-max-ziplist-entries 512 ++hash-max-ziplist-value 64 ++hz 10 ++logfile "" ++loglevel notice ++lua-time-limit 5000 ++notify-keyspace-events "" ++rdbchecksum yes ++slave-read-only yes ++stop-writes-on-bgsave-error yes ++tcp-keepalive 0 ++{% endif %} +--- bench/templates/supervisor.conf.orig 2014-11-19 06:36:44 UTC ++++ bench/templates/supervisor.conf +@@ -28,5 +28,18 @@ stderr_logfile={{ bench_dir }}/logs/work + user={{ user }} + directory={{ sites_dir }} + ++ ++{% if frappe_version > 4%} ++[program:redis-cache] ++command={{ redis_server }} {{ redis_config }} ++autostart=true ++autorestart=true ++stopsignal=QUIT ++stdout_logfile={{ bench_dir }}/logs/redis.log ++stderr_logfile={{ bench_dir }}/logs/redis.error.log ++user={{ user }} ++directory={{ sites_dir }} ++{% endif %} ++ + [group:frappe] + programs=frappe-web,frappe-worker,frappe-workerbeat +--- bench/utils.py.orig 2014-11-19 06:36:44 UTC ++++ bench/utils.py +@@ -1,14 +1,24 @@ + import os ++import re + import sys + import subprocess + import getpass + import logging ++import itertools ++import requests + import json ++import platform ++import multiprocessing + from distutils.spawn import find_executable + import pwd, grp + ++ ++class PatchError(Exception): ++ pass ++ + logger = logging.getLogger(__name__) + ++ + default_config = { + 'restart_supervisor_on_update': False, + 'auto_update': False, +@@ -20,15 +30,20 @@ default_config = { + } + + def get_frappe(bench='.'): +- frappe = os.path.abspath(os.path.join(bench, 'env', 'bin', 'frappe')) ++ frappe = get_env_cmd('frappe', bench=bench) + if not os.path.exists(frappe): + print 'frappe app is not installed. Run the following command to install frappe' + print 'bench get-app frappe https://github.com/frappe/frappe.git' + return frappe + ++def get_env_cmd(cmd, bench='.'): ++ return os.path.abspath(os.path.join(bench, 'env', 'bin', cmd)) ++ + def init(path, apps_path=None, no_procfile=False, no_backups=False, + no_auto_update=False, frappe_path=None, frappe_branch=None, wheel_cache_dir=None): + from .app import get_app, install_apps_from_path ++ from .config import generate_redis_config ++ global FRAPPE_VERSION + if os.path.exists(path): + print 'Directory {} already exists!'.format(path) + sys.exit(1) +@@ -44,9 +59,10 @@ def init(path, apps_path=None, no_procfi + if wheel_cache_dir: + update_config({"wheel_cache_dir":wheel_cache_dir}, bench=path) + prime_wheel_cache(bench=path) ++ + if not frappe_path: + frappe_path = 'https://github.com/frappe/frappe.git' +- get_app('frappe', frappe_path, branch=frappe_branch, bench=path) ++ get_app('frappe', frappe_path, branch=frappe_branch, bench=path, build_asset_files=False) + if not no_procfile: + setup_procfile(bench=path) + if not no_backups: +@@ -55,6 +71,9 @@ def init(path, apps_path=None, no_procfi + setup_auto_update(bench=path) + if apps_path: + install_apps_from_path(apps_path, bench=path) ++ FRAPPE_VERSION = get_current_frappe_version(bench=path) ++ build_assets(bench=path) ++ generate_redis_config(bench=path) + + def exec_cmd(cmd, cwd='.'): + try: +@@ -69,18 +88,31 @@ def setup_env(bench='.'): + exec_cmd('./env/bin/pip -q install https://github.com/frappe/MySQLdb1/archive/MySQLdb-1.2.5-patched.tar.gz', cwd=bench) + + def setup_procfile(bench='.'): ++ from .app import get_current_frappe_version ++ frappe_version = get_current_frappe_version() ++ procfile_contents = { ++ 'web': "./env/bin/frappe --serve --sites_path sites", ++ 'worker': "sh -c 'cd sites && exec ../env/bin/python -m frappe.celery_app worker'", ++ 'workerbeat': "sh -c 'cd sites && exec ../env/bin/python -m frappe.celery_app beat -s scheduler.schedule'" ++ } ++ if frappe_version > 4: ++ procfile_contents['redis_cache'] = "redis-server config/redis.conf" ++ procfile_contents['web'] = "bench serve" ++ ++ procfile = '\n'.join(["{0}: {1}".format(k, v) for k, v in procfile_contents.items()]) ++ + with open(os.path.join(bench, 'Procfile'), 'w') as f: +- f.write("""web: ./env/bin/frappe --serve --sites_path sites +-worker: sh -c 'cd sites && exec ../env/bin/python -m frappe.celery_app worker' +-workerbeat: sh -c 'cd sites && exec ../env/bin/python -m frappe.celery_app beat -s scheduler.schedule'""") ++ f.write(procfile) + + def new_site(site, mariadb_root_password=None, admin_password=None, bench='.'): ++ import hashlib + logger.info('creating new site {}'.format(site)) + mariadb_root_password_fragment = '--root_password {}'.format(mariadb_root_password) if mariadb_root_password else '' + admin_password_fragment = '--admin_password {}'.format(admin_password) if admin_password else '' +- exec_cmd("{frappe} --install {site} {site} {mariadb_root_password_fragment} {admin_password_fragment}".format( ++ exec_cmd("{frappe} {site} --install {db_name} {mariadb_root_password_fragment} {admin_password_fragment}".format( + frappe=get_frappe(bench=bench), + site=site, ++ db_name = hashlib.sha1(site).hexdigest()[:10], + mariadb_root_password_fragment=mariadb_root_password_fragment, + admin_password_fragment=admin_password_fragment + ), cwd=os.path.join(bench, 'sites')) +@@ -88,14 +120,23 @@ def new_site(site, mariadb_root_password + exec_cmd("{frappe} --use {site}".format(frappe=get_frappe(bench=bench), site=site), cwd=os.path.join(bench, 'sites')) + + def patch_sites(bench='.'): +- exec_cmd("{frappe} --latest all".format(frappe=get_frappe(bench=bench)), cwd=os.path.join(bench, 'sites')) ++ try: ++ if FRAPPE_VERSION == 4: ++ exec_cmd("{frappe} --latest all".format(frappe=get_frappe(bench=bench)), cwd=os.path.join(bench, 'sites')) ++ else: ++ run_frappe_cmd('--site', 'all', 'migrate', bench=bench) ++ except subprocess.CalledProcessError: ++ raise PatchError + + def build_assets(bench='.'): +- exec_cmd("{frappe} --build".format(frappe=get_frappe(bench=bench)), cwd=os.path.join(bench, 'sites')) ++ if FRAPPE_VERSION == 4: ++ exec_cmd("{frappe} --build".format(frappe=get_frappe(bench=bench)), cwd=os.path.join(bench, 'sites')) ++ else: ++ run_frappe_cmd('build', bench=bench) + + def get_sites(bench='.'): + sites_dir = os.path.join(bench, "sites") +- sites = [site for site in os.listdir(sites_dir) ++ sites = [site for site in os.listdir(sites_dir) + if os.path.isdir(os.path.join(sites_dir, site)) and site not in ('assets',)] + return sites + +@@ -115,14 +156,22 @@ def setup_auto_update(bench='.'): + + def setup_backups(bench='.'): + logger.info('setting up backups') +- add_to_crontab('0 */6 * * * cd {sites_dir} && {frappe} --backup all >> {logfile} 2>&1'.format(sites_dir=get_sites_dir(bench=bench), +- frappe=get_frappe(bench=bench), ++ bench_dir = get_bench_dir(bench=bench) ++ if FRAPPE_VERSION == 4: ++ backup_command = "cd {sites_dir} && {frappe} --backup all".format(frappe=get_frappe(bench=bench),) ++ else: ++ backup_command = "cd {bench_dir} && {bench} --site all backup".format(bench_dir=bench_dir, bench=sys.argv[0]) ++ ++ add_to_crontab('0 */6 * * * {backup_command} >> {logfile} 2>&1'.format(backup_command=backup_command, + logfile=os.path.join(get_bench_dir(bench=bench), 'logs', 'backup.log'))) + + def add_to_crontab(line): + current_crontab = read_crontab() + if not line in current_crontab: +- s = subprocess.Popen("crontab", stdin=subprocess.PIPE) ++ cmd = ["crontab"] ++ if platform.system() == 'FreeBSD': ++ cmd = ["crontab", "-"] ++ s = subprocess.Popen(cmd, stdin=subprocess.PIPE) + s.stdin.write(current_crontab) + s.stdin.write(line + '\n') + s.stdin.close() +@@ -182,11 +231,12 @@ def get_program(programs): + + def get_process_manager(): + return get_program(['foreman', 'forego', 'honcho']) +- ++ + def start(): + program = get_process_manager() + if not program: + raise Exception("No process manager found") ++ os.environ['PYTHONUNBUFFERED'] = "true" + os.execv(program, [program, 'start']) + + def check_cmd(cmd, cwd='.'): +@@ -208,9 +258,10 @@ def check_git_for_shallow_clone(): + + def get_cmd_output(cmd, cwd='.'): + try: +- return subprocess.check_output(cmd, cwd=cwd, shell=True) ++ return subprocess.check_output(cmd, cwd=cwd, shell=True, stderr=open(os.devnull, 'wb')).strip() + except subprocess.CalledProcessError, e: +- print "Error:", e.output ++ if e.output: ++ print e.output + raise + + def restart_supervisor_processes(bench='.'): +@@ -236,13 +287,28 @@ def update_site_config(site, new_config, + put_site_config(site, config, bench=bench) + + def set_nginx_port(site, port, bench='.', gen_config=True): ++ set_site_config_nginx_property(site, {"nginx_port": port}, bench=bench) ++ ++def set_ssl_certificate(site, ssl_certificate, bench='.', gen_config=True): ++ set_site_config_nginx_property(site, {"ssl_certificate": ssl_certificate}, bench=bench) ++ ++def set_ssl_certificate_key(site, ssl_certificate_key, bench='.', gen_config=True): ++ set_site_config_nginx_property(site, {"ssl_certificate_key": ssl_certificate_key}, bench=bench) ++ ++def set_nginx_port(site, port, bench='.', gen_config=True): ++ set_site_config_nginx_property(site, {"nginx_port": port}, bench=bench) ++ ++def set_site_config_nginx_property(site, config, bench='.', gen_config=True): + from .config import generate_nginx_config + if site not in get_sites(bench=bench): + raise Exception("No such site") +- update_site_config(site, {"nginx_port": port}, bench=bench) ++ update_site_config(site, config, bench=bench) + if gen_config: + generate_nginx_config() + ++def set_url_root(site, url_root, bench='.'): ++ update_site_config(site, {"host_name": url_root}, bench=bench) ++ + def set_default_site(site, bench='.'): + if not site in get_sites(bench=bench): + raise Exception("Site not in bench") +@@ -258,8 +324,11 @@ def update_requirements(bench='.'): + exec_cmd("{pip} install -q -r {req_file}".format(pip=pip, req_file=req_file)) + + def backup_site(site, bench='.'): +- exec_cmd("{frappe} --backup {site}".format(frappe=get_frappe(bench=bench), site=site), +- cwd=os.path.join(bench, 'sites')) ++ if FRAPPE_VERSION == 4: ++ exec_cmd("{frappe} --backup {site}".format(frappe=get_frappe(bench=bench), site=site), ++ cwd=os.path.join(bench, 'sites')) ++ else: ++ run_frappe_cmd('--site', site, 'backup', bench=bench) + + def backup_all_sites(bench='.'): + for site in get_sites(bench=bench): +@@ -313,4 +382,133 @@ def drop_privileges(uid_name='nobody', g + os.setuid(running_uid) + + # Ensure a very conservative umask +- old_umask = os.umask(077) ++ old_umask = os.umask(022) ++ ++def fix_prod_setup_perms(frappe_user=None): ++ files = [ ++ "logs/web.error.log", ++ "logs/web.log", ++ "logs/workerbeat.error.log", ++ "logs/workerbeat.log", ++ "logs/worker.error.log", ++ "logs/worker.log", ++ "config/nginx.conf", ++ "config/supervisor.conf", ++ ] ++ ++ if not frappe_user: ++ frappe_user = get_config().get('frappe_user') ++ ++ if not frappe_user: ++ print "frappe user not set" ++ sys.exit(1) ++ ++ for path in files: ++ if os.path.exists(path): ++ uid = pwd.getpwnam(frappe_user).pw_uid ++ gid = grp.getgrnam(frappe_user).gr_gid ++ os.chown(path, uid, gid) ++ ++def fix_file_perms(): ++ for dir_path, dirs, files in os.walk('.'): ++ for _dir in dirs: ++ os.chmod(os.path.join(dir_path, _dir), 0755) ++ for _file in files: ++ os.chmod(os.path.join(dir_path, _file), 0644) ++ bin_dir = './env/bin' ++ if os.path.exists(bin_dir): ++ for _file in os.listdir(bin_dir): ++ if not _file.startswith('activate'): ++ os.chmod(os.path.join(bin_dir, _file), 0755) ++ ++def get_redis_version(): ++ version_string = subprocess.check_output('redis-server --version', shell=True).strip() ++ if re.search("Redis server version 2.4", version_string): ++ return "2.4" ++ if re.search("Redis server v=2.6", version_string): ++ return "2.6" ++ if re.search("Redis server v=2.8", version_string): ++ return "2.8" ++ ++def get_current_frappe_version(bench='.'): ++ from .app import get_current_frappe_version as fv ++ return fv(bench=bench) ++ ++def run_frappe_cmd(*args, **kwargs): ++ bench = kwargs.get('bench', '.') ++ f = get_env_cmd('python', bench=bench) ++ sites_dir = os.path.join(bench, 'sites') ++ subprocess.check_call((f, '-m', 'frappe.utils.bench_helper', 'frappe') + args, cwd=sites_dir) ++ ++ ++def pre_upgrade(from_ver, to_ver, bench='.'): ++ from .migrate_to_v5 import validate_v4, remove_shopping_cart ++ pip = os.path.join(bench, 'env', 'bin', 'pip') ++ if from_ver == 4 and to_ver == 5: ++ apps = ('frappe', 'erpnext') ++ remove_shopping_cart(bench=bench) ++ ++ for app in apps: ++ cwd = os.path.abspath(os.path.join(bench, 'apps', app)) ++ if os.path.exists(cwd): ++ exec_cmd("git clean -dxf", cwd=cwd) ++ exec_cmd("{pip} install --upgrade -e {app}".format(pip=pip, app=cwd)) ++ ++def post_upgrade(from_ver, to_ver, bench='.'): ++ from .app import get_current_frappe_version ++ from .config import generate_nginx_config, generate_supervisor_config, generate_redis_config ++ conf = get_config(bench=bench) ++ if from_ver == 4 and to_ver == 5: ++ print "-"*80 ++ print "Your bench was upgraded to version 5" ++ if conf.get('restart_supervisor_on_update'): ++ generate_redis_config(bench=bench) ++ generate_supervisor_config(bench=bench) ++ generate_nginx_config(bench=bench) ++ setup_procfile(bench=bench) ++ setup_backups(bench=bench) ++ print "As you have setup your bench for production, you will have to reload configuration for nginx and supervisor" ++ print "To complete the migration, please run the following commands" ++ print ++ print "sudo service nginx restart" ++ print "sudo supervisorctl reload" ++ ++def update_translations_p(args): ++ update_translations(*args) ++ ++def download_translations_p(): ++ pool = multiprocessing.Pool(8) ++ ++ langs = get_langs() ++ apps = ('frappe', 'erpnext') ++ args = list(itertools.product(apps, langs)) ++ ++ pool.map(update_translations_p, args) ++ ++def download_translations(): ++ langs = get_langs() ++ apps = ('frappe', 'erpnext') ++ for app, lang in itertools.product(apps, langs): ++ update_translations(app, lang) ++ ++ ++def get_langs(): ++ lang_file = 'apps/frappe/frappe/data/languages.txt' ++ with open(lang_file) as f: ++ lang_data = f.read() ++ langs = [line.split('\t')[0] for line in lang_data.splitlines()] ++ langs.remove('en') ++ return langs ++ ++ ++def update_translations(app, lang): ++ translations_dir = os.path.join('apps', app, app, 'translations') ++ csv_file = os.path.join(translations_dir, lang + '.csv') ++ r = requests.get("https://translate.erpnext.com/files/{}-{}.csv".format(app, lang)) ++ r.raise_for_status() ++ with open(csv_file, 'wb') as f: ++ f.write(r.text.encode('utf-8')) ++ print 'downloaded for', app, lang ++ ++ ++FRAPPE_VERSION = get_current_frappe_version() +--- completion.sh.orig 2015-07-31 10:19:27 UTC ++++ completion.sh +@@ -0,0 +1,30 @@ ++_setup_bench_tab_completion () { ++ if [ -n "$BASH" ] ; then ++ _bench () { ++ local cur=${COMP_WORDS[COMP_CWORD]} ++ local prev=${COMP_WORDS[COMP_CWORD-1]} ++ if [[ $prev == "--site" ]]; then ++ COMPREPLY=( $(compgen -W "`_site_dirs`" -- $cur) ) ++ fi ++ } ++ complete -F _bench bench ++ elif [ -n "$ZSH_VERSION" ]; then ++ _bench () { ++ local a ++ local prev ++ read -l a ++ prev=`echo $a| awk '{ print $NF }'` ++ if [[ $prev == "--site" ]]; then ++ reply=($(_site_dirs)) ++ fi ++ } ++ compctl -K _bench bench ++ fi ++} ++ ++_site_dirs() { ++ ls -d sites/*/ | sed "s/sites\///g" | sed "s/\/$//g" | xargs echo ++} ++ ++ ++_setup_bench_tab_completion +--- install_scripts/erpnext-apps-master.json.orig 2014-11-19 06:36:44 UTC ++++ install_scripts/erpnext-apps-master.json +@@ -3,10 +3,5 @@ + "url":"https://github.com/frappe/erpnext", + "name":"erpnext", + "branch": "master" +- }, +- { +- "url":"https://github.com/frappe/shopping-cart", +- "name":"shopping_cart", +- "branch": "master" + } + ] +--- install_scripts/erpnext-apps.json.orig 2014-11-19 06:36:44 UTC ++++ install_scripts/erpnext-apps.json +@@ -2,9 +2,5 @@ + { + "url":"https://github.com/frappe/erpnext", + "name":"erpnext" +- }, +- { +- "url":"https://github.com/frappe/shopping-cart", +- "name":"shopping_cart" + } + ] +--- install_scripts/setup_frappe.sh.orig 2014-11-19 06:36:44 UTC ++++ install_scripts/setup_frappe.sh +@@ -16,7 +16,7 @@ get_passwd() { + } + + set_opts () { +- OPTS=`getopt -o v --long verbose,mysql-root-password:,frappe-user:,setup-production,help -n 'parse-options' -- "$@"` ++ OPTS=`getopt -o v --long verbose,mysql-root-password:,frappe-user:,bench-branch:,setup-production,skip-setup-bench,help -n 'parse-options' -- "$@"` + + if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi + +@@ -25,10 +25,21 @@ set_opts () { + VERBOSE=false + HELP=false + FRAPPE_USER=false +- FRAPPE_USER_PASS=`get_passwd` +- MSQ_PASS=`get_passwd` +- ADMIN_PASS=`get_passwd` ++ BENCH_BRANCH="master" + SETUP_PROD=false ++ SETUP_BENCH=true ++ ++ if [ -f ~/frappe_passwords.sh ]; then ++ source ~/frappe_passwords.sh ++ else ++ FRAPPE_USER_PASS=`get_passwd` ++ MSQ_PASS=`get_passwd` ++ ADMIN_PASS=`get_passwd` ++ ++ echo "FRAPPE_USER_PASS=$FRAPPE_USER_PASS" > ~/frappe_passwords.sh ++ echo "MSQ_PASS=$MSQ_PASS" >> ~/frappe_passwords.sh ++ echo "ADMIN_PASS=$ADMIN_PASS" >> ~/frappe_passwords.sh ++ fi + + while true; do + case "$1" in +@@ -37,6 +48,8 @@ set_opts () { + --mysql-root-password ) MSQ_PASS="$2"; shift; shift ;; + --frappe-user ) FRAPPE_USER="$2"; shift; shift ;; + --setup-production ) SETUP_PROD=true; shift;; ++ --bench-branch ) BENCH_BRANCH="$2"; shift;; ++ --skip-setup-bench ) SETUP_BENCH=false; shift;; + -- ) shift; break ;; + * ) break ;; + esac +@@ -94,7 +107,7 @@ add_centos6_mariadb_repo() { + echo " + [mariadb] + name = MariaDB +-baseurl = http://yum.mariadb.org/5.5/centos$OS_VER-$ARCH ++baseurl = http://yum.mariadb.org/10.0/centos$OS_VER-$ARCH + gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB + gpgcheck=1 + " > /etc/yum.repos.d/mariadb.repo +@@ -105,7 +118,7 @@ add_ubuntu_mariadb_repo() { + run_cmd sudo apt-get update + run_cmd sudo apt-get install -y software-properties-common python-software-properties + run_cmd sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db +- run_cmd sudo add-apt-repository "deb http://ams2.mirrors.digitalocean.com/mariadb/repo/5.5/ubuntu $OS_VER main" ++ run_cmd sudo add-apt-repository "deb http://ams2.mirrors.digitalocean.com/mariadb/repo/10.0/ubuntu $OS_VER main" + } + + add_debian_mariadb_repo() { +@@ -122,15 +135,15 @@ add_debian_mariadb_repo() { + run_cmd sudo apt-get update + run_cmd sudo apt-get install -y python-software-properties + run_cmd sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db +- run_cmd sudo add-apt-repository "deb http://ams2.mirrors.digitalocean.com/mariadb/repo/5.5/debian $CODENAME main" ++ run_cmd sudo add-apt-repository "deb http://ams2.mirrors.digitalocean.com/mariadb/repo/10.0/debian $CODENAME main" + } + + add_ius_repo() { + if [ $OS_VER -eq "6" ]; then + wget http://dl.iuscommunity.org/pub/ius/stable/CentOS/$OS_VER/$T_ARCH/epel-release-6-5.noarch.rpm +- wget http://dl.iuscommunity.org/pub/ius/stable/CentOS/$OS_VER/$T_ARCH/ius-release-1.0-13.ius.centos6.noarch.rpm ++ wget http://dl.iuscommunity.org/pub/ius/stable/CentOS/$OS_VER/$T_ARCH/ius-release-1.0-14.ius.centos6.noarch.rpm + rpm --quiet -q epel-release || rpm -Uvh epel-release-6-5.noarch.rpm +- rpm --quiet -q ius-release || rpm -Uvh ius-release-1.0-13.ius.centos6.noarch.rpm ++ rpm --quiet -q ius-release || rpm -Uvh ius-release-1.0-14.ius.centos6.noarch.rpm + fi + } + +@@ -139,7 +152,9 @@ add_epel_centos7() { + } + + add_maria_db_repo() { +- if [ "$OS" == "centos" ]; then ++ if [ "$OS" == "Ubuntu" ] && [ $OS_VER == "utopic" ]; then ++ return ++ elif [ "$OS" == "centos" ]; then + echo Adding centos mariadb repo + add_centos6_mariadb_repo + +@@ -148,7 +163,7 @@ add_maria_db_repo() { + add_debian_mariadb_repo + + elif [ "$OS" == "Ubuntu" ]; then +- echo Adding debian mariadb repo ++ echo Adding ubuntu mariadb repo + add_ubuntu_mariadb_repo + else + echo Unsupported Distribution +@@ -164,10 +179,10 @@ install_packages() { + run_cmd sudo yum groupinstall -y "Development tools" + if [ $OS_VER == "6" ]; then + run_cmd add_ius_repo +- run_cmd sudo yum install -y git MariaDB-server MariaDB-client MariaDB-compat python-setuptools nginx zlib-devel bzip2-devel openssl-devel memcached postfix python27-devel python27 libxml2 libxml2-devel libxslt libxslt-devel redis MariaDB-devel libXrender libXext python27-setuptools ++ run_cmd sudo yum install -y git MariaDB-server MariaDB-client MariaDB-compat python-setuptools nginx zlib-devel bzip2-devel openssl-devel postfix python27-devel python27 libxml2 libxml2-devel libxslt libxslt-devel redis MariaDB-devel libXrender libXext python27-setuptools cronie sudo which xorg-x11-fonts-Type1 xorg-x11-fonts-75dpi + elif [ $OS_VER == "7" ]; then + run_cmd add_epel_centos7 +- run_cmd sudo yum install -y git mariadb-server mariadb-devel python-setuptools nginx zlib-devel bzip2-devel openssl-devel memcached postfix python-devel libxml2 libxml2-devel libxslt libxslt-devel redis libXrender libXext supervisor ++ run_cmd sudo yum install -y git mariadb-server mariadb-devel python-setuptools nginx zlib-devel bzip2-devel openssl-devel postfix python-devel libxml2 libxml2-devel libxslt libxslt-devel redis libXrender libXext supervisor cronie sudo which xorg-x11-fonts-75dpi xorg-x11-fonts-Type1 + fi + echo "Installing wkhtmltopdf" + install_wkhtmltopdf_centos +@@ -178,7 +193,7 @@ install_packages() { + export DEBIAN_FRONTEND=noninteractive + setup_debconf + run_cmd sudo apt-get update +- run_cmd sudo apt-get install python-dev python-setuptools build-essential python-mysqldb git memcached ntp vim screen htop mariadb-server mariadb-common libmariadbclient-dev libxslt1.1 libxslt1-dev redis-server libssl-dev libcrypto++-dev postfix nginx supervisor python-pip fontconfig libxrender1 libxext6 -y ++ run_cmd sudo apt-get install python-dev python-setuptools build-essential python-mysqldb git ntp vim screen htop mariadb-server mariadb-common libmariadbclient-dev libxslt1.1 libxslt1-dev redis-server libssl-dev libcrypto++-dev postfix nginx supervisor python-pip fontconfig libxrender1 libxext6 xfonts-75dpi xfonts-base -y + echo "Installing wkhtmltopdf" + install_wkhtmltopdf_deb + +@@ -190,17 +205,17 @@ install_packages() { + + install_wkhtmltopdf_centos () { + +- if [[ $OS == "centos" && $OS_VER == "7" && $T_ARCH="i386" ]]; then ++ if [[ $OS == "centos" && $OS_VER == "7" && $T_ARCH == "i386" ]]; then + echo "Cannot install wkhtmltodpdf. Skipping..." + return 0 + fi +- RPM="wkhtmltox-0.12.1_linux-$OS$OS_VER-$WK_ARCH.rpm" +- run_cmd wget http://downloads.sourceforge.net/project/wkhtmltopdf/0.12.1/$RPM ++ RPM="wkhtmltox-0.12.2.1_linux-$OS$OS_VER-$WK_ARCH.rpm" ++ run_cmd wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/$RPM + rpm --quiet -q wkhtmltox || run_cmd rpm -Uvh $RPM + } + + install_wkhtmltopdf_deb () { +- if [[ $OS_VER == "utopic" ]]; then ++ if [[ $OS_VER == "utopic" || $OS_VER == "vivid" ]]; then + echo "Cannot install wkhtmltodpdf. Skipping..." + return 0 + fi +@@ -209,8 +224,8 @@ install_wkhtmltopdf_deb () { + else + WK_VER=$OS_VER + fi +- run_cmd wget http://downloads.sourceforge.net/project/wkhtmltopdf/0.12.1/wkhtmltox-0.12.1_linux-$WK_VER-$WK_ARCH.deb +- run_cmd dpkg -i wkhtmltox-0.12.1_linux-$WK_VER-$WK_ARCH.deb ++ run_cmd wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-$WK_VER-$WK_ARCH.deb ++ run_cmd dpkg -i wkhtmltox-0.12.2.1_linux-$WK_VER-$WK_ARCH.deb + } + + +@@ -274,18 +289,47 @@ configure_services_centos6() { + + configure_services_centos7() { + run_cmd systemctl enable nginx +- run_cmd systemctl enable mariadb ++ run_cmd systemctl enable mysql + run_cmd systemctl enable redis + run_cmd systemctl enable supervisord +- run_cmd systemctl enable memcached + } + + start_services_centos7() { + run_cmd systemctl start nginx +- run_cmd systemctl start mariadb ++ run_cmd systemctl start mysql + run_cmd systemctl start redis + run_cmd systemctl start supervisord +- run_cmd systemctl start memcached ++} ++ ++configure_mariadb() { ++ config=" ++[mysqld] ++innodb-file-format=barracuda ++innodb-file-per-table=1 ++innodb-large-prefix=1 ++character-set-client-handshake = FALSE ++character-set-server = utf8mb4 ++collation-server = utf8mb4_unicode_ci ++ ++[mysql] ++default-character-set = utf8mb4 ++ " ++ deb_cnf_path="/etc/mysql/conf.d/barracuda.cnf" ++ centos_cnf_path="/etc/my.cnf.d/barracuda.cnf" ++ ++ if [ $OS == "centos" ]; then ++ ++ echo "$config" > $centos_cnf_path ++ if [ $OS_VER == "6" ]; then ++ run_cmd sudo service mysql restart ++ elif [ $OS_VER == "7" ]; then ++ run_cmd sudo systemctl restart mysql ++ fi ++ ++ elif [ $OS == "debian" ] || [ $OS == "Ubuntu" ]; then ++ echo "$config" > $deb_cnf_path ++ sudo service mysql restart ++ fi + } + + setup_debconf() { +@@ -296,14 +340,14 @@ setup_debconf() { + } + + install_bench() { +- run_cmd sudo su $FRAPPE_USER -c "cd /home/$FRAPPE_USER && git clone https://github.com/frappe/bench bench-repo" +- if hash pip-2.7; then ++ run_cmd sudo su $FRAPPE_USER -c "cd /home/$FRAPPE_USER && git clone https://github.com/frappe/bench --branch $BENCH_BRANCH bench-repo" ++ if hash pip-2.7 &> /dev/null; then + PIP="pip-2.7" +- elif hash pip2.7; then ++ elif hash pip2.7 &> /dev/null; then + PIP="pip2.7" +- elif hash pip2; then ++ elif hash pip2 &> /dev/null; then + PIP="pip2" +- elif hash pip; then ++ elif hash pip &> /dev/null; then + PIP="pip" + else + echo PIP not installed +@@ -325,12 +369,12 @@ setup_bench() { + echo Setting up first site + echo /home/$FRAPPE_USER/frappe-bench > /etc/frappe_bench_dir + run_cmd sudo su $FRAPPE_USER -c "cd /home/$FRAPPE_USER/frappe-bench && bench new-site site1.local --mariadb-root-password $MSQ_PASS --admin-password $ADMIN_PASS" +- run_cmd sudo su $FRAPPE_USER -c "cd /home/$FRAPPE_USER/frappe-bench && bench frappe --install_app erpnext" +- run_cmd sudo su $FRAPPE_USER -c "cd /home/$FRAPPE_USER/frappe-bench && bench frappe --install_app shopping_cart" ++ run_cmd sudo su $FRAPPE_USER -c "cd /home/$FRAPPE_USER/frappe-bench && bench install-app erpnext" + run_cmd bash -c "cd /home/$FRAPPE_USER/frappe-bench && bench setup sudoers $FRAPPE_USER" + if $SETUP_PROD; then + run_cmd bash -c "cd /home/$FRAPPE_USER/frappe-bench && bench setup production $FRAPPE_USER" + fi ++ chown $FRAPPE_USER /home/$FRAPPE_USER/frappe-bench/logs/* + } + + add_user() { +@@ -377,10 +421,13 @@ main() { + fi + configure_mariadb_centos + fi ++ configure_mariadb + echo "Adding frappe user" + add_user + install_bench +- setup_bench ++ if $SETUP_BENCH; then ++ setup_bench ++ fi + + echo + RUNNING="" +--- setup.py.orig 2014-11-19 06:36:44 UTC ++++ setup.py +@@ -2,7 +2,7 @@ from setuptools import setup, find_packa + + setup( + name='bench', +- version='0.1', ++ version='0.92', + py_modules=find_packages(), + include_package_data=True, + url='https://github.com/frappe/bench', Property changes on: head/www/py-frappe-bench/files/patch-a93acec ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/py-frappe-bench/files/patch-setup.py =================================================================== --- head/www/py-frappe-bench/files/patch-setup.py (nonexistent) +++ head/www/py-frappe-bench/files/patch-setup.py (revision 393308) @@ -0,0 +1,20 @@ +--- setup.py.orig 2015-07-31 10:13:11 UTC ++++ setup.py +@@ -3,7 +3,7 @@ from setuptools import setup, find_packa + setup( + name='bench', + version='0.92', +- py_modules=find_packages(), ++ packages=find_packages(), + include_package_data=True, + url='https://github.com/frappe/bench', + author='Web Notes Technologies Pvt. Ltd.', +@@ -15,7 +15,7 @@ setup( + 'requests', + 'honcho', + 'semantic_version', +- 'GitPython==0.3.2.RC1' ++ 'GitPython>=0.3.2.RC1' + ], + entry_points=''' + [console_scripts] Property changes on: head/www/py-frappe-bench/files/patch-setup.py ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/py-frappe-bench/pkg-descr =================================================================== --- head/www/py-frappe-bench/pkg-descr (nonexistent) +++ head/www/py-frappe-bench/pkg-descr (revision 393308) @@ -0,0 +1,5 @@ +The bench allows you to setup Frappe / ERPNext apps on +your local machine or a production server. You can use +the bench to serve multiple frappe sites. + +WWW: https://github.com/frappe/bench Property changes on: head/www/py-frappe-bench/pkg-descr ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property