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