Update templates.
[privoxy.git] / doc / source / developer-manual.sgml
1 <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN"[
2 <!entity % dummy "IGNORE"> 
3 <!entity supported SYSTEM "supported.sgml">
4 <!entity newfeatures SYSTEM "newfeatures.sgml">
5 <!entity p-intro SYSTEM "privoxy.sgml">
6 <!entity history SYSTEM "history.sgml">
7 <!entity seealso SYSTEM "seealso.sgml">
8 <!entity contacting SYSTEM "contacting.sgml">
9 <!entity copyright SYSTEM "copyright.sgml">
10 <!entity license SYSTEM "license.sgml">
11 <!entity p-version "3.0.11">
12 <!entity p-status "UNRELEASED">
13 <!entity % p-not-stable "INCLUDE">
14 <!entity % p-stable "IGNORE">
15 <!entity % p-text "IGNORE">        <!-- define we are not a text only doc -->
16 <!entity % p-doc "INCLUDE">        <!-- and we are a formal doc           -->
17 <!entity  my-copy "&copy;">        <!-- kludge for docbook2man            -->
18 ]>
19 <!--
20  File        :  $Source: /cvsroot/ijbswa/current/doc/source/developer-manual.sgml,v $
21
22  Purpose     :  developer manual
23                 This file belongs into
24                 ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
25                 
26  $Id: developer-manual.sgml,v 2.24 2009/01/13 16:50:35 fabiankeil Exp $
27
28  Copyright (C) 2001-2008 Privoxy Developers http://www.privoxy.org/
29  See LICENSE.
30
31  ========================================================================
32  NOTE: Please read developer-manual/documentation.html before touching 
33  anything in this, or other Privoxy documentation. You have been warned!
34  Failure to abide by this rule will result in the revocation of your license 
35  to live a peaceful existence!
36  ========================================================================
37
38 -->
39
40 <article id="index">
41   <artheader>
42     <title>Privoxy Developer Manual</title>
43     <pubdate>
44      <subscript>
45     <!-- Completely the wrong markup, but very little is allowed  -->
46     <!-- in this part of an article. FIXME -->
47       <link linkend="copyright">Copyright</link> &my-copy; 2001-2008 by 
48       <ulink url="http://www.privoxy.org/">Privoxy Developers</ulink>
49      </subscript>
50     </pubdate>
51
52
53     <pubdate>$Id: developer-manual.sgml,v 2.24 2009/01/13 16:50:35 fabiankeil Exp $</pubdate>
54
55 <!--
56
57 Note: this should generate a separate page, and a live link to it. 
58 But it doesn't for some mysterious reason. Please leave commented
59 unless it can be fixed proper. For the time being, the copyright 
60 statement will be in copyright.smgl.
61
62 Hal.
63
64 <legalnotice id="legalnotice"> 
65  <para>
66   text goes here ........
67  </para>
68 </legalnotice>
69
70 -->
71
72     <abstract>
73
74 <![%dummy;[
75  <para>
76  <comment>
77   This is here to keep vim syntax file from breaking :/
78   If I knew enough to fix it, I would.
79   PLEASE DO NOT REMOVE! HB: hal@foobox.net
80  </comment>
81  </para>
82  ]]>
83 <para>
84  The developer manual provides guidance on coding, testing, packaging, documentation
85  and other issues of importance to those involved with
86  <application>Privoxy</application> development. It is mandatory (and helpful!) reading
87  for anyone who wants to join the team. Note that it's currently out of date
88  and may not be entirely correct. As always, patches are welcome.
89 </para>
90
91 <!-- Include privoxy.sgml boilerplate text: -->
92
93 <!--  &p-intro; Someone interested enough in the project to contribute
94                 will already know at this point what Privoxy is. -->
95
96 <!-- end boilerplate -->
97
98 <para>
99  Please note that this document is constantly evolving. This copy represents
100  the state at the release of version &p-version;.
101  You can find the latest version of the this manual at <ulink
102  url="http://www.privoxy.org/developer-manual/">http://www.privoxy.org/developer-manual/</ulink>.
103  Please see <link linkend="contact">the Contact section</link> 
104  on how to contact the developers.
105 </para>
106 <!--        <para> -->
107 <!--    Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. -->
108 <!--   </para> -->
109
110     </abstract>
111   </artheader>
112
113
114 <!--   ~~~~~       New section      ~~~~~     -->
115   <sect1 id="introduction"><title>Introduction</title>
116 <!--
117
118  I don't like seeing blank space :) So added *something* here.
119
120  --> 
121     <para>
122      <application>Privoxy</application>, as an heir to
123      <application>Junkbuster</application>, is a Free Software project 
124      and the code is licensed under the GNU General Public License version 2.
125      As such, <application>Privoxy</application> development is potentially open
126      to anyone who has the time, knowledge, and desire to contribute
127      in any capacity. Our goals are simply to continue the mission,
128      to improve <application>Privoxy</application>, and
129      to make it available to as wide an audience as possible. 
130     </para>
131     <para>
132      One does not have to be a programmer to contribute. Packaging, testing,
133      documenting and porting, are all important jobs as well.
134     </para>
135
136   <!--   ~~~~~       New section      ~~~~~     -->
137   <sect2 id="quickstart"><title>Quickstart to Privoxy Development</title>
138    <para>
139     The first step is to join the <ulink
140       url="mailto:ijbswa-developers@lists.sourceforge.net">developer's mailing list</ulink>.
141     You can submit your ideas, or even better patches. Patches are best 
142     submitted to the Sourceforge tracker set up for this purpose, but 
143     can be sent to the list for review too.
144    </para>
145     <para>
146      You will also need to have a cvs package installed, which will 
147      entail having ssh installed as well (which seems to be a requirement of
148      SourceForge), in order to access the cvs repository. Having the GNU build
149      tools is also going to be important (particularly, autoconf and gmake).
150     </para>
151     <para>
152       For the time being (read, this section is under construction), you can 
153       also refer to the extensive comments in the source code. In fact, 
154       reading the code is recommended in any case.
155     </para>
156    </sect2>
157   </sect1>
158
159   <!--   ~~~~~       New section      ~~~~~     -->
160   <sect1 id="cvs"><title>The CVS Repository</title>
161     <para>
162       If you become part of the active development team, you will eventually
163       need write access to our holy grail, the CVS repository. One of the 
164       team members will need to set this up for you. Please read
165       this chapter completely before accessing via CVS.
166     </para>
167
168     <sect2 id="cvsaccess"><title>Access to CVS</title>
169       <para>
170         The project's CVS repository is hosted on
171         <ulink url="http://sourceforge.net/">SourceForge.</ulink>
172         Please refer to the chapters 6 and 7 in
173         <ulink url="http://sourceforge.net/docman/?group_id=1">SF's site
174         documentation</ulink> for the technical access details for your
175         operating system. For historical reasons, the CVS server is
176         called <literal>ijbswa.cvs.sourceforge.net</literal>, the repository is
177         called <literal>ijbswa</literal>, and the source tree module is called
178         <literal>current</literal>.
179       </para>
180     </sect2>
181
182     <sect2 id="cvsbranches">
183     <title>Branches</title>
184      <para>
185        Within the CVS repository, there are modules and branches. As
186        mentioned, the sources are in the <literal>current</literal>
187        <quote>module</quote>. Other modules are present for platform specific
188        issues. There is a webview of the CVS hierarchy at <ulink
189        url="http://ijbswa.cvs.sourceforge.net/ijbswa/">http://ijbswa.cvs.sourceforge.net/ijbswa/</ulink>,
190        which might help with visualizing how these pieces fit together.
191      </para>
192      <para>
193        Branches are used to fork a sub-development path from the main trunk.
194        Within the <literal>current</literal> module where the sources are, there
195        is always at least one <quote>branch</quote> from the main trunk
196        devoted to a stable release series. The main trunk is where active
197        development takes place for the next stable series (e.g. 3.2.x).
198        So just prior to each stable series (e.g. 3.0.x), a branch is created
199        just for stable series releases (e.g. 3.0.0 -> 3.0.1 -> 3.0.2, etc).
200        Once the initial stable release of any stable branch has taken place,
201        this branch is <emphasis>only used for bugfixes</emphasis>, which have
202        had prior testing before being committed to CVS. (See <link
203        linkend="versionnumbers">Version Numbers</link> below for details on
204        versioning.)
205      </para>
206      <para>
207       At one time there were two distinct branches: stable and unstable. The
208       more drastic changes were to be in the unstable branch. These branches 
209       have now been merged to minimize time and effort of maintaining two 
210       branches.
211      </para>
212     <!-- 
213      <para>
214        This will result in at least two active branches, which means there may
215        be occasions that require the same (or similar) item to be 
216        checked into to two different places (assuming its a bugfix and needs 
217        fixing in both the stable and unstable trees). This also means that in
218        order to have access to both trees, both will have to be checked out 
219        separately. Use the <literal>cvs -r</literal> flag to check out a 
220        branch, e.g: <literal>cvs co -r v_3_0_branch current</literal>.
221      </para>
222     --> 
223     </sect2>
224
225     <sect2 id="cvscommit"><title>CVS Commit Guidelines</title>
226       <para>
227         The source tree is the heart of every software project. Every effort must
228         be made to ensure that it is readable, compilable and consistent at all
229         times. There are differing guidelines for the stable branch and the
230         main development trunk, and we ask anyone with CVS access to strictly
231         adhere to the following guidelines:
232       </para>
233       
234       <para>
235        Basic Guidelines, for all branches:
236       </para>
237       <para>
238         <itemizedlist>
239           <listitem><para>
240             Please don't commit even 
241             a small change without testing it thoroughly first. When we're
242             close to a public release, ask a fellow developer to review your 
243             changes.
244           </para></listitem>
245           <listitem><para>
246             Your commit message should give a concise overview of <emphasis>what you
247             changed</emphasis> (no big details) and <emphasis>why you changed it</emphasis>
248             Just check previous messages for good examples.
249           </para></listitem>
250           <listitem><para>
251             Don't use the same message on multiple files, unless it equally applies to
252             all those files.
253           </para></listitem>
254           <listitem><para>
255             If your changes span multiple files, and the code won't recompile unless
256             all changes are committed (e.g. when changing the signature of a function),
257             then commit all files one after another, without long delays in between.
258             If necessary, prepare the commit messages in advance.
259           </para></listitem>
260           <listitem><para>
261             Before changing things on CVS, make sure that your changes are in line
262             with the team's general consensus on what should be done.
263           </para></listitem>
264           <listitem>
265            <para>
266             Note that near a major public release, we get more cautious.
267             There is always the possibility to submit a patch to the <ulink
268             url="http://sourceforge.net/tracker/?atid=311118&amp;group_id=11118&amp;func=browse">patch
269             tracker</ulink> instead.
270           </para>
271          </listitem> 
272         </itemizedlist>
273       </para>
274       
275 <!--
276       <para>
277        Stable branches are handled with more care, especially after the 
278        initial *.*.0 release, and we are just in bugfix mode. In addition to 
279        the above, the below applies only to the stable branch (currently the 
280        <literal>v_3_0_branch</literal> branch):
281       </para>
282       
283       <para>
284        <itemizedlist>
285         <listitem>
286          <para>
287            Do not commit <emphasis>anything</emphasis> unless your proposed
288            changes have been well tested first, preferably by other members of the
289            project, or have prior approval of the project leaders or consensus
290            of the devel list.
291          </para>
292         </listitem> 
293        <listitem>
294         <para>
295          Where possible, bugfixes and changes should be tested in the main 
296          development trunk first. There may be occasions where this is not 
297          feasible, though.
298         </para>
299        </listitem> 
300        <listitem>
301         <para>
302           Alternately, proposed changes can be submitted as patches to the patch tracker on 
303           Sourceforge first: <ulink
304           url="http://sourceforge.net/tracker/?group_id=11118&#38;atid=311118">http://sourceforge.net/tracker/?group_id=11118&#38;atid=311118</ulink>.
305           Then ask for peer review. 
306         </para>
307        </listitem> 
308         <listitem>
309          <para>
310           Do not even think about anything except bugfixes. No new features!
311          </para>
312         </listitem> 
313      
314        </itemizedlist>
315       </para> 
316     -->
317     </sect2>
318
319   </sect1>
320         
321   <!--   ~~~~~       New section      ~~~~~     -->
322 <sect1 id="documentation"><title>Documentation Guidelines</title>
323   <para>
324     All formal documents are maintained in Docbook SGML and located in the
325     <computeroutput>doc/source/*</computeroutput> directory. You will need
326     <ulink url="http://www.docbook.org">Docbook</ulink>, the Docbook 
327     DTD's and the Docbook modular stylesheets (or comparable alternatives),
328     and either <application>jade</application> or
329     <application>openjade</application> (recommended) installed in order to
330     build docs from source. Currently there is <ulink
331     url="../user-manual/index.html"><citetitle>user-manual</citetitle></ulink>,
332     <ulink url="../faq/index.html"><citetitle>FAQ</citetitle></ulink>, and, of
333     course this, the <citetitle>developer-manual</citetitle> in this format.
334     The <citetitle>README</citetitle>, <citetitle>AUTHORS</citetitle>,
335     <citetitle>INSTALL</citetitle>,
336     <citetitle>privoxy.1</citetitle> (man page), and
337     <citetitle>config</citetitle> files are also now maintained as Docbook
338     SGML. These files, when built, in the top-level source directory are
339     generated files! Also, the <application>Privoxy</application> <filename>index.html</filename> (and a 
340     variation on this file, <filename>privoxy-index.html</filename>, 
341     meant for inclusion with doc packages), are maintained as SGML as well.
342     <emphasis>DO NOT edit these directly</emphasis>. Edit the SGML source, or
343     contact someone involved in the documentation.
344     </para> 
345     <para>
346      <filename>config</filename> requires some special handling. The reason it
347      is maintained this way is so that the extensive comments in the file
348      mirror those in <citetitle>user-manual</citetitle>. But the conversion 
349      process requires going from SGML to HTML to text to special formatting 
350      required for the embedded comments. Some of this does not survive so
351      well. Especially some of the examples that are longer than 80 characters.
352      The build process for this file outputs to <filename>config.new</filename>, 
353      which should be reviewed for errors and mis-formatting. Once satisfied
354      that it is correct, then it should be hand copied to
355      <filename>config</filename>.
356     </para>
357     <para>
358      Other, less formal documents (e.g. <filename>LICENSE</filename>) are
359      maintained as plain text files in the top-level source directory.
360     </para>
361     <para>
362      Packagers are encouraged to include this documentation. For those without
363      the ability to build the docs locally, text versions of each are kept in
364      CVS. HTML versions are also being kept in CVS under 
365      <filename>doc/webserver/*</filename>. And PDF version are kept in 
366      <filename>doc/pdf/*</filename>.
367     </para>
368     <para>
369      Formal documents are built with the Makefile targets of
370      <computeroutput>make dok</computeroutput>, or alternately
371      <computeroutput>make redhat-dok</computeroutput>. If you have problems,
372      try both. The build process uses the document SGML sources in
373      <computeroutput>doc/source/*/*</computeroutput> to update all text files in
374      <computeroutput>doc/text/</computeroutput> and to update all HTML
375      documents in <computeroutput>doc/webserver/</computeroutput>.
376     </para>
377     <para>
378      Documentation writers should please make sure documents build
379      successfully before committing to CVS, if possible.
380     </para>
381     <para>
382      How do you update the webserver (i.e. the pages on privoxy.org)?
383      
384      <orderedlist numeration="arabic">
385       <listitem><para>
386         First, build the docs by running <computeroutput>make
387         dok</computeroutput> (or alternately <computeroutput>make
388         redhat-dok</computeroutput>). For PDF docs, do <computeroutput>make
389         dok-pdf</computeroutput>.
390       </para></listitem>
391       <listitem><para>
392         Run <computeroutput>make webserver</computeroutput> which copies all
393         files from <computeroutput>doc/webserver</computeroutput> to the
394         sourceforge webserver via scp.
395       </para></listitem>
396      </orderedlist>
397   </para>
398
399   <para>
400    Finished docs should be occasionally submitted to CVS
401    (<filename>doc/webserver/*/*.html</filename>) so that those without 
402    the ability to build them locally, have access to them if needed.
403    This is especially important just prior to a new release! Please
404    do this <emphasis>after</emphasis> the <literal>$VERSION</literal> and
405    other release specific data in <filename>configure.in</filename> has been
406    updated (this is done just prior to a new release).
407   </para>
408
409 <!--   ~~~~~       New section      ~~~~~     -->
410 <sect2 id="sgml">
411 <title>Quickstart to Docbook and SGML</title>
412 <para>
413  If you are not familiar with SGML, it is a markup language similar to HTML. 
414  Actually, not a mark up language per se, but a language used to define 
415  markup languages. In fact, HTML is an SGML application. Both will use
416  <quote>tags</quote> to format text and other content. SGML tags can be much
417  more varied, and flexible, but do much of the same kinds of things. The tags,
418  or <quote>elements</quote>, are definable in SGML. There is no set
419  <quote>standards</quote>. Since we are using
420  <application>Docbook</application>, our tags are those that are defined by 
421  <application>Docbook</application>. Much of how the finish document is
422  rendered is determined by the <quote>stylesheets</quote>.
423  The stylesheets determine how each tag gets translated to HTML, or other
424  formats.
425 </para>
426
427 <para>
428  Tags in Docbook SGML need to be always <quote>closed</quote>. If not, you
429  will likely generate errors. Example: <literal>&lt;title&gt;My
430  Title&lt;/title&gt;</literal>. They are also case-insensitive, but we
431  strongly suggest using all lower case. This keeps compatibility with
432  [Docbook] <application>XML</application>.
433 </para>
434
435 <para>
436  Our documents use <quote>sections</quote> for the most part. Sections
437  will be processed into HTML headers (e.g. <literal>h1</literal> for 
438  <literal>sect1</literal>). The <application>Docbook</application> stylesheets
439  will use these to also generate the Table of Contents for each doc. Our 
440  TOC's are set to a depth of three. Meaning <literal>sect1</literal>, 
441  <literal>sect2</literal>, and <literal>sect3</literal> will have TOC 
442  entries, but <literal>sect4</literal> will not. Each section requires 
443  a <literal>&lt;title&gt;</literal> element, and at least one 
444  <literal>&lt;para&gt;</literal>. There is a limit of five section 
445  levels in Docbook, but generally three should be sufficient for our 
446  purposes.
447 </para>
448
449 <para>
450  Some common elements that you likely will use: 
451 </para>
452
453 <para>
454   <simplelist>
455     <member>
456       <emphasis>&lt;para&gt;&lt;/para&gt;</emphasis>, paragraph delimiter. Most 
457       text needs to be within paragraph elements (there are some exceptions).
458     </member>
459     <member>
460       <emphasis>&lt;emphasis&gt;&lt;/emphasis&gt;</emphasis>, the stylesheets
461       make this italics.
462     </member>
463     <member>
464       <emphasis>&lt;filename&gt;&lt;/filename&gt;</emphasis>, files and directories.
465     </member>
466     <member>
467       <emphasis>&lt;command&gt;&lt;/command&gt;</emphasis>, command examples.
468     </member>
469     <member>
470       <emphasis>&lt;literallayout&gt;&lt;/literallayout&gt;</emphasis>, like 
471       <literal>&lt;pre&gt;</literal>, more or less.
472     </member>
473     <member>
474       <emphasis>&lt;itemizedlist&gt;&lt;/itemizedlist&gt;</emphasis>, list with bullets.
475     </member>
476     <member>
477       <emphasis>&lt;listitem&gt;&lt;/listitem&gt;</emphasis>, member of the above.
478     </member>
479     <member>
480       <emphasis>&lt;screen&gt;&lt;/screen&gt;</emphasis>, screen output, implies 
481       <literal>&lt;literallayout&gt;</literal>.
482     </member>
483     <member>
484       <emphasis>&lt;ulink url="example.com"&gt;&lt;/ulink&gt;</emphasis>, like 
485       HTML <literal>&lt;a&gt;</literal> tag.
486     </member>
487     <member>
488       <emphasis>&lt;quote&gt;&lt;/quote&gt;</emphasis>, for, doh, quoting text. 
489     </member>
490   </simplelist>
491 </para>
492
493 <para>
494  Look at any of the existing docs for examples of all these and more.
495 </para>
496
497 <para>
498  You might also find <quote><ulink
499  url="http://opensource.bureau-cornavin.com/crash-course/index.html">Writing Documentation
500  Using DocBook - A Crash Course</ulink></quote> useful.
501 </para>
502 </sect2>
503
504 <!--   ~~~~~       New section      ~~~~~     -->
505   <sect2 id="docstyle">
506   <title><application>Privoxy</application> Documentation Style</title>
507    <para>
508     It will be easier if everyone follows a similar writing style. This 
509     just makes it easier to read what someone else has written if it 
510     is all done in a similar fashion.
511    </para>
512    <para>
513     Here it is:
514    </para>
515    <para>
516     <itemizedlist>
517      <listitem>
518       <para>
519        All tags should be lower case.
520       </para>
521     </listitem> 
522     <listitem>
523      <para>
524        Tags delimiting a <emphasis>block</emphasis> of text (even small
525        blocks) should be on their own line. Like:
526        <literallayout>
527  &lt;para&gt;
528   Some text goes here.
529  &lt;/para&gt;
530        </literallayout>
531        Tags marking individual words, or few words, should be in-line:
532        <literallayout>
533   Just to &lt;emphasis&gt;emphasize&lt;/emphasis&gt;, some text goes here.
534        </literallayout>
535      </para>
536    </listitem> 
537    <listitem>
538     <para>
539       Tags should be nested and step indented for block text like: (except
540       in-line tags) 
541      <literallayout>
542  &lt;para&gt;
543   &lt;itemizedlist&gt;
544    &lt;para&gt;
545     &lt;listitem&gt;
546       Some text goes here in our list example.
547      &lt;/listitem&gt;
548    &lt;/para&gt;
549   &lt;/itemizedlist&gt;
550  &lt;/para&gt;
551        </literallayout>
552       This makes it easier to find the text amongst the tags ;-)
553     </para>
554    </listitem> 
555    <listitem>
556     <para>
557      Use white space to separate logical divisions within a document, 
558      like between sections. Running everything together consistently 
559      makes it harder to read and work on.
560     </para>
561    </listitem> 
562    <listitem>
563     <para>
564      Do not hesitate to make comments. Comments can either use the 
565      &lt;comment&gt; element, or the &lt;!--  --&gt; style comment 
566      familiar from HTML. (Note in Docbook v4.x &lt;comment&gt; is 
567      replaced by &lt;remark&gt;.)
568     </para>
569   </listitem> 
570   <listitem>
571    <para>
572      We have an international audience. Refrain from slang, or English 
573      idiosyncrasies (too many to list :). Humor also does not translate 
574      well sometimes.
575    </para>
576   </listitem> 
577   <listitem>
578    <para>
579     Try to keep overall line lengths in source files to 80 characters or less
580     for obvious reasons. This is not always possible, with lengthy URLs for
581     instance.
582    </para>
583   </listitem> 
584   <listitem>
585    <para>
586     Our documents are available in differing formats. Right now, they 
587     are just plain text, HTML, and PDF, but others are always a 
588     future possibility. Be careful with URLs (&lt;ulink&gt;), and avoid 
589     this mistake:
590    </para>
591    <para>
592      My favorite site is &lt;ulink url="http://example.com"&gt;here&lt;/ulink&gt;.
593    </para>
594    <para>
595      This will render as <quote>My favorite site is here</quote>, which is 
596      not real helpful in a text doc. Better like this:
597    </para>
598    <para>
599      My favorite site is &lt;ulink url="http://example.com"&gt;example.com&lt;/ulink&gt;.
600    </para>
601   </listitem>
602   <listitem>
603    <para>
604     All documents should be spell checked occasionally.
605     <application>aspell</application> can check SGML with the
606     <literal>-H</literal> option. (<application>ispell</application> I think
607     too.)
608    </para>
609   </listitem> 
610
611   </itemizedlist>
612  </para> 
613   
614   </sect2>
615
616   
617  <!--   ~~~~~       New section      ~~~~~     -->
618
619  <sect2><title>Privoxy Custom Entities</title>
620  <para>
621   <application>Privoxy</application> documentation is using 
622   a number of customized <quote>entities</quote> to facilitate 
623   documentation maintenance. 
624  </para>
625  <para>
626   We are using a set of <quote>boilerplate</quote> files with generic text,
627   that is used by multiple docs. This way we can write something once, and use
628   it repeatedly without having to re-write the same content over and over again.
629   If editing such a file, keep in mind that it should be
630   <emphasis>generic</emphasis>. That is the purpose; so it can be used in varying 
631   contexts without additional modifications.
632  </para>
633  <para>
634   We are also using what <application>Docbook</application> calls 
635   <quote>internal entities</quote>. These are like variables in 
636   programming. Well, sort of. For instance, we have the
637   <literal>p-version</literal> entity that contains the current 
638   <application>Privoxy</application> version string. You are strongly 
639   encouraged to use these where possible. Some of these obviously 
640   require re-setting with each release (done by the Makefile). A sampling of
641   custom entities are listed below. See any of the main docs for examples.
642  </para>
643
644  <para>
645   <itemizedlist>
646   <listitem>
647    <para>
648     Re- <quote>boilerplate</quote> text entities are defined like:
649    </para>
650    <para>
651     <literal>&lt;!entity supported SYSTEM "supported.sgml"&gt;</literal>
652    </para>
653    <para>
654      In this example, the contents of the file,
655      <filename>supported.sgml</filename> is available for inclusion anywhere 
656      in the doc. To make this happen, just reference the now defined 
657      entity: <literal>&#38;supported;</literal> (starts with an ampersand 
658      and ends with a semi-colon), and the contents will be dumped into 
659      the finished doc at that point.
660    </para>
661   </listitem> 
662   <listitem>
663    <para>
664     Commonly used <quote>internal entities</quote>:
665   </para>
666   <simplelist>
667    <member>
668     <emphasis>p-version</emphasis>: the <application>Privoxy</application> 
669     version string, e.g. <quote>&p-version;</quote>.
670    </member>
671    <member>
672     <emphasis>p-status</emphasis>: the project status, either 
673     <quote>alpha</quote>, <quote>beta</quote>, or <quote>stable</quote>.
674    </member>
675    <member>
676     <emphasis>p-not-stable</emphasis>: use to conditionally include 
677     text in <quote>not stable</quote> releases (e.g. <quote>beta</quote>).
678    </member>
679    <member>
680     <emphasis>p-stable</emphasis>: just the opposite.
681    </member>
682    <member>
683     <emphasis>p-text</emphasis>: this doc is only generated as text.
684    </member>
685   </simplelist>
686  </listitem> 
687  </itemizedlist>
688  </para> 
689  <para>
690   There are others in various places that are defined for a specific 
691   purpose. Read the source!
692  </para>
693  
694  </sect2>
695   
696  </sect1>
697
698 <!--     <listitem><para>be consistent with the redirect script (i.e. the <application>Privoxy</application> program -->
699 <!--       points via the redirect URL at sf to valid end-points in the document)</para></listitem> -->
700
701   <!--   ~~~~~       New section      ~~~~~     -->
702   <sect1 id="coding"><title>Coding Guidelines</title>
703
704     <sect2 id="s1"><title>Introduction</title>
705
706     <para>This set of standards is designed to make our lives easier.  It is
707     developed with the simple goal of helping us keep the "new and improved
708     <application>Privoxy</application>" consistent and reliable. Thus making
709     maintenance easier and increasing chances of success of the
710     project.</para>
711
712     <para>And that of course comes back to us as individuals. If we can
713     increase our development and product efficiencies then we can solve more
714     of the request for changes/improvements and in general feel good about
715     ourselves. ;-></para>
716
717   </sect2>
718
719     <sect2 id="s2"><title>Using Comments</title>
720  
721
722     <sect3 id="s3"><title>Comment, Comment, Comment</title>
723
724     <para><emphasis>Explanation:</emphasis></para>
725
726     <para>Comment as much as possible without commenting the obvious.
727     For example do not comment "variable_a is equal to variable_b".
728     Instead explain why variable_a should be equal to the variable_b.
729     Just because a person can read code does not mean they will
730     understand why or what is being done. A reader may spend a lot
731     more time figuring out what is going on when a simple comment
732     or explanation would have prevented the extra research. Please
733     help your brother IJB'ers out!</para>
734
735     <para>The comments will also help justify the intent of the code.
736     If the comment describes something different than what the code
737     is doing then maybe a programming error is occurring.</para>
738
739     <para><emphasis>Example:</emphasis></para>
740 <programlisting>
741 /* if page size greater than 1k ... */
742 if ( page_length() > 1024 )
743 {
744     ... "block" the page up ...
745 }
746
747 /* if page size is small, send it in blocks */
748 if ( page_length() > 1024 )
749 {
750     ... "block" the page up ...
751 }
752
753 This demonstrates 2 cases of "what not to do".  The first is a
754 "syntax comment".  The second is a comment that does not fit what
755 is actually being done.
756 </programlisting>
757   </sect3>
758
759     
760
761     <sect3 id="s4"><title>Use blocks for comments</title>
762
763     <para><emphasis>Explanation:</emphasis></para>
764
765     <para>Comments can help or they can clutter. They help when they
766     are differentiated from the code they describe. One line
767     comments do not offer effective separation between the comment
768     and the code. Block identifiers do, by surrounding the code
769     with a clear, definable pattern.</para>
770
771     <para><emphasis>Example:</emphasis></para>
772 <programlisting>
773 /*********************************************************************
774  * This will stand out clearly in your code!
775  *********************************************************************/
776 if ( this_variable == that_variable )
777 {
778    do_something_very_important();
779 }
780
781
782 /* unfortunately, this may not */
783 if ( this_variable == that_variable )
784 {
785    do_something_very_important();
786 }
787
788
789 if ( this_variable == that_variable ) /* this may not either */
790 {
791    do_something_very_important();
792 }</programlisting>
793
794     <para><emphasis>Exception:</emphasis></para>
795
796     <para>If you are trying to add a small logic comment and do not
797     wish to "disrupt" the flow of the code, feel free to use a 1
798     line comment which is NOT on the same line as the code.</para>
799
800     
801   </sect3>
802     
803
804     <sect3 id="s5"><title>Keep Comments on their own line</title>
805
806     <para><emphasis>Explanation:</emphasis></para>
807
808     <para>It goes back to the question of readability. If the comment
809     is on the same line as the code it will be harder to read than
810     the comment that is on its own line.</para>
811
812     <para>There are three exceptions to this rule, which should be
813     violated freely and often: during the definition of variables,
814     at the end of closing braces, when used to comment
815     parameters.</para>
816
817     <para><emphasis>Example:</emphasis></para>
818 <programlisting>
819 /*********************************************************************
820  * This will stand out clearly in your code,
821  * But the second example won't.
822  *********************************************************************/
823 if ( this_variable == this_variable )
824 {
825    do_something_very_important();
826 }
827
828 if ( this_variable == this_variable ) /*can you see me?*/
829 {
830    do_something_very_important(); /*not easily*/
831 }
832
833
834 /*********************************************************************
835  * But, the encouraged exceptions:
836  *********************************************************************/
837 int urls_read     = 0;     /* # of urls read + rejected */
838 int urls_rejected = 0;     /* # of urls rejected */
839
840 if ( 1 == X )
841 {
842    do_something_very_important();
843 }
844
845
846 short do_something_very_important(
847    short firstparam,   /* represents something */
848    short nextparam     /* represents something else */ )
849 {
850    ...code here...
851
852 }   /* -END- do_something_very_important */
853 </programlisting>
854   </sect3>
855     
856
857     <sect3 id="s6"><title>Comment each logical step</title>
858
859     <para><emphasis>Explanation:</emphasis></para>
860
861     <para>Logical steps should be commented to help others follow the
862     intent of the written code and comments will make the code more
863     readable.</para>
864
865     <para>If you have 25 lines of code without a comment, you should
866     probably go back into it to see where you forgot to put
867     one.</para>
868
869     <para>Most "for", "while", "do", etc... loops _probably_ need a
870     comment. After all, these are usually major logic
871     containers.</para>
872
873     
874   </sect3>
875     
876
877     <sect3 id="s7"><title>Comment All Functions Thoroughly</title>
878
879     <para><emphasis>Explanation:</emphasis></para>
880
881     <para>A reader of the code should be able to look at the comments
882     just prior to the beginning of a function and discern the
883     reason for its existence and the consequences of using it. The
884     reader should not have to read through the code to determine if
885     a given function is safe for a desired use. The proper
886     information thoroughly presented at the introduction of a
887     function not only saves time for subsequent maintenance or
888     debugging, it more importantly aids in code reuse by allowing a
889     user to determine the safety and applicability of any function
890     for the problem at hand. As a result of such benefits, all
891     functions should contain the information presented in the
892     addendum section of this document.</para>
893
894     
895   </sect3>
896     
897
898     <sect3 id="s8"><title>Comment at the end of braces if the
899     content is more than one screen length</title>
900
901     <para><emphasis>Explanation:</emphasis></para>
902
903     <para>Each closing brace should be followed on the same line by a
904     comment that describes the origination of the brace if the
905     original brace is off of the screen, or otherwise far away from
906     the closing brace. This will simplify the debugging,
907     maintenance, and readability of the code.</para>
908
909     <para>As a suggestion , use the following flags to make the
910     comment and its brace more readable:</para>
911
912     <para>use following a closing brace: } /* -END- if() or while ()
913     or etc... */</para>
914
915     <para><emphasis>Example:</emphasis></para>
916 <programlisting>
917 if ( 1 == X )
918 {
919    do_something_very_important();
920    ...some long list of commands...
921 } /* -END- if x is 1 */
922
923 or:
924
925 if ( 1 == X )
926 {
927    do_something_very_important();
928    ...some long list of commands...
929 } /* -END- if ( 1 == X ) */
930 </programlisting>
931   </sect3>
932     
933   </sect2>
934
935     <sect2 id="s9"><title>Naming Conventions</title>
936
937     
938
939     <sect3 id="s10"><title>Variable Names</title>
940
941     <para><emphasis>Explanation:</emphasis></para>
942
943     <para>Use all lowercase, and separate words via an underscore
944     ('_'). Do not start an identifier with an underscore. (ANSI C
945     reserves these for use by the compiler and system headers.) Do
946     not use identifiers which are reserved in ANSI C++. (E.g.
947     template, class, true, false, ...). This is in case we ever
948     decide to port Privoxy to C++.</para>
949
950     <para><emphasis>Example:</emphasis></para>
951 <programlisting>
952 int ms_iis5_hack = 0;</programlisting>
953
954     <para><emphasis>Instead of:</emphasis></para>
955
956     <para>
957 <programlisting>
958 int msiis5hack = 0; int msIis5Hack = 0;
959 </programlisting>
960 </para>
961
962     
963
964   </sect3>    
965
966     <sect3 id="s11"><title>Function Names</title>
967
968     <para><emphasis>Explanation:</emphasis></para>
969
970     <para>Use all lowercase, and separate words via an underscore
971     ('_'). Do not start an identifier with an underscore. (ANSI C
972     reserves these for use by the compiler and system headers.) Do
973     not use identifiers which are reserved in ANSI C++. (E.g.
974     template, class, true, false, ...). This is in case we ever
975     decide to port Privoxy to C++.</para>
976
977     <para><emphasis>Example:</emphasis></para>
978 <programlisting>
979 int load_some_file( struct client_state *csp )</programlisting>
980
981     <para><emphasis>Instead of:</emphasis></para>
982
983     <para>
984 <programlisting>
985 int loadsomefile( struct client_state *csp )
986 int loadSomeFile( struct client_state *csp )
987 </programlisting>
988 </para>
989
990     
991   </sect3>
992     
993
994     <sect3 id="s12"><title>Header file prototypes</title>
995
996     <para><emphasis>Explanation:</emphasis></para>
997
998     <para>Use a descriptive parameter name in the function prototype
999     in header files. Use the same parameter name in the header file
1000     that you use in the c file.</para>
1001
1002     <para><emphasis>Example:</emphasis></para>
1003 <programlisting>
1004 (.h) extern int load_aclfile( struct client_state *csp );
1005 (.c) int load_aclfile( struct client_state *csp )</programlisting>
1006
1007     <para><emphasis>Instead of:</emphasis>
1008 <programlisting>
1009 (.h) extern int load_aclfile( struct client_state * ); or 
1010 (.h) extern int load_aclfile(); 
1011 (.c) int load_aclfile( struct client_state *csp )
1012 </programlisting>
1013 </para>
1014
1015     
1016   </sect3>
1017     
1018
1019     <sect3 id="s13"><title>Enumerations, and #defines</title>
1020
1021     <para><emphasis>Explanation:</emphasis></para>
1022
1023     <para>Use all capital letters, with underscores between words. Do
1024     not start an identifier with an underscore. (ANSI C reserves
1025     these for use by the compiler and system headers.)</para>
1026
1027     <para><emphasis>Example:</emphasis></para>
1028 <programlisting>
1029 (enumeration) : enum Boolean { FALSE, TRUE };
1030 (#define) : #define DEFAULT_SIZE 100;</programlisting>
1031
1032     <para><emphasis>Note:</emphasis> We have a standard naming scheme for #defines
1033     that toggle a feature in the preprocessor: FEATURE_>, where
1034     > is a short (preferably 1 or 2 word) description.</para>
1035
1036     <para><emphasis>Example:</emphasis></para>
1037 <programlisting>
1038 #define FEATURE_FORCE 1
1039
1040 #ifdef FEATURE_FORCE
1041 #define FORCE_PREFIX blah
1042 #endif /* def FEATURE_FORCE */
1043 </programlisting>
1044   </sect3>
1045     
1046
1047     <sect3 id="s14"><title>Constants</title>
1048
1049     <para><emphasis>Explanation:</emphasis></para>
1050
1051     <para>Spell common words out entirely (do not remove vowels).</para>
1052
1053     <para>Use only widely-known domain acronyms and abbreviations.
1054     Capitalize all letters of an acronym.</para>
1055
1056     <para>Use underscore (_) to separate adjacent acronyms and
1057     abbreviations. Never terminate a name with an underscore.</para>
1058
1059     <para><emphasis>Example:</emphasis></para>
1060 <programlisting>
1061 #define USE_IMAGE_LIST 1</programlisting>
1062
1063     <para><emphasis>Instead of:</emphasis></para>
1064
1065     <para>
1066 <programlisting>
1067 #define USE_IMG_LST 1 or 
1068 #define _USE_IMAGE_LIST 1 or
1069 #define USE_IMAGE_LIST_ 1 or 
1070 #define use_image_list 1 or
1071 #define UseImageList 1
1072 </programlisting>
1073 </para>
1074
1075     
1076   </sect3>
1077
1078   </sect2>
1079     
1080
1081     <sect2 id="s15"><title>Using Space</title>
1082
1083     
1084
1085     <sect3 id="s16"><title>Put braces on a line by themselves.</title>
1086
1087     <para><emphasis>Explanation:</emphasis></para>
1088
1089     <para>The brace needs to be on a line all by itself, not at the
1090     end of the statement. Curly braces should line up with the
1091     construct that they're associated with. This practice makes it
1092     easier to identify the opening and closing braces for a
1093     block.</para>
1094
1095     <para><emphasis>Example:</emphasis></para>
1096 <programlisting>
1097 if ( this == that )
1098 {
1099    ...
1100 }</programlisting>
1101
1102     <para><emphasis>Instead of:</emphasis></para>
1103
1104     <para>if ( this == that ) { ... }</para>
1105
1106     <para>or</para>
1107
1108     <para>if ( this == that ) { ... }</para>
1109
1110     <para><emphasis>Note:</emphasis> In the special case that the if-statement is
1111     inside a loop, and it is trivial, i.e. it tests for a
1112     condition that is obvious from the purpose of the block,
1113     one-liners as above may optically preserve the loop structure
1114     and make it easier to read.</para>
1115
1116     <para><emphasis>Status:</emphasis> developer-discretion.</para>
1117
1118     <para><emphasis>Example exception:</emphasis></para>
1119 <programlisting>
1120 while ( more lines are read )
1121 {
1122    /* Please document what is/is not a comment line here */
1123    if ( it's a comment ) continue;
1124
1125    do_something( line );
1126 }
1127 </programlisting>
1128   </sect3>
1129     
1130
1131     <sect3 id="s17"><title>ALL control statements should have a
1132     block</title>
1133
1134     <para><emphasis>Explanation:</emphasis></para>
1135
1136     <para>Using braces to make a block will make your code more
1137     readable and less prone to error. All control statements should
1138     have a block defined.</para>
1139
1140     <para><emphasis>Example:</emphasis></para>
1141 <programlisting>
1142 if ( this == that )
1143 {
1144    do_something();
1145    do_something_else();
1146 }</programlisting>
1147
1148     <para><emphasis>Instead of:</emphasis></para>
1149
1150     <para>if ( this == that ) do_something(); do_something_else();</para>
1151
1152     <para>or</para>
1153
1154     <para>if ( this == that ) do_something();</para>
1155
1156     <para><emphasis>Note:</emphasis> The first example in "Instead of" will execute
1157     in a manner other than that which the developer desired (per
1158     indentation). Using code braces would have prevented this
1159     "feature". The "explanation" and "exception" from the point
1160     above also applies.</para>
1161
1162     
1163   </sect3>
1164     
1165
1166     <sect3 id="s18"><title>Do not belabor/blow-up boolean
1167     expressions</title>
1168
1169     <para><emphasis>Example:</emphasis></para>
1170 <programlisting>
1171 structure->flag = ( condition );</programlisting>
1172
1173     <para><emphasis>Instead of:</emphasis></para>
1174
1175     <para>if ( condition ) { structure->flag = 1; } else {
1176     structure->flag = 0; }</para>
1177
1178     <para><emphasis>Note:</emphasis> The former is readable and concise. The later
1179     is wordy and inefficient. Please assume that any developer new
1180     to the project has at least a "good" knowledge of C/C++. (Hope
1181     I do not offend by that last comment ... 8-)</para>
1182
1183     
1184   </sect3>
1185     
1186
1187     <sect3 id="s19"><title>Use white space freely because it is
1188     free</title>
1189
1190     <para><emphasis>Explanation:</emphasis></para>
1191
1192     <para>Make it readable. The notable exception to using white space
1193     freely is listed in the next guideline.</para>
1194
1195     <para><emphasis>Example:</emphasis></para>
1196 <programlisting>
1197 int first_value   = 0;
1198 int some_value    = 0;
1199 int another_value = 0;
1200 int this_variable = 0;
1201
1202 if ( this_variable == this_variable )
1203
1204 first_value = old_value + ( ( some_value - another_value ) - whatever )
1205 </programlisting>
1206   </sect3>
1207     
1208
1209     <sect3 id="s20"><title>Don't use white space around structure
1210     operators</title>
1211
1212     <para><emphasis>Explanation:</emphasis></para>
1213
1214     <para>- structure pointer operator ( "->" ) - member operator (
1215     "." ) - functions and parentheses</para>
1216
1217     <para>It is a general coding practice to put pointers, references,
1218     and function parentheses next to names. With spaces, the
1219     connection between the object and variable/function name is not
1220     as clear.</para>
1221
1222     <para><emphasis>Example:</emphasis></para>
1223 <programlisting>
1224 a_struct->a_member;
1225 a_struct.a_member;
1226 function_name();</programlisting>
1227
1228     <para><emphasis>Instead of:</emphasis> a_struct -> a_member; a_struct . a_member;
1229     function_name ();</para>
1230
1231     
1232   </sect3>
1233     
1234
1235     <sect3 id="s21"><title>Make the last brace of a function stand
1236     out</title>
1237
1238     <para><emphasis>Example:</emphasis></para>
1239 <programlisting>
1240 int function1( ... )
1241 {
1242    ...code...
1243    return( ret_code );
1244
1245 }   /* -END- function1 */
1246
1247
1248 int function2( ... )
1249 {
1250 }   /* -END- function2 */
1251 </programlisting>
1252
1253     <para><emphasis>Instead of:</emphasis></para>
1254
1255     <para>int function1( ... ) { ...code... return( ret_code ); } int
1256     function2( ... ) { }</para>
1257
1258     <para><emphasis>Note:</emphasis> Use 1 blank line before the closing brace and 2
1259     lines afterward. This makes the end of function standout to
1260     the most casual viewer. Although function comments help
1261     separate functions, this is still a good coding practice. In
1262     fact, I follow these rules when using blocks in "for", "while",
1263     "do" loops, and long if {} statements too. After all whitespace
1264     is free!</para>
1265
1266     <para><emphasis>Status:</emphasis> developer-discretion on the number of blank
1267     lines. Enforced is the end of function comments.</para>
1268
1269     
1270   </sect3>
1271     
1272
1273     <sect3 id="s22"><title>Use 3 character indentions</title>
1274
1275     <para><emphasis>Explanation:</emphasis></para>
1276
1277     <para>If some use 8 character TABs and some use 3 character TABs,
1278     the code can look *very* ragged. So use 3 character indentions
1279     only. If you like to use TABs, pass your code through a filter
1280     such as "expand -t3" before checking in your code.</para>
1281
1282     <para><emphasis>Example:</emphasis></para>
1283 <programlisting>
1284 static const char * const url_code_map[256] =
1285 {
1286    NULL, ...
1287 };
1288
1289
1290 int function1( ... )
1291 {
1292    if ( 1 )
1293    {
1294       return( ALWAYS_TRUE );
1295    }
1296    else
1297    {
1298       return( HOW_DID_YOU_GET_HERE );
1299    }
1300
1301    return( NEVER_GETS_HERE );
1302
1303 }
1304 </programlisting>
1305   </sect3>
1306
1307   </sect2>
1308     
1309
1310     <sect2 id="s23"><title>Initializing</title>
1311
1312     
1313
1314     <sect3 id="s24"><title>Initialize all variables</title>
1315
1316     <para><emphasis>Explanation:</emphasis></para>
1317
1318     <para>Do not assume that the variables declared will not be used
1319     until after they have been assigned a value somewhere else in
1320     the code. Remove the chance of accidentally using an unassigned
1321     variable.</para>
1322
1323     <para><emphasis>Example:</emphasis></para>
1324 <programlisting>
1325 short a_short = 0;
1326 float a_float  = 0;
1327 struct *ptr = NULL;</programlisting>
1328
1329     <para><emphasis>Note:</emphasis> It is much easier to debug a SIGSEGV if the
1330     message says you are trying to access memory address 00000000
1331     and not 129FA012; or array_ptr[20] causes a SIGSEV vs.
1332     array_ptr[0].</para>
1333
1334     <para><emphasis>Status:</emphasis> developer-discretion if and only if the
1335     variable is assigned a value "shortly after" declaration.</para>
1336
1337   </sect3>
1338   </sect2>
1339     
1340
1341     <sect2 id="s25"><title>Functions</title>
1342
1343     
1344
1345     <sect3 id="s26"><title>Name functions that return a boolean as a
1346     question.</title>
1347
1348     <para><emphasis>Explanation:</emphasis></para>
1349
1350     <para>Value should be phrased as a question that would logically
1351     be answered as a true or false statement</para>
1352
1353     <para><emphasis>Example:</emphasis></para>
1354 <programlisting>
1355 should_we_block_this();
1356 contains_an_image();
1357 is_web_page_blank();
1358 </programlisting>
1359   </sect3>
1360     
1361
1362     <sect3 id="s27"><title>Always specify a return type for a
1363     function.</title>
1364
1365     <para><emphasis>Explanation:</emphasis></para>
1366
1367     <para>The default return for a function is an int. To avoid
1368     ambiguity, create a return for a function when the return has a
1369     purpose, and create a void return type if the function does not
1370     need to return anything.</para>
1371
1372     
1373   </sect3>
1374     
1375
1376     <sect3 id="s28"><title>Minimize function calls when iterating by
1377     using variables</title>
1378
1379     <para><emphasis>Explanation:</emphasis></para>
1380
1381     <para>It is easy to write the following code, and a clear argument
1382     can be made that the code is easy to understand:</para>
1383
1384     <para><emphasis>Example:</emphasis></para>
1385 <programlisting>
1386 for ( size_t cnt = 0; cnt &lt; block_list_length(); cnt++ )
1387 {
1388    ....
1389 }</programlisting>
1390
1391     <para><emphasis>Note:</emphasis> Unfortunately, this makes a function call for
1392     each and every iteration. This increases the overhead in the
1393     program, because the compiler has to look up the function each
1394     time, call it, and return a value. Depending on what occurs in
1395     the block_list_length() call, it might even be creating and
1396     destroying structures with each iteration, even though in each
1397     case it is comparing "cnt" to the same value, over and over.
1398     Remember too - even a call to block_list_length() is a function
1399     call, with the same overhead.</para>
1400
1401     <para>Instead of using a function call during the iterations,
1402     assign the value to a variable, and evaluate using the
1403     variable.</para>
1404
1405     <para><emphasis>Example:</emphasis></para>
1406 <programlisting>
1407 size_t len = block_list_length();
1408
1409 for ( size_t cnt = 0; cnt &lt; len; cnt++ )
1410 {
1411    ....
1412 }</programlisting>
1413
1414     <para><emphasis>Exceptions:</emphasis> if the value of block_list_length()
1415     *may* change or could *potentially* change, then you must code the
1416     function call in the for/while loop.</para>
1417
1418     
1419   </sect3>
1420     
1421
1422     <sect3 id="s29"><title>Pass and Return by Const Reference</title>
1423
1424     <para><emphasis>Explanation:</emphasis></para>
1425
1426     <para>This allows a developer to define a const pointer and call
1427     your function. If your function does not have the const
1428     keyword, we may not be able to use your function. Consider
1429     strcmp, if it were defined as: extern int strcmp( char *s1,
1430     char *s2 );</para>
1431
1432     <para>I could then not use it to compare argv's in main: int main(
1433     int argc, const char *argv[] ) { strcmp( argv[0], "privoxy"
1434     ); }</para>
1435
1436     <para>Both these pointers are *const*! If the c runtime library
1437     maintainers do it, we should too.</para>
1438
1439     
1440   </sect3>
1441     
1442
1443     <sect3 id="s30"><title>Pass and Return by Value</title>
1444
1445     <para><emphasis>Explanation:</emphasis></para>
1446
1447     <para>Most structures cannot fit onto a normal stack entry (i.e.
1448     they are not 4 bytes or less). Aka, a function declaration
1449     like: int load_aclfile( struct client_state csp )</para>
1450
1451     <para>would not work. So, to be consistent, we should declare all
1452     prototypes with "pass by value": int load_aclfile( struct
1453     client_state *csp )</para>
1454
1455     
1456   </sect3>
1457     
1458
1459     <sect3 id="s31"><title>Names of include files</title>
1460
1461     <para><emphasis>Explanation:</emphasis></para>
1462
1463     <para>Your include statements should contain the file name without
1464     a path. The path should be listed in the Makefile, using -I as
1465     processor directive to search the indicated paths. An exception
1466     to this would be for some proprietary software that utilizes a
1467     partial path to distinguish their header files from system or
1468     other header files.</para>
1469
1470     <para><emphasis>Example:</emphasis></para>
1471 <programlisting>
1472 #include &lt;iostream.h&gt;     /* This is not a local include */
1473 #include "config.h"       /* This IS a local include */
1474 </programlisting>
1475
1476     <para><emphasis>Exception:</emphasis></para>
1477
1478     <para>
1479 <programlisting>
1480 /* This is not a local include, but requires a path element. */ 
1481 #include &lt;sys/fileName.h&gt;
1482 </programlisting>
1483 </para>
1484
1485     <para><emphasis>Note:</emphasis> Please! do not add "-I." to the Makefile
1486     without a _very_ good reason. This duplicates the #include
1487     "file.h" behavior.</para>
1488
1489     
1490   </sect3>
1491     
1492
1493     <sect3 id="s32"><title>Provide multiple inclusion
1494     protection</title>
1495
1496     <para><emphasis>Explanation:</emphasis></para>
1497
1498     <para>Prevents compiler and linker errors resulting from
1499     redefinition of items.</para>
1500
1501     <para>Wrap each header file with the following syntax to prevent
1502     multiple inclusions of the file. Of course, replace PROJECT_H
1503     with your file name, with "." Changed to "_", and make it
1504     uppercase.</para>
1505
1506     <para><emphasis>Example:</emphasis></para>
1507 <programlisting>
1508 #ifndef PROJECT_H_INCLUDED
1509 #define PROJECT_H_INCLUDED
1510  ...
1511 #endif /* ndef PROJECT_H_INCLUDED */
1512 </programlisting>
1513   </sect3>
1514     
1515
1516     <sect3 id="s33"><title>Use `extern "C"` when appropriate</title>
1517
1518     <para><emphasis>Explanation:</emphasis></para>
1519
1520     <para>If our headers are included from C++, they must declare our
1521     functions as `extern "C"`. This has no cost in C, but increases
1522     the potential re-usability of our code.</para>
1523
1524     <para><emphasis>Example:</emphasis></para>
1525 <programlisting>
1526 #ifdef __cplusplus
1527 extern "C"
1528 {
1529 #endif /* def __cplusplus */
1530
1531 ... function definitions here ...
1532
1533 #ifdef __cplusplus
1534 }
1535 #endif /* def __cplusplus */
1536 </programlisting>
1537   </sect3>
1538     
1539
1540     <sect3 id="s34"><title>Where Possible, Use Forward Struct
1541     Declaration Instead of Includes</title>
1542
1543     <para><emphasis>Explanation:</emphasis></para>
1544
1545     <para>Useful in headers that include pointers to other struct's.
1546     Modifications to excess header files may cause needless
1547     compiles.</para>
1548
1549     <para><emphasis>Example:</emphasis></para>
1550 <programlisting>
1551 /*********************************************************************
1552  * We're avoiding an include statement here!
1553  *********************************************************************/
1554 struct file_list;
1555 extern file_list *xyz;</programlisting>
1556
1557     <para><emphasis>Note:</emphasis> If you declare "file_list xyz;" (without the
1558     pointer), then including the proper header file is necessary.
1559     If you only want to prototype a pointer, however, the header
1560     file is unnecessary.</para>
1561
1562     <para><emphasis>Status:</emphasis> Use with discretion.</para>
1563
1564     
1565   </sect3>
1566   </sect2>
1567
1568     <sect2 id="s35"><title>General Coding Practices</title>
1569
1570     
1571
1572     <sect3 id="s36"><title>Turn on warnings</title>
1573
1574     <para><emphasis>Explanation</emphasis></para>
1575
1576     <para>Compiler warnings are meant to help you find bugs. You
1577     should turn on as many as possible. With GCC, the switch is
1578     "-Wall". Try and fix as many warnings as possible.</para>
1579
1580     
1581   </sect3>
1582     
1583
1584     <sect3 id="s37"><title>Provide a default case for all switch
1585     statements</title>
1586
1587     <para><emphasis>Explanation:</emphasis></para>
1588
1589     <para>What you think is guaranteed is never really guaranteed. The
1590     value that you don't think you need to check is the one that
1591     someday will be passed. So, to protect yourself from the
1592     unknown, always have a default step in a switch statement.</para>
1593
1594     <para><emphasis>Example:</emphasis></para>
1595 <programlisting>
1596 switch( hash_string( cmd ) )
1597 {
1598    case hash_actions_file :
1599       ... code ...
1600       break;
1601
1602    case hash_confdir :
1603       ... code ...
1604       break;
1605
1606    default :
1607       log_error( ... );
1608       ... anomaly code goes here ...
1609       continue; / break; / exit( 1 ); / etc ...
1610
1611 } /* end switch( hash_string( cmd ) ) */</programlisting>
1612
1613     <para><emphasis>Note:</emphasis> If you already have a default condition, you
1614     are obviously exempt from this point. Of note, most of the
1615     WIN32 code calls `DefWindowProc' after the switch statement.
1616     This API call *should* be included in a default statement.</para>
1617
1618     <para><emphasis>Another Note:</emphasis> This is not so much a readability issue
1619     as a robust programming issue. The "anomaly code goes here" may
1620     be no more than a print to the STDERR stream (as in
1621     load_config). Or it may really be an abort condition.</para>
1622
1623     <para><emphasis>Status:</emphasis> Programmer discretion is advised.</para>
1624
1625     
1626   </sect3>
1627     
1628
1629     <sect3 id="s38"><title>Try to avoid falling through cases in a
1630     switch statement.</title>
1631
1632     <para><emphasis>Explanation:</emphasis></para>
1633
1634     <para>In general, you will want to have a 'break' statement within
1635     each 'case' of a switch statement. This allows for the code to
1636     be more readable and understandable, and furthermore can
1637     prevent unwanted surprises if someone else later gets creative
1638     and moves the code around.</para>
1639
1640     <para>The language allows you to plan the fall through from one
1641     case statement to another simply by omitting the break
1642     statement within the case statement. This feature does have
1643     benefits, but should only be used in rare cases. In general,
1644     use a break statement for each case statement.</para>
1645
1646     <para>If you choose to allow fall through, you should comment both
1647     the fact of the fall through and reason why you felt it was
1648     necessary.</para>
1649
1650     
1651   </sect3>
1652     
1653
1654     <sect3 id="s39"><title>Use 'long' or 'short' Instead of
1655     'int'</title>
1656
1657     <para><emphasis>Explanation:</emphasis></para>
1658
1659     <para>On 32-bit platforms, int usually has the range of long. On
1660     16-bit platforms, int has the range of short.</para>
1661
1662     <para><emphasis>Status:</emphasis> open-to-debate. In the case of most FSF
1663     projects (including X/GNU-Emacs), there are typedefs to int4,
1664     int8, int16, (or equivalence ... I forget the exact typedefs
1665     now). Should we add these to IJB now that we have a "configure"
1666     script?</para>
1667
1668     
1669   </sect3>
1670     
1671
1672     <sect3 id="s40"><title>Don't mix size_t and other types</title>
1673
1674     <para><emphasis>Explanation:</emphasis></para>
1675
1676     <para>The type of size_t varies across platforms. Do not make
1677     assumptions about whether it is signed or unsigned, or about
1678     how long it is. Do not compare a size_t against another
1679     variable of a different type (or even against a constant)
1680     without casting one of the values.</para>
1681
1682     
1683   </sect3>
1684     
1685
1686     <sect3 id="s41"><title>Declare each variable and struct on its
1687     own line.</title>
1688
1689     <para><emphasis>Explanation:</emphasis></para>
1690
1691     <para>It can be tempting to declare a series of variables all on
1692     one line. Don't.</para>
1693
1694     <para><emphasis>Example:</emphasis></para>
1695 <programlisting>
1696 long a = 0;
1697 long b = 0;
1698 long c = 0;</programlisting>
1699
1700     <para><emphasis>Instead of:</emphasis></para>
1701
1702     <para>long a, b, c;</para>
1703
1704     <para><emphasis>Explanation:</emphasis> - there is more room for comments on the
1705     individual variables - easier to add new variables without
1706     messing up the original ones - when searching on a variable to
1707     find its type, there is less clutter to "visually"
1708     eliminate</para>
1709
1710     <para><emphasis>Exceptions:</emphasis> when you want to declare a bunch of loop
1711     variables or other trivial variables; feel free to declare them
1712     on one line. You should, although, provide a good comment on
1713     their functions.</para>
1714
1715     <para><emphasis>Status:</emphasis> developer-discretion.</para>
1716
1717     
1718   </sect3>
1719     
1720
1721     <sect3 id="s42"><title>Use malloc/zalloc sparingly</title>
1722
1723     <para><emphasis>Explanation:</emphasis></para>
1724
1725     <para>Create a local struct (on the stack) if the variable will
1726     live and die within the context of one function call.</para>
1727
1728     <para>Only "malloc" a struct (on the heap) if the variable's life
1729     will extend beyond the context of one function call.</para>
1730
1731     <para><emphasis>Example:</emphasis></para>
1732 <programlisting>
1733 If a function creates a struct and stores a pointer to it in a
1734 list, then it should definitely be allocated via `malloc'.
1735 </programlisting>
1736   </sect3>
1737     
1738
1739     <sect3 id="s43"><title>The Programmer Who Uses 'malloc' is
1740     Responsible for Ensuring 'free'</title>
1741
1742     <para><emphasis>Explanation:</emphasis></para>
1743
1744     <para>If you have to "malloc" an instance, you are responsible for
1745     insuring that the instance is `free'd, even if the deallocation
1746     event falls within some other programmer's code. You are also
1747     responsible for ensuring that deletion is timely (i.e. not too
1748     soon, not too late). This is known as "low-coupling" and is a
1749     "good thing (tm)". You may need to offer a
1750     free/unload/destructor type function to accommodate this.</para>
1751
1752     <para><emphasis>Example:</emphasis></para>
1753 <programlisting>
1754 int load_re_filterfile( struct client_state *csp ) { ... }
1755 static void unload_re_filterfile( void *f ) { ... }</programlisting>
1756
1757     <para><emphasis>Exceptions:</emphasis></para>
1758
1759     <para>The developer cannot be expected to provide `free'ing
1760     functions for C run-time library functions ... such as
1761     `strdup'.</para>
1762
1763     <para><emphasis>Status:</emphasis> developer-discretion. The "main" use of this
1764     standard is for allocating and freeing data structures (complex
1765     or nested).</para>
1766
1767     
1768   </sect3>
1769     
1770
1771     <sect3 id="s44"><title>Add loaders to the `file_list' structure
1772     and in order</title>
1773
1774     <para><emphasis>Explanation:</emphasis></para>
1775
1776     <para>I have ordered all of the "blocker" file code to be in alpha
1777     order. It is easier to add/read new blockers when you expect a
1778     certain order.</para>
1779
1780     <para><emphasis>Note:</emphasis> It may appear that the alpha order is broken in
1781     places by POPUP tests coming before PCRS tests. But since
1782     POPUPs can also be referred to as KILLPOPUPs, it is clear that
1783     it should come first.</para>
1784
1785     
1786   </sect3>
1787     
1788
1789     <sect3 id="s45"><title>"Uncertain" new code and/or changes to
1790     existing code, use FIXME or XXX</title>
1791
1792     <para><emphasis>Explanation:</emphasis></para>
1793
1794     <para>If you have enough confidence in new code or confidence in
1795     your changes, but are not *quite* sure of the repercussions,
1796     add this:</para>
1797
1798     <para>/* FIXME: this code has a logic error on platform XYZ, *
1799     attempting to fix */ #ifdef PLATFORM ...changed code here...
1800     #endif</para>
1801
1802     <para>or:</para>
1803
1804     <para>/* FIXME: I think the original author really meant this...
1805     */ ...changed code here...</para>
1806
1807     <para>or:</para>
1808
1809     <para>/* FIXME: new code that *may* break something else... */
1810     ...new code here...</para>
1811
1812     <para><emphasis>Note:</emphasis> If you make it clear that this may or may not
1813     be a "good thing (tm)", it will be easier to identify and
1814     include in the project (or conversely exclude from the
1815     project).</para>
1816
1817     
1818   </sect3>
1819
1820   </sect2>
1821
1822     <sect2 id="s46"><title>Addendum: Template for files and function
1823     comment blocks:</title>
1824
1825     <para><emphasis>Example for file comments:</emphasis></para>
1826 <programlisting>
1827 const char FILENAME_rcs[] = "$I<!-- Break CVS Substitution -->d$";
1828 /*********************************************************************
1829  *
1830  * File        :  $S<!-- Break CVS Substitution -->ource$
1831  *
1832  * Purpose     :  (Fill me in with a good description!)
1833  *
1834  * Copyright   :  Written by and Copyright (C) 2001-2009
1835  *                the Privoxy team. http://www.privoxy.org/
1836  *
1837  *                This program is free software; you can redistribute it
1838  *                and/or modify it under the terms of the GNU General
1839  *                Public License as published by the Free Software
1840  *                Foundation; either version 2 of the License, or (at
1841  *                your option) any later version.
1842  *
1843  *                This program is distributed in the hope that it will
1844  *                be useful, but WITHOUT ANY WARRANTY; without even the
1845  *                implied warranty of MERCHANTABILITY or FITNESS FOR A
1846  *                PARTICULAR PURPOSE.  See the GNU General Public
1847  *                License for more details.
1848  *
1849  *                The GNU General Public License should be included with
1850  *                this file.  If not, you can view it at
1851  *                http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
1852  *                or write to the Free Software Foundation, Inc., 
1853  *                51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 ,
1854  *                USA
1855  *
1856  * Revisions   :
1857  *    $L<!-- Break CVS Substitution -->og$
1858  *
1859  *********************************************************************/
1860
1861
1862 #include "config.h"
1863
1864    ...necessary include files for us to do our work...
1865
1866 const char FILENAME_h_rcs[] = FILENAME_H_VERSION;
1867 </programlisting>
1868
1869     <para><emphasis>Note:</emphasis> This declares the rcs variables that should be
1870     added to the "show-proxy-args" page. If this is a brand new
1871     creation by you, you are free to change the "Copyright" section
1872     to represent the rights you wish to maintain.</para>
1873
1874     <para><emphasis>Note:</emphasis> The formfeed character that is present right
1875     after the comment flower box is handy for (X|GNU)Emacs users to
1876     skip the verbiage and get to the heart of the code (via
1877     `forward-page' and `backward-page'). Please include it if you
1878     can.</para>
1879
1880     <para><emphasis>Example for file header comments:</emphasis></para>
1881 <programlisting>
1882 #ifndef _FILENAME_H
1883 #define _FILENAME_H
1884 #define FILENAME_H_VERSION "$I<!-- Break CVS Substitution -->d$"
1885 /*********************************************************************
1886  *
1887  * File        :  $S<!-- Break CVS Substitution -->ource$
1888  *
1889  * Purpose     :  (Fill me in with a good description!)
1890  *
1891  * Copyright   :  Written by and Copyright (C) 2001-2009
1892  *                the Privoxy team. http://www.privoxy.org/
1893  *
1894  *                This program is free software; you can redistribute it
1895  *                and/or modify it under the terms of the GNU General
1896  *                Public License as published by the Free Software
1897  *                Foundation; either version 2 of the License, or (at
1898  *                your option) any later version.
1899  *
1900  *                This program is distributed in the hope that it will
1901  *                be useful, but WITHOUT ANY WARRANTY; without even the
1902  *                implied warranty of MERCHANTABILITY or FITNESS FOR A
1903  *                PARTICULAR PURPOSE.  See the GNU General Public
1904  *                License for more details.
1905  *
1906  *                The GNU General Public License should be included with
1907  *                this file.  If not, you can view it at
1908  *                http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
1909  *                or write to the Free Software Foundation, Inc., 
1910  *                51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 ,
1911  *                USA
1912  *
1913  * Revisions   :
1914  *    $L<!-- Break CVS Substitution -->og$
1915  *
1916  *********************************************************************/
1917
1918
1919 #include "project.h"
1920
1921 #ifdef __cplusplus
1922 extern "C" {
1923 #endif
1924
1925    ... function headers here ...
1926
1927
1928 /* Revision control strings from this header and associated .c file */
1929 extern const char FILENAME_rcs[];
1930 extern const char FILENAME_h_rcs[];
1931
1932
1933 #ifdef __cplusplus
1934 } /* extern "C" */
1935 #endif
1936
1937 #endif /* ndef _FILENAME_H */
1938
1939 /*
1940   Local Variables:
1941   tab-width: 3
1942   end:
1943 */
1944 </programlisting>
1945
1946     <para><emphasis>Example for function comments:</emphasis></para>
1947 <programlisting>
1948 /*********************************************************************
1949  *
1950  * Function    :  FUNCTION_NAME
1951  *
1952  * Description :  (Fill me in with a good description!)
1953  *
1954  * parameters  :
1955  *          1  :  param1 = pointer to an important thing
1956  *          2  :  x      = pointer to something else
1957  *
1958  * Returns     :  0 => Ok, everything else is an error.
1959  *
1960  *********************************************************************/
1961 int FUNCTION_NAME( void *param1, const char *x )
1962 {
1963    ...
1964    return( 0 );
1965
1966 }
1967 </programlisting>
1968
1969     <para><emphasis>Note:</emphasis> If we all follow this practice, we should be
1970     able to parse our code to create a "self-documenting" web
1971     page.</para>
1972
1973   </sect2>
1974
1975   </sect1>
1976
1977   <!--   ~~~~~       New section      ~~~~~     -->
1978   <sect1 id="testing"><title>Testing Guidelines</title>
1979     <para>To be filled.
1980 </para>
1981
1982     <!--   ~~~~~       New section      ~~~~~     -->
1983     <sect2 id="testing-plan"><title>Testplan for releases</title>
1984       <para>
1985        Explain release numbers. major, minor. developer releases. etc.
1986
1987 <orderedlist numeration="arabic">
1988           <listitem><para>
1989 Remove any existing rpm with rpm -e
1990 </para></listitem>
1991           <listitem><para>
1992 Remove any file that was left over. This includes (but is not limited to)
1993       <itemizedlist>
1994                 <listitem><para>/var/log/privoxy</para></listitem>
1995                 <listitem><para>/etc/privoxy</para></listitem>
1996                 <listitem><para>/usr/sbin/privoxy</para></listitem>
1997                 <listitem><para>/etc/init.d/privoxy</para></listitem>
1998                 <listitem><para>/usr/doc/privoxy*</para></listitem>
1999               </itemizedlist>
2000 </para></listitem>
2001           <listitem><para>
2002 Install the rpm. Any error messages?
2003 </para></listitem>
2004           <listitem><para>start,stop,status <application>Privoxy</application> with the specific script
2005       (e.g. /etc/rc.d/init/privoxy stop). Reboot your machine. Does
2006       autostart work?</para></listitem>
2007           <listitem><para>Start browsing. Does <application>Privoxy</application> work? Logfile written?</para></listitem>
2008           <listitem><para>Remove the rpm. Any error messages? All files removed?</para></listitem>
2009         </orderedlist>
2010 </para>
2011     </sect2>
2012
2013     <!--   ~~~~~       New section      ~~~~~     -->
2014     <sect2 id="testing-report"><title>Test reports</title>
2015       <para>
2016 Please submit test reports only with the <ulink url="http://sourceforge.net/tracker/?func=add&amp;group_id=11118&amp;atid=395005">test form</ulink>
2017 at sourceforge. Three simple steps:
2018         <itemizedlist>
2019           
2020           <listitem><para>Select category: the distribution you test on.</para></listitem>
2021           <listitem><para>Select group: the version of <application>Privoxy</application> that we are about to release.</para></listitem>
2022           <listitem><para>Fill the Summary and Detailed Description with something
2023               intelligent (keep it short and precise).</para>
2024           </listitem>
2025         </itemizedlist>
2026         Do not mail to the mailing list (we cannot keep track on issues there).
2027       </para>
2028     </sect2>
2029     
2030   </sect1>
2031
2032   <!--   ~~~~~       New section      ~~~~~     -->
2033   <sect1 id="newrelease"><title>Releasing a New Version</title>
2034     <para>
2035         When we release versions of <application>Privoxy</application>,
2036         our work leaves our cozy secret lab and has to work in the cold
2037         RealWorld[tm]. Once it is released, there is no way to call it
2038         back, so it is very important that great care is taken to ensure
2039         that everything runs fine, and not to introduce problems in the
2040         very last minute.
2041     </para>
2042     <para>
2043         So when releasing a new version, please adhere exactly to the
2044         procedure outlined in this chapter.
2045     </para>
2046
2047     <para>
2048         The following programs are required to follow this process:
2049         <filename>ncftpput</filename> (ncftp), <filename>scp, ssh</filename> (ssh),
2050         <filename>gmake</filename> (GNU's version of make), autoconf, cvs.
2051     </para>
2052
2053     <sect2 id="versionnumbers">
2054     <title>Version numbers</title>
2055
2056     <para>
2057       First you need to determine which version number the release will have. 
2058       <application>Privoxy</application> version numbers consist of three numbers,
2059       separated by dots, like in X.Y.Z (e.g. 3.0.0), where:
2060         <itemizedlist>
2061           <listitem>
2062             <para>
2063               X, the version major, is rarely ever changed. It is increased by one if
2064               turning a development branch into stable substantially changes the functionality,
2065               user interface or configuration syntax. Majors 1 and 2 were 
2066               <application>Junkbuster</application>, and 3 will be the first stable
2067               <application>Privoxy</application> release.
2068             </para>
2069           </listitem>
2070           <listitem>
2071             <para>
2072               Y, the version minor, represents the branch within the major version.
2073               At any point in time, there are two branches being maintained:
2074               The stable branch, with an even minor, say, 2N, in which no functionality is
2075               being added and only bug-fixes are made, and 2N+1, the development branch, in
2076               which the further development of <application>Privoxy</application> takes
2077               place.
2078               This enables us to turn the code upside down and inside out, while at the same time
2079               providing and maintaining a stable version.
2080               The minor is reset to zero (and one) when the major is incremented. When a development
2081               branch has matured to the point where it can be turned into stable, the old stable branch
2082               2N is given up (i.e. no longer maintained), the former development branch 2N+1 becomes the
2083               new stable branch 2N+2, and a new development branch 2N+3 is opened.
2084             </para>
2085           </listitem>
2086           <listitem>
2087             <para>
2088               Z, the point or sub version, represents a release of the software within a branch.
2089               It is therefore incremented immediately before each code freeze. 
2090               In development branches, only the even point versions correspond to actual releases,
2091               while the odd ones denote the evolving state of the sources on CVS in between.
2092               It follows that Z is odd on CVS in development branches most of the time. There, it gets
2093               increased to an even number immediately before a code freeze, and is increased to an odd
2094               number again immediately thereafter.
2095               This ensures that builds from CVS snapshots are easily distinguished from released versions.
2096               The point version is reset to zero when the minor changes.
2097             </para>
2098             <para>
2099               Stable branches work a little differently, since there should be
2100               little to no development happening in such branches. Remember,
2101               only bugfixes, which presumably should have had some testing
2102               before being committed. Stable branches will then have their 
2103               version reported as <literal>0.0.0</literal>, during that period 
2104               between releases when changes are being added. This is to denote 
2105               that this code is <emphasis>not for release</emphasis>. Then 
2106               as the release nears, the version is bumped according: e.g. 
2107               <literal>3.0.1 -> 0.0.0 -> 3.0.2</literal>.
2108             </para>
2109           </listitem>
2110         </itemizedlist>
2111     </para>
2112     <para>
2113      In summary, the main CVS trunk is the development branch where new
2114      features are being worked on for the next stable series. This should
2115      almost always be where the most activity takes place. There is always at
2116      least one stable branch from the trunk, e.g now it is
2117      <literal>3.0</literal>, which is only used to release stable versions.
2118      Once the initial *.0 release of the stable branch has been done, then as a
2119      rule, only bugfixes that have had prior testing should be committed to
2120      the stable branch. Once there are enough bugfixes to justify a new
2121      release, the version of this branch is again incremented Example: 3.0.0
2122      -> 3.0.1 -> 3.0.2, etc are all stable releases from within the stable
2123      branch. 3.1.x is currently the main trunk, and where work on 3.2.x is
2124      taking place. If any questions, please post to the devel list
2125      <emphasis>before</emphasis> committing to a stable branch!
2126     </para>
2127     <para>
2128      Developers should remember too that if they commit a bugfix to the stable 
2129      branch, this will more than likely require a separate submission to the 
2130      main trunk, since these are separate development trees within CVS. If you 
2131      are working on both, then this would require at least two separate check
2132      outs (i.e main trunk, <emphasis>and</emphasis> the stable release branch,
2133      which is <literal>v_3_0_branch</literal> at the moment).
2134     </para>
2135
2136     </sect2>
2137      
2138     <sect2 id="beforerelease">
2139     <title>Before the Release: Freeze</title>
2140      <para>
2141        The following <emphasis>must be done by one of the
2142        developers</emphasis> prior to each new release.
2143      </para>
2144      <para>
2145       <itemizedlist>
2146        <listitem>
2147         <para>
2148          Make sure that everybody who has worked on the code in the last
2149          couple of days has had a chance to yell <quote>no!</quote> in case
2150          they have pending changes/fixes in their pipelines. Announce the
2151          freeze so that nobody will interfere with last minute changes.
2152         </para>
2153       </listitem> 
2154       <listitem>
2155        <para>
2156          Increment the version number (point from odd to even in development
2157          branches!) in <filename>configure.in</filename>. (RPM spec files 
2158          will need to be incremented as well.)
2159        </para>
2160       </listitem> 
2161       <listitem>
2162        <para>
2163         If <filename>default.action</filename> has changed since last
2164         release (i.e. software release or standalone actions file release),
2165         bump up its version info to A.B in this line:
2166        </para>
2167        <para> 
2168         <programlisting>
2169   {+add-header{X-Actions-File-Version: A.B} -filter -no-popups}
2170 </programlisting>
2171        </para>
2172        <para> 
2173         Then change the version info in doc/webserver/actions/index.php,
2174         line: '$required_actions_file_version = "A.B";'
2175        </para>
2176       </listitem>
2177       <listitem>
2178        <para>
2179         All documentation should be rebuild after the version bump.
2180         Finished docs should be then be committed to CVS (for those 
2181         without the ability to build these). Some docs may require 
2182         rather obscure processing tools. <filename>config</filename>,
2183         the man page (and the html version of the man page), and the PDF docs
2184         fall in this category. REAMDE, the man page, AUTHORS, and config
2185         should all also be committed to CVS for other packagers. The 
2186         formal docs should be uploaded to the webserver. See the
2187         Section "Updating the webserver" in this manual for details.
2188        </para>
2189       </listitem> 
2190       <listitem>
2191        <para>
2192          The <citetitle>User Manual</citetitle> is also used for context 
2193          sensitive help for the CGI editor. This is version sensitive, so that
2194          the user will get appropriate help for his/her release. So with 
2195          each release a fresh version should be uploaded to the webserver
2196          (this is in addition to the main <citetitle>User Manual</citetitle>
2197          link from the main page since we need to keep manuals for various 
2198          versions available). The CGI pages will link to something like 
2199          <literal>http://privoxy.org/$(VERSION)/user-manual/</literal>. This
2200          will need to be updated for each new release. There is no Makefile
2201          target for this at this time!!! It needs to be done manually.
2202        </para>
2203       </listitem> 
2204       <listitem>
2205        <para>
2206         All developers should look at the <filename>ChangeLog</filename> and
2207         make sure noteworthy changes are referenced.
2208        </para>
2209      </listitem> 
2210       <listitem>
2211        <para>
2212         <emphasis>Commit all files that were changed in the above steps!</emphasis>
2213        </para>
2214       </listitem>
2215       <listitem>
2216        <para>
2217         Tag all files in CVS with the version number with
2218         <quote><command>cvs tag v_X_Y_Z</command></quote>.
2219         Don't use vX_Y_Z, ver_X_Y_Z, v_X.Y.Z (won't work) etc.
2220        </para>
2221       </listitem> 
2222      <listitem>
2223        <para>
2224         If the release was in a development branch, increase the point version
2225         from even to odd (X.Y.(Z+1)) again in <filename>configure.in</filename> and
2226         commit your change.
2227        </para>
2228       </listitem> 
2229      <listitem>
2230        <para>
2231         On the webserver, copy the user manual to a new top-level directory
2232         called <filename>X.Y.Z</filename>. This ensures that help links from the CGI
2233         pages, which have the version as a prefix, will go into the right version of the manual.
2234         If this is a development branch release, also symlink <filename>X.Y.(Z-1)</filename>
2235         to <filename>X.Y.Z</filename> and <filename>X.Y.(Z+1)</filename> to
2236         <filename>.</filename> (i.e. dot). 
2237        </para>
2238       </listitem> 
2239       </itemizedlist>
2240      </para> 
2241     </sect2>
2242     
2243     <sect2 id="therelease">
2244     <title>Building and Releasing the Packages</title>
2245      <para>
2246       Now the individual packages can be built and released. Note that for
2247       GPL reasons the first package to be released is always the source tarball.
2248      </para>
2249  
2250      <para>
2251       For <emphasis>all</emphasis> types of packages, including the source tarball,
2252       <emphasis>you must make sure that you build from clean sources by exporting
2253       the right version from CVS into an empty directory</emphasis> (just press return when
2254       asked for a password):
2255      </para>
2256       
2257      <para>
2258       <programlisting>
2259   mkdir dist # delete or choose different name if it already exists
2260   cd dist
2261   cvs -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa login
2262   cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa export -r v_X_Y_Z current
2263 </programlisting>
2264     </para>
2265   
2266     <para>
2267      <emphasis>Do NOT change</emphasis> a single bit, including, but not limited to
2268      version information after export from CVS. This is to make sure that
2269      all release packages, and with them, all future bug reports, are based
2270      on exactly the same code.
2271     </para>
2272   
2273     <warning>
2274      <para>
2275       Every significant release of Privoxy has included at least one 
2276       package that either had incorrect versions of files, missing files, 
2277       or incidental leftovers from a previous build process that gave 
2278       unknown numbers of users headaches to try to figure out what was 
2279       wrong. PLEASE, make sure you are using pristene sources, and are
2280       following the prescribed process!
2281      </para>
2282     </warning>
2283
2284     <para>
2285      Please find additional instructions for the source tarball and the
2286      individual platform dependent binary packages below. And details 
2287      on the Sourceforge release process below that.
2288     </para>
2289
2290     <sect3 id="pack-guidelines">
2291     <title>Note on Privoxy Packaging</title>
2292      <para>
2293       Please keep these general guidelines in mind when putting together 
2294       your package. These apply to <emphasis>all</emphasis> platforms!
2295      </para>
2296      <para>
2297       <itemizedlist>
2298        <listitem>
2299         <para>
2300           <application>Privoxy</application> <emphasis>requires</emphasis>
2301           write access to: all <filename>*.action</filename> files, all 
2302           logfiles, and the <filename>trust</filename> file. You will 
2303           need to determine the best way to do this for your platform.
2304         </para>
2305        </listitem> 
2306        <listitem>
2307         <para>
2308           Please include up to date documentation. At a bare minimum:
2309         </para>
2310         <simplelist>
2311          <member>
2312           <filename>LICENSE</filename> (top-level directory)
2313          </member>
2314         </simplelist>
2315         <simplelist>
2316          <member>
2317           <filename>README</filename> (top-level directory)
2318          </member>
2319         </simplelist>
2320         <simplelist>
2321          <member>
2322           <filename>AUTHORS</filename> (top-level directory)
2323          </member>
2324         </simplelist>
2325         <simplelist>
2326          <member>
2327           <filename>man page</filename> (top-level directory, Unix-like
2328           platforms only)
2329          </member>
2330         </simplelist>
2331         <simplelist>
2332          <member>
2333           <filename>The User Manual</filename> (doc/webserver/user-manual/)
2334          </member>
2335         </simplelist>
2336         <simplelist>
2337          <member>
2338           <filename>FAQ</filename> (doc/webserver/faq/)
2339          </member>
2340         </simplelist>
2341         <para>
2342           Also suggested: <filename>Developer Manual</filename>
2343           (doc/webserver/developer-manual) and <filename>ChangeLog</filename>
2344           (top-level directory). <filename>FAQ</filename> and the manuals are
2345           HTML docs. There are also text versions in
2346           <filename>doc/text/</filename> which could conceivably also be
2347           included.
2348         </para>
2349         <para>
2350          The documentation has been designed such that the manuals are linked
2351          to each other from parallel directories, and should be packaged 
2352          that way. <filename>privoxy-index.html</filename> can also be
2353          included and can serve as a focal point for docs and other links of
2354          interest (and possibly renamed to <filename>index.html</filename>).
2355          This should be one level up from the manuals. There is a link also 
2356          on this page to an HTMLized version of the man page. To avoid 404 for
2357          this, it is in CVS as
2358          <filename>doc/webserver/man-page/privoxy-man-page.html</filename>,
2359          and should be included along with the manuals. There is also a
2360          css stylesheets that can be included for better presentation:
2361          <filename>p_doc.css</filename>. This should be in the same directory
2362          with <filename>privoxy-index.html</filename>, (i.e. one level up from
2363          the manual directories).
2364         </para>
2365       </listitem> 
2366       <listitem>
2367        <para>
2368         <filename>user.action</filename> and <filename>user.filter</filename>
2369         are designed for local preferences. Make sure these do not get overwritten!
2370         <filename>config</filename> should not be overwritten either. This 
2371         has especially important configuration data in it.
2372         <filename>trust</filename> should be left in tact as well.
2373        </para>
2374       </listitem> 
2375       <listitem>
2376        <para>
2377         Other configuration files (<filename>default.action</filename> and
2378         <filename>default.filter</filename>) should be installed as the new
2379         defaults, but all previously installed configuration files should be
2380         preserved as backups. This is just good manners :-) These files are
2381         likely to change between releases and contain important new features
2382         and bug fixes.
2383        </para>
2384      </listitem> 
2385      <listitem>
2386       <para>
2387        Please check platform specific notes in this doc, if you haven't 
2388        done <quote>Privoxy</quote> packaging before for other platform 
2389        specific issues. Conversely, please add any notes that you know 
2390        are important for your platform (or contact one of the doc 
2391        maintainers to do this if you can't).
2392       </para>
2393     </listitem> 
2394     <listitem>
2395      <para>
2396        Packagers should do a <quote>clean</quote> install of their 
2397        package after building it. So any previous installs should be 
2398        removed first to ensure the integrity of the newly built package. 
2399        Then run the package for a while to make sure there are no 
2400        obvious problems, before uploading.
2401      </para>
2402     </listitem> 
2403
2404       </itemizedlist>
2405      </para> 
2406     
2407     </sect3>
2408
2409     <sect3 id="newrelease-tarball"><title>Source Tarball</title>
2410         <para>
2411         First, <emphasis>make sure that you have freshly exported the right
2412         version into an empty directory</emphasis>. (See "Building and releasing
2413         packages" above). Then run:
2414         </para>
2415         <para>
2416         <programlisting>
2417   cd current
2418   autoheader && autoconf && ./configure
2419 </programlisting>
2420         </para>
2421         <para>
2422         Then do:
2423         </para>
2424         <para>
2425         <programlisting>
2426   make tarball-dist
2427 </programlisting>
2428         </para>
2429         <para>
2430         To upload the package to Sourceforge, simply issue
2431         </para>
2432         <para>
2433         <programlisting>
2434   make tarball-upload
2435 </programlisting>
2436         </para>
2437         <para>
2438         Go to the displayed URL and release the file publicly on Sourceforge.
2439         For the change log field, use the relevant section of the
2440         <filename>ChangeLog</filename> file.
2441       </para>
2442     </sect3>
2443
2444     <sect3 id="newrelease-rpm"><title>SuSE, Conectiva or Red Hat RPM</title>
2445         <para>
2446         In following text, replace <replaceable class="parameter">dist</replaceable>
2447         with either <quote>rh</quote> for Red Hat or <quote>suse</quote> for SuSE.
2448         </para>
2449         <para>
2450         First, <emphasis>make sure that you have freshly exported the right
2451         version into an empty directory</emphasis>. (See "Building and releasing
2452         packages" above). 
2453         </para>
2454         <para>
2455         As the only exception to not changing anything after export from CVS,
2456         now examine the file <filename>privoxy-</filename><replaceable class="parameter">dist</replaceable><filename>.spec</filename>
2457         and make sure that the version information and the RPM release number are
2458         correct. The RPM release numbers for each version start at one. Hence it must
2459         be reset to one if this is the first RPM for
2460         <replaceable class="parameter">dist</replaceable> which is built from version
2461         X.Y.Z. Check the
2462         <ulink url="http://sourceforge.net/project/showfiles.php?group_id=11118">file
2463         list</ulink> if unsure. Else, it must be set to the highest already available RPM
2464         release number for that version plus one.
2465         </para>
2466         <para>
2467         Then run:
2468         </para>
2469         <para>
2470         <programlisting>
2471   cd current
2472   autoheader && autoconf && ./configure
2473 </programlisting>
2474         </para>
2475         <para>
2476         Then do
2477         </para>
2478         <para>
2479         <programlisting>
2480   make <replaceable class="parameter">dist</replaceable>-dist
2481 </programlisting>
2482         </para>
2483         <para>
2484         To upload the package to Sourceforge, simply issue
2485         </para>
2486         <para>
2487         <programlisting>
2488   make <replaceable class="parameter">dist</replaceable>-upload <replaceable class="parameter">rpm_packagerev</replaceable>
2489 </programlisting>
2490         </para>
2491         <para>
2492         where <replaceable class="parameter">rpm_packagerev</replaceable> is the
2493         RPM release number as determined above.
2494         Go to the displayed URL and release the file publicly on Sourceforge.
2495         Use the release notes and change log from the source tarball package.
2496       </para>
2497     </sect3>
2498
2499     <sect3 id="newrelease-os2"><title>OS/2</title>
2500       <para>
2501         First, <emphasis>make sure that you have freshly exported the right
2502         version into an empty directory</emphasis>. (See "Building and releasing
2503         packages" above). Then get the OS/2 Setup module:
2504         </para>
2505         <para>
2506         <programlisting>
2507   cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co os2setup
2508 </programlisting>
2509         </para>
2510         <para>
2511         You will need a mix of development tools.
2512         The main compilation takes place with IBM Visual Age C++.
2513         Some ancillary work takes place with GNU tools, available from
2514         various sources like hobbes.nmsu.edu.
2515         Specificially, you will need <filename>autoheader</filename>,
2516         <filename>autoconf</filename> and <filename>sh</filename> tools.
2517         The packaging takes place with WarpIN, available from various sources, including
2518         its home page: <ulink url="http://www.xworkplace.org/">xworkplace</ulink>.
2519         </para>
2520         <para>
2521         Change directory to the <filename>os2setup</filename> directory.
2522         Edit the os2build.cmd file to set the final executable filename.
2523         For example, 
2524         </para>
2525         <para>
2526         <programlisting>
2527   installExeName='privoxyos2_setup_X.Y.Z.exe'
2528 </programlisting>
2529         </para>
2530         <para>
2531         Next, edit the <filename>IJB.wis</filename> file so the release number matches
2532         in the <filename>PACKAGEID</filename> section:
2533         </para>
2534         <para>
2535         <programlisting>
2536   PACKAGEID="Privoxy Team\Privoxy\Privoxy Package\X\Y\Z"
2537 </programlisting>
2538         </para>
2539         <para>
2540         You're now ready to build.  Run:
2541         </para>
2542         <para>
2543         <programlisting>
2544   os2build
2545 </programlisting>
2546         </para>
2547         <para>
2548          You will find the  WarpIN-installable executable in the
2549         <filename>./files</filename> directory. Upload this anonymously to
2550          <filename>uploads.sourceforge.net/incoming</filename>, create a release
2551          for it, and you're done. Use the release notes and Change Log from the
2552          source tarball package.
2553         </para>
2554     </sect3>
2555
2556     <sect3 id="newrelease-solaris"><title>Solaris</title>
2557       <para>
2558         Login to Sourceforge's compilefarm via ssh:
2559         </para>
2560         <para>
2561         <programlisting>
2562   ssh cf.sourceforge.net
2563 </programlisting>
2564         </para>
2565         <para>
2566         Choose the right operating system (not the Debian one).
2567         When logged in, <emphasis>make sure that you have freshly exported the right
2568         version into an empty directory</emphasis>. (See "Building and releasing
2569         packages" above). Then run:
2570         </para>
2571         <para>
2572         <programlisting>
2573   cd current
2574   autoheader && autoconf && ./configure
2575 </programlisting>
2576         </para>
2577         <para>
2578         Then run
2579         </para>
2580         <para>
2581         <programlisting>
2582   gmake solaris-dist
2583 </programlisting>
2584         </para>
2585         <para>
2586         which creates a gzip'ed tar archive. Sadly, you cannot use <command>make
2587         solaris-upload</command> on the Sourceforge machine (no ncftpput). You now have
2588         to manually upload the archive to Sourceforge's ftp server and release
2589         the file publicly. Use the release notes and Change Log from the
2590         source tarball package.
2591         </para>
2592     </sect3>
2593
2594     <sect3 id="newrelease-windows"><title>Windows</title>
2595       <para>
2596         You should ensure you have the latest version of Cygwin (from
2597         <ulink url="http://www.cygwin.com/">http://www.cygwin.com/</ulink>).
2598         Run the following commands from within a Cygwin bash shell.
2599       </para>
2600       <para>
2601         First, <emphasis>make sure that you have freshly exported the right
2602         version into an empty directory</emphasis>. (See "Building and releasing
2603         packages" above). Then get the Windows setup module:
2604       </para>
2605       <para>
2606       <programlisting>
2607   cvs -z3  -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co winsetup
2608 </programlisting>
2609       </para>
2610       <para>
2611         Then you can build the package.  This is fully automated, and is
2612         controlled by <filename>winsetup/GNUmakefile</filename>.
2613         All you need to do is:
2614       </para>
2615       <para>
2616       <programlisting>
2617   cd winsetup
2618   make
2619 </programlisting>
2620       </para>
2621       <para>
2622         Now you can manually rename <filename>privoxy_setup.exe</filename> to
2623         <filename>privoxy_setup_X_Y_Z.exe</filename>, and upload it to
2624         SourceForge. When releasing the package on SourceForge, use the release notes
2625         and Change Log from the source tarball package.
2626       </para>
2627     </sect3>
2628
2629     <sect3 id="newrelease-debian"><title>Debian</title>
2630       <para>
2631         First, <emphasis>make sure that you have freshly exported the
2632         right version into an empty directory</emphasis>. (See
2633         "Building and releasing packages" above).  Then add a log
2634         entry to <filename>debian/changelog</filename>, if it is not
2635         already there, for example by running:
2636       </para>
2637       <para>
2638         <programlisting>
2639   debchange -v &p-version;-&p-status;-1 "New upstream version"
2640 </programlisting>
2641       </para>
2642       <para>
2643         Then, run: 
2644       </para>
2645       <para>
2646         <programlisting>
2647   dpkg-buildpackage -rfakeroot -us -uc -b
2648 </programlisting>
2649       </para>
2650       <para>
2651         This will create
2652         <filename>../privoxy_&p-version;-&p-status;-1_i386.deb</filename>
2653         which can be uploaded.  To upload the package to Sourceforge, simply
2654         issue
2655       </para>
2656       <para>
2657         <programlisting>
2658   make debian-upload
2659 </programlisting>
2660       </para>
2661     </sect3>
2662
2663     <sect3 id="newrelease-macosx"><title>Mac OS X</title>
2664       <para>
2665         First, <emphasis>make sure that you have freshly exported the right
2666         version into an empty directory</emphasis>. (See "Building and releasing
2667         packages" above). Then get the Mac OS X setup module:
2668         </para>
2669         <para>
2670         <programlisting>
2671   cvs -z3 -d:pserver:anonymous@ijbswa.cvs.sourceforge.net:/cvsroot/ijbswa co osxsetup
2672 </programlisting>
2673         </para>
2674         <para>
2675         Then run:
2676         </para>
2677         <para>
2678         <programlisting>
2679   cd osxsetup
2680   build
2681 </programlisting>
2682         </para>
2683         <para>
2684         This will run <filename>autoheader</filename>, <filename>autoconf</filename> and
2685         <filename>configure</filename> as well as <filename>make</filename>.
2686         Finally, it will copy over the necessary files to the ./osxsetup/files directory
2687         for further processing by <filename>PackageMaker</filename>.
2688         </para>
2689         <para>
2690         Bring up PackageMaker with the PrivoxyPackage.pmsp definition file, modify the package
2691         name to match the release, and hit the "Create package" button.
2692         If you specify ./Privoxy.pkg as the output package name, you can then create
2693         the distributable zip file with the command:
2694         </para>
2695         <para>
2696         <programlisting>
2697   zip -r privoxyosx_setup_x.y.z.zip Privoxy.pkg
2698 </programlisting>
2699         </para>
2700         <para>
2701         You can then upload <filename>privoxyosx_setup_x.y.z.zip</filename> anonymously to 
2702         <filename>uploads.sourceforge.net/incoming</filename>,
2703         create a release for it, and you're done. Use the release notes
2704         and Change Log from the source tarball package.
2705         </para>
2706     </sect3>
2707
2708     <sect3 id="newrelease-freebsd"><title>FreeBSD</title>
2709       <para>
2710         Login to Sourceforge's compile-farm via ssh:
2711         </para>
2712         <para>
2713         <programlisting>
2714   ssh cf.sourceforge.net
2715 </programlisting>
2716         </para>
2717         <para>
2718         Choose the right operating system.
2719         When logged in, <emphasis>make sure that you have freshly exported the right
2720         version into an empty directory</emphasis>. (See "Building and releasing
2721         packages" above). Then run:
2722         </para>
2723         <para>
2724         <programlisting>
2725   cd current
2726   autoheader && autoconf && ./configure
2727 </programlisting>
2728         </para>
2729         <para>
2730         Then run:
2731         </para>
2732         <para>
2733         <programlisting>
2734   gmake freebsd-dist
2735 </programlisting>
2736         </para>
2737         <para>
2738         which creates a gzip'ed tar archive. Sadly, you cannot use <command>make
2739         freebsd-upload</command> on the Sourceforge machine (no ncftpput). You now have
2740         to manually upload the archive to Sourceforge's ftp server and release
2741         the file publicly. Use the release notes and Change Log from the
2742         source tarball package.
2743         </para>
2744     </sect3>
2745
2746     <sect3 id="newrelease-hpux"><title>HP-UX 11</title>
2747       <para>
2748         First, <emphasis>make sure that you have freshly exported the right
2749         version into an empty directory</emphasis>. (See "Building and releasing
2750         packages" above). Then run:
2751         </para>
2752         <para>
2753         <programlisting>
2754   cd current
2755   autoheader && autoconf && ./configure
2756 </programlisting>
2757         </para>
2758         <para>
2759         Then do FIXME.
2760         </para>
2761     </sect3>
2762
2763     <sect3 id="newrelease-amiga"><title>Amiga OS</title>
2764       <para>
2765         First, <emphasis>make sure that you have freshly exported the right
2766         version into an empty directory</emphasis>. (See "Building and releasing
2767         packages" above). Then run:
2768         </para>
2769         <para>
2770         <programlisting>
2771   cd current
2772   autoheader && autoconf && ./configure
2773 </programlisting>
2774         </para>
2775         <para>
2776         Then do FIXME.
2777         </para>
2778     </sect3>
2779
2780     <sect3 id="newrelease-aix"><title>AIX</title>
2781       <para>
2782         Login to Sourceforge's compilefarm via ssh:
2783         </para>
2784         <para>
2785         <programlisting>
2786   ssh cf.sourceforge.net
2787 </programlisting>
2788         </para>
2789         <para>
2790         Choose the right operating system.
2791         When logged in, <emphasis>make sure that you have freshly exported the right
2792         version into an empty directory</emphasis>. (See "Building and releasing
2793         packages" above). Then run:
2794         </para>
2795         <para>
2796         <programlisting>
2797   cd current
2798   autoheader && autoconf && ./configure
2799 </programlisting>
2800         </para>
2801         <para>
2802         Then run:
2803         </para>
2804         <para>
2805         <programlisting>
2806   make aix-dist
2807 </programlisting>
2808         </para>
2809         <para>
2810         which creates a gzip'ed tar archive. Sadly, you cannot use <command>make
2811         aix-upload</command> on the Sourceforge machine (no ncftpput). You now have
2812         to manually upload the archive to Sourceforge's ftp server and release
2813         the file publicly. Use the release notes and Change Log from the
2814         source tarball package.
2815         </para>
2816     </sect3>
2817    </sect2>
2818
2819    <sect2 id="releasing">
2820    <title>Uploading and Releasing Your Package</title>
2821     <para>
2822       After the package is ready, it is time to upload it 
2823       to SourceForge, and go through the release steps. The upload
2824       is done via FTP:
2825     </para>
2826      <para>
2827       <itemizedlist>
2828        <listitem>
2829         <para>
2830           Upload to: <ulink url="ftp://upload.sourceforge.net/incoming">ftp://upload.sourceforge.net/incoming</ulink>
2831         </para>
2832       </listitem> 
2833       <listitem>
2834        <para>
2835          user: <literal>anonymous</literal>
2836        </para>
2837       </listitem> 
2838       <listitem>
2839        <para>
2840          password: <literal>ijbswa-developers@lists.sourceforge.net</literal>
2841        </para>
2842       </listitem> 
2843      </itemizedlist>
2844     </para> 
2845     <para>
2846      Or use the <command>make</command> targets as described above.
2847     </para>
2848     <para>
2849      Once this done go to <ulink
2850       url="https://sourceforge.net/project/admin/editpackages.php?group_id=11118"
2851       >https://sourceforge.net/project/admin/editpackages.php?group_id=11118</ulink>, 
2852      making sure you are logged in. Find your target platform in the 
2853      second column, and click <literal>Add Release</literal>. You will 
2854      then need to create a new release for your package, using the format 
2855      of <literal>$VERSION ($CODE_STATUS)</literal>, e.g. <emphasis>&p-version;
2856      (beta)</emphasis>.
2857     </para>
2858     <para>
2859      Now just follow the prompts. Be sure to add any appropriate Release
2860      notes. You should see your freshly uploaded packages in 
2861      <quote>Step 2. Add Files To This Release</quote>. Check the 
2862      appropriate box(es). Remember at each step to hit the 
2863      <quote>Refresh/Submit</quote> buttons! You should now see your 
2864      file(s) listed in Step 3. Fill out the forms with the appropriate 
2865      information for your platform, being sure to hit <quote>Update</quote>
2866      for each file. If anyone is monitoring your platform, check the 
2867      <quote>email</quote> box at the very bottom to notify them of 
2868      the new package. This should do it!
2869     </para>
2870     <para>
2871      If you have made errors, or need to make changes, you can go through 
2872      essentially the same steps, but select <literal>Edit Release</literal>, 
2873      instead of <literal>Add Release</literal>.
2874     </para>
2875    </sect2>
2876
2877     <sect2 id="afterrelease">
2878     <title>After the Release</title>
2879      <para>
2880       When all (or: most of the) packages have been uploaded and made available,
2881       send an email to the <ulink url="mailto:ijbswa-announce@lists.sourceforge.net">announce
2882       mailing list</ulink>, Subject: "Version X.Y.Z available for download". Be sure to
2883       include the
2884       <ulink url="http://sourceforge.net/project/showfiles.php?group_id=11118">download
2885       location</ulink>, the release notes and the Changelog. Also, post an
2886       updated News item on the project page Sourceforge, and update the Home 
2887       page and docs linked from the Home page (see below). Other news sites
2888       and release oriented sites, such as Freshmeat, should also be notified.
2889      </para>
2890    </sect2>
2891
2892   </sect1>
2893   
2894   <!--   ~~~~~       New section      ~~~~~     -->
2895   <sect1 id="webserver-update"><title>Update the Webserver</title>
2896    <para>
2897     The webserver should be updated at least with each stable release. When
2898     updating, please follow these steps to make sure that no broken links,
2899     inconsistent contents or permission problems will occur (as it has many 
2900     times in the past!):
2901    </para>
2902    <para>
2903     If you have changed anything in the stable-branch documentation source
2904     SGML files, do:
2905    </para>
2906    <para>
2907     <programlisting>
2908   make dok dok-pdf # (or 'make redhat-dok dok-pdf' if 'make dok' doesn't work for you)
2909 </programlisting>
2910    </para>
2911    <para>
2912     That will generate <filename>doc/webserver/user-manual</filename>,
2913     <filename>doc/webserver/developer-manual</filename>,
2914     <filename>doc/webserver/faq</filename>, 
2915     <filename>doc/pdf/*.pdf</filename> and
2916     <filename>doc/webserver/index.html</filename> automatically.
2917    </para>
2918    <para>
2919     If you changed the manual page sources, generate
2920     <filename>doc/webserver/man-page/privoxy-man-page.html</filename>
2921     by running <quote><command>make man</command></quote>. (This is
2922     a separate target due to dependencies on some obscure perl scripts
2923     [now in CVS, but not well tested]. See comments in <filename>GNUmakefile</filename>.)
2924    </para>
2925    <para>
2926     If you want to add new files to the webserver, create them locally in
2927     the <filename>doc/webserver/*</filename> directory (or
2928     create new directories under <filename>doc/webserver</filename>).
2929    </para>
2930    <para>
2931     Next, commit any changes from the above steps to CVS. All set? 
2932     If these are docs in the stable branch, then do:
2933    </para>
2934    <para>
2935     <programlisting>
2936   make webserver
2937 </programlisting>
2938    </para>
2939    <para>
2940     This will do the upload to <ulink url="http://www.privoxy.org/">the
2941     webserver</ulink> (www.privoxy.org) and ensure all files and directories
2942     there are group writable.
2943    </para>
2944    <para>
2945     Please do <emphasis>NOT</emphasis> use any other means of transferring
2946     files to the webserver to avoid permission problems. Also, please do not
2947     upload docs from development branches or versions. The publicly posted
2948     docs should be in sync with the last official release.
2949    </para>
2950   </sect1>
2951
2952   <!--   ~~~~~       New section      ~~~~~     -->
2953   <sect1 id="contact"><title>Contacting the developers, Bug Reporting and Feature Requests</title>
2954 <!-- Include contacting.sgml  -->
2955  &contacting;
2956 <!-- end contacting -->
2957   </sect1>
2958   
2959
2960 <!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->
2961 <sect1 id="copyright"><title>Privoxy Copyright, License and History</title>
2962
2963 <!-- Include copyright.sgml -->
2964  &copyright;
2965 <!-- end -->
2966
2967 <!--   ~~~~~       New section      ~~~~~     -->
2968 <sect2><title>License</title>
2969 <!-- Include copyright.sgml: -->
2970  &license;
2971 <!-- end copyright -->
2972 </sect2>
2973 <!--  ~  End section  ~  -->
2974
2975 <!--   ~~~~~       New section      ~~~~~     -->
2976 <sect2><title>History</title>
2977 <!-- Include history.sgml -->
2978  &history;
2979 <!-- end -->
2980 </sect2>
2981
2982 </sect1>
2983   
2984   <!--   ~~~~~       New section      ~~~~~     -->
2985   <sect1 id="seealso"><title>See also</title>
2986 <!-- Include seealso.sgml -->
2987  &seealso;
2988 <!-- end  -->
2989
2990   </sect1>
2991
2992   <!--
2993
2994   This program is free software; you can redistribute it 
2995   and/or modify it under the terms of the GNU General
2996   Public License as published by the Free Software
2997   Foundation; either version 2 of the License, or (at
2998   your option) any later version.
2999
3000   This program is distributed in the hope that it will
3001   be useful, but WITHOUT ANY WARRANTY; without even the
3002   implied warranty of MERCHANTABILITY or FITNESS FOR A
3003   PARTICULAR PURPOSE.  See the GNU General Public
3004   License for more details.
3005
3006   The GNU General Public License should be included with
3007   this file.  If not, you can view it at
3008   http://www.gnu.org/copyleft/gpl.html
3009   or write to the Free Software Foundation, Inc., 59
3010   Temple Place - Suite 330, Boston, MA  02111-1307, USA.
3011
3012   $Log: developer-manual.sgml,v $
3013   Revision 2.24  2009/01/13 16:50:35  fabiankeil
3014   The standard.action file is gone.
3015
3016   Revision 2.23  2008/09/26 17:02:01  fabiankeil
3017   - Break some more CVS substitutions in examples.
3018   - Remove Junkbusters reference in example header
3019     for new files.
3020
3021   Revision 2.22  2008/08/30 15:37:35  fabiankeil
3022   Update entities.
3023
3024   Revision 2.21  2008/08/16 08:51:28  fabiankeil
3025   Update version-related entities.
3026
3027   Revision 2.20  2008/06/14 13:21:24  fabiankeil
3028   Prepare for the upcoming 3.0.9 beta release.
3029
3030   Revision 2.19  2008/05/12 11:13:33  fabiankeil
3031   Clarify that Privoxy is licensed under GPL version 2.
3032
3033   Revision 2.18  2008/02/04 12:14:06  fabiankeil
3034   Change "Edit Packages" URL to use https.
3035
3036   Revision 2.17  2008/02/03 21:37:41  hal9
3037   Apply patch from Mark: s/OSX/OS X/
3038
3039   Revision 2.16  2008/01/19 17:52:38  hal9
3040   Re-commit to fix various minor issues for new release.
3041
3042   Revision 2.15  2008/01/19 15:03:05  hal9
3043   Doc sources tagged for 3.0.8 release.
3044
3045   Revision 2.14  2008/01/17 01:49:51  hal9
3046   Change copyright notice for docs s/2007/2008/. All these will be rebuilt soon
3047   enough.
3048
3049   Revision 2.13  2007/10/30 17:59:31  fabiankeil
3050   - Bump p-version, p-status and copyright date.
3051   - Mention that the manual is out of date.
3052   - Don't use examples with HardToReadCamelCase after
3053     explaining that we actually don't like that.
3054   - Minor cosmetics.
3055
3056   Revision 2.12  2006/11/14 01:57:46  hal9
3057   Dump all docs prior to 3.0.6 release. Various minor changes to faq and user
3058   manual.
3059
3060   Revision 2.11  2006/09/26 02:36:29  hal9
3061   Fix broken link per bug tracker.
3062
3063   Revision 2.10  2006/09/22 01:27:55  hal9
3064   Final commit of probably various minor changes here and there. Unless
3065   something changes this should be ready for pending release.
3066
3067   Revision 2.9  2006/09/14 02:30:07  hal9
3068   Fix ijbswa cvs links. Update notes on release process, and which config files
3069   should be overwritten and which not.
3070
3071   Revision 2.8  2006/08/22 23:35:01  hal9
3072   Fix email address, cvs URI, address branching changes and various other
3073   small updates.
3074
3075   Revision 2.7  2006/07/18 14:48:50  david__schmidt
3076   Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch)
3077   with what was really the latest development (the v_3_0_branch branch)
3078
3079   Revision 1.46.2.11  2002/12/11 13:12:15  hal9
3080   Rewrite cvs write access give-away section.
3081
3082   Revision 1.46.2.10  2002/09/26 21:53:45  hal9
3083   Changes to reflect recent change in stable branch commit policy (hopefully
3084   clearer now).
3085
3086   Revision 1.46.2.9  2002/09/26 01:21:40  hal9
3087   Porting 3.1.1 changes: more on cvs and branches, more on versions and
3088   releases.
3089
3090   Revision 1.46.2.8  2002/08/17 00:16:10  hal9
3091   Add note on updating webserver for User-manual/CGI editor, which is version
3092   dependent (and different from main UM link).
3093
3094   Revision 1.46.2.7  2002/08/14 17:29:25  hal9
3095   Add small notes on post-release steps, and uploading docs to webserver.
3096
3097   Revision 1.46.2.6  2002/08/10 11:40:25  oes
3098   Added disclaimer about probably being out-of-date and two small hints
3099
3100   Revision 1.46.2.5  2002/08/09 01:15:12  hal9
3101   Added some notes on pre-release steps (test builds first, update ChangeLog).
3102
3103   Revision 1.46.2.4  2002/05/29 00:30:59  mal0rd
3104   Fixed a little formatting.  Clarified debian section.
3105
3106   Revision 1.46.2.3  2002/05/28 04:32:45  hal9
3107   Change hints on bundling index.html to privoxy-index.html
3108
3109   Revision 1.46.2.2  2002/05/26 17:04:24  hal9
3110   -Spellcheck, very minor edits, and sync across branches
3111
3112   Revision 1.48  2002/05/26 12:48:31  roro
3113   Add releasing information about Debian.
3114
3115   Revision 1.47  2002/05/26 04:55:11  mal0rd
3116   Added debian-dist and debian-upload targets.  Also documented usage.
3117
3118   Revision 1.46  2002/05/22 17:15:00  oes
3119   Updated intro
3120
3121   Revision 1.45  2002/05/19 23:01:54  hal9
3122   Add small section on general packaging guidelines (e.g. actions files must
3123   be writable).
3124
3125   Revision 1.44  2002/05/15 03:55:17  hal9
3126   Fix ulink -> link, and minor modification to release process section for
3127   clarification.
3128
3129   Revision 1.43  2002/05/10 01:48:19  hal9
3130   This is mostly proposed copyright/licensing additions and changes. Docs
3131   are still GPL, but licensing and copyright are more visible. Also, copyright
3132   changed in doc header comments (eliminate references to JB except FAQ).
3133
3134   Revision 1.42  2002/05/05 20:26:02  hal9
3135   Sorting out license vs copyright in these docs.
3136
3137   Revision 1.41  2002/05/04 08:44:44  swa
3138   bumped version
3139
3140   Revision 1.40  2002/05/04 00:43:43  hal9
3141   -Remove TOC/first page kludge with proper stylesheet fix.
3142   -Combined the two very brief sections: Intro and Quickstart.
3143
3144   Revision 1.39  2002/05/02 15:08:25  oes
3145   Added explanation about version numbers and RPM package revisions
3146
3147   Revision 1.38  2002/04/29 02:20:31  hal9
3148   Add info on steps for uploading and the release process on SF.
3149
3150   Revision 1.37  2002/04/26 17:23:29  swa
3151   bookmarks cleaned, changed structure of user manual, screen and programlisting cleanups, and numerous other changes that I forgot
3152
3153   Revision 1.36  2002/04/26 05:25:23  hal9
3154   Mass commit to catch a few scattered fixes.
3155
3156   Revision 1.35  2002/04/17 15:16:15  oes
3157   Added link to docbook crash course
3158
3159   Revision 1.34  2002/04/15 23:39:32  oes
3160    - Extended & fixed the release section
3161    - Added CVS guideline sections
3162    - Separated webserver section from release section
3163    - Commented out boilerplate inclusion (If you don't know yet what it is,
3164      you shouldn't mess with its code ;-)
3165    - Nits & fixes
3166
3167   Revision 1.33  2002/04/12 03:49:53  hal9
3168   Spell checked. Clarification on where docs are kept.
3169
3170   Revision 1.32  2002/04/11 21:29:58  jongfoster
3171   Documenting Win32 release procedure
3172
3173   Revision 1.31  2002/04/11 09:32:52  oes
3174   more nits
3175
3176   Revision 1.30  2002/04/11 09:24:53  oes
3177   nits
3178
3179   Revision 1.29  2002/04/10 18:45:14  swa
3180   generated
3181
3182   Revision 1.28  2002/04/08 22:59:26  hal9
3183   Version update. Spell chkconfig correctly :)
3184
3185   Revision 1.27  2002/04/08 15:31:18  hal9
3186   Touch ups to documentation section.
3187
3188   Revision 1.26  2002/04/07 23:50:08  hal9
3189   Documentation changes to reflect HTML docs now in CVS, and new generated files
3190   list.
3191
3192   Revision 1.25  2002/04/06 05:07:28  hal9
3193   -Add privoxy-man-page.sgml, for man page.
3194   -Add authors.sgml for AUTHORS (and p-authors.sgml)
3195   -Reworked various aspects of various docs.
3196   -Added additional comments to sub-docs.
3197
3198   Revision 1.24  2002/04/04 21:33:37  hal9
3199   More on documenting the documents.
3200
3201   Revision 1.23  2002/04/04 18:46:47  swa
3202   consistent look. reuse of copyright, history et. al.
3203
3204   Revision 1.22  2002/04/04 17:27:56  swa
3205   more single file to be included at multiple points. make maintaining easier
3206
3207   Revision 1.21  2002/04/04 06:48:37  hal9
3208   Structural changes to allow for conditional inclusion/exclusion of content
3209   based on entity toggles, e.g. 'entity % p-not-stable  "INCLUDE"'. And
3210   definition of internal entities, e.g. 'entity p-version "2.9.13"' that will
3211   eventually be set by Makefile.
3212   More boilerplate text for use across multiple docs.
3213
3214   Revision 1.20  2002/04/04 03:28:27  david__schmidt
3215   Add Mac OS X section
3216
3217   Revision 1.19  2002/04/03 15:09:42  david__schmidt
3218   Add OS/2 build section
3219
3220   Revision 1.18  2002/04/03 03:51:48  hal9
3221   Touch ups.
3222
3223   Revision 1.17  2002/04/03 01:21:17  hal9
3224   Implementing Andreas's suggestions for Release sections.
3225
3226   Revision 1.16  2002/03/31 23:04:40  hal9
3227   Fleshed out the doc section, and added something for an intro so it was not
3228   blank.
3229
3230   Revision 1.15  2002/03/30 22:29:47  swa
3231   wrong make flavour
3232
3233   Revision 1.14  2002/03/30 19:04:08  swa
3234   people release differently. no good.
3235   I want to make parts of the docs only.
3236
3237   Revision 1.13  2002/03/27 01:16:41  hal9
3238   ditto
3239
3240   Revision 1.12  2002/03/27 01:02:51  hal9
3241   Touch up on name change...
3242
3243   Revision 1.11  2002/03/26 22:29:55  swa
3244   we have a new homepage!
3245
3246   Revision 1.10  2002/03/24 12:33:01  swa
3247   more additions.
3248
3249   Revision 1.9  2002/03/24 11:01:05  swa
3250   name change
3251
3252   Revision 1.8  2002/03/23 15:13:11  swa
3253   renamed every reference to the old name with foobar.
3254   fixed "application foobar application" tag, fixed
3255   "the foobar" with "foobar". left junkbustser in cvs
3256   comments and remarks to history untouched.
3257
3258   Revision 1.7  2002/03/11 13:13:27  swa
3259   correct feedback channels
3260
3261   Revision 1.6  2002/02/24 14:25:06  jongfoster
3262   Formatting changes.  Now changing the doctype to DocBook XML 4.1
3263   will work - no other changes are needed.
3264
3265   Revision 1.5  2001/10/31 18:16:51  swa
3266   documentation added: howto generate docs in text and html
3267   format, howto move stuff to the webserver.
3268
3269   Revision 1.4  2001/09/23 10:13:48  swa
3270   upload process established. run make webserver and
3271   the documentation is moved to the webserver. documents
3272   are now linked correctly.
3273
3274   Revision 1.3  2001/09/13 15:27:40  swa
3275   cosmetics
3276
3277   Revision 1.2  2001/09/13 15:20:17  swa
3278   merged standards into developer manual
3279
3280   Revision 1.1  2001/09/12 15:36:41  swa
3281   source files for junkbuster documentation
3282
3283   Revision 1.3  2001/09/10 17:43:59  swa
3284   first proposal of a structure.
3285
3286   Revision 1.2  2001/06/13 14:28:31  swa
3287   docs should have an author.
3288
3289   Revision 1.1  2001/06/13 14:20:37  swa
3290   first import of project's documentation for the webserver.
3291
3292   -->
3293
3294 </article>