]> git.llucax.com Git - mecon/scripts.git/blob - subversion/sapo/sapo.py
Primera version de archivos de soporte de subversion.
[mecon/scripts.git] / subversion / sapo / sapo.py
1 #!/usr/bin/env python
2 # -*- coding: iso-8859-1 -*-
3 # vim: set ts=4 softtabstop=4 expandtab :
4 # $Id$
5
6 # Config.
7
8 svncreate = 'sudo /usr/local/bin/svncreate'
9
10 import sys
11 import os
12 import re
13 import string
14 import cgi
15 import cgitb
16
17 # Para que tire errores más verborrágicos.
18 cgitb.enable()
19
20 def is_in(elem, lst):
21     for e in lst:
22         if elem == e:
23             return True
24     return False
25
26 class FormError(Exception):
27     def __init__(self, value):
28         self.value = value
29     def __str__(self):
30         return """<div style="color: red">%s</div>""" % self.value
31
32 def print_header():
33     print "Content-Type: text/html"
34     print
35     print """\
36 <html>
37     <head>
38         <title>Creador de Repositorios Subversion</title>
39     </head>
40     <body>
41         <h1>Creador de Repositorios Subversion</h1>
42 """
43
44 def print_footer():
45     print """\
46     </body>
47 </html>
48 """
49
50 def print_form(form):
51     def selected(user):
52         if is_in(user, form.getlist('users')):
53             return ' selected'
54         return ''
55
56     repos = ''
57     if form.getfirst('repos'):
58         repos = form.getfirst('repos')
59     desc = ''
60     if form.getfirst('desc'):
61         desc = form.getfirst('desc')
62     print """\
63         <form method="POST">
64             Nombre del repositorio: <input type="text" name="repos" value="%s"><br>
65             Descripción:            <input type="text" name="desc" value="%s"><br>
66             Usuarios habilitados a escribir:
67             <select name="users" multiple>""" % (repos, desc)
68     for user in get_users('/etc/svn/passwd'):
69         print """<option%s>%s</option>""" % (selected(user), user)
70     print """\
71             </select><br>
72             <input type="submit" name="enviado" value="Crear"><br>
73         </form>"""
74
75 def print_repos(repos):
76     url = 'http://portal.mecon.ar/svn/%s/tronco/' % repos
77     print '<p>Puede hacer un checkout con:<br>'
78     print '<tt>svn co <a href="%s">%s</a> %s</tt></p>.\n' % (url, url, repos)
79     #print 'Alternativamente puede hacer un checkout con: svn co svn+ssh://portal.mecon.ar/var/lib/svn/%s si tiene acceso via ssh.\n' % repos
80     print '<div style="text-align: center"><a href="./">Volver</a></div>'
81
82 def get_users(file):
83     users = []
84     f = open(file, 'r')
85     lines = f.readlines()
86     for line in lines:
87         users.append(line.strip().split(':')[0])
88     f.close()
89     return users
90
91 def check_form(form):
92     check_cond(form.has_key('repos'), 'No se especificó el nombre del repositorio.')
93     check_cond(form.has_key('desc'), 'No se especificó la descripción del repositorio.')
94     check_cond(form.has_key('users'), 'No se especificaron usuarios habilitados para escribir en el repositorio.')
95     check_cond(re.match('^[\w\d]+$', form['repos'].value),
96         'El nombre del repositorio no es válido (sólo puede tener caracteres alfanuméricos).')
97
98 def check_cond(cond, msg):
99     if (not cond):
100         raise FormError(msg);
101
102 def escape(str):
103     return str.replace("'", "\\'")
104
105
106 ################################### PROGRAMA PRINCIPAL ######################################
107
108 print_header()
109
110 form = cgi.FieldStorage()
111 try:
112     # Si nos llegó el formulario.
113     if form.has_key('enviado'):
114         check_form(form)
115         print '<pre>'
116         repos = escape(form.getfirst('repos'))
117         desc = escape(form.getfirst('desc'))
118         usrs = ' '
119         usrs = escape(usrs.join(form.getlist('users')))
120         cmd = "%s '%s' '%s' '%s'" % (svncreate, repos, desc, usrs)
121         sys.stdout.flush()
122         status = os.system(cmd)
123         print '</pre>'
124         if status:
125             raise FormError('Hubo un error al crear el repositorio (código de estado: %d).' % status)
126         print_repos(form.getfirst('repos'))
127     else:
128         print_form(form)
129 except FormError, e:
130     print e
131     print_form(form)
132
133 print_footer()
134
135