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