<div><span style="color: rgb(160, 160, 168); ">On Monday, January 30, 2012 at 4:46 AM, M.-A. Lemburg wrote:</span></div>
                <blockquote type="cite" style="border-left-style:solid;border-width:1px;margin-left:0px;padding-left:10px;">
                    <span><div><div><div>Donald Stufft wrote:</div><blockquote type="cite"><div><div><br></div><div><br></div><div>On Monday, January 30, 2012 at 4:23 AM, M.-A. Lemburg wrote:</div><div><br></div><blockquote type="cite"><div><div>Richard Jones wrote:</div><blockquote type="cite"><div><div>Hi catalog-sig,</div><div><br></div><div>When we initially implemented file upload to PyPI it was our intention</div><div>that the file be immutable once uploaded. The goal was to make things</div><div>significantly simpler for end users - there would only ever be one</div><div>file with a given name. If the content changed then so must the name</div><div>(typically by creating a new release version.)</div><div><br></div><div>After the upload facility was put in place we also added the ability</div><div>to delete files uploaded to pypi. This created a loophole: if a</div><div>package owner knew how to they could delete the file and re-upload,</div><div>thus circumventing the replacement protection.</div><div><br></div><div>I'm considering closing this loophole by retaining a record of the</div><div>uploaded file (though not the contents) so that future uploads with</div><div>the same name wouldn't be allowed. I understand that this is how the</div><div>ruby gem archive handles deletion of files.</div><div><br></div><div>Your thoughts?</div></div></blockquote><div><br></div><div>I don't think that's a good idea, since it would require the</div><div>package author to issue a new release whenever something goes wrong</div><div>with an upload (e.g. missing files, corrupted archive, etc.).</div><div><br></div><div>Please leave the existing logic in place.</div></div></blockquote><div>And version numbers are a scarce resource? </div></div></blockquote><div><br></div><div>No, but having to kick off the whole release process again</div><div>just because something went wrong when uploading release files</div><div>to PyPI causes plenty of trouble.</div><div><br></div></div></div></span></blockquote><div>I would assert that almost every time something goes wrong with "uploading to PyPI" it's actually "I didn't package my software correctly". A better solution to people failing package correctly (missing MANIFEST, whatever) is to test your package prior to uploading to PyPI. Then you don't need mutable files, your release process becomes more robust, your releases become more robust, and the ecosystem in general becomes more robust.</div><div><br></div><div>Further more I would still argue that the benefits to the community outweigh the ability for people to skimp on the release process. Either you are doing your releases adhoc, in that case you don't have much of a release process to begin with, so doing it over again to bump it up one more isn't a huge deal, or you have a large release process and testing the package before distributing it should be a part of it.&nbsp;</div><blockquote type="cite" style="border-left-style:solid;border-width:1px;margin-left:0px;padding-left:10px;"><span><div><div><div></div><blockquote type="cite"><div>(Even though I believe it would be acceptable to cover that particular use case by giving a grace period of when you can re upload). </div></blockquote><div><br></div><div>Can't we just leave dealing with that problem to the package authors ?</div><div>It's their responsibility, not PyPI's.</div></div></div></span></blockquote><div>In my opinion No. PyPI is acting as the central repository, it is it's responsibility to take a reasonable effort to protect the people that depend on it. The current solution doesn't just make end developers at risk from a bad author breaking their well tested software. It also puts the security of their software under the the author's watch. Author of a particular package's credentials get leaked/stolen/whatever? suddenly my software is now possibly vulnerable to whatever person did it decides to upload.&nbsp;</div><div><br></div><div>It puts the integrity of my (proverbial my) software in the hands of a disparate group of authors who may or may not have the same stringent testing that I do. Any python application that get's installed from PyPI is at risk of mysteriously breaking, even with a "known good" configuration. These bugs are often hard to track down, and very confusing and difficult to determine why they are occurring when they never did before.</div><blockquote type="cite" style="border-left-style:solid;border-width:1px;margin-left:0px;padding-left:10px;"><span><div><div><div><br></div><div>-- </div><div>Marc-Andre Lemburg</div><div><a href="http://eGenix.com">eGenix.com</a></div><div><br></div><div>Professional Python Services directly from the Source  (#1, Jan 30 2012)</div><blockquote type="cite"><blockquote type="cite"><blockquote type="cite"><div><div>Python/Zope Consulting and Support ...        <a href="http://www.egenix.com">http://www.egenix.com</a>/</div><div>mxODBC.Zope.Database.Adapter ...             <a href="http://zope.egenix.com">http://zope.egenix.com</a>/</div><div>mxODBC, mxDateTime, mxTextTools ...        <a href="http://python.egenix.com">http://python.egenix.com</a>/</div></div></blockquote></blockquote></blockquote><div>________________________________________________________________________</div><div><br></div><div>::: Try our new mxODBC.Connect Python Database Interface for free ! ::::</div><div><br></div><div><br></div><div>   <a href="http://eGenix.com">eGenix.com</a> Software, Skills and Services GmbH  Pastor-Loeh-Str.48</div><div>    D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg</div><div>           Registered at Amtsgericht Duesseldorf: HRB 46611</div><div>               <a href="http://www.egenix.com/company/contact/">http://www.egenix.com/company/contact/</a></div></div></div></span>
                 
                 
                 
                 
                </blockquote>
                 
                <div>
                    <br>
                </div>