[PEAK] Re: PATCH for setuptools: local and UTC time mismatch when
extracting to PYTHON_EGG_CACHE
Alain Spineux
aspineux at gmail.com
Tue Jun 17 09:58:53 EDT 2008
I made a better version of the patch, using the
calendar.gmtime() function to convert UTC tuple into the Unix timestamp.
--- pkg_resources.py.orig 2008-04-17 14:19:03.000000000 +0200
+++ pkg_resources.py 2008-06-10 03:54:08.000000000 +0200
@@ -13,7 +13,7 @@
method.
"""
-import sys, os, zipimport, time, re, imp, new
+import sys, os, zipimport, time, re, imp, new, calendar
try:
frozenset
@@ -1325,7 +1325,7 @@
(d>>9)+1980, (d>>5)&0xF, d&0x1F, # ymd
(t&0xFFFF)>>11, (t>>5)&0x3F, (t&0x1F) * 2, 0, 0, -1 # hms, etc.
)
- timestamp = time.mktime(date_time)
+ timestamp = calendar.timegm(date_time)
try:
real_path = manager.get_cache_path(
On Tue, May 13, 2008 at 5:16 PM, Alain Spineux <aspineux at gmail.com> wrote:
> Hi
>
> I sent this 1 month ago and didn't get any answer.
> Is it the good place to send patch ?
> Do you have any bugzilla alike ?
>
> Regards
>
> On Thu, Apr 17, 2008 at 4:37 PM, Alain Spineux <aspineux at gmail.com> wrote:
>> Hi
>>
>> I wrote a test case below.
>>
>> The problem: before to import a module, setuptools check if the one
>> already unzipped in the
>> cache match the original EGG file ! It compare the size and the date.
>> At first installation in the cache setuptools use the current timezone
>> (instead of UTC) to
>> initiate timestamp, but if the same module is used when a different
>> timezone is set, it will try to
>> install the module again and require the rights to write in $PYTHON_EGG_CACHE.
>> Now suppose I installed the module once as root and run one
>> instance of my application per timezone and with different user
>> credentials ... !
>> I get the "Permission denied" !!!
>>
>> Here is the test case and a PATCH at the end
>>
>> [root at eg01 tmp]# cat setuptools_tz.sh
>>
>> me=kolab-r
>> export PYTHON_EGG_CACHE=/tmp/test
>> rm -rf $PYTHON_EGG_CACHE
>> mkdir $PYTHON_EGG_CACHE
>> chown $me.$me $PYTHON_EGG_CACHE
>>
>> python -c "import MySQLdb" && echo Ok as root
>> ls -l $PYTHON_EGG_CACHE
>>
>> su $me -c 'python -c "import MySQLdb"' && echo Ok as $me
>>
>> export TZ=UTC
>>
>> su $me -c 'python -c "import MySQLdb"' && echo Ok as $me
>>
>>
>>
>> [root at eg01 tmp]# sh setuptools_tz.sh
>> Ok as root
>> total 8
>> drwxr-xr-x 2 root root 4096 Apr 17 16:05
>> MySQL_python-1.2.2-py2.5-linux-i686.egg-tmp
>> Ok as kolab-r
>> Traceback (most recent call last):
>> File "<string>", line 1, in <module>
>> File "/kolab/lib/python/site-packages/PIL/__init__.py", line 19, in <module>
>>
>> File "/kolab/lib/python/site-packages/MySQL_python-1.2.2-py2.5-linux-i686.egg/_mysql.py",
>> line 7, in <module>
>> File "/kolab/lib/python/site-packages/MySQL_python-1.2.2-py2.5-linux-i686.egg/_mysql.py",
>> line 4, in __bootstrap__
>> File "pkg_resources.py", line 841, in resource_filename
>> self, resource_name
>> File "pkg_resources.py", line 1310, in get_resource_filename
>> self._extract_resource(manager, self._eager_to_zip(name))
>> File "pkg_resources.py", line 1365, in _extract_resource
>> manager.extraction_error() # report a user-friendly error
>> File "pkg_resources.py", line 887, in extraction_error
>> raise err
>> pkg_resources.ExtractionError: Can't extract file(s) to egg cache
>>
>> The following error occurred while trying to extract file(s) to the Python egg
>> cache:
>>
>> [Errno 13] Permission denied:
>> '/tmp/test/MySQL_python-1.2.2-py2.5-linux-i686.egg-tmp/tmpvIJCos.$extract'
>>
>> The Python egg cache directory is currently set to:
>>
>> /tmp/test
>>
>> Perhaps your account does not have write access to this directory? You can
>> change the cache directory by setting the PYTHON_EGG_CACHE environment
>> variable to point to an accessible directory.
>>
>>
>>
>> ---- patch start -----
>> --- setuptools-0.6c8-py2.5.egg/pkg_resources.py.orig 2008-04-17
>> 14:19:03.000000000 +0200
>> +++ setuptools-0.6c8-py2.5.egg/pkg_resources.py 2008-04-17
>> 16:34:40.000000000 +0200
>> @@ -1325,7 +1325,20 @@
>> (d>>9)+1980, (d>>5)&0xF, d&0x1F, # ymd
>> (t&0xFFFF)>>11, (t>>5)&0x3F, (t&0x1F) * 2, 0, 0, -1 # hms, etc.
>> )
>> - timestamp = time.mktime(date_time)
>> + # the original buggy code
>> + # timestamp = time.mktime(date_time)
>> +
>> + # some helper to convert UTC tuple in UTC sec from the epoch
>> + def _d(y, m, d, days=(0,31,59,90,120,151,181,212,243,273,304,334,365)):
>> + return (((y - 1901)*1461)/4 + days[m-1] + d +
>> + ((m > 2 and not y % 4 and (y % 100 or not y % 400)) and 1))
>> +
>> + def timegm(tm, epoch=_d(1970,1,1)):
>> + year, month, day, h, m, s = tm[:6]
>> + return (_d(year, month, day) - epoch)*86400 + h*3600 + m*60 + s
>> +
>> + # the good code that return the correct timestamp
>> + timestamp = timegm(date_time)
>>
>> try:
>> real_path = manager.get_cache_path(
>> @@ -1334,6 +1347,7 @@
>>
>> if os.path.isfile(real_path):
>> stat = os.stat(real_path)
>> + #print 'ASX', real_path, stat.st_mtime, 'ZIP=',
>> timestamp, stat.st_mtime-timestamp, zip_stat, date_time
>> if stat.st_size==size and stat.st_mtime==timestamp:
>> # size and stamp match, don't bother extracting
>> return real_path
>>
>> ----- patch end -----
>>
>> Regards
>>
>> --
>> Alain Spineux
>> aspineux gmail com
>> May the sources be with you
>>
>
>
>
> --
> Alain Spineux
> aspineux gmail com
> May the sources be with you
>
--
Alain Spineux
aspineux gmail com
May the sources be with you
More information about the PEAK
mailing list