]> Pileus Git - ~andy/fetchmail/blob - dist-tools/shipper/shipper.xml
Add new gai.c debug source.
[~andy/fetchmail] / dist-tools / shipper / shipper.xml
1 <!DOCTYPE refentry PUBLIC 
2    "-//OASIS//DTD DocBook XML V4.1.2//EN"
3    "docbook/docbookx.dtd">
4 <refentry id='shipper.1'>
5 <refmeta>
6 <refentrytitle>shipper</refentrytitle>
7 <manvolnum>1</manvolnum>
8 </refmeta>
9 <refnamediv id='name'>
10 <refname> shipper</refname>
11 <refpurpose>automatic drop-shipping of project releases</refpurpose>
12 </refnamediv>
13 <refsynopsisdiv id='synopsis'>
14
15 <cmdsynopsis>
16   <command>shipper</command>  
17   <arg choice='opt'>-h</arg>
18   <arg choice='opt'>-n</arg>
19   <arg choice='opt'>-N</arg>
20   <arg choice='opt'>-f</arg>
21   <arg choice='opt'>-v</arg>
22 </cmdsynopsis>
23 <cmdsynopsis>
24   <command>buildrpms</command>
25   <arg choice='req'><replaceable>tarball</replaceable></arg>
26 </cmdsynopsis>
27 </refsynopsisdiv>
28
29 <refsect1><title>Description</title>
30
31 <para><application>shipper</application> is a tool for shipping
32 project releases.  Its job is to make it possible for you to run the
33 command <command>shipper</command> in the top-level directory of a
34 project and have a release be properly exported to all the places that
35 you normally deliver it &mdash; your personal website, Linux source
36 code archive sites, and distribution submission queues. A second goal
37 is to arrange your shipping process in such a way that metadata like
38 your project version only have to be kept in one place and modified
39 once per release. The overall goal is to reduce the friction cost
40 of shipping releases to as near zero as possible.</para>
41
42 <para><application>buildrpms</application> is a helper script that
43 builds source and binary RPMs from a specified tarball with a
44 BuildRoot field. <application>shipper</application> also calls
45 <citerefentry>
46 <refentrytitle>rpm2lsm</refentrytitle>
47 <manvolnum>1</manvolnum></citerefentry> to do part of its work.</para>
48
49 <para>As much as possible, <application>shipper</application> tries to
50 deduce what it should do rather than requiring you to tell it.  In
51 order to do this, it relies on your project obeying standard GNU-like
52 naming conventions.  It also relies on being able to mine project
53 metadata out of a package specfile.  (Presently the only variety of
54 package specfile supported is an RPM spec; this may change in the future,
55 when we fully support shipping Debian packages.)</para>
56
57 <para>In normal use, you need set only one configuration variable,
58 which is the list of private destinations to ship to.  You may also
59 want to add some magic <quote>Keywords</quote> comments to your
60 project specfiles.  Once you have <application>shipper</application>
61 up and running, you can experiment with more advanced features
62 such as having the program generate project web pages for you.</para>
63 </refsect1>
64
65 <refsect1><title>Theory of Operation</title>
66
67 <para><application>shipper</application> pushes
68 <emphasis>deliverables</emphasis> out to
69 <emphasis>destinations</emphasis>.  Deliverables include: source tarballs,
70 source zip archives, source RPMs, binary RPMs, ChangeLog files, README
71 files, LSM files, and various other project metadata files.  Destinations
72 include both <emphasis>private destinations</emphasis> like websites, FTP
73 archive sites and mailing lists, and <emphasis>public
74 channels</emphasis> like ibiblio, freshmeat.net, and the submission
75 queues for various well-known operating-system distributions. The
76 shipper framework is extensible and it is relatively easy to add new
77 channel types and new deliverables; in the future, we hope to support
78 (for example) Debian packages as deliverables and SourceForge as a
79 channel.</para>
80
81 <para><application>shipper</application>'s first step is to find the
82 project name and version, then to check that the minimum set of files that
83 <application>shipper</application> requires to continue is in place.
84 To start with, <application>shipper</application> needs a source
85 tarball and a specfile. Once it knows those are in place, it
86 can extract various pieces of information it will need to do its
87 real work. It also reads in a handful of configuration variables.
88 The -N (nobuild) option causes it to dump all configuration values and
89 stop there.</para>
90
91 <para>The first real work that gets done is finding or building local
92 deliverables.  These are either <emphasis>generated
93 deliverables</emphasis> (like RPMs) that can be rebuilt automatically,
94 or or <emphasis>stock deliverables</emphasis> (like a README file)
95 that have to be changed by hand.  <application>shipper</application>
96 rebuilds any generated deliverable that doesn't exist when it starts
97 up.  Building local deliverables is separated from uploading because
98 it means that you can stop and inspect what you're going to ship
99 before committing to an upload.</para>
100
101 <para>The -n (noupload) option stops before uploading, leaving all
102 local deliverables in place but displaying the exact upload commands
103 that would have been used to ship them.  The -f (force) option forces
104 a rebuild of all generated deliverables, even those that already
105 exist.  The command <command>shipper -f -n</command> will show you
106 exactly what <application>shipper</application> would do for a real
107 upload.</para>
108
109 <para>Once all local deliverables have been built,
110 <application>shipper</application> can begin uploading files and
111 posting announcements. It does private destinations first, then public
112 channels.  This means, for example, that if you give
113 <application>shipper</application> your personal website as a destination, the
114 website will get updated each time <emphasis>before</emphasis>
115 any submissions or announcements are sent to public sites like 
116 ibiblio.org or freshmeat.net.</para>
117
118 <para>When uploads are complete, <application>shipper</application>
119 cleans up after itself by deleting any deliverables it created for
120 this run.  Deliverables that were found and up to date are not
121 removed.</para>
122
123 <para>Finally, note that <application>shipper</application> makes one
124 important assumption about the structure of your website(s).  Beneath
125 each directory in your <varname>destinations</varname> list, there
126 will be one subdirectory for each project, with the directory leaf
127 name being the same as the project.  Thus, for example, if you have
128 three projects named ruby, diamond and sapphire, and your personal
129 site is at <filename>gemstones.net:/public/www/precious/</filename>,
130 <application>shipper</application> will expect to be able to drop
131 deliverables in three directories
132 <filename>gemstones.net:/public/www/precious/ruby</filename>,
133 <filename>gemstones.net:/public/www/precious/diamond/</filename>, and
134 <filename>gemstones.net:/public/www/precious/sapphire/</filename>.
135 Note that <application>shipper</application> will not create these
136 project directories for you if they're missing; this is deliberate, so
137 that uploads to sites that are not prepared for them will fail
138 noisily.</para>
139
140 </refsect1>
141
142 <refsect1><title>How Shipper Deduces What To Do</title>
143
144 <para>The behavior of shipper depends on a handful of internal
145 variables.  Some of these variables have defaults computed at startup
146 time.  All can be set or overridden in the per-user
147 <filename>~/.shipper</filename> file, and overridden in any
148 per-project <filename>.shipper</filename> file.  Both files are Python
149 code and the syntax of variable settings is Python's.</para>
150
151 <para>If a variable is set in a config file, that value is locked in
152 (except for the <varname>destinations</varname> variable which can be
153 appended to from a specfile, see below) Variables that are
154 <emphasis>not</emphasis> set in a config file may be set by the values
155 of fields in your project specfile.</para>
156
157 <para>For basic use, it is only necessary to set one such variable:
158 <varname>destinations</varname>, the list of destinations to ship to.
159 Normally you'll set this globally, pointing all your projects at your
160 main distribution website, in your <filename>~/.shipper</filename>
161 file; it is also possible to add destinations on a per-project basis
162 by giving a comma-separated list in a #Destinations: comment in the
163 specfile.  You can set the variable in a per-project
164 <filename>.shipper</filename> to ignore your global destination
165 list.</para>
166
167 <para>The first thing shipper looks for is a specfile in the
168 current directory; there must be exactly one.  It extracts the project
169 name from the Name field.  Next step is to find the project version
170 (the variable <varname>package</varname>).  This is extracted from the
171 specfile, or by looking for a makefile macro with a name
172 beginning with VERS; if the value of that macro is a shell command
173 wrapped in $(shell ...), it is executed and the output is captured to
174 yield the version.  If both versions are present, they are
175 consistency-checked.</para>
176
177 <para><application>shipper</application> gets most of the rest of the
178 data it uses to decide what to do from headers in the specfile.
179 The following table lists all the variables and their corresponding
180 specfile fields. <application>shipper</application> uses the RPM spec
181 file fields: the Debian entries are informational only.</para>
182
183 <informaltable>
184 <tgroup cols="4">
185 <thead>
186 <row>
187 <entry>Variable</entry>
188 <entry>RPM specfile field</entry>
189 <entry>Debian specfile field</entry>
190 <entry>Meaning</entry>
191 </row>
192 </thead>
193 <tbody>
194 <row>
195 <entry><varname>destinations</varname></entry>
196 <entry>#Destinations:</entry>
197 <entry>XBS-Destinations:</entry>
198 <entry>
199 <para>A list of remote directories to ship to using
200 <citerefentry>
201 <refentrytitle>scp</refentrytitle> <manvolnum>1</manvolnum>
202 </citerefentry>.  Each location is a place to drop deliverables:
203 either a [user@]site:path destination that
204 <citerefentry>
205 <refentrytitle>scp</refentrytitle> <manvolnum>1</manvolnum>
206 </citerefentry> can use, or an FTP url that
207 <citerefentry>
208 <refentrytitle>lftp</refentrytitle> <manvolnum>1</manvolnum>
209 </citerefentry>
210 can use. Note that actual project directories are computed by
211 appending the value of <varname>package</varname> to
212 the destination you're shipping to.</para>
213
214 <para><emphasis role='bold'>There is no default.</emphasis>.  If you
215 do not set this variable, <application>shipper</application> will
216 ship only to public channels.</para>
217 </entry>
218 </row>
219 <row>
220 <entry><varname>channels</varname></entry>
221 <entry align='center'>-</entry>
222 <entry align='center'>-</entry>
223 <entry>
224 <para>The list of public channels to be shipped to after the private
225 channels in the <varname>destination</varname> list. You can disable
226 one or more of these in a config file by calling the function
227 <function>disable()</function>; for example with
228 <command>disable('freshmeat')</command>.</para>
229 </entry>
230 </row>
231 <row>
232 <entry><varname>whoami</varname></entry>
233 <entry align='center'>-</entry>
234 <entry align='center'>-</entry>
235 <entry>
236 <para>A plausible email address for the user.  If not specified in the
237 config file, it's generated from
238 <envar>$USERNAME</envar> and <envar>$HOSTNAME</envar>.</para>
239 </entry>
240 </row>
241 <row>
242 <entry><varname>date</varname></entry>
243 <entry align='center'>-</entry>
244 <entry align='center'>-</entry>
245 <entry>
246 <para>The program's startup time. This can be used in the web page and
247 email announcement templates.</para>
248
249 <para>You can use the Python function time.strftime("...") in your
250 <filename>~/.shipper</filename> file to format this date to your
251 taste.  If you don't set this in the config file, the program will
252 set it for you.</para>
253 </entry>
254 </row>
255 <row>
256 <entry><varname>indextemplate</varname></entry>
257 <entry align='center'>-</entry>
258 <entry align='center'>-</entry>
259 <entry>
260 <para>Template HTML from which to generate index.html for shipping.  There is a
261 default which generates a very simple page containing a title, a 
262 date, and a table listing downloadable resources.  This is used when
263 shipping to a web directory, if no index page exists when shipper
264 is run.</para>
265 </entry>
266 </row>
267 <row>
268 <entry><varname>mailtemplate</varname></entry>
269 <entry align='center'>-</entry>
270 <entry align='center'>-</entry>
271 <entry>
272 <para>Template text from which to generate the file ANNOUNCE.EMAIL to be
273 shipped to destinations that are mailto URLs.  There is a default which
274 generates a very simple email containing a subject, a pointer to the 
275 project web page, and the last entry in the project changelog.</para>
276 </entry>
277 </row>
278 <row>
279 <entry><varname>package</varname></entry>
280 <entry>Name:</entry>
281 <entry>Package:</entry>
282 <entry>
283 <para>Project name, used to generate the stem part of the names of RPMs and
284 other deliverables that <application>shipper</application>
285 builds. If the specfile is a Debian control file, the Debian-specific
286 part of the version number (after the dash) is removed.</para>
287 </entry>
288 </row>
289 <row>
290 <entry><varname>version</varname></entry>
291 <entry>Version:</entry>
292 <entry>Version:</entry>
293 <entry>
294 <para>Project version, used in generating the names of RPMs and
295 other deliverables that <application>shipper</application>
296 builds.</para>
297 </entry>
298 </row>
299 <row>
300 <entry><varname>homepage</varname></entry>
301 <entry>URL:</entry>
302 <entry>XBS-Home-Page:</entry>
303 <entry>
304 <para>Project home page URL. Used when generating project 
305 announcements.</para>
306 </entry>
307 </row>
308 <row>
309 <entry><varname>arch</varname></entry>
310 <entry>BuildArch:</entry>
311 <entry>Architecture:</entry>
312 <entry>
313 <para>Build architecture.  If this field is <quote>noarch</quote>, 
314 noarch rather than binary RPMs will be built.</para>
315 </entry>
316 </row>
317 <row>
318 <entry><varname>keywords</varname></entry>
319 <entry>#Keywords:</entry>
320 <entry>XBS-Keywords:</entry>
321 <entry>
322 <para>Topic keywords. Used when generating LSM files.</para>
323 </entry>
324 </row>
325 <row>
326 <entry><varname>freshmeat_name</varname></entry>
327 <entry>#Freshmeat-Name:</entry>
328 <entry>XBS-Freshmeat-Name:</entry>
329 <entry>
330 <para>Freshmeat shortname, used in generating freshmeat.net
331 announcements. If this isn't present, it defaults to the project
332 name; you only need to set it if they differ.</para>
333 </entry>
334 </row>
335 <row>
336 <entry><varname>summary</varname></entry>
337 <entry>Summary</entry>
338 <entry>Description:</entry>
339 <entry>
340 <para>The one-line project summary field from your specfile.</para>
341 </entry>
342 </row>
343 <row>
344 <entry><varname>description</varname></entry>
345 <entry>%description</entry>
346 <entry>Description:</entry>
347 <entry>
348 <para>The Description field from your specfile.</para>
349 </entry>
350 </row>
351 <row>
352 <entry><varname>changelog</varname></entry>
353 <entry>ChangeLog or %changelog</entry>
354 <entry align='center'>-</entry>
355 <entry>
356 <para>If a <filename>ChangeLog</filename> file exists in the project
357 directory, its entire contents.  Otherwise, if it exists,
358 the entire changelog section from the specfile.</para>
359 </entry>
360 </row>
361 <row>
362 <entry><varname>lastchange</varname></entry>
363 <entry>ChangeLog or %changelog</entry>
364 <entry align='center'>-</entry>
365 <entry>
366 <para>
367 If the source of your changlog was your specfile, this is the
368 most recent entry from your changelog without
369 its date/author/release header.  If the source was Changelog, a 
370 line of text directing the user to see the ChangeLog file. 
371 This becomes the Changes field in your freshmeat.net announcement,
372 and freshmeat.net doesn't like the bulleted format of GNU ChangeLog
373 entries.</para>
374 </entry>
375 </row>
376 <row>
377 <entry><varname>resourcetable</varname></entry> <entry
378 align='center'>-</entry> <entry align='center'>-</entry>
379 <entry>
380 <para>The HTML table of links to downloadable resources.  This
381 variable is only computed if the index page is built.  Any setting
382 of it in the startup files is ignored.</para>
383 </entry>
384 </row>
385 </tbody>
386 </tgroup>
387 </informaltable>
388
389 <para>All these variables are available for substitution at the time a
390 web page or email announcement is generated. In general, any variable
391 you set in your <filename>~/.shipper</filename> file will be available
392 at the time the web page or email announcement is generated.  Use the
393 Python "%(variable)s" syntax, not shell-substitution syntax.</para>
394
395 </refsect1>
396
397 <refsect1><title>Finding and Building Local Deliverables</title>
398
399 <para>The following files are considered stock deliverables and may be
400 shipped if they are present when <application>shipper</application>
401 starts up:</para>
402
403 <informaltable>
404 <tgroup cols="2">
405 <thead>
406 <row>
407 <entry>File</entry>
408 <entry>Explanation</entry>
409 </row>
410 </thead>
411 <tbody>
412 <row>
413 <entry>README</entry>
414 <entry>
415 <para>Project roadmap file.</para>
416 </entry>
417 </row>
418 <row>
419 <entry>tarball</entry>
420 <entry>
421 <para>The current source tarball, that is the file named ${package}-${version}.tar.gz.</para>
422 </entry>
423 </row>
424 <row>
425 <entry>zipfile</entry>
426 <entry>
427 <para>The current source zip archive, that is the file named ${package}-${version}.zip.</para>
428 </entry>
429 </row>
430 <row>
431 <entry>NEWS</entry>
432 <entry>
433 <para>Project news file.</para>
434 </entry>
435 </row>
436 <row>
437 <entry>ChangeLog</entry>
438 <entry>
439 <para>Project change log.</para>
440 </entry>
441 </row>
442 <row>
443 <entry>HISTORY</entry>
444 <entry>
445 <para>Project history file.</para>
446 </entry>
447 </row>
448 <row>
449 <entry>BUGS</entry>
450 <entry>
451 <para>Project bug list.</para>
452 </entry>
453 </row>
454 <row>
455 <entry>TODO</entry>
456 <entry>
457 <para>Current to-do list.</para>
458 </entry>
459 </row>
460 <row>
461 <entry>*.html</entry>
462 <entry>
463 <para>Any files with an .html extension will be shipped to all 
464 website destinations.</para>
465 </entry>
466 </row>
467 </tbody>
468 </tgroup>
469 </informaltable>
470
471 <para>Here are the generated deliverables that
472 <application>shipper</application> will build and ship, if they don't
473 exist when it starts up.  Any of these that are created will be 
474 deleted after a successful upload.</para>
475
476 <informaltable>
477 <tgroup cols="2">
478 <thead>
479 <row>
480 <entry>Type</entry>
481 <entry>Explanation</entry>
482 </row>
483 </thead>
484 <tbody>
485 <row>
486 <entry>index.html</entry>
487 <entry>
488 <para>An index web page, to be shipped to any website destination.</para>
489 </entry>
490 </row>
491 <row>
492 <entry>RPMs</entry>
493 <entry>
494 <para>Source and either binary or noarch RPMs.</para>
495 </entry>
496 </row>
497 <row>
498 <entry>LSM</entry>
499 <entry>
500 <para>If the ibiblio channel is enabled,
501 <application>shipper</application> will generate a Linux Software Map
502 file for it.</para>
503 </entry>
504 </row>
505 <row>
506 <entry>CHANGES</entry>
507 <entry>
508 <para>If there is no ChangeLog file but there was a %changelog in your
509 specfile, <application>shipper</application> will generate a CHANGES
510 from the changelog entries in the specfile and ship that.</para>
511 </entry>
512 </row>
513 <row>
514 <entry>ANNOUNCE.FRESHMEAT</entry>
515 <entry>
516 <para>If there is no ANNOUNCE.FRESHMEAT file,
517 <application>shipper</application> will generate one. It will be a
518 job card that can be fed to freshmeat.net's XML-RPC interface via
519 <citerefentry><refentrytitle>freshmeat-submit</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
520 </para>
521 </entry>
522 </row>
523 <row>
524 <entry>ANNOUNCE.EMAIL</entry>
525 <entry>
526 <para>If there is no ANNOUNCE.EMAIL file, <application>shipper</application>
527 will generate one to be emailed to destinations that are mailto URLs.</para>
528 </entry>
529 </row>
530 </tbody>
531 </tgroup>
532 </informaltable>
533 </refsect1>
534
535 <refsect1><title>Shipping to Destinations</title>
536 <para>In operation, <application>shipper</application> walks through a
537 list of destinations, building the required deliverables for each one and
538 performing the required shipping actions to push them out to the
539 destination.  Here are the channel types
540 <application>shipper</application> knows about:</para>
541
542 <informaltable>
543 <tgroup cols="4">
544 <colspec align='left'/>
545 <colspec align='left'/>
546 <colspec align='center'/>
547 <colspec align='left'/>
548 <thead>
549 <row>
550 <entry>Channel Type</entry>
551 <entry>Deliverables</entry>
552 <entry>Specified by</entry>
553 <entry>Explanation</entry>
554 </row>
555 </thead>
556 <tbody>
557 <row>
558 <entry>ibiblio</entry>
559 <entry>tarball, RPMs, LSM file</entry>
560 <entry>-</entry>
561 <entry>
562 <para>If the ibiblio channel is enabled (it is by default),
563 <application>shipper</application> will attempt to ship a source
564 tarball, RPMs, and an an LSM file to ibiblio.org via FTP.  The LSM
565 file will be automatically generated.</para>
566 </entry>
567 </row>
568 <row>
569 <entry>redhat</entry>
570 <entry>RPMs</entry>
571 <entry>-</entry>
572 <entry>
573 <para>If the Red Hat channel is enabled (it is by default),
574 <application>shipper</application> will attempt to ship source
575 and binary RPMs to the Red Hat submission directory via FTP.</para>
576 </entry>
577 </row>
578 <row>
579 <entry>freshmeat</entry>
580 <entry>ANNOUNCE.FRESHMEAT</entry>
581 <entry>-</entry>
582 <entry>
583 <para>If the freshmeat channel is enabled (it is by default),
584 <application>shipper</application> will attempt to post a release
585 announcement on freshmeat.net using
586 <citerefentry><refentrytitle>freshmeat-submit</refentrytitle><manvolnum>1</manvolnum></citerefentry>.
587 The
588 announcement will include URLs for whichever of the following
589 deliverables are shipped, using the URL field from your specfile: tarball,
590 zipfile, RPMs, CHANGES.  The user will be
591 prompted for a Freshmeat release-focus.  This announcement is
592 generated into the local deliverable ANNOUNCE.FRESHMEAT.</para>
593 </entry>
594 </row>
595 <row>
596 <entry>Generic Web site</entry>
597 <entry>README, tarball, zipfile, RPMs, CHANGES, NEWS, HISTORY, *.html, 
598 BUGS, TODO.</entry>
599 <entry>scp destination ([user@]host:dir)</entry>
600 <entry>
601 <para>This channel type represents a website.
602 <application>shipper</application> uses
603 <citerefentry><refentrytitle>scp</refentrytitle><manvolnum>1</manvolnum></citerefentry>
604 to put deliverables on websites.  If the user part of the scp
605 destination is absent, it will be taken from the environment variable
606 <envar>USERNAME</envar>.</para>
607
608 <para>No generic Web sites are shipped to by default. You must declare
609 them by putting scp destinations in the <varname>destinations</varname>
610 variable.</para>
611 </entry>
612 </row>
613 <row>
614 <entry>Generic FTP site</entry>
615 <entry>tarball, RPMs</entry>
616 <entry>FTP URL</entry>
617 <entry>
618 <para>Old-fashioned FTP site with no metadata.  The FTP URL is parsed
619 to get the sitename and directory where deliverables should be dropped.  The
620 FTP username to be used will be taken from the environment variable
621 <envar>USERNAME</envar>.  The FTP password will be looked up in your
622 <filename>~/.netrc</filename> file.</para>
623
624 <para>No generic FTP sites are shipped to by default.  You must
625 declare them by putting FTP urls in the
626 <varname>destinations</varname> variable.</para>
627 </entry>
628 </row>
629 <row>
630 <entry>Email address</entry>
631 <entry>ANNOUNCE.EMAIL</entry>
632 <entry>mailto URL</entry>
633 <entry>
634 <para>The contents of the generated ANNOUNCE.EMAIL file is emailed to
635 each email address specified as a channel.</para>
636
637 <para>No email channels are set up by default.  You must
638 declare them by putting mailto: urls in the
639 <varname>destinations</varname> variable.</para>
640 </entry>
641 </row>
642 <row>
643 <entry>rsync unit</entry>
644 <entry>SRPM</entry>
645 <entry>rsync address ([user@]host::unit)</entry>
646 <entry>
647 <para>An SRPM is shipped to each destination that is rcognized as 
648 an rsync address (by the double colon).</para>
649
650 <para>No rsync channels are set up by default.  You must
651 declare them by putting rsync addresses in the
652 <varname>destinations</varname> variable.</para>
653 </entry>
654 </row>
655 </tbody>
656 </tgroup>
657 </informaltable>
658 </refsect1>
659
660 <refsect1><title>Command-line Options</title>
661
662 <para>The -n option of <application>shipper</application> suppresses
663 uploads, just building all deliverables locally.  The -N option
664 suppresses both uploads and builds, generating a configuration dumop
665 instead.  The -f option forces rebuilding of local deliverables even
666 if they already exist.  The -v option makes
667 <application>shipper</application> chatty about what it's doing.  The
668 -h option prints a usage message and exits.</para>
669
670 </refsect1>
671
672 <refsect1><title>Hints and Tips</title>
673 <para>The following variable definition in your makefile will ensure
674 that the makefile version is derived from (and thus always consistent
675 with) the specfile version.</para>
676
677 <programlisting>
678 VERS=$(shell sed &lt;*.spec -n -e '/Version: \(.*\)/s//\1/p')
679 </programlisting>
680
681 <para>A makefile production like the following will allow
682 you to type <command>make release</command> and be sure that all
683 the deliverables <application>shipper</application> knows about
684 will be rebuilt before being shipped.</para>
685
686 <programlisting>
687 release: <emphasis>package</emphasis>-$(VERS).tar.gz <emphasis>package</emphasis>.html 
688         shipper -f
689 </programlisting>
690
691 <para>You will want to change <emphasis>package</emphasis> to your 
692 project name.  Note that you should not use this recipe if your
693 project  has its own (non-generated) index page, as the -f option will
694 overwrite <filename>index.html</filename>.</para>
695
696 <para>To make
697 <citerefentry>
698 <refentrytitle>rpm</refentrytitle><manvolnum>1</manvolnum>
699 </citerefentry>
700 build noarch rather than binary RPMs, insert the following header in
701 your specfile:</para>
702
703 <programlisting>
704 BuildArch: noarch
705 </programlisting>
706 </refsect1>
707
708 <refsect1><title>Author</title>
709 <para>Eric S. Raymond <email>esr@thyrsus.com</email>.  The buildrpms
710 script was originally by Sean Reifschneider.</para>
711
712 <para>There is a project web page at
713 <ulink
714 url="http://www.catb.org/~esr/shipper/">http://www.catb.org/~esr/shipper/</ulink>.</para>
715 </refsect1>
716
717 <refsect1><title>Bugs</title>
718 <para>The rsync channel type is untested.  Shipping Debian packages 
719 should be supported.</para>
720 </refsect1>
721
722 <refsect1><title>See Also</title>
723
724 <para>
725 <citerefentry>
726 <refentrytitle>freshmeat-submit</refentrytitle>
727 <manvolnum>1</manvolnum>
728 </citerefentry>,
729 <citerefentry>
730 <refentrytitle>lftp</refentrytitle>
731 <manvolnum>1</manvolnum>
732 </citerefentry>,
733 <citerefentry>
734 <refentrytitle>rpm2lsm</refentrytitle>
735 <manvolnum>1</manvolnum>
736 </citerefentry>,
737 <citerefentry>
738 <refentrytitle>scp</refentrytitle>
739 <manvolnum>1</manvolnum>
740 </citerefentry>,
741 <citerefentry>
742 <refentrytitle>ssh</refentrytitle>
743 <manvolnum>1</manvolnum>
744 </citerefentry>.</para>
745 </refsect1>
746 </refentry>
747
748 <!--
749 Local Variables:
750 compile-command: "make shipper.html"
751 End:
752 -->