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