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