Integrating patch submitted by Vincent Caron <zerodeux@gnu.org> in https://gna.org...
[forgeplucker:forgeplucker.git] / trunk / forgeplucker / __init__.py
1 # Collect all imports required to do project state fetches.
2
3 import netrc
4
5 from htmlscrape import *
6 from generic import *
7 from handle_sourceforge import *
8 from handle_berlios import *
9 from handle_savane import *
10 from handle_trac import *
11 from handle_fusionforge import *
12 from handle_gcode import *
13
14 from output_oslccmv2json import *
15
16 # Collect handler classes here, client code will introspect on this set
17 # so as not to have to know about individual handler classes.
18 handler_classes = (SourceForge, Berlios, Savane, Trac, Sf_Trac, GCode, FusionForge)
19
20 # Map well-known hosting sites to forge system types. We'd try using
21 # pattern-matching on the site main page for this, but forge admins
22 # customize their front pages a lot and unambiguous cues about
23 # forge type aren't so easy to find.
24 site_to_handler = {
25     "sourceforge.net": SourceForge,
26     "sourceforge.net/apps/trac": Sf_Trac,
27     "developer.berlios.de": Berlios,
28     "savannah.gnu.org": Savane,
29     "savannah.nongnu.org": Savane,
30     "gna.org": Savane,
31     "code.google.com": GCode,
32     "fusionforge.org": FusionForge,
33     "gforge.inria.fr": FusionForge,
34 }
35
36 def get_forgetype(host):
37     "Deduce forge type from hostname."
38     if host in site_to_handler:
39         return site_to_handler[host]
40     # FIXME: Someday, we'll do more checks by parsing the site entry page 
41     print >>sys.stderr, "Can't determine forge type for host %s" % host
42     raise SystemExit, 1
43
44 def get_credentials(user, passwd, host):
45     """Assemble user's actual credentials.
46        user can be a ':' seperated list of usernames"""
47     #usernames is list of usernames to try
48     if user is None:
49         usernames = [os.getenv("LOGNAME")]
50         user = os.getenv("LOGNAME")
51     else:
52         usernames = user.split(':')
53     host = host.split('/')[0] #If the host is a not a domain use just the domain
54     if passwd is None:
55         try:
56             passwords = netrc.netrc()
57             auth = passwords.authenticators(host)
58         except IOError:
59             auth = None
60         if auth and auth[0] in usernames:
61             user = auth[0]
62             passwd = auth[2]
63         else :
64             user = None
65             passwd = None
66     return (user, passwd)
67
68 # End