annotate pylons_app/controllers/hg.py @ 32:f93b523c0be3

dirty fix for multiple file encodings,
author Marcin Kuzminski <marcin@python-blog.com>
date Fri, 05 Mar 2010 01:14:30 +0100
parents 2963f2894a7a
children 707dfdb1c7a8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
1 #!/usr/bin/python
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
2 # -*- coding: utf-8 -*-
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
3 import logging
20
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
4 from pylons_app.lib.base import BaseController, render
22
3142616771cd Removed default contact name
Marcin Kuzminski
parents: 21
diff changeset
5 from pylons import c, g, session, request
3142616771cd Removed default contact name
Marcin Kuzminski
parents: 21
diff changeset
6 from pylons_app.lib import helpers as h
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
7 from mako.template import Template
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
8 from pprint import pprint
5
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
9 import os
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
10 from mercurial import ui, hg
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
11 from mercurial.error import RepoError
6
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
12 from ConfigParser import ConfigParser
31
2963f2894a7a Tempalting change, bugfix for serving raw files, and diffs. Now raw files are not parsed thruough mako, and diffs are mako safe (not parsed also)
Marcin Kuzminski <marcin@python-blog.com>
parents: 22
diff changeset
13 import encodings
10
525ed90e4577 major app speedup moved the wsgi creation to app globals, in order to make it run only once.
Marcin Kuzminski
parents: 8
diff changeset
14 log = logging.getLogger(__name__)
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
15
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
16 class HgController(BaseController):
21
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
17
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
18 def __before__(self):
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
19 c.repos_prefix = 'etelko'
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
20
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
21 def view(self, *args, **kwargs):
21
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
22 response = g.hgapp(request.environ, self.start_response)
31
2963f2894a7a Tempalting change, bugfix for serving raw files, and diffs. Now raw files are not parsed thruough mako, and diffs are mako safe (not parsed also)
Marcin Kuzminski <marcin@python-blog.com>
parents: 22
diff changeset
23 #for mercurial protocols and raw files we can't wrap into mako
2963f2894a7a Tempalting change, bugfix for serving raw files, and diffs. Now raw files are not parsed thruough mako, and diffs are mako safe (not parsed also)
Marcin Kuzminski <marcin@python-blog.com>
parents: 22
diff changeset
24 if request.environ['HTTP_ACCEPT'].find("mercurial") != -1 or \
2963f2894a7a Tempalting change, bugfix for serving raw files, and diffs. Now raw files are not parsed thruough mako, and diffs are mako safe (not parsed also)
Marcin Kuzminski <marcin@python-blog.com>
parents: 22
diff changeset
25 request.environ['PATH_INFO'].find('raw-file') != -1:
21
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
26 return response
32
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
27 try:
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
28 tmpl = u''.join(response)
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
29 template = Template(tmpl, lookup=request.environ['pylons.pylons']\
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
30 .config['pylons.g'].mako_lookup)
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
31
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
32 except (RuntimeError, UnicodeDecodeError):
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
33 log.info('disabling unicode due to encoding error')
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
34 response = g.hgapp(request.environ, self.start_response)
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
35 tmpl = ''.join(response)
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
36 template = Template(tmpl, lookup=request.environ['pylons.pylons']\
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
37 .config['pylons.g'].mako_lookup, disable_unicode=True)
31
2963f2894a7a Tempalting change, bugfix for serving raw files, and diffs. Now raw files are not parsed thruough mako, and diffs are mako safe (not parsed also)
Marcin Kuzminski <marcin@python-blog.com>
parents: 22
diff changeset
38
21
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
39
31
2963f2894a7a Tempalting change, bugfix for serving raw files, and diffs. Now raw files are not parsed thruough mako, and diffs are mako safe (not parsed also)
Marcin Kuzminski <marcin@python-blog.com>
parents: 22
diff changeset
40 return template.render(g=g, c=c, session=session, h=h)
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
41
22
3142616771cd Removed default contact name
Marcin Kuzminski
parents: 21
diff changeset
42
3142616771cd Removed default contact name
Marcin Kuzminski
parents: 21
diff changeset
43 def manage_hgrc(self):
3142616771cd Removed default contact name
Marcin Kuzminski
parents: 21
diff changeset
44 pass
3142616771cd Removed default contact name
Marcin Kuzminski
parents: 21
diff changeset
45
31
2963f2894a7a Tempalting change, bugfix for serving raw files, and diffs. Now raw files are not parsed thruough mako, and diffs are mako safe (not parsed also)
Marcin Kuzminski <marcin@python-blog.com>
parents: 22
diff changeset
46 def hgrc(self, dirname):
2963f2894a7a Tempalting change, bugfix for serving raw files, and diffs. Now raw files are not parsed thruough mako, and diffs are mako safe (not parsed also)
Marcin Kuzminski <marcin@python-blog.com>
parents: 22
diff changeset
47 filename = os.path.join(dirname, '.hg', 'hgrc')
2963f2894a7a Tempalting change, bugfix for serving raw files, and diffs. Now raw files are not parsed thruough mako, and diffs are mako safe (not parsed also)
Marcin Kuzminski <marcin@python-blog.com>
parents: 22
diff changeset
48 return filename
2963f2894a7a Tempalting change, bugfix for serving raw files, and diffs. Now raw files are not parsed thruough mako, and diffs are mako safe (not parsed also)
Marcin Kuzminski <marcin@python-blog.com>
parents: 22
diff changeset
49
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
50 def add_repo(self, new_repo):
20
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
51 c.staticurl = g.statics
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
52
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
53 #extra check it can be add since it's the command
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
54 if new_repo == 'add':
20
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
55 c.msg = 'you basstard ! this repo is a command'
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
56 c.new_repo = ''
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
57 return render('add.html')
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
58
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
59 new_repo = new_repo.replace(" ", "_")
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
60 new_repo = new_repo.replace("-", "_")
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
61
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
62 try:
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
63 self._create_repo(new_repo)
20
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
64 c.new_repo = new_repo
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
65 c.msg = 'added repo'
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
66 except Exception as e:
20
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
67 c.new_repo = 'Exception when adding: %s' % new_repo
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
68 c.msg = str(e)
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
69
20
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
70 return render('add.html')
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
71
5
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
72 def _check_repo(self, repo_name):
12
5f30a6d558dc Added pylons manage script
Marcin Kuzminski
parents: 10
diff changeset
73 p = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
5f30a6d558dc Added pylons manage script
Marcin Kuzminski
parents: 10
diff changeset
74 config_path = os.path.join(p, 'hgwebdir.config')
6
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
75
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
76 cp = ConfigParser()
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
77
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
78 cp.read(config_path)
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
79 repos_path = cp.get('paths', '/').replace("**", '')
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
80
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
81 if not repos_path:
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
82 raise Exception('Could not read config !')
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
83
5
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
84 self.repo_path = os.path.join(repos_path, repo_name)
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
85
5
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
86 try:
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
87 r = hg.repository(ui.ui(), self.repo_path)
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
88 hg.verify(r)
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
89 #here we hnow that repo exists it was verified
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
90 log.info('%s repo is already created', repo_name)
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
91 raise Exception('Repo exists')
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
92 except RepoError:
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
93 log.info('%s repo is free for creation', repo_name)
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
94 #it means that there is no valid repo there...
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
95 return True
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
96
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
97
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
98 def _create_repo(self, repo_name):
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
99 if repo_name in [None, '', 'add']:
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
100 raise Exception('undefined repo_name of repo')
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
101
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
102 if self._check_repo(repo_name):
6
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
103 log.info('creating repo %s in %s', repo_name, self.repo_path)
5
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
104 cmd = """mkdir %s && hg init %s""" \
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
105 % (self.repo_path, self.repo_path)
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
106 os.popen(cmd)
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
107
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
108 #def _make_app():
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
109 # #for single a repo
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
110 # #return hgweb("/path/to/repo", "Name")
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
111 # repos = "hgwebdir.config"
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
112 # return hgwebdir(repos)
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
113 #
5
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
114
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
115 # def view(self, environ, start_response):
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
116 # #the following is only needed when using hgwebdir
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
117 # app = _make_app()
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
118 # #return wsgi_app(environ, start_response)
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
119 # response = app(request.environ, self.start_response)
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
120 #
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
121 # if environ['PATH_INFO'].find("static") != -1:
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
122 # return response
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
123 # else:
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
124 # #wrap the murcurial response in a mako template.
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
125 # template = Template("".join(response),
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
126 # lookup = environ['pylons.pylons']\
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
127 # .config['pylons.g'].mako_lookup)
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
128 #
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
129 # return template.render(g = g, c = c, session = session, h = h)