annotate pylons_app/controllers/hg.py @ 37:707dfdb1c7a8

Bugfix when client is using old mercurial version and not setting http accept
author marcink
date Thu, 18 Mar 2010 14:37:05 +0100
parents f93b523c0be3
children 71ffa932799d
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
37
707dfdb1c7a8 Bugfix when client is using old mercurial version and not setting http accept
marcink
parents: 32
diff changeset
14 from pylons.controllers.util import abort
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
15 log = logging.getLogger(__name__)
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
16
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
17 class HgController(BaseController):
21
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
18
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
19 def __before__(self):
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
20 c.repos_prefix = 'etelko'
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
21
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
22 def view(self, *args, **kwargs):
21
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
23 response = g.hgapp(request.environ, self.start_response)
37
707dfdb1c7a8 Bugfix when client is using old mercurial version and not setting http accept
marcink
parents: 32
diff changeset
24
707dfdb1c7a8 Bugfix when client is using old mercurial version and not setting http accept
marcink
parents: 32
diff changeset
25 http_accept = request.environ.get('HTTP_ACCEPT', False)
707dfdb1c7a8 Bugfix when client is using old mercurial version and not setting http accept
marcink
parents: 32
diff changeset
26 if not http_accept:
707dfdb1c7a8 Bugfix when client is using old mercurial version and not setting http accept
marcink
parents: 32
diff changeset
27 return abort(status_code=400, detail='no http accept in header')
707dfdb1c7a8 Bugfix when client is using old mercurial version and not setting http accept
marcink
parents: 32
diff changeset
28
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
29 #for mercurial protocols and raw files we can't wrap into mako
37
707dfdb1c7a8 Bugfix when client is using old mercurial version and not setting http accept
marcink
parents: 32
diff changeset
30 if http_accept.find("mercurial") != -1 or \
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
31 request.environ['PATH_INFO'].find('raw-file') != -1:
21
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
diff changeset
32 return response
32
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
33 try:
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
34 tmpl = u''.join(response)
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
35 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
36 .config['pylons.g'].mako_lookup)
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
37
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
38 except (RuntimeError, UnicodeDecodeError):
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
39 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
40 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
41 tmpl = ''.join(response)
f93b523c0be3 dirty fix for multiple file encodings,
Marcin Kuzminski <marcin@python-blog.com>
parents: 31
diff changeset
42 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
43 .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
44
21
fac1f62a1d71 Wrapped into mako templates,
Marcin Kuzminski
parents: 20
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 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
47
22
3142616771cd Removed default contact name
Marcin Kuzminski
parents: 21
diff changeset
48
3142616771cd Removed default contact name
Marcin Kuzminski
parents: 21
diff changeset
49 def manage_hgrc(self):
3142616771cd Removed default contact name
Marcin Kuzminski
parents: 21
diff changeset
50 pass
3142616771cd Removed default contact name
Marcin Kuzminski
parents: 21
diff changeset
51
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
52 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
53 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
54 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
55
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
56 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
57 c.staticurl = g.statics
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
58
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
59 #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
60 if new_repo == 'add':
20
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
61 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
62 c.new_repo = ''
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
63 return render('add.html')
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
64
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
65 new_repo = new_repo.replace(" ", "_")
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
66 new_repo = new_repo.replace("-", "_")
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
67
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
68 try:
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
69 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
70 c.new_repo = new_repo
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
71 c.msg = 'added repo'
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
72 except Exception as e:
20
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
73 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
74 c.msg = str(e)
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
75
20
bbaab7501c1a Added custom templates, did over check of code to make it work.
Marcin Kuzminski
parents: 12
diff changeset
76 return render('add.html')
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
77
5
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
78 def _check_repo(self, repo_name):
12
5f30a6d558dc Added pylons manage script
Marcin Kuzminski
parents: 10
diff changeset
79 p = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
5f30a6d558dc Added pylons manage script
Marcin Kuzminski
parents: 10
diff changeset
80 config_path = os.path.join(p, 'hgwebdir.config')
6
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
81
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
82 cp = ConfigParser()
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
83
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
84 cp.read(config_path)
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
85 repos_path = cp.get('paths', '/').replace("**", '')
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
86
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
87 if not repos_path:
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
88 raise Exception('Could not read config !')
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
89
5
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
90 self.repo_path = os.path.join(repos_path, repo_name)
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
91
5
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
92 try:
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
93 r = hg.repository(ui.ui(), self.repo_path)
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
94 hg.verify(r)
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
95 #here we hnow that repo exists it was verified
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
96 log.info('%s repo is already created', repo_name)
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
97 raise Exception('Repo exists')
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
98 except RepoError:
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
99 log.info('%s repo is free for creation', repo_name)
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
100 #it means that there is no valid repo there...
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
101 return True
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
102
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
103
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
104 def _create_repo(self, repo_name):
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
105 if repo_name in [None, '', 'add']:
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
106 raise Exception('undefined repo_name of repo')
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
107
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
108 if self._check_repo(repo_name):
6
2620dac853ad added autoconfig loading
Marcin Kuzminski
parents: 5
diff changeset
109 log.info('creating repo %s in %s', repo_name, self.repo_path)
5
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
110 cmd = """mkdir %s && hg init %s""" \
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
111 % (self.repo_path, self.repo_path)
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
112 os.popen(cmd)
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
113
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
114 #def _make_app():
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
115 # #for single a repo
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
116 # #return hgweb("/path/to/repo", "Name")
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
117 # repos = "hgwebdir.config"
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
118 # return hgwebdir(repos)
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
119 #
5
ad0dd3904225 added repo creation
Marcin Kuzminski
parents: 0
diff changeset
120
8
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
121 # def view(self, environ, start_response):
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
122 # #the following is only needed when using hgwebdir
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
123 # app = _make_app()
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
124 # #return wsgi_app(environ, start_response)
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
125 # response = app(request.environ, self.start_response)
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
126 #
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
127 # if environ['PATH_INFO'].find("static") != -1:
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
128 # return response
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
129 # else:
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
130 # #wrap the murcurial response in a mako template.
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
131 # template = Template("".join(response),
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
132 # lookup = environ['pylons.pylons']\
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
133 # .config['pylons.g'].mako_lookup)
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
134 #
3092016c6d0c Changed to webapp, removed get from routes,
Marcin Kuzminski
parents: 6
diff changeset
135 # return template.render(g = g, c = c, session = session, h = h)