= Hacking Trac for code.djangoproject.com = For posterity -- and for when we upgrade! -- this page contains a list of all the things I've done to modify Trac for code.djangoproject.com. == Plugins == Most of the work comes from a set of plugins from [http://trac-hacks.org/ Trac Hacks]. This installation is using the following plugins: * [http://trac-hacks.org/wiki/NavAddPlugin NavAdd] * [http://trac-hacks.org/wiki/NavHiderPlugin NavHider] * [http://trac-hacks.org/wiki/SimpleTicketPlugin SimpleTicket] * [http://trac.edgewall.org/wiki/SpamFilter TracSpamFilter] * [http://trac.edgewall.org/wiki/WebAdmin WebAdmin] * [http://trac-hacks.org/wiki/TocMacro TocMacro] Most of them are easy to install -- just check out the source, {{{python setup.py bdist_egg}}}, and copy the egg to plugins. I did have to make one trivial bug fix for Python 2.3 to the !NavHider plugin: {{{ Index: navhider/filter.py =================================================================== --- navhider/filter.py (revision 1926) +++ navhider/filter.py (working copy) @@ -4,7 +4,7 @@ try: set = set -except ImportError: +except NameError: from sets import Set as set __all__ = ['NavHiderModule'] }}} == Custom fields == Most of the fields used by out [http://www.djangoproject.com/documentation/contributing/#ticket-triage ticket workflow] are added using Trac's [http://trac.edgewall.org/wiki/TracTicketsCustomFields custom field feature]. See the {{{[ticket-custom]}}} section in the ini below. == Configuration == There's a lot of config stuff in trac.ini, much of which is just there by default. These are the important bits: {{{ [browser] downloadable_paths = /django/trunk, /django/branches/*, /django/tags/*, /django_website hide_properties = svk:merge, svn:ignore [navadd] add_items = reports, simpleticket reports.target = mainnav reports.title = Reports reports.url = /wiki/Reports simpleticket.target = mainnav simpleticket.title = New Ticket simpleticket.url = /simpleticket [notification] always_notify_owner = true always_notify_reporter = true always_notify_updater = true [simpleticket] hide = stage, needs_tests, needs_docs, needs_better_patch [ticket-custom] has_patch = checkbox has_patch.label = Has patch has_patch.order = 20 needs_better_patch = checkbox needs_better_patch.label = Patch needs improvement needs_better_patch.order = 50 needs_docs = checkbox needs_docs.label = Needs documentation needs_docs.order = 30 needs_tests = checkbox needs_tests.label = Needs tests needs_tests.order = 40 stage = select stage.label = Triage Stage stage.options = Unreviewed|Design decision needed|Accepted|Ready for checkin stage.order = 10 stage.value = 0 [trac] mainnav = wiki,timeline,browser,reports,tickets,-newticket,simpleticket,search metanav = -about,login,logout,settings,-help }}} == Hooks == We use a couple of SVN post-commit hooks to send the checkin notifications to django-updates and to update Trac from "Fixed #XXX" messages. Our post-commit hook: {{{ #!/bin/sh export PYTHONPATH=/home/trac/ REPOS="$1" REV="$2" LOG=`/usr/bin/svnlook log -r $REV $REPOS` AUTHOR=`/usr/bin/svnlook author -r $REV $REPOS` TRAC_ENV='/home/trac/django.tracenv/' TRAC_URL='http://code.djangoproject.com/' /usr/bin/python2.3 /home/trac/trac-0.10.3/contrib/trac-post-commit-hook \ -p "$TRAC_ENV" \ -r "$REV" \ -u "$AUTHOR" \ -m "$LOG" \ -s "$TRAC_URL" /home/svn/django/hooks/commit-email.pl \ "$REPOS" \ "$REV" \ -s "[Changeset]" \ --from noreply@djangoproject.com \ django-updates@googlegroups.com }}} == Templates == I've deliberately avoided hacking any built-in trac templates so that upgrades aren't quite so painful. I've thus only edited {{{site_css.cs}}} {{{site_footer.cs}}}}, {{{site_header.cs}}}, and {{{site_newticket.cs}}}.