Mercurial > public > src > rhodecode
annotate pylons_app/lib/utils.py @ 393:a26f48ad7a8a
fixes issue #16 reimplementation of database repository, for using generic pk instead of repo naming as pk. Which caused to many problems.
Fixed issue when redirecting after repo name change to 404.
Removed update hook from basic app setup
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Tue, 27 Jul 2010 14:53:22 +0200 |
parents | 23e720be5f44 |
children | 55377fdc1fc6 |
rev | line source |
---|---|
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
1 #!/usr/bin/env python |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
2 # encoding: utf-8 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
3 # Utilities for hg app |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
4 # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com> |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
5 # This program is free software; you can redistribute it and/or |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
6 # modify it under the terms of the GNU General Public License |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
7 # as published by the Free Software Foundation; version 2 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
8 # of the License or (at your opinion) any later version of the license. |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
9 # |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
10 # This program is distributed in the hope that it will be useful, |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
13 # GNU General Public License for more details. |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
14 # |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
15 # You should have received a copy of the GNU General Public License |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
16 # along with this program; if not, write to the Free Software |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
18 # MA 02110-1301, USA. |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
19 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
20 """ |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
21 Created on April 18, 2010 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
22 Utilities for hg app |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
23 @author: marcink |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
24 """ |
376
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
25 from beaker.cache import cache_region |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
26 from mercurial import ui, config, hg |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
27 from mercurial.error import RepoError |
376
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
28 from pylons_app.model import meta |
368
bb8f45f6d8f9
updated hg-app db manage and global settings
Marcin Kuzminski <marcin@python-works.com>
parents:
366
diff
changeset
|
29 from pylons_app.model.db import Repository, User, HgAppUi, HgAppSettings |
376
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
30 from vcs.backends.base import BaseChangeset |
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
31 from vcs.utils.lazy import LazyProperty |
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
32 import logging |
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
33 import os |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
34 log = logging.getLogger(__name__) |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
35 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
36 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
37 def get_repo_slug(request): |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
38 return request.environ['pylons.routes_dict'].get('repo_name') |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
39 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
40 def is_mercurial(environ): |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
41 """ |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
42 Returns True if request's target is mercurial server - header |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
43 ``HTTP_ACCEPT`` of such request would start with ``application/mercurial``. |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
44 """ |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
45 http_accept = environ.get('HTTP_ACCEPT') |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
46 if http_accept and http_accept.startswith('application/mercurial'): |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
47 return True |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
48 return False |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
49 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
50 def check_repo_dir(paths): |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
51 repos_path = paths[0][1].split('/') |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
52 if repos_path[-1] in ['*', '**']: |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
53 repos_path = repos_path[:-1] |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
54 if repos_path[0] != '/': |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
55 repos_path[0] = '/' |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
56 if not os.path.isdir(os.path.join(*repos_path)): |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
57 raise Exception('Not a valid repository in %s' % paths[0][1]) |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
58 |
314
752675cdd167
made routes verification method based only on paths, since it's much faster and enough
Marcin Kuzminski <marcin@python-works.com>
parents:
310
diff
changeset
|
59 def check_repo_fast(repo_name, base_path): |
752675cdd167
made routes verification method based only on paths, since it's much faster and enough
Marcin Kuzminski <marcin@python-works.com>
parents:
310
diff
changeset
|
60 if os.path.isdir(os.path.join(base_path, repo_name)):return False |
752675cdd167
made routes verification method based only on paths, since it's much faster and enough
Marcin Kuzminski <marcin@python-works.com>
parents:
310
diff
changeset
|
61 return True |
752675cdd167
made routes verification method based only on paths, since it's much faster and enough
Marcin Kuzminski <marcin@python-works.com>
parents:
310
diff
changeset
|
62 |
752675cdd167
made routes verification method based only on paths, since it's much faster and enough
Marcin Kuzminski <marcin@python-works.com>
parents:
310
diff
changeset
|
63 def check_repo(repo_name, base_path, verify=True): |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
64 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
65 repo_path = os.path.join(base_path, repo_name) |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
66 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
67 try: |
314
752675cdd167
made routes verification method based only on paths, since it's much faster and enough
Marcin Kuzminski <marcin@python-works.com>
parents:
310
diff
changeset
|
68 if not check_repo_fast(repo_name, base_path): |
752675cdd167
made routes verification method based only on paths, since it's much faster and enough
Marcin Kuzminski <marcin@python-works.com>
parents:
310
diff
changeset
|
69 return False |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
70 r = hg.repository(ui.ui(), repo_path) |
314
752675cdd167
made routes verification method based only on paths, since it's much faster and enough
Marcin Kuzminski <marcin@python-works.com>
parents:
310
diff
changeset
|
71 if verify: |
752675cdd167
made routes verification method based only on paths, since it's much faster and enough
Marcin Kuzminski <marcin@python-works.com>
parents:
310
diff
changeset
|
72 hg.verify(r) |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
73 #here we hnow that repo exists it was verified |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
74 log.info('%s repo is already created', repo_name) |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
75 return False |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
76 except RepoError: |
314
752675cdd167
made routes verification method based only on paths, since it's much faster and enough
Marcin Kuzminski <marcin@python-works.com>
parents:
310
diff
changeset
|
77 #it means that there is no valid repo there... |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
78 log.info('%s repo is free for creation', repo_name) |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
79 return True |
314
752675cdd167
made routes verification method based only on paths, since it's much faster and enough
Marcin Kuzminski <marcin@python-works.com>
parents:
310
diff
changeset
|
80 |
376
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
81 def ask_ok(prompt, retries=4, complaint='Yes or no, please!'): |
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
82 while True: |
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
83 ok = raw_input(prompt) |
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
84 if ok in ('y', 'ye', 'yes'): return True |
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
85 if ok in ('n', 'no', 'nop', 'nope'): return False |
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
86 retries = retries - 1 |
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
87 if retries < 0: raise IOError |
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
88 print complaint |
d09381593b12
updated db manage script, and remove broken test
Marcin Kuzminski <marcin@python-works.com>
parents:
374
diff
changeset
|
89 |
366
6484963056cd
implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents:
364
diff
changeset
|
90 @cache_region('super_short_term', 'cached_hg_ui') |
6484963056cd
implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents:
364
diff
changeset
|
91 def get_hg_ui_cached(): |
374
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
92 try: |
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
93 sa = meta.Session |
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
94 ret = sa.query(HgAppUi).all() |
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
95 finally: |
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
96 meta.Session.remove() |
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
97 return ret |
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
98 |
366
6484963056cd
implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents:
364
diff
changeset
|
99 |
368
bb8f45f6d8f9
updated hg-app db manage and global settings
Marcin Kuzminski <marcin@python-works.com>
parents:
366
diff
changeset
|
100 def get_hg_settings(): |
374
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
101 try: |
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
102 sa = meta.Session |
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
103 ret = sa.query(HgAppSettings).scalar() |
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
104 finally: |
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
105 meta.Session.remove() |
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
106 |
368
bb8f45f6d8f9
updated hg-app db manage and global settings
Marcin Kuzminski <marcin@python-works.com>
parents:
366
diff
changeset
|
107 if not ret: |
bb8f45f6d8f9
updated hg-app db manage and global settings
Marcin Kuzminski <marcin@python-works.com>
parents:
366
diff
changeset
|
108 raise Exception('Could not get application settings !') |
bb8f45f6d8f9
updated hg-app db manage and global settings
Marcin Kuzminski <marcin@python-works.com>
parents:
366
diff
changeset
|
109 return ret |
bb8f45f6d8f9
updated hg-app db manage and global settings
Marcin Kuzminski <marcin@python-works.com>
parents:
366
diff
changeset
|
110 |
364
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
111 def make_ui(read_from='file', path=None, checkpaths=True): |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
112 """ |
364
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
113 A function that will read python rc files or database |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
114 and make an mercurial ui object from read options |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
115 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
116 @param path: path to mercurial config file |
364
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
117 @param checkpaths: check the path |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
118 @param read_from: read from 'file' or 'db' |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
119 """ |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
120 #propagated from mercurial documentation |
364
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
121 sections = ['alias', 'auth', |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
122 'decode/encode', 'defaults', |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
123 'diff', 'email', |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
124 'extensions', 'format', |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
125 'merge-patterns', 'merge-tools', |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
126 'hooks', 'http_proxy', |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
127 'smtp', 'patch', |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
128 'paths', 'profiling', |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
129 'server', 'trusted', |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
130 'ui', 'web', ] |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
131 baseui = ui.ui() |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
132 |
364
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
133 |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
134 if read_from == 'file': |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
135 if not os.path.isfile(path): |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
136 log.warning('Unable to read config file %s' % path) |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
137 return False |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
138 |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
139 cfg = config.config() |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
140 cfg.read(path) |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
141 for section in sections: |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
142 for k, v in cfg.items(section): |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
143 baseui.setconfig(section, k, v) |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
144 if checkpaths:check_repo_dir(cfg.items('paths')) |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
145 |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
146 |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
147 elif read_from == 'db': |
366
6484963056cd
implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents:
364
diff
changeset
|
148 hg_ui = get_hg_ui_cached() |
364
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
149 for ui_ in hg_ui: |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
150 baseui.setconfig(ui_.ui_section, ui_.ui_key, ui_.ui_value) |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
151 |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
152 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
153 return baseui |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
154 |
364
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
155 |
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
156 def set_hg_app_config(config): |
368
bb8f45f6d8f9
updated hg-app db manage and global settings
Marcin Kuzminski <marcin@python-works.com>
parents:
366
diff
changeset
|
157 hgsettings = get_hg_settings() |
bb8f45f6d8f9
updated hg-app db manage and global settings
Marcin Kuzminski <marcin@python-works.com>
parents:
366
diff
changeset
|
158 config['hg_app_auth_realm'] = hgsettings.app_auth_realm |
bb8f45f6d8f9
updated hg-app db manage and global settings
Marcin Kuzminski <marcin@python-works.com>
parents:
366
diff
changeset
|
159 config['hg_app_name'] = hgsettings.app_title |
364
1ef52a70f3b7
Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents:
314
diff
changeset
|
160 |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
161 def invalidate_cache(name, *args): |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
162 """Invalidates given name cache""" |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
163 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
164 from beaker.cache import region_invalidate |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
165 log.info('INVALIDATING CACHE FOR %s', name) |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
166 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
167 """propagate our arguments to make sure invalidation works. First |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
168 argument has to be the name of cached func name give to cache decorator |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
169 without that the invalidation would not work""" |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
170 tmp = [name] |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
171 tmp.extend(args) |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
172 args = tuple(tmp) |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
173 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
174 if name == 'cached_repo_list': |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
175 from pylons_app.model.hg_model import _get_repos_cached |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
176 region_invalidate(_get_repos_cached, None, *args) |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
177 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
178 if name == 'full_changelog': |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
179 from pylons_app.model.hg_model import _full_changelog_cached |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
180 region_invalidate(_full_changelog_cached, None, *args) |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
181 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
182 class EmptyChangeset(BaseChangeset): |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
183 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
184 revision = -1 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
185 message = '' |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
186 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
187 @LazyProperty |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
188 def raw_id(self): |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
189 """ |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
190 Returns raw string identifing this changeset, useful for web |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
191 representation. |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
192 """ |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
193 return '0' * 12 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
194 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
195 |
372
e8fc875467bd
implemented manual repo rescann and remapping
Marcin Kuzminski <marcin@python-works.com>
parents:
368
diff
changeset
|
196 def repo2db_mapper(initial_repo_list, remove_obsolete=False): |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
197 """ |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
198 maps all found repositories into db |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
199 """ |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
200 from pylons_app.model.repo_model import RepoModel |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
201 |
374
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
202 sa = meta.Session |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
203 user = sa.query(User).filter(User.admin == True).first() |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
204 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
205 rm = RepoModel() |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
206 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
207 for name, repo in initial_repo_list.items(): |
393
a26f48ad7a8a
fixes issue #16 reimplementation of database repository, for using generic pk instead of repo naming as pk. Which caused to many problems.
Marcin Kuzminski <marcin@python-works.com>
parents:
384
diff
changeset
|
208 if not sa.query(Repository).filter(Repository.repo_name == name).scalar(): |
310
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
209 log.info('repository %s not found creating default', name) |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
210 |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
211 form_data = { |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
212 'repo_name':name, |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
213 'description':repo.description if repo.description != 'unknown' else \ |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
214 'auto description for %s' % name, |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
215 'private':False |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
216 } |
a074dec6ee40
restored utils, wrongly deleted
Marcin Kuzminski <marcin@python-works.com>
parents:
308
diff
changeset
|
217 rm.create(form_data, user, just_db=True) |
372
e8fc875467bd
implemented manual repo rescann and remapping
Marcin Kuzminski <marcin@python-works.com>
parents:
368
diff
changeset
|
218 |
e8fc875467bd
implemented manual repo rescann and remapping
Marcin Kuzminski <marcin@python-works.com>
parents:
368
diff
changeset
|
219 |
e8fc875467bd
implemented manual repo rescann and remapping
Marcin Kuzminski <marcin@python-works.com>
parents:
368
diff
changeset
|
220 if remove_obsolete: |
e8fc875467bd
implemented manual repo rescann and remapping
Marcin Kuzminski <marcin@python-works.com>
parents:
368
diff
changeset
|
221 #remove from database those repositories that are not in the filesystem |
e8fc875467bd
implemented manual repo rescann and remapping
Marcin Kuzminski <marcin@python-works.com>
parents:
368
diff
changeset
|
222 for repo in sa.query(Repository).all(): |
e8fc875467bd
implemented manual repo rescann and remapping
Marcin Kuzminski <marcin@python-works.com>
parents:
368
diff
changeset
|
223 if repo.repo_name not in initial_repo_list.keys(): |
e8fc875467bd
implemented manual repo rescann and remapping
Marcin Kuzminski <marcin@python-works.com>
parents:
368
diff
changeset
|
224 sa.delete(repo) |
e8fc875467bd
implemented manual repo rescann and remapping
Marcin Kuzminski <marcin@python-works.com>
parents:
368
diff
changeset
|
225 sa.commit() |
e8fc875467bd
implemented manual repo rescann and remapping
Marcin Kuzminski <marcin@python-works.com>
parents:
368
diff
changeset
|
226 |
374
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
227 |
664a5b8c551a
Added application settings, are now customizable from database
Marcin Kuzminski <marcin@python-works.com>
parents:
372
diff
changeset
|
228 meta.Session.remove() |
384
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
229 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
230 from UserDict import DictMixin |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
231 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
232 class OrderedDict(dict, DictMixin): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
233 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
234 def __init__(self, *args, **kwds): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
235 if len(args) > 1: |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
236 raise TypeError('expected at most 1 arguments, got %d' % len(args)) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
237 try: |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
238 self.__end |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
239 except AttributeError: |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
240 self.clear() |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
241 self.update(*args, **kwds) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
242 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
243 def clear(self): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
244 self.__end = end = [] |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
245 end += [None, end, end] # sentinel node for doubly linked list |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
246 self.__map = {} # key --> [key, prev, next] |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
247 dict.clear(self) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
248 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
249 def __setitem__(self, key, value): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
250 if key not in self: |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
251 end = self.__end |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
252 curr = end[1] |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
253 curr[2] = end[1] = self.__map[key] = [key, curr, end] |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
254 dict.__setitem__(self, key, value) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
255 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
256 def __delitem__(self, key): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
257 dict.__delitem__(self, key) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
258 key, prev, next = self.__map.pop(key) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
259 prev[2] = next |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
260 next[1] = prev |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
261 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
262 def __iter__(self): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
263 end = self.__end |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
264 curr = end[2] |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
265 while curr is not end: |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
266 yield curr[0] |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
267 curr = curr[2] |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
268 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
269 def __reversed__(self): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
270 end = self.__end |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
271 curr = end[1] |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
272 while curr is not end: |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
273 yield curr[0] |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
274 curr = curr[1] |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
275 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
276 def popitem(self, last=True): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
277 if not self: |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
278 raise KeyError('dictionary is empty') |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
279 if last: |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
280 key = reversed(self).next() |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
281 else: |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
282 key = iter(self).next() |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
283 value = self.pop(key) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
284 return key, value |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
285 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
286 def __reduce__(self): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
287 items = [[k, self[k]] for k in self] |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
288 tmp = self.__map, self.__end |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
289 del self.__map, self.__end |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
290 inst_dict = vars(self).copy() |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
291 self.__map, self.__end = tmp |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
292 if inst_dict: |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
293 return (self.__class__, (items,), inst_dict) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
294 return self.__class__, (items,) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
295 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
296 def keys(self): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
297 return list(self) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
298 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
299 setdefault = DictMixin.setdefault |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
300 update = DictMixin.update |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
301 pop = DictMixin.pop |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
302 values = DictMixin.values |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
303 items = DictMixin.items |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
304 iterkeys = DictMixin.iterkeys |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
305 itervalues = DictMixin.itervalues |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
306 iteritems = DictMixin.iteritems |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
307 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
308 def __repr__(self): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
309 if not self: |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
310 return '%s()' % (self.__class__.__name__,) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
311 return '%s(%r)' % (self.__class__.__name__, self.items()) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
312 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
313 def copy(self): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
314 return self.__class__(self) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
315 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
316 @classmethod |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
317 def fromkeys(cls, iterable, value=None): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
318 d = cls() |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
319 for key in iterable: |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
320 d[key] = value |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
321 return d |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
322 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
323 def __eq__(self, other): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
324 if isinstance(other, OrderedDict): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
325 return len(self) == len(other) and self.items() == other.items() |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
326 return dict.__eq__(self, other) |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
327 |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
328 def __ne__(self, other): |
23e720be5f44
Added implementation of Ordered Dict.
Marcin Kuzminski <marcin@python-works.com>
parents:
376
diff
changeset
|
329 return not self == other |