  <chapter id="patches">
    <title>Submitting Patches</title>

    <sect1 id="patch-format">
      <title>Patch Format</title>

      <para>
        Patches are submitted via email to the Wine patches mailing list, 
	<email>wine-patches@winehq.org</email>. Your patch should include:
      </para>

      <itemizedlist>
        <listitem>
          <para>
            A meaningful subject (very short description of patch)            
          </para>
        </listitem>
         <listitem>
          <para>
            A long (paragraph) description of what was wrong and what is now 
            better. (recommended)
          </para>
        </listitem>
        <listitem>
          <para>
            A change log entry (short description of what was changed).
          </para>
        </listitem>
        <listitem>
          <para>
            The patch in <command>diff -u</command> format
          </para>
        </listitem>
      </itemizedlist>

      <para>
	
      </para>

      <para>
        <command>cvs diff -u</command> works great for the common case
        where a file is edited.  However, if you add or remove a file
        <command>cvs diff</command> will not report that correctly so
        make sure you explicitly take care of this rare case.
      </para>
      <para>
        For additions simply include them by appending the
        <command>diff -u /dev/null /my/new/file</command> output of them
	to any <command>cvs diff -u</command> output you may have.
	Alternatively, use <command>diff -Nu olddir/ newdir/</command>
	in case of multiple new files to add.
      </para>
      <para>
        For removals, clearly list the files in the description of the patch.
      </para>
      <para>
        Since wine is constantly changing due to development it is strongly
        recommended that you use cvs for patches, if you cannot use cvs for
        some reason, you can submit patches against the latest tarball. 
        To do this make a copy of the files that you will be modifying and
        <command>diff -u</command> against the old file. I.E.
      </para>
      <screen>
diff -u file.old file.c > file.txt
      </screen>
    </sect1>

    <sect1 id="Style-notes">
      <title>Some notes about style</title>
       
      <para>
        There are a few conventions that about coding style that have been
        adopted over the years of development. The rational for these 
        <quote>rules</quote> is explained for each one.
      </para>
      <itemizedlist>
        <listitem>
        <para>
          No HTML mail, since patches should be in-lined and HTML turns the 
          patch into garbage. Also it is considered bad etiquette as it 
          uglifies the message, and is not viewable by many of the subscribers.
        </para>
        </listitem>
         <listitem>
        <para>
           Only one change set per patch. Patches should address only one
           bug/problem at a time. If a lot of changes need to be made then it
           is preferred to break it into a series of patches. This makes it
           easier to find regressions.
        </para>
        </listitem>
        <listitem>
        <para>
          Tabs are not forbidden but discouraged. A tab is defined as
          8 characters and the usual amount of indentation is 4
          characters.
        </para>
        </listitem>
        <listitem>
        <para>
          C++ style comments are discouraged since some compilers choke on 
          them.
        </para>
        </listitem>
        <listitem>
        <para>
          Commenting out a block of code is usually done by enclosing it in 
          <command>#if 0 ... #endif</command> Statements. For example.
        </para>
        <screen> 
/* note about reason for commenting block */
#if 0
code
code /* comments */
code
#endif
        </screen>
        <para>
          The reason for using this method is that it does not require that
          you edit comments that may be inside the block of code.
        </para>
        </listitem>
        <listitem>
        <para>
          Patches should be in-lined (if you can configure your email client to
          not wrap lines), or attached as plain text attachments so they can 
          be read inline. This may mean some more work for you. However it
          allows others to review your patch easily and decreases the chances
          of it being overlooked or forgotten.
        </para>
        </listitem>
        <listitem>
        <para>
          Code is usually limited to 80 columns. This helps prevent mailers
          mangling patches by line wrap. Also it generally makes code easier
          to read.
        </para>
        </listitem>
        <listitem>
        <para>
          If the patch fixes a bug in Bugzilla please provide a link to the 
          bug in the comments of the patch. This will make it easier for the 
          maintainers of Bugzilla.
        </para>
        </listitem>
      </itemizedlist>
      <sect2 id="Inline-Attachments-with-OE">
        <title>Inline attachments with Outlook Express</title>
        <para>
          Outlook Express is notorious for mangling attachments. Giving the
          patch a <filename>.txt</filename> extension and attaching will solve
          the problem for most mailers including Outlook. Also, there is a way
          to enable Outlook Express send <filename>.diff</filename>
          attachments.
        </para>
        <para>
          You need following two things to make it work.
        </para>
        <orderedlist>
          <listitem>
          <para>
            Make sure that <filename>.diff</filename> files have \r\n line
            ends, because if OE detects that there is no \r\n line endings it
            switches to quoted-printable format attachments.
          </para>
          </listitem>
          <listitem>
          <para>
            Using regedit add key "Content Type" with value "text/plain" 
            to the .diff extension under HKEY_CLASSES_ROOT (same as for .txt
            extension). This tells OE to use Content-Type: text/plain instead
            of application/octet-stream.
          </para>
          </listitem>
        </orderedlist>
        <para>
          Item #1 is important. After you hit "Send" button, go to "Outbox" 
          and using "Properties" verify the message source to make sure that
          the mail has correct format. You might want to send several test
          emails to yourself too.
        </para>
      </sect2>
      <sect2 id="Alexandre-Bottom-Line">
        <title>Alexandre's Bottom Line</title>
        <para>
          <quote>The basic rules are: no attachments, no mime crap, no 
          line wrapping, a single patch per mail. Basically if I can't 
          do <command>"cat raw_mail | patch -p0"</command> it's in the
          wrong format.</quote>
        </para>
      </sect2>
    </sect1>

    <sect1 id="patch-quality">
      <title>Quality Assurance</title>

      <para>
        (Or, "How do I get Alexandre to apply my patch quickly so I
        can build on it and it will not go stale?")
      </para>
      <para>
        Make sure your patch applies to the current CVS head
        revisions.  If a bunch of patches are committed to CVS that may
        affect whether your patch will apply cleanly then verify that
        your patch does apply!   <command>cvs update</command> is your
        friend!
      </para>
      <para>
        Save yourself some embarrassment and run your patched code
        against more than just your current test example.  Experience
        will tell you how much effort to apply here. If there are
        any conformance tests for the code you're working on, run them
        and make sure they still pass after your patch is applied. Running
        tests can be done by running <command>make test</command>. You may
        need to run <command>make testclean</command> to undo the results
        of a previous test run. See the <quote>testing</quote> guide for
        more details on Wine's conformance tests.
      </para>

    </sect1>
  </chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-parent-document:("wine-devel.sgml" "set" "book" "part" "chapter" "")
End:
-->
