diff options
author | Marcin Kuzminski <marcin@python-works.com> | 2012-09-08 00:17:33 +0200 |
---|---|---|
committer | Marcin Kuzminski <marcin@python-works.com> | 2012-09-08 00:17:33 +0200 |
commit | acf2954594693fb256185a4e904369e1cb8388ea (patch) | |
tree | 08a7de6bc3d285eeb4d7de8815e8780af5b810dc | |
parent | 8c3120ccc594d826ae03df45fdb137e84fe2f470 (diff) | |
parent | b00ef1cd72d8be9d92f328a907d888a7a161a853 (diff) |
merge with betav1.4.1
-rw-r--r-- | rhodecode/lib/compat.py | 131 | ||||
-rw-r--r-- | rhodecode/lib/db_manage.py | 11 | ||||
-rw-r--r-- | rhodecode/lib/subprocessio.py | 4 | ||||
-rw-r--r-- | rhodecode/websetup.py | 1 |
4 files changed, 143 insertions, 4 deletions
diff --git a/rhodecode/lib/compat.py b/rhodecode/lib/compat.py index d54b88d6..75ab561a 100644 --- a/rhodecode/lib/compat.py +++ b/rhodecode/lib/compat.py @@ -31,6 +31,7 @@ from rhodecode import __platform__, PLATFORM_WIN, __py_version__ # json #============================================================================== from rhodecode.lib.ext_json import json +import array #============================================================================== @@ -415,6 +416,14 @@ else: # in py2.6 bytes is a synonim for str _bytes = str +if __py_version__ >= (2, 6): + _bytearray = bytearray +else: + # no idea if this is correct but all integration tests are passing + # i think we never use bytearray anyway + _bytearray = array + + #============================================================================== # deque #============================================================================== @@ -548,7 +557,127 @@ else: if __py_version__ >= (2, 6): from threading import Event, Thread else: - from threading import _Verbose, Condition, Lock, Thread + from threading import _Verbose, Condition, Lock, Thread, _time, \ + _allocate_lock, RLock, _sleep + + def Condition(*args, **kwargs): + return _Condition(*args, **kwargs) + + class _Condition(_Verbose): + + def __init__(self, lock=None, verbose=None): + _Verbose.__init__(self, verbose) + if lock is None: + lock = RLock() + self.__lock = lock + # Export the lock's acquire() and release() methods + self.acquire = lock.acquire + self.release = lock.release + # If the lock defines _release_save() and/or _acquire_restore(), + # these override the default implementations (which just call + # release() and acquire() on the lock). Ditto for _is_owned(). + try: + self._release_save = lock._release_save + except AttributeError: + pass + try: + self._acquire_restore = lock._acquire_restore + except AttributeError: + pass + try: + self._is_owned = lock._is_owned + except AttributeError: + pass + self.__waiters = [] + + def __enter__(self): + return self.__lock.__enter__() + + def __exit__(self, *args): + return self.__lock.__exit__(*args) + + def __repr__(self): + return "<Condition(%s, %d)>" % (self.__lock, len(self.__waiters)) + + def _release_save(self): + self.__lock.release() # No state to save + + def _acquire_restore(self, x): + self.__lock.acquire() # Ignore saved state + + def _is_owned(self): + # Return True if lock is owned by current_thread. + # This method is called only if __lock doesn't have _is_owned(). + if self.__lock.acquire(0): + self.__lock.release() + return False + else: + return True + + def wait(self, timeout=None): + if not self._is_owned(): + raise RuntimeError("cannot wait on un-acquired lock") + waiter = _allocate_lock() + waiter.acquire() + self.__waiters.append(waiter) + saved_state = self._release_save() + try: # restore state no matter what (e.g., KeyboardInterrupt) + if timeout is None: + waiter.acquire() + if __debug__: + self._note("%s.wait(): got it", self) + else: + # Balancing act: We can't afford a pure busy loop, so we + # have to sleep; but if we sleep the whole timeout time, + # we'll be unresponsive. The scheme here sleeps very + # little at first, longer as time goes on, but never longer + # than 20 times per second (or the timeout time remaining). + endtime = _time() + timeout + delay = 0.0005 # 500 us -> initial delay of 1 ms + while True: + gotit = waiter.acquire(0) + if gotit: + break + remaining = endtime - _time() + if remaining <= 0: + break + delay = min(delay * 2, remaining, .05) + _sleep(delay) + if not gotit: + if __debug__: + self._note("%s.wait(%s): timed out", self, timeout) + try: + self.__waiters.remove(waiter) + except ValueError: + pass + else: + if __debug__: + self._note("%s.wait(%s): got it", self, timeout) + finally: + self._acquire_restore(saved_state) + + def notify(self, n=1): + if not self._is_owned(): + raise RuntimeError("cannot notify on un-acquired lock") + __waiters = self.__waiters + waiters = __waiters[:n] + if not waiters: + if __debug__: + self._note("%s.notify(): no waiters", self) + return + self._note("%s.notify(): notifying %d waiter%s", self, n, + n != 1 and "s" or "") + for waiter in waiters: + waiter.release() + try: + __waiters.remove(waiter) + except ValueError: + pass + + def notifyAll(self): + self.notify(len(self.__waiters)) + + notify_all = notifyAll def Event(*args, **kwargs): return _Event(*args, **kwargs) diff --git a/rhodecode/lib/db_manage.py b/rhodecode/lib/db_manage.py index 6370eacf..cd860087 100644 --- a/rhodecode/lib/db_manage.py +++ b/rhodecode/lib/db_manage.py @@ -30,7 +30,7 @@ import uuid import logging from os.path import dirname as dn, join as jn -from rhodecode import __dbversion__ +from rhodecode import __dbversion__, __py_version__ from rhodecode.model.user import UserModel from rhodecode.lib.utils import ask_ok @@ -659,3 +659,12 @@ class DbManage(object): reg_perm.user = default_user reg_perm.permission = perm self.sa.add(reg_perm) + + def finish(self): + """ + Function executed at the end of setup + """ + if not __py_version__ >= (2, 6): + notify('Python2.5 detected, please switch ' + 'egg:waitress#main -> egg:Paste#http ' + 'in your .ini file')
\ No newline at end of file diff --git a/rhodecode/lib/subprocessio.py b/rhodecode/lib/subprocessio.py index a0723638..5e19eccf 100644 --- a/rhodecode/lib/subprocessio.py +++ b/rhodecode/lib/subprocessio.py @@ -24,7 +24,7 @@ If not, see <http://www.gnu.org/licenses/>. ''' import os import subprocess -from rhodecode.lib.compat import deque, Event, Thread, _bytes +from rhodecode.lib.compat import deque, Event, Thread, _bytes, _bytearray class StreamFeeder(Thread): @@ -39,7 +39,7 @@ class StreamFeeder(Thread): self.daemon = True filelike = False self.bytes = _bytes() - if type(source) in (type(''), _bytes, bytearray): # string-like + if type(source) in (type(''), _bytes, _bytearray): # string-like self.bytes = _bytes(source) else: # can be either file pointer or file-like if type(source) in (int, long): # file pointer it is diff --git a/rhodecode/websetup.py b/rhodecode/websetup.py index 79321041..d342dc59 100644 --- a/rhodecode/websetup.py +++ b/rhodecode/websetup.py @@ -48,3 +48,4 @@ def setup_app(command, conf, vars): dbmanage.populate_default_permissions() Session.commit() load_environment(conf.global_conf, conf.local_conf, initial=True) + dbmanage.finish() |