From 5162c495f1c309e15bff1650e31fc6209c29b442 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 2 Feb 2018 13:58:17 +0100 Subject: [PATCH 001/124] release: Bump version 4.11.0 to 4.12.0 --- .bumpversion.cfg | 2 +- rhodecode/VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 2e1f03ef..de82363c 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 4.11.0 +current_version = 4.12.0 message = release: Bump version {current_version} to {new_version} [bumpversion:file:rhodecode/VERSION] diff --git a/rhodecode/VERSION b/rhodecode/VERSION index 91f3b438..bcd250ed 100644 --- a/rhodecode/VERSION +++ b/rhodecode/VERSION @@ -1 +1 @@ -4.11.0 \ No newline at end of file +4.12.0 \ No newline at end of file From ee9bb863218ea55a801625c73ceba37b992de3f3 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 2 Feb 2018 14:13:13 +0100 Subject: [PATCH 002/124] nix: bumped version --- pkgs/python-packages.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 51ecb56b..a7d2de56 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -1680,7 +1680,7 @@ }; }; rhodecode-enterprise-ce = super.buildPythonPackage { - name = "rhodecode-enterprise-ce-4.11.1"; + name = "rhodecode-enterprise-ce-4.12.0"; buildInputs = with self; [pytest py pytest-cov pytest-sugar pytest-runner pytest-catchlog pytest-profiling gprof2dot pytest-timeout mock WebTest cov-core coverage configobj]; doCheck = true; propagatedBuildInputs = with self; [setuptools-scm amqp authomatic Babel Beaker celery Chameleon channelstream click colander configobj cssselect decorator deform docutils dogpile.cache dogpile.core ecdsa FormEncode future futures gnureadline infrae.cache iso8601 itsdangerous Jinja2 billiard kombu lxml Mako Markdown MarkupSafe msgpack-python MySQL-python objgraph packaging Paste PasteDeploy PasteScript pathlib2 peppercorn psutil psycopg2 py-bcrypt pycrypto pycurl pyflakes pygments-markdown-lexer Pygments pyparsing pyramid-beaker pyramid-debugtoolbar pyramid-jinja2 pyramid-mako pyramid pysqlite python-dateutil python-ldap python-memcached python-pam pytz pyzmq py-gfm recaptcha-client redis repoze.lru requests Routes setproctitle simplejson six SQLAlchemy sshpubkeys subprocess32 supervisor Tempita translationstring trollius urllib3 URLObject venusian WebError WebHelpers2 WebHelpers WebOb Whoosh wsgiref zope.cachedescriptors zope.deprecation zope.event zope.interface nbconvert bleach nbformat jupyter-client alembic invoke bumpversion transifex-client gevent greenlet gunicorn waitress uWSGI ipdb ipython CProfileV bottle rhodecode-tools appenlight-client pytest py pytest-cov pytest-sugar pytest-runner pytest-catchlog pytest-profiling gprof2dot pytest-timeout mock WebTest cov-core coverage]; From 531660c46fd0665a1a481480656f870072d0db43 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 2 Feb 2018 14:14:27 +0100 Subject: [PATCH 003/124] dependencies: bumped graphviz 0.8.2 --- pkgs/python-packages.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index a7d2de56..43e1be18 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -783,13 +783,13 @@ }; }; graphviz = super.buildPythonPackage { - name = "graphviz-0.8.1"; + name = "graphviz-0.8.2"; buildInputs = with self; []; doCheck = false; propagatedBuildInputs = with self; []; src = fetchurl { - url = "https://pypi.python.org/packages/a9/a6/ee6721349489a2da6eedd3dba124f2b5ac15ee1e0a7bd4d3cfdc4fff0327/graphviz-0.8.1.zip"; - md5 = "88d8efa88c02a735b3659fe0feaf0b96"; + url = "https://pypi.python.org/packages/fa/d1/63b62dee9e55368f60b5ea445e6afb361bb47e692fc27553f3672e16efb8/graphviz-0.8.2.zip"; + md5 = "50866e780f43e1cb0d073c70424fcaff"; }; meta = { license = [ pkgs.lib.licenses.mit ]; From ad22d6050d754ef2528462bd7adf308117f2622c Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 2 Feb 2018 14:14:52 +0100 Subject: [PATCH 004/124] dependencies: bumped to ipaddress 0.1.19 --- pkgs/python-packages.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 43e1be18..78581997 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -874,13 +874,13 @@ }; }; ipaddress = super.buildPythonPackage { - name = "ipaddress-1.0.18"; + name = "ipaddress-1.0.19"; buildInputs = with self; []; doCheck = false; propagatedBuildInputs = with self; []; src = fetchurl { - url = "https://pypi.python.org/packages/4e/13/774faf38b445d0b3a844b65747175b2e0500164b7c28d78e34987a5bfe06/ipaddress-1.0.18.tar.gz"; - md5 = "310c2dfd64eb6f0df44aa8c59f2334a7"; + url = "https://pypi.python.org/packages/f0/ba/860a4a3e283456d6b7e2ab39ce5cf11a3490ee1a363652ac50abf9f0f5df/ipaddress-1.0.19.tar.gz"; + md5 = "d0687efaf93a32476d81e90ba0609c57"; }; meta = { license = [ pkgs.lib.licenses.psfl ]; From 87eddf01a3f6288bdd90baf5b993c6a061a0bbb0 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 2 Feb 2018 14:15:23 +0100 Subject: [PATCH 005/124] dependencies: bumped pyexpect to 4.3.1 --- pkgs/python-packages.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 78581997..60751de1 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -1160,13 +1160,13 @@ }; }; pexpect = super.buildPythonPackage { - name = "pexpect-4.3.0"; + name = "pexpect-4.3.1"; buildInputs = with self; []; doCheck = false; propagatedBuildInputs = with self; [ptyprocess]; src = fetchurl { - url = "https://pypi.python.org/packages/f8/44/5466c30e49762bb92e442bbdf4472d6904608d211258eb3198a11f0309a4/pexpect-4.3.0.tar.gz"; - md5 = "047a486dcd26134b74f2e67046bb61a0"; + url = "https://pypi.python.org/packages/14/05/47c8bca66390c9b18c91f6152db4b74eb850382e8e13aa2f06dfb3036466/pexpect-4.3.1.tar.gz"; + md5 = "16aa4549136b2d1b2bf1e0e9788d75a6"; }; meta = { license = [ pkgs.lib.licenses.isc { fullName = "ISC License (ISCL)"; } ]; From 5995762b95ac91c99575bd23ae396ac1169a2ed2 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 2 Feb 2018 14:15:54 +0100 Subject: [PATCH 006/124] dependencies: bumped ws4py to 0.4.3 --- pkgs/python-packages.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 60751de1..c9527a4a 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -2002,13 +2002,13 @@ }; }; ws4py = super.buildPythonPackage { - name = "ws4py-0.4.2"; + name = "ws4py-0.4.3"; buildInputs = with self; []; doCheck = false; propagatedBuildInputs = with self; []; src = fetchurl { - url = "https://pypi.python.org/packages/b8/98/a90f1d96ffcb15dfc220af524ce23e0a5881258dafa197673357ce1683dd/ws4py-0.4.2.tar.gz"; - md5 = "f0603ae376707a58d205bd87a67758a2"; + url = "https://pypi.python.org/packages/fa/a1/33c43a4304ac3b4dc81deb93cbd329de9297dd034d75c47cce64fda806bc/ws4py-0.4.3.tar.gz"; + md5 = "d5834cf7d3965bb0da31bbb02bd8513a"; }; meta = { license = [ pkgs.lib.licenses.bsdOriginal ]; From 42755eaad0228beeceacfadaed54af2823940f17 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 2 Feb 2018 14:18:44 +0100 Subject: [PATCH 007/124] dependencies: bumped bleach to 2.1.2 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index c9527a4a..c7b7d5df 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -406,13 +406,13 @@ }; }; bleach = super.buildPythonPackage { - name = "bleach-2.1.1"; + name = "bleach-2.1.2"; buildInputs = with self; []; doCheck = false; propagatedBuildInputs = with self; [six html5lib]; src = fetchurl { - url = "https://pypi.python.org/packages/d4/3f/d517089af35b01bb9bc4eac5ea04bae342b37a5e9abbb27b7c3ce0eae070/bleach-2.1.1.tar.gz"; - md5 = "7c5dfb1d66ea979b5a465afb12c82ec4"; + url = "https://pypi.python.org/packages/b3/5f/0da670d30d3ffbc57cc97fa82947f81bbe3eab8d441e2d42e661f215baf2/bleach-2.1.2.tar.gz"; + md5 = "d0b14ae43a437ee0c650e04c6063eedd"; }; meta = { license = [ pkgs.lib.licenses.asl20 ]; diff --git a/requirements.txt b/requirements.txt index 742bab56..8e1f44b6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -98,7 +98,7 @@ zope.interface==4.1.3 # entrypoints backport, pypi version doesn't support egg installs https://code.rhodecode.com/upstream/entrypoints/archive/96e6d645684e1af3d7df5b5272f3fe85a546b233.tar.gz?md5=7db37771aea9ac9fefe093e5d6987313#egg=entrypoints==0.2.2.rhodecode-upstream1 nbconvert==5.3.1 -bleach==2.1.1 +bleach==2.1.2 nbformat==4.4.0 jupyter_client==5.0.0 From dbb2ccfca4549bed6560795528af0f64f810c772 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 2 Feb 2018 14:19:02 +0100 Subject: [PATCH 008/124] dependencies: bumped html5lib 1.0.1 --- pkgs/python-packages.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index c7b7d5df..1c04d727 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -822,13 +822,13 @@ }; }; html5lib = super.buildPythonPackage { - name = "html5lib-1.0b10"; + name = "html5lib-1.0.1"; buildInputs = with self; []; doCheck = false; - propagatedBuildInputs = with self; [six webencodings setuptools]; + propagatedBuildInputs = with self; [six webencodings]; src = fetchurl { - url = "https://pypi.python.org/packages/97/16/982214624095c1420c75f3bd295d9e658794aafb95fc075823de107e0ae4/html5lib-1.0b10.tar.gz"; - md5 = "5ada1243b7a863624b2f35245b2186e9"; + url = "https://pypi.python.org/packages/85/3e/cf449cf1b5004e87510b9368e7a5f1acd8831c2d6691edd3c62a0823f98f/html5lib-1.0.1.tar.gz"; + md5 = "942a0688d6bdf20d087c9805c40182ad"; }; meta = { license = [ pkgs.lib.licenses.mit ]; From 515a904f68ea344439a748cb07eeff6fc43fc109 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 2 Feb 2018 14:27:02 +0100 Subject: [PATCH 009/124] dependecies: bumped greenlet to 0.4.13 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 1c04d727..9ca89610 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -796,13 +796,13 @@ }; }; greenlet = super.buildPythonPackage { - name = "greenlet-0.4.12"; + name = "greenlet-0.4.13"; buildInputs = with self; []; doCheck = false; propagatedBuildInputs = with self; []; src = fetchurl { - url = "https://pypi.python.org/packages/be/76/82af375d98724054b7e273b5d9369346937324f9bcc20980b45b068ef0b0/greenlet-0.4.12.tar.gz"; - md5 = "e8637647d58a26c4a1f51ca393e53c00"; + url = "https://pypi.python.org/packages/13/de/ba92335e9e76040ca7274224942282a80d54f85e342a5e33c5277c7f87eb/greenlet-0.4.13.tar.gz"; + md5 = "6e0b9dd5385f81d478451ec8ed1d62b3"; }; meta = { license = [ pkgs.lib.licenses.mit ]; diff --git a/requirements.txt b/requirements.txt index 8e1f44b6..265493ba 100644 --- a/requirements.txt +++ b/requirements.txt @@ -110,7 +110,7 @@ transifex-client==0.12.5 ## http servers gevent==1.2.2 -greenlet==0.4.12 +greenlet==0.4.13 gunicorn==19.7.1 waitress==1.1.0 uWSGI==2.0.15 From f733999500297ac534f511218ace538e1ac215ef Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 2 Feb 2018 14:41:57 +0100 Subject: [PATCH 010/124] dependencies: bumped markdown to 2.6.11 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 9ca89610..60ee3e40 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -94,13 +94,13 @@ }; }; Markdown = super.buildPythonPackage { - name = "Markdown-2.6.9"; + name = "Markdown-2.6.11"; buildInputs = with self; []; doCheck = false; propagatedBuildInputs = with self; []; src = fetchurl { - url = "https://pypi.python.org/packages/29/82/dfe242bcfd9eec0e7bf93a80a8f8d8515a95b980c44f5c0b45606397a423/Markdown-2.6.9.tar.gz"; - md5 = "56547d362a9abcf30955b8950b08b5e3"; + url = "https://pypi.python.org/packages/b3/73/fc5c850f44af5889192dff783b7b0d8f3fe8d30b65c8e3f78f8f0265fecf/Markdown-2.6.11.tar.gz"; + md5 = "a67c1b2914f7d74eeede2ebe0fdae470"; }; meta = { license = [ pkgs.lib.licenses.bsdOriginal ]; diff --git a/requirements.txt b/requirements.txt index 265493ba..6b86ea05 100644 --- a/requirements.txt +++ b/requirements.txt @@ -31,7 +31,7 @@ billiard==3.5.0.3 kombu==4.1.0 lxml==3.7.3 Mako==1.0.7 -Markdown==2.6.9 +Markdown==2.6.11 MarkupSafe==1.0.0 msgpack-python==0.4.8 MySQL-python==1.2.5 From e8869c22a7c49ee61dc41586600ea77cee95605d Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 2 Feb 2018 14:42:12 +0100 Subject: [PATCH 011/124] dependencies: bumped psutil to 5.4.3 --- pkgs/python-packages.nix | 6 +++--- requirements.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/python-packages.nix b/pkgs/python-packages.nix index 60ee3e40..ca64b522 100644 --- a/pkgs/python-packages.nix +++ b/pkgs/python-packages.nix @@ -1225,13 +1225,13 @@ }; }; psutil = super.buildPythonPackage { - name = "psutil-5.4.0"; + name = "psutil-5.4.3"; buildInputs = with self; []; doCheck = false; propagatedBuildInputs = with self; []; src = fetchurl { - url = "https://pypi.python.org/packages/8d/96/1fc6468be91521192861966c40bd73fdf8b065eae6d82dd0f870b9825a65/psutil-5.4.0.tar.gz"; - md5 = "01af6219b1e8fcfd53603023967713bf"; + url = "https://pypi.python.org/packages/e2/e1/600326635f97fee89bf8426fef14c5c29f4849c79f68fd79f433d8c1bd96/psutil-5.4.3.tar.gz"; + md5 = "3b291833dbea631db9d271aa602a169a"; }; meta = { license = [ pkgs.lib.licenses.bsdOriginal ]; diff --git a/requirements.txt b/requirements.txt index 6b86ea05..6d8188e2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -42,7 +42,7 @@ PasteDeploy==1.5.2 PasteScript==2.0.2 pathlib2==2.3.0 peppercorn==0.5 -psutil==5.4.0 +psutil==5.4.3 psycopg2==2.7.3.2 py-bcrypt==0.4 pycrypto==2.6.1 From 63034e6033af83788e1609323d9314b090af693f Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 2 Feb 2018 19:48:03 +0100 Subject: [PATCH 012/124] gunicorn: show total gunicorn execution time, and worker counter base on the gunicorn_conf.py --- configs/gunicorn_config.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/configs/gunicorn_config.py b/configs/gunicorn_config.py index 9abfbdd8..60f2a156 100644 --- a/configs/gunicorn_config.py +++ b/configs/gunicorn_config.py @@ -119,16 +119,16 @@ def child_exit(server, worker): def pre_request(worker, req): - return - worker.log.debug("[<%-10s>] PRE WORKER: %s %s", - worker.pid, req.method, req.path) + worker.start_time = time.time() + worker.log.debug( + "GNCRN PRE WORKER: %s %s", req.method, req.path) def post_request(worker, req, environ, resp): - return - worker.log.debug("[<%-10s>] POST WORKER: %s %s resp: %s", worker.pid, - req.method, req.path, resp.status_code) - + total_time = time.time() - worker.start_time + worker.log.debug( + "GNCRN POST WORKER [cnt:%s]: %s %s resp: %s, Load Time: %.3fs", + worker.nr, req.method, req.path, resp.status_code, total_time) class RhodeCodeLogger(Logger): From b23a02309351742c856907f536040af18963d0ef Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 5 Feb 2018 13:21:37 +0100 Subject: [PATCH 013/124] meta: fix write condition. --- rhodecode/subscribers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rhodecode/subscribers.py b/rhodecode/subscribers.py index 269bfa39..e8b2d645 100644 --- a/rhodecode/subscribers.py +++ b/rhodecode/subscribers.py @@ -184,7 +184,7 @@ def write_metadata_if_needed(event): except Exception: age_in_min = 0 - if age_in_min < 60 * 60 * 24: + if age_in_min > 60 * 60 * 24: return try: From b8619894a601e9b73d152f3eb7aceed1607e8936 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 5 Feb 2018 18:45:04 +0100 Subject: [PATCH 014/124] process-management: use safer way to extract data for processes. - prevents from unknown PID errors. --- .../apps/admin/views/process_management.py | 42 ++++++++++++++++--- .../settings_process_management_data.mako | 36 +++++++--------- 2 files changed, 52 insertions(+), 26 deletions(-) diff --git a/rhodecode/apps/admin/views/process_management.py b/rhodecode/apps/admin/views/process_management.py index 5cd2f496..847bcaab 100644 --- a/rhodecode/apps/admin/views/process_management.py +++ b/rhodecode/apps/admin/views/process_management.py @@ -28,7 +28,7 @@ from rhodecode.apps._base import BaseAppView from rhodecode.apps.admin.navigation import navigation_list from rhodecode.lib.auth import ( LoginRequired, HasPermissionAllDecorator, CSRFRequired) -from rhodecode.lib.utils2 import safe_int +from rhodecode.lib.utils2 import safe_int, StrictAttributeDict log = logging.getLogger(__name__) @@ -36,9 +36,41 @@ log = logging.getLogger(__name__) class AdminProcessManagementView(BaseAppView): def load_default_context(self): c = self._get_local_tmpl_context() - return c + def _format_proc(self, proc, with_children=False): + try: + mem = proc.memory_info() + proc_formatted = StrictAttributeDict({ + 'pid': proc.pid, + 'name': proc.name(), + 'mem_rss': mem.rss, + 'mem_vms': mem.vms, + 'cpu_percent': proc.cpu_percent(), + 'create_time': proc.create_time(), + 'cmd': ' '.join(proc.cmdline()), + }) + + if with_children: + proc_formatted.update({ + 'children': [self._format_proc(x) + for x in proc.children(recursive=True)] + }) + except Exception: + log.exception('Failed to load proc') + proc_formatted = None + return proc_formatted + + def get_processes(self): + proc_list = [] + for p in psutil.process_iter(): + if 'gunicorn' in p.name(): + proc = self._format_proc(p, with_children=True) + if proc: + proc_list.append(proc) + + return proc_list + @LoginRequired() @HasPermissionAllDecorator('hg.admin') @view_config( @@ -50,8 +82,7 @@ class AdminProcessManagementView(BaseAppView): c.active = 'process_management' c.navlist = navigation_list(self.request) - c.gunicorn_processes = ( - p for p in psutil.process_iter() if 'gunicorn' in p.name()) + c.gunicorn_processes = self.get_processes() return self._get_template_context(c) @LoginRequired() @@ -62,8 +93,7 @@ class AdminProcessManagementView(BaseAppView): def process_management_data(self): _ = self.request.translate c = self.load_default_context() - c.gunicorn_processes = ( - p for p in psutil.process_iter() if 'gunicorn' in p.name()) + c.gunicorn_processes = self.get_processes() return self._get_template_context(c) @LoginRequired() diff --git a/rhodecode/templates/admin/settings/settings_process_management_data.mako b/rhodecode/templates/admin/settings/settings_process_management_data.mako index 0bbc86f8..832bfcf2 100644 --- a/rhodecode/templates/admin/settings/settings_process_management_data.mako +++ b/rhodecode/templates/admin/settings/settings_process_management_data.mako @@ -2,12 +2,11 @@ <% def get_name(proc): - cmd = ' '.join(proc.cmdline()) - if 'vcsserver.ini' in cmd: + if 'vcsserver.ini' in proc.cmd: return 'VCSServer' - elif 'rhodecode.ini' in cmd: + elif 'rhodecode.ini' in proc.cmd: return 'RhodeCode' - return proc.name() + return proc.name %> % for proc in c.gunicorn_processes: - <% mem = proc.memory_info()%> - <% children = proc.children(recursive=True) %> - % if children: + % if proc.children: <% mem_sum = 0 %> - % for proc_child in children: - <% mem = proc_child.memory_info()%> + % for proc_child in proc.children: % endfor - + From f94ac01a596c3a4c6b2ac613380155189114e171 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 5 Feb 2018 18:52:04 +0100 Subject: [PATCH 015/124] process-management: prevent from inject login page on session expiration. --- .../admin/settings/settings_process_management.mako | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/rhodecode/templates/admin/settings/settings_process_management.mako b/rhodecode/templates/admin/settings/settings_process_management.mako index 4165dba8..ef454f6b 100644 --- a/rhodecode/templates/admin/settings/settings_process_management.mako +++ b/rhodecode/templates/admin/settings/settings_process_management.mako @@ -70,6 +70,13 @@ autoRefresh = function(value) { var loadData = function() { currentRequest = $.get(url) .done(function(data) { + + if(data.indexOf('id="processTimeStamp"') === -1){ + clearInterval(intervalID); + $('#procList').html('ERROR LOADING DATA. PLEASE REFRESH THE PAGE'); + return + } + currentRequest = null; $('#procList').html(data); timeagoActivate(); From 2c3c7c561ca251cdd8d7814fe11a78ffde419c68 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Tue, 6 Feb 2018 14:42:52 +0100 Subject: [PATCH 016/124] gunicorn: update config to present consistent pre and post logs. --- configs/gunicorn_config.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/configs/gunicorn_config.py b/configs/gunicorn_config.py index 60f2a156..5ed0db5c 100644 --- a/configs/gunicorn_config.py +++ b/configs/gunicorn_config.py @@ -55,6 +55,7 @@ keepalive = 2 # SERVER MECHANICS # None == system temp dir +# worker_tmp_dir is recommended to be set to some tmpfs worker_tmp_dir = None tmp_upload_dir = None @@ -121,7 +122,7 @@ def child_exit(server, worker): def pre_request(worker, req): worker.start_time = time.time() worker.log.debug( - "GNCRN PRE WORKER: %s %s", req.method, req.path) + "GNCRN PRE WORKER [cnt:%s]: %s %s", worker.nr, req.method, req.path) def post_request(worker, req, environ, resp): From b2c7cd47ea2c5af65c9123e049df9b572e11170b Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Wed, 7 Feb 2018 18:26:38 +0100 Subject: [PATCH 017/124] pull-request, git: add option to skip --ff-only --- rhodecode/lib/vcs/backends/git/repository.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/rhodecode/lib/vcs/backends/git/repository.py b/rhodecode/lib/vcs/backends/git/repository.py index e3ca9482..62e46540 100644 --- a/rhodecode/lib/vcs/backends/git/repository.py +++ b/rhodecode/lib/vcs/backends/git/repository.py @@ -791,7 +791,7 @@ class GitRepository(BaseRepository): def _get_shadow_instance(self, shadow_repository_path, enable_hooks=False): return GitRepository(shadow_repository_path) - def _local_pull(self, repository_path, branch_name): + def _local_pull(self, repository_path, branch_name, ff_only=True): """ Pull a branch from a local repository. """ @@ -802,7 +802,10 @@ class GitRepository(BaseRepository): # conflicts with our current branch) # Additionally, that option needs to go before --no-tags, otherwise git # pull complains about it being an unknown flag. - cmd = ['pull', '--ff-only', '--no-tags', repository_path, branch_name] + cmd = ['pull'] + if ff_only: + cmd.append('--ff-only') + cmd.extend(['--no-tags', repository_path, branch_name]) self.run_git_command(cmd, fail_on_stderr=False) def _local_merge(self, merge_message, user_name, user_email, heads): @@ -915,6 +918,7 @@ class GitRepository(BaseRepository): pr_branch = shadow_repo._get_new_pr_branch( source_ref.name, target_ref.name) + log.debug('using pull-request merge branch: `%s`', pr_branch) shadow_repo._checkout(pr_branch, create=True) try: shadow_repo._local_fetch(source_repo.path, source_ref.name) From 141575541f8dd8931fa0366540a8c866fdc11282 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Fri, 9 Feb 2018 10:52:58 +0100 Subject: [PATCH 018/124] core: properly report 502 errors for gevent and gunicorn. - gevent+gunicorn doesn't raise normal pycurl errors --- rhodecode/lib/exceptions.py | 1 + rhodecode/lib/vcs/client_http.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/rhodecode/lib/exceptions.py b/rhodecode/lib/exceptions.py index 914f46f1..3051ce9c 100644 --- a/rhodecode/lib/exceptions.py +++ b/rhodecode/lib/exceptions.py @@ -132,6 +132,7 @@ class VCSServerUnavailable(HTTPBadGateway): 'Incorrect vcs.server=host:port', 'Incorrect vcs.server.protocol', ] + def __init__(self, message=''): self.explanation = 'Could not connect to VCS Server' if message: diff --git a/rhodecode/lib/vcs/client_http.py b/rhodecode/lib/vcs/client_http.py index 824f4b61..2d0bb715 100644 --- a/rhodecode/lib/vcs/client_http.py +++ b/rhodecode/lib/vcs/client_http.py @@ -197,6 +197,13 @@ def _remote_call(url, payload, exceptions_map, session): response = session.post(url, data=msgpack.packb(payload)) except pycurl.error as e: raise exceptions.HttpVCSCommunicationError(e) + except Exception as e: + message = getattr(e, 'message', '') + if 'Failed to connect' in message: + # gevent doesn't return proper pycurl errors + raise exceptions.HttpVCSCommunicationError(e) + else: + raise if response.status_code >= 400: log.error('Call to %s returned non 200 HTTP code: %s', From f878774ddedbe899d426ecc3c7281ffae25ef891 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Sun, 11 Feb 2018 20:42:17 +0100 Subject: [PATCH 019/124] ini: remove deprecated ini setting. --- configs/development.ini | 3 --- configs/production.ini | 3 --- rhodecode/tests/rhodecode.ini | 3 --- 3 files changed, 9 deletions(-) diff --git a/configs/development.ini b/configs/development.ini index 51a71cda..89e639d5 100644 --- a/configs/development.ini +++ b/configs/development.ini @@ -190,9 +190,6 @@ force_https = false ## use Strict-Transport-Security headers use_htsts = false -## number of commits stats will parse on each iteration -commit_parse_limit = 25 - ## git rev filter option, --all is the default filter, if you need to ## hide all refs in changelog switch this to --branches --tags git_rev_filter = --branches --tags diff --git a/configs/production.ini b/configs/production.ini index c169ce7c..abc27a5a 100644 --- a/configs/production.ini +++ b/configs/production.ini @@ -165,9 +165,6 @@ force_https = false ## use Strict-Transport-Security headers use_htsts = false -## number of commits stats will parse on each iteration -commit_parse_limit = 25 - ## git rev filter option, --all is the default filter, if you need to ## hide all refs in changelog switch this to --branches --tags git_rev_filter = --branches --tags diff --git a/rhodecode/tests/rhodecode.ini b/rhodecode/tests/rhodecode.ini index 192f441b..ba27aa20 100644 --- a/rhodecode/tests/rhodecode.ini +++ b/rhodecode/tests/rhodecode.ini @@ -154,9 +154,6 @@ force_https = false ## use Strict-Transport-Security headers use_htsts = false -## number of commits stats will parse on each iteration -commit_parse_limit = 25 - ## git rev filter option, --all is the default filter, if you need to ## hide all refs in changelog switch this to --branches --tags git_rev_filter = --all From e6766e5944f49087bc70e42b82ae2c11c4f72ccc Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Sun, 11 Feb 2018 20:39:24 +0100 Subject: [PATCH 020/124] docs: added info about how to remove nix from dev setup. --- docs/contributing/dev-setup.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/contributing/dev-setup.rst b/docs/contributing/dev-setup.rst index 07b7a1a6..6fc70d49 100644 --- a/docs/contributing/dev-setup.rst +++ b/docs/contributing/dev-setup.rst @@ -34,6 +34,13 @@ following commands: Update your channels frequently by running ``nix-channel --update``. +.. note:: + + To uninstall nix run the following: + + remove the . "$HOME/.nix-profile/etc/profile.d/nix.sh" line in your ~/.profile or ~/.bash_profile + rm -rf $HOME/{.nix-channels,.nix-defexpr,.nix-profile,.config/nixpkgs} + sudo rm -rf /nix Switch nix to the latest STABLE channel --------------------------------------- From 41dbdd78a47ea31059233d99625a404e61255a31 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 12 Feb 2018 14:09:30 +0100 Subject: [PATCH 021/124] form-templates: allow checkboxes to have help block. --- rhodecode/templates/forms/checkbox.pt | 32 ++++++++++++++---------- rhodecode/templates/forms/textinput.pt | 34 ++++++++++++++------------ 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/rhodecode/templates/forms/checkbox.pt b/rhodecode/templates/forms/checkbox.pt index 2e0520ee..a5252fb5 100644 --- a/rhodecode/templates/forms/checkbox.pt +++ b/rhodecode/templates/forms/checkbox.pt @@ -1,20 +1,26 @@ -
- + +
+ +

${help_block}

-
\ No newline at end of file +
+ + \ No newline at end of file diff --git a/rhodecode/templates/forms/textinput.pt b/rhodecode/templates/forms/textinput.pt index 578c3a23..3b76d3e2 100644 --- a/rhodecode/templates/forms/textinput.pt +++ b/rhodecode/templates/forms/textinput.pt @@ -6,21 +6,25 @@ mask_placeholder mask_placeholder|field.widget.mask_placeholder; style style|field.widget.style; help_block help_block|field.widget.help_block|''; -" + " tal:omit-tag=""> - -

${help_block}

- + + +

${help_block}

+ + \ No newline at end of file From 79ef96aa2de626d8caa485ae7f56b8ceff86a6cc Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Tue, 13 Feb 2018 10:15:20 +0100 Subject: [PATCH 022/124] form-templates: added readonly checkbox template --- .../templates/forms/readonly/checkbox.pt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 rhodecode/templates/forms/readonly/checkbox.pt diff --git a/rhodecode/templates/forms/readonly/checkbox.pt b/rhodecode/templates/forms/readonly/checkbox.pt new file mode 100644 index 00000000..b2ce52d0 --- /dev/null +++ b/rhodecode/templates/forms/readonly/checkbox.pt @@ -0,0 +1,27 @@ + + +
+ +

${help_block}

+ +
+ +
\ No newline at end of file From c2c94c7f571a2af551ea7de471b7a28464e18e3a Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Sun, 11 Feb 2018 20:51:56 +0100 Subject: [PATCH 023/124] repositories: allow storing push url for automation. --- rhodecode/__init__.py | 2 +- .../dbmigrate/versions/086_version_4_12_0.py | 39 +++++++++++++++++++ rhodecode/model/db.py | 14 +++++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 rhodecode/lib/dbmigrate/versions/086_version_4_12_0.py diff --git a/rhodecode/__init__.py b/rhodecode/__init__.py index bd65114c..34dd7c91 100644 --- a/rhodecode/__init__.py +++ b/rhodecode/__init__.py @@ -51,7 +51,7 @@ PYRAMID_SETTINGS = {} EXTENSIONS = {} __version__ = ('.'.join((str(each) for each in VERSION[:3]))) -__dbversion__ = 85 # defines current db version for migrations +__dbversion__ = 86 # defines current db version for migrations __platform__ = platform.system() __license__ = 'AGPLv3, and Commercial License' __author__ = 'RhodeCode GmbH' diff --git a/rhodecode/lib/dbmigrate/versions/086_version_4_12_0.py b/rhodecode/lib/dbmigrate/versions/086_version_4_12_0.py new file mode 100644 index 00000000..22470bb1 --- /dev/null +++ b/rhodecode/lib/dbmigrate/versions/086_version_4_12_0.py @@ -0,0 +1,39 @@ +import logging + +from sqlalchemy import * + +from rhodecode.model import meta +from rhodecode.lib.dbmigrate.versions import _reset_base, notify + +log = logging.getLogger(__name__) + + +def upgrade(migrate_engine): + """ + Upgrade operations go here. + Don't create your own engine; bind migrate_engine to your metadata + """ + _reset_base(migrate_engine) + from rhodecode.lib.dbmigrate.schema import db_4_11_0_0 as db + + repository_table = db.Repository.__table__ + + push_uri = Column( + "push_uri", db.EncryptedTextValue(), nullable=True, unique=False, + default=None) + + push_uri.create(table=repository_table) + + # issue fixups + fixups(db, meta.Session) + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + +def fixups(models, _SESSION): + pass + + diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py index f4a8aad0..b096d67d 100644 --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -1557,6 +1557,9 @@ class Repository(Base, BaseModel): clone_uri = Column( "clone_uri", EncryptedTextValue(), nullable=True, unique=False, default=None) + push_uri = Column( + "push_uri", EncryptedTextValue(), nullable=True, unique=False, + default=None) repo_type = Column( "repo_type", String(255), nullable=False, unique=False, default=None) user_id = Column( @@ -1943,6 +1946,7 @@ class Repository(Base, BaseModel): 'repo_name': repo.repo_name, 'repo_type': repo.repo_type, 'clone_uri': repo.clone_uri or '', + 'push_uri': repo.push_uri or '', 'url': RepoModel().get_url(self), 'private': repo.private, 'created_on': repo.created_on, @@ -2077,6 +2081,16 @@ class Repository(Base, BaseModel): clone_uri = url_obj.with_password('*****') return clone_uri + @property + def push_uri_hidden(self): + push_uri = self.push_uri + if push_uri: + import urlobject + url_obj = urlobject.URLObject(cleaned_uri(push_uri)) + if url_obj.password: + push_uri = url_obj.with_password('*****') + return push_uri + def clone_url(self, **override): from rhodecode.model.settings import SettingsModel From 803051c06bccf3a12febd98b734ba5189dfdadc2 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 12 Feb 2018 14:08:36 +0100 Subject: [PATCH 024/124] scm-model: fix the reference to the proper default url used for pushing --- rhodecode/model/scm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rhodecode/model/scm.py b/rhodecode/model/scm.py index 0c963e37..e5efd2ea 100644 --- a/rhodecode/model/scm.py +++ b/rhodecode/model/scm.py @@ -397,7 +397,7 @@ class ScmModel(BaseModel): def push_changes(self, repo, username, remote_uri=None): dbrepo = self._get_repo(repo) - remote_uri = remote_uri or dbrepo.clone_uri + remote_uri = remote_uri or dbrepo.push_uri if not remote_uri: raise Exception("This repository doesn't have a clone uri") From 5f25ae601efd6aaab9095d50b9297c63f82f6257 Mon Sep 17 00:00:00 2001 From: Marcin Kuzminski Date: Mon, 12 Feb 2018 14:14:33 +0100 Subject: [PATCH 025/124] repositories: allow properly updating repository push url. --- rhodecode/api/views/repo_api.py | 8 ++ rhodecode/apps/repository/__init__.py | 3 + .../apps/repository/views/repo_settings.py | 6 +- .../repository/views/repo_settings_remote.py | 2 - rhodecode/model/repo.py | 4 + .../validation_schema/schemas/repo_schema.py | 20 +++- rhodecode/public/js/rhodecode/routes.js | 1 + .../templates/admin/repos/repo_edit.mako | 2 +- .../admin/repos/repo_edit_remote.mako | 67 ++++++++++---- .../admin/repos/repo_edit_settings.mako | 91 ++++++++++++++++--- 10 files changed, 165 insertions(+), 39 deletions(-) diff --git a/rhodecode/api/views/repo_api.py b/rhodecode/api/views/repo_api.py index c81bee6e..f8713726 100644 --- a/rhodecode/api/views/repo_api.py +++ b/rhodecode/api/views/repo_api.py @@ -563,6 +563,7 @@ def create_repo( description=Optional(''), private=Optional(False), clone_uri=Optional(None), + push_uri=Optional(None), landing_rev=Optional('rev:tip'), enable_statistics=Optional(False), enable_locking=Optional(False), @@ -596,6 +597,8 @@ def create_repo( :type private: bool :param clone_uri: set clone_uri :type clone_uri: str + :param push_uri: set push_uri + :type push_uri: str :param landing_rev: : :type landing_rev: str :param enable_locking: @@ -639,6 +642,7 @@ def create_repo( description = Optional.extract(description) copy_permissions = Optional.extract(copy_permissions) clone_uri = Optional.extract(clone_uri) + push_uri = Optional.extract(push_uri) landing_commit_ref = Optional.extract(landing_rev) defs = SettingsModel().get_default_repo_settings(strip_prefix=True) @@ -666,6 +670,7 @@ def create_repo( repo_description=description, repo_landing_commit_ref=landing_commit_ref, repo_clone_uri=clone_uri, + repo_push_uri=push_uri, repo_private=private, repo_copy_permissions=copy_permissions, repo_enable_statistics=enable_statistics, @@ -684,6 +689,7 @@ def create_repo( 'repo_description': schema_data['repo_description'], 'repo_private': schema_data['repo_private'], 'clone_uri': schema_data['repo_clone_uri'], + 'push_uri': schema_data['repo_push_uri'], 'repo_landing_rev': schema_data['repo_landing_commit_ref'], 'enable_statistics': schema_data['repo_enable_statistics'], 'enable_locking': schema_data['repo_enable_locking'], @@ -907,6 +913,7 @@ def update_repo( repo_owner=updates['user'], repo_description=updates['repo_description'], repo_clone_uri=updates['clone_uri'], + repo_push_uri=updates['push_uri'], repo_fork_of=updates['fork_id'], repo_private=updates['repo_private'], repo_landing_commit_ref=updates['repo_landing_rev'], @@ -925,6 +932,7 @@ def update_repo( repo_description=schema_data['repo_description'], repo_private=schema_data['repo_private'], clone_uri=schema_data['repo_clone_uri'], + push_uri=schema_data['repo_push_uri'], repo_landing_rev=schema_data['repo_landing_commit_ref'], repo_enable_statistics=schema_data['repo_enable_statistics'], repo_enable_locking=schema_data['repo_enable_locking'], diff --git a/rhodecode/apps/repository/__init__.py b/rhodecode/apps/repository/__init__.py index d1796de1..1d30674e 100644 --- a/rhodecode/apps/repository/__init__.py +++ b/rhodecode/apps/repository/__init__.py @@ -373,6 +373,9 @@ def includeme(config): config.add_route( name='edit_repo_remote_pull', pattern='/{repo_name:.*?[^/]}/settings/remote/pull', repo_route=True) + config.add_route( + name='edit_repo_remote_push', + pattern='/{repo_name:.*?[^/]}/settings/remote/push', repo_route=True) # Statistics config.add_route( diff --git a/rhodecode/apps/repository/views/repo_settings.py b/rhodecode/apps/repository/views/repo_settings.py index 7dd314dd..b21fe5e7 100644 --- a/rhodecode/apps/repository/views/repo_settings.py +++ b/rhodecode/apps/repository/views/repo_settings.py @@ -138,15 +138,19 @@ class RepoSettingsView(RepoAppView): repo_description=schema_data['repo_description'], repo_private=schema_data['repo_private'], clone_uri=schema_data['repo_clone_uri'], + push_uri=schema_data['repo_push_uri'], repo_landing_rev=schema_data['repo_landing_commit_ref'], repo_enable_statistics=schema_data['repo_enable_statistics'], repo_enable_locking=schema_data['repo_enable_locking'], repo_enable_downloads=schema_data['repo_enable_downloads'], ) - # detect if CLONE URI changed, if we get OLD means we keep old values + # detect if SYNC URI changed, if we get OLD means we keep old values if schema_data['repo_clone_uri_change'] == 'OLD': validated_updates['clone_uri'] = self.db_repo.clone_uri + if schema_data['repo_push_uri_change'] == 'OLD': + validated_updates['push_uri'] = self.db_repo.push_uri + # use the new full name for redirect new_repo_name = schema_data['repo_group']['repo_name_with_group'] diff --git a/rhodecode/apps/repository/views/repo_settings_remote.py b/rhodecode/apps/repository/views/repo_settings_remote.py index d1ce1131..12f13889 100644 --- a/rhodecode/apps/repository/views/repo_settings_remote.py +++ b/rhodecode/apps/repository/views/repo_settings_remote.py @@ -35,8 +35,6 @@ log = logging.getLogger(__name__) class RepoSettingsRemoteView(RepoAppView): def load_default_context(self): c = self._get_local_tmpl_context() - - return c @LoginRequired() diff --git a/rhodecode/model/repo.py b/rhodecode/model/repo.py index 8f75afad..f48d041e 100644 --- a/rhodecode/model/repo.py +++ b/rhodecode/model/repo.py @@ -304,6 +304,7 @@ class RepoModel(BaseModel): {'k': 'repo_enable_locking', 'strip': True}, {'k': 'repo_landing_rev', 'strip': True}, {'k': 'clone_uri', 'strip': False}, + {'k': 'push_uri', 'strip': False}, {'k': 'repo_private', 'strip': True}, {'k': 'repo_enable_statistics', 'strip': True} ) @@ -319,6 +320,8 @@ class RepoModel(BaseModel): defaults[item['k']] = val if item['k'] == 'clone_uri': defaults['clone_uri_hidden'] = repo_info.clone_uri_hidden + if item['k'] == 'push_uri': + defaults['push_uri_hidden'] = repo_info.push_uri_hidden # fill owner if repo_info.user: @@ -348,6 +351,7 @@ class RepoModel(BaseModel): (1, 'repo_enable_locking'), (1, 'repo_enable_statistics'), (0, 'clone_uri'), + (0, 'push_uri'), (0, 'fork_id') ] for strip, k in update_keys: diff --git a/rhodecode/model/validation_schema/schemas/repo_schema.py b/rhodecode/model/validation_schema/schemas/repo_schema.py index 347b97d6..fcd6406e 100644 --- a/rhodecode/model/validation_schema/schemas/repo_schema.py +++ b/rhodecode/model/validation_schema/schemas/repo_schema.py @@ -66,7 +66,7 @@ def deferred_landing_ref_validator(node, kw): @colander.deferred -def deferred_clone_uri_validator(node, kw): +def deferred_sync_uri_validator(node, kw): repo_type = kw.get('repo_type') validator = validators.CloneUriValidator(repo_type) return validator @@ -323,6 +323,12 @@ class RepoSchema(colander.MappingSchema): preparers=[preparers.strip_preparer], missing='') + repo_push_uri = colander.SchemaNode( + colander.String(), + validator=colander.All(colander.Length(min=1)), + preparers=[preparers.strip_preparer], + missing='') + repo_fork_of = colander.SchemaNode( colander.String(), validator=deferred_fork_of_validator, @@ -381,7 +387,17 @@ class RepoSettingsSchema(RepoSchema): repo_clone_uri = colander.SchemaNode( colander.String(), preparers=[preparers.strip_preparer], - validator=deferred_clone_uri_validator, + validator=deferred_sync_uri_validator, + missing='') + + repo_push_uri_change = colander.SchemaNode( + colander.String(), + missing='NEW') + + repo_push_uri = colander.SchemaNode( + colander.String(), + preparers=[preparers.strip_preparer], + validator=deferred_sync_uri_validator, missing='') def deserialize(self, cstruct): diff --git a/rhodecode/public/js/rhodecode/routes.js b/rhodecode/public/js/rhodecode/routes.js index 4e4c5c84..35eb3bea 100644 --- a/rhodecode/public/js/rhodecode/routes.js +++ b/rhodecode/public/js/rhodecode/routes.js @@ -232,6 +232,7 @@ function registerRCRoutes() { pyroutes.register('repo_edit_toggle_locking', '/%(repo_name)s/settings/toggle_locking', ['repo_name']); pyroutes.register('edit_repo_remote', '/%(repo_name)s/settings/remote', ['repo_name']); pyroutes.register('edit_repo_remote_pull', '/%(repo_name)s/settings/remote/pull', ['repo_name']); + pyroutes.register('edit_repo_remote_push', '/%(repo_name)s/settings/remote/push', ['repo_name']); pyroutes.register('edit_repo_statistics', '/%(repo_name)s/settings/statistics', ['repo_name']); pyroutes.register('edit_repo_statistics_reset', '/%(repo_name)s/settings/statistics/update', ['repo_name']); pyroutes.register('edit_repo_issuetracker', '/%(repo_name)s/settings/issue_trackers', ['repo_name']); diff --git a/rhodecode/templates/admin/repos/repo_edit.mako b/rhodecode/templates/admin/repos/repo_edit.mako index 9c93ab79..14811e40 100644 --- a/rhodecode/templates/admin/repos/repo_edit.mako +++ b/rhodecode/templates/admin/repos/repo_edit.mako @@ -65,7 +65,7 @@ %if c.rhodecode_db_repo.repo_type != 'svn':
  • - ${_('Remote')} + ${_('Remote sync')}
  • %endif
  • diff --git a/rhodecode/templates/admin/repos/repo_edit_remote.mako b/rhodecode/templates/admin/repos/repo_edit_remote.mako index c93589b3..6c2e8aaf 100644 --- a/rhodecode/templates/admin/repos/repo_edit_remote.mako +++ b/rhodecode/templates/admin/repos/repo_edit_remote.mako @@ -1,31 +1,60 @@
    -

    ${_('Remote url')}

    +

    ${_('Remote Sync')}

    -

    ${_('Manually pull changes from external repository.')}

    +

    ${_('Manually pull/push changes from/to external URLs.')}

    - %if c.rhodecode_db_repo.clone_uri: + %if c.rhodecode_db_repo.clone_uri or c.rhodecode_db_repo.push_uri: - ${_('Remote mirror url')}: - ${c.rhodecode_db_repo.clone_uri_hidden} +
  • @@ -15,10 +14,8 @@
    @@ -28,18 +25,18 @@ command - RSS:${h.format_byte_size_binary(mem.rss)} + RSS:${h.format_byte_size_binary(proc.mem_rss)} - VMS:${h.format_byte_size_binary(mem.vms)} + VMS:${h.format_byte_size_binary(proc.mem_vms)} - AGE: ${h.age_component(h.time_to_utcdatetime(proc.create_time()))} + AGE: ${h.age_component(h.time_to_utcdatetime(proc.create_time))} MASTER @@ -49,8 +46,7 @@
    @@ -60,21 +56,21 @@ command - CPU: ${proc_child.cpu_percent()} % + CPU: ${proc_child.cpu_percent} % - RSS:${h.format_byte_size_binary(mem.rss)} - <% mem_sum += mem.rss %> + RSS:${h.format_byte_size_binary(proc_child.mem_rss)} + <% mem_sum += proc_child.mem_rss %> - VMS:${h.format_byte_size_binary(mem.vms)} + VMS:${h.format_byte_size_binary(proc_child.mem_vms)} - AGE: ${h.age_component(h.time_to_utcdatetime(proc_child.create_time()))} + AGE: ${h.age_component(h.time_to_utcdatetime(proc_child.create_time))} @@ -84,7 +80,7 @@
    | total processes: ${len(children)}| total processes: ${len(proc.children)} RSS:${h.format_byte_size_binary(mem_sum)}
    + % if c.rhodecode_db_repo.clone_uri: + + + + + + + + + + + + + % endif -

    - ${_('Pull can be automated by such api call. Can be called periodically in crontab etc.')} -
    - - ${h.api_call_example(method='pull', args={"repoid": c.rhodecode_db_repo.repo_name})} - -

    + % if c.rhodecode_db_repo.push_uri: + + + + + + + + + % endif + +
    ${_('Pull url')}
    ${c.rhodecode_db_repo.clone_uri_hidden}
    +

    + ${_('Pull can be automated by such api call. Can be called periodically in crontab etc.')} +
    + + ${h.api_call_example(method='pull', args={"repoid": c.rhodecode_db_repo.repo_name})} + +

    +
    + ${h.secure_form(h.route_path('edit_repo_remote_pull', repo_name=c.repo_name), request=request)} +
    +
    + ${h.submit('remote_pull_%s' % c.rhodecode_db_repo.repo_name,_('Pull changes from remote location'),class_="btn btn-small",onclick="return confirm('"+_('Confirm to pull changes from remote side')+"');")} +
    +
    + ${h.end_form()} +
    ${_('Push url')}
    ${c.rhodecode_db_repo.push_uri_hidden}
    + ${_('This feature is available in RhodeCode EE edition only. Contact {sales_email} to obtain a trial license.').format(sales_email='sales@rhodecode.com')|n} +
    - ${h.secure_form(h.route_path('edit_repo_remote_pull', repo_name=c.repo_name), request=request)} -
    -
    - ${h.submit('remote_pull_%s' % c.rhodecode_db_repo.repo_name,_('Pull changes from remote location'),class_="btn btn-small",onclick="return confirm('"+_('Confirm to pull changes from remote side')+"');")} -
    -
    - ${h.end_form()} %else: ${_('This repository does not have any remote mirror url set.')} diff --git a/rhodecode/templates/admin/repos/repo_edit_settings.mako b/rhodecode/templates/admin/repos/repo_edit_settings.mako index 4b1781e5..f7c45b48 100644 --- a/rhodecode/templates/admin/repos/repo_edit_settings.mako +++ b/rhodecode/templates/admin/repos/repo_edit_settings.mako @@ -46,9 +46,10 @@ % if c.rhodecode_db_repo.repo_type != 'svn': + <% sync_link = h.literal(h.link_to('remote sync', h.route_path('edit_repo_remote', repo_name=c.repo_name))) %>
    - +
    %if c.rhodecode_db_repo.clone_uri: @@ -83,14 +84,56 @@ ${h.hidden('repo_clone_uri_change', 'NEW')} %endif

    - <% pull_link = h.literal(h.link_to('remote sync', h.route_path('edit_repo_remote', repo_name=c.repo_name))) %> - ${_('http[s] url where from repository was imported, this field can used for doing {pull_link}.').format(pull_link=pull_link)|n}
    + ${_('http[s] url where from repository was imported. This field can used for doing {sync_link}.').format(sync_link=sync_link)|n}
    + ${_('This field is stored encrypted inside Database, a format of http://user:password@server.com/repo_name can be used and will be hidden from display.')} +

    +
    +
    +
    +
    + +
    +
    + %if c.rhodecode_db_repo.push_uri: + ## display, if we don't have any errors + % if not c.form['repo_push_uri'].error: +
    + ${c.rhodecode_db_repo.push_uri_hidden} + ${_('edit')} +
    + % endif + + ## alter field +
    + ${c.form['repo_push_uri'].render(css_class='medium', oid='push_uri', placeholder=_('enter new value, or leave empty to remove'))|n} + ${c.form.render_error(request, c.form['repo_push_uri'])|n} + % if c.form['repo_push_uri'].error: + ## we got error from form subit, means we modify the url + ${h.hidden('repo_push_uri_change', 'MOD')} + % else: + ${h.hidden('repo_push_uri_change', 'OLD')} + % endif + + % if not c.form['repo_push_uri'].error: + ${_('cancel')} + % endif + +
    + %else: + ## not set yet, display form to set it + ${c.form['repo_push_uri'].render(css_class='medium', oid='push_uri')|n} + ${c.form.render_error(request, c.form['repo_push_uri'])|n} + ${h.hidden('repo_push_uri_change', 'NEW')} + %endif +

    + ${_('http[s] url to sync data back. This field can used for doing {sync_link}.').format(sync_link=sync_link)|n}
    ${_('This field is stored encrypted inside Database, a format of http://user:password@server.com/repo_name can be used and will be hidden from display.')}

    % else: ${h.hidden('repo_clone_uri', '')} + ${h.hidden('repo_push_uri', '')} % endif
    @@ -207,16 +250,11 @@