2001-03-20 00:47:07 -05:00
|
|
|
|
PEP: 243
|
|
|
|
|
Title: Module Repository Upload Mechanism
|
|
|
|
|
Version: $Revision$
|
2006-03-23 15:13:19 -05:00
|
|
|
|
Last-Modified: $Date$
|
2001-03-20 00:47:07 -05:00
|
|
|
|
Author: jafo-pep@tummy.com (Sean Reifschneider)
|
2001-03-21 12:36:34 -05:00
|
|
|
|
Discussions-To: distutils-sig@python.org
|
2001-03-20 00:47:07 -05:00
|
|
|
|
Status: Draft
|
|
|
|
|
Type: Standards Track
|
|
|
|
|
Created: 18-Mar-2001
|
|
|
|
|
Python-Version: 2.1
|
2001-03-27 02:51:33 -05:00
|
|
|
|
Post-History: 20-Mar-2001, 24-Mar-2001
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Abstract
|
|
|
|
|
|
|
|
|
|
For a module repository system (such as Perl's CPAN) to be
|
|
|
|
|
successful, it must be as easy as possible for module authors to
|
|
|
|
|
submit their work. An obvious place for this submit to happen is
|
|
|
|
|
in the Distutils tools after the distribution archive has been
|
|
|
|
|
successfully created. For example, after a module author has
|
|
|
|
|
tested their software (verifying the results of "setup.py sdist"),
|
|
|
|
|
they might type "setup.py sdist --submit". This would flag
|
|
|
|
|
Distutils to submit the source distribution to the archive server
|
|
|
|
|
for inclusion and distribution to the mirrors.
|
|
|
|
|
|
|
|
|
|
This PEP only deals with the mechanism for submitting the software
|
|
|
|
|
distributions to the archive, and does not deal with the actual
|
|
|
|
|
archive/catalog server.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Upload Process
|
|
|
|
|
|
|
|
|
|
The upload will include the Distutils "PKG-INFO" meta-data
|
|
|
|
|
information (as specified in PEP-241 [1]), the actual software
|
|
|
|
|
distribution, and other optional information. This information
|
|
|
|
|
will be uploaded as a multi-part form encoded the same as a
|
|
|
|
|
regular HTML file upload request. This form is posted using
|
2001-03-27 02:51:33 -05:00
|
|
|
|
ENCTYPE="multipart/form-data" encoding [2].
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
|
|
|
|
The upload will be made to the host "modules.python.org" on port
|
2001-03-27 02:51:33 -05:00
|
|
|
|
80/tcp (POST http://modules.python.org:80/swalowpost.cgi). The form
|
|
|
|
|
will consist of the following fields:
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
2001-03-21 12:36:34 -05:00
|
|
|
|
distribution -- The file containing the module software (for
|
|
|
|
|
example, a .tar.gz or .zip file).
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
2001-03-21 12:36:34 -05:00
|
|
|
|
distmd5sum -- The MD5 hash of the uploaded distribution,
|
|
|
|
|
encoded in ASCII representing the hexadecimal representation
|
|
|
|
|
of the digest ("for byte in digest: s = s + ('%02x' %
|
|
|
|
|
ord(byte))").
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
2001-03-27 02:51:33 -05:00
|
|
|
|
pkginfo (optional) -- The file containing the distribution
|
|
|
|
|
meta-data (as specified in PEP-241 [1]). Note that if this is
|
|
|
|
|
not included, the distribution file is expected to be in .tar
|
|
|
|
|
format (gzipped and bzipped compreesed are allowed) or .zip
|
|
|
|
|
format, with a "PKG-INFO" file in the top-level directory it
|
|
|
|
|
extracts ("package-1.00/PKG-INFO").
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
2001-03-27 02:51:33 -05:00
|
|
|
|
infomd5sum (required if pkginfo field is present) -- The MD5 hash
|
|
|
|
|
of the uploaded meta-data, encoded in ASCII representing the
|
|
|
|
|
hexadecimal representation of the digest ("for byte in digest:
|
|
|
|
|
s = s + ('%02x' % ord(byte))").
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
2001-03-21 12:36:34 -05:00
|
|
|
|
platform (optional) -- A string representing the target
|
|
|
|
|
platform for this distribution. This is only for binary
|
|
|
|
|
distributions. It is encoded as
|
2001-03-27 02:51:33 -05:00
|
|
|
|
"<os_name>-<os_version>-<platform architecture>-<python
|
|
|
|
|
version>".
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
2001-03-27 02:51:33 -05:00
|
|
|
|
signature (optional) -- A OpenPGP-compatible signature [3] of
|
|
|
|
|
the uploaded distribution as signed by the author. This may
|
|
|
|
|
be used by the cataloging system to automate acceptance of
|
|
|
|
|
uploads.
|
|
|
|
|
|
|
|
|
|
protocol_version -- A string indicating the protocol version that
|
|
|
|
|
the client supports. This document describes protocol version "1".
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Return Data
|
|
|
|
|
|
2001-03-27 02:51:33 -05:00
|
|
|
|
The status of the upload will be reported using HTTP non-standard
|
|
|
|
|
("X-*)" headers. The "X-Swalow-Status" header may have the following
|
|
|
|
|
values:
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
2001-03-21 12:36:34 -05:00
|
|
|
|
SUCCESS -- Indicates that the upload has succeeded.
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
2001-03-21 12:36:34 -05:00
|
|
|
|
FAILURE -- The upload is, for some reason, unable to be
|
|
|
|
|
processed.
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
2001-03-21 12:36:34 -05:00
|
|
|
|
TRYAGAIN -- The server is unable to accept the upload at this
|
|
|
|
|
time, but the client should try again at a later time.
|
|
|
|
|
Potential causes of this are resource shortages on the server,
|
|
|
|
|
administrative down-time, etc...
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
2001-03-27 02:51:33 -05:00
|
|
|
|
Optionally, there may be a "X-Swalow-Reason" header which includes a
|
|
|
|
|
human-readable string which provides more detailed information about
|
|
|
|
|
the "X-Swalow-Status".
|
|
|
|
|
|
|
|
|
|
If there is no "X-Swalow-Status" header, or it does not contain one of
|
|
|
|
|
the three strings above, it should be treated as a temporary failure.
|
|
|
|
|
|
|
|
|
|
Example:
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
2001-03-27 02:51:33 -05:00
|
|
|
|
>>> f = urllib.urlopen('http://modules.python.org:80/swalowpost.cgi')
|
|
|
|
|
>>> s = f.headers['x-swalow-status']
|
|
|
|
|
>>> s = s + ': ' + f.headers.get('x-swalow-reason', '<None>')
|
|
|
|
|
>>> print s
|
|
|
|
|
FAILURE: Required field "distribution" missing.
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Sample Form
|
|
|
|
|
|
|
|
|
|
The upload client must submit the page in the same form as
|
|
|
|
|
Netscape Navigator version 4.76 for Linux produces when presented
|
|
|
|
|
with the following form:
|
|
|
|
|
|
2001-03-21 12:36:34 -05:00
|
|
|
|
<H1>Upload file</H1>
|
|
|
|
|
<FORM NAME="fileupload" METHOD="POST" ACTION="swalowpost.cgi"
|
|
|
|
|
ENCTYPE="multipart/form-data">
|
|
|
|
|
<INPUT TYPE="file" NAME="distribution"><BR>
|
|
|
|
|
<INPUT TYPE="text" NAME="distmd5sum"><BR>
|
|
|
|
|
<INPUT TYPE="file" NAME="pkginfo"><BR>
|
|
|
|
|
<INPUT TYPE="text" NAME="infomd5sum"><BR>
|
|
|
|
|
<INPUT TYPE="text" NAME="platform"><BR>
|
|
|
|
|
<INPUT TYPE="text" NAME="signature"><BR>
|
2001-03-27 02:51:33 -05:00
|
|
|
|
<INPUT TYPE="hidden" NAME="protocol_version" VALUE="1"><BR>
|
2001-03-21 12:36:34 -05:00
|
|
|
|
<INPUT TYPE="SUBMIT" VALUE="Upload">
|
|
|
|
|
</FORM>
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Platforms
|
|
|
|
|
|
|
|
|
|
The following are valid os names:
|
|
|
|
|
|
2001-03-27 02:51:33 -05:00
|
|
|
|
aix beos debian dos freebsd hpux mac macos mandrake netbsd
|
|
|
|
|
openbsd qnx redhat solaris suse windows yellowdog
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
|
|
|
|
The above include a number of different types of distributions of
|
|
|
|
|
Linux. Because of versioning issues these must be split out, and
|
|
|
|
|
it is expected that when it makes sense for one system to use
|
|
|
|
|
distributions made on other similar systems, the download client
|
|
|
|
|
will make the distinction.
|
|
|
|
|
|
|
|
|
|
Version is the official version string specified by the vendor for
|
2001-03-27 02:51:33 -05:00
|
|
|
|
the particular release. For example, "2000" and "nt" (Windows),
|
|
|
|
|
"9.04" (HP-UX), "7.0" (RedHat, Mandrake).
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
|
|
|
|
The following are valid architectures:
|
|
|
|
|
|
2001-03-27 02:51:33 -05:00
|
|
|
|
alpha hppa ix86 powerpc sparc ultrasparc
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Status
|
|
|
|
|
|
|
|
|
|
I currently have a proof-of-concept client and server implemented.
|
|
|
|
|
I plan to have the Distutils patches ready for the 2.1 release.
|
|
|
|
|
Combined with Andrew's PEP-241 [1] for specifying distribution
|
|
|
|
|
meta-data, I hope to have a platform which will allow us to gather
|
|
|
|
|
real-world data for finalizing the catalog system for the 2.2
|
|
|
|
|
release.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
References
|
|
|
|
|
|
|
|
|
|
[1] Metadata for Python Software Package, Kuchling,
|
2001-07-05 15:20:16 -04:00
|
|
|
|
http://www.python.org/peps/pep-0241.html
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
2001-03-27 02:51:33 -05:00
|
|
|
|
[2] RFC 1867, Form-based File Upload in HTML
|
|
|
|
|
http://www.faqs.org/rfcs/rfc1867.html
|
|
|
|
|
|
|
|
|
|
[3] RFC 2440, OpenPGP Message Format
|
|
|
|
|
http://www.faqs.org/rfcs/rfc2440.html
|
|
|
|
|
|
2001-03-20 00:47:07 -05:00
|
|
|
|
|
|
|
|
|
Copyright
|
|
|
|
|
|
|
|
|
|
This document has been placed in the public domain.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Local Variables:
|
|
|
|
|
mode: indented-text
|
|
|
|
|
indent-tabs-mode: nil
|
|
|
|
|
End:
|