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