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