see Changelog
[mining-tools:carnarvon.git] / pycarnarvon / Main.py
1 # Copyright (C) 2006 Alvaro Navarro Clemente
2 #
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU Library General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 #
17 # Authors : Alvaro Navarro <anavarro@gsyc.escet.urjc.es>
18
19 """
20 This module contains the analysis sequence used in carnavon
21 it is just an ordered list of the actions (usually functions
22 implemented in other modules) that are to be run
23
24
25 @author:       Alvaro Navarro
26 @organization: Grupo de Sistemas y Comunicaciones, Universidad Rey Juan Carlos
27 @copyright:    Universidad Rey Juan Carlos (Madrid, Spain)
28 @license:      GNU GPL version 2 or any later version
29 @contact:      anavarro@gsyc.escet.urjc.es
30 """
31
32 import sys
33 import os
34 import time
35 import string
36 import stat
37 import getopt
38
39
40 import Database as dbmodule
41 import ParserConfigFile as parsermodule
42 import Repository as rpmodule
43 import Wizard as wz
44 import Timestamp as timemodule
45 import Globals as gb
46 import SendMail as mailmodule
47 import Tables
48
49
50 # Some stuff about the project
51 author = "(C) 2005,2006 %s <%s>" % (gb.Globals.author, gb.Globals.mail)
52 name = "carnarvon %s - Libresoft Group http://libresoft.urjc.es" % (gb.Globals.version)
53 credits = "\n%s \n%s\n" % (name,author)
54
55
56 def usage():
57     print "Usage: %s [options] config_file" % (sys.argv[0])
58     print """
59 Options:
60
61   -h, --help               Print this usage message.
62   -o, --options            Print additional posting options.
63
64   -d, --driver             Output driver [mysql|stdout]
65   -t, --max-threads        Max number of threads [default=2]
66   -w, --wizard             Create a config file step by step
67   -a, --automatic          Autogenerate a basic template config file
68   -c, --no-checkout        Don't checkout repository automatically.
69   -r, --no-clean           Don't clean source directory after checkout
70   -l, --no-log             Don't log repository automatically.
71 """
72
73 def main():
74
75     print credits
76
77     short_opts = "hoawclt:d:r"
78     long_opts = [ "help", "options", "wizard", "automatic", "no-clean"
79                   "no-checkout", "no-log", "max-threads=", "driver="]
80
81     try:
82         opts, args = getopt.getopt(sys.argv[1:], short_opts, long_opts)
83     except getopt.GetoptError:
84         usage()
85         sys.exit(1)
86
87     rc_file = ''
88     checkout_step = 1
89     log_step = 1
90     clean = 1
91     maxthreads = 2
92     driver = "mysql"
93
94     if args == []:
95         usage()
96         sys.exit(0)
97
98     # Config file comes from args
99     rc_file = args[0]
100
101     for o, a in opts:
102         if o in ("-h", "--help"):
103             usage()
104             sys.exit(0)
105         elif o in ("-a", "--automatic"):
106             wz.automatic_wizard(rc_file)
107             sys.exit(0)
108         elif o in ("-t", "--max-threads"):
109             maxthreads = a
110         elif o in ("-c", "--no-checkout"):
111             checkout_step = 0
112         elif o in ("-l", "--no-log"):
113             log_step = 0
114         elif o in ("-w", "--wizard"):
115             wz.wizard(rc_file)
116             sys.exit(0)
117         elif o in ("-d", "--driver"):
118             driver = a
119         elif o in ("-r", "--no-clean"):
120             clean = 0
121
122     # Parse config file
123     print "[*] Reading config file: " + str(rc_file)
124     rc = parsermodule.ParserConfigFile()
125     rc.read_rcfile(rc_file)
126     rc.buildstamps()
127
128     workspace = rc.config_map['workspace']
129
130     # Create workspace
131     if os.path.isdir(workspace):
132         print "[*] Using workspace: " + str(workspace)
133     else:
134         print "[*] Creating workspace: " + str(workspace)
135         gb.Globals.createdir(workspace)
136
137
138     user = rc.config_map['username']
139     password = rc.config_map['password']
140     host = rc.config_map['hostname']
141     database = rc.config_map['database']
142
143     # Access Database
144     conection = driver + "://" + user + ":" + password + "@" + host + "/" + database
145     gb.Globals.connection = conection
146     db = dbmodule.Database(conection)
147
148
149     #if drop_database_step:
150     db.create_database()
151     db.create_table('files',Tables.files)
152     db.create_table('commiters',Tables.commiters)
153     db.create_table('dates',Tables.dates)
154     db.create_table('directories', Tables.directories)
155     db.create_table('functions', Tables.functions)
156     print "[*] Database %s succesfully created" % (database)
157
158     # CVS/SVN interactive
159     parser = rpmodule.RepositoryFactory.create(rc.config_map['type'], maxthreads)
160
161     parser.modules = rc.config_map['modules']
162     parser.repository = rc.config_map['cvsroot']
163     parser.type = rc.config_map['type']
164
165     # Main Loop. All actions should be under this for
166     for mydate in rc.dates:
167
168         # create table for actual annotate timestamp
169         taux = 'annotates_' + str(mydate).replace("-","_")
170         db.create_table(taux, Tables.annotates)
171
172         # Add to the Timestamp object the new reference
173         timemodule.Timestamp.settimes(mydate,db)
174
175         # Config values for checkout and create dir
176         parser.src_dir = workspace + 'src_' + str(mydate)
177         parser.date = mydate
178         gb.Globals.createdir(workspace + 'src_' + str(mydate))
179
180         if checkout_step:
181             parser.checkout()
182
183         # Log step in time
184         if log_step:
185             # blame method creates new Line objects
186             print "[*] Parsing logs for date: " + str(mydate)
187             parser.collect()
188             parser.annotate()
189
190         # clean checkout
191         if clean:
192             print "[*] Deleting checkout ..."
193             #parser.clean()
194
195     db.close()
196
197     # Only if user has set send mail
198     if rc.config_map['sendmail']:
199         server = rc.config_map['smtpserver']
200         mail = rc.config_map['mail']
201         mailmodule.sendMail('carnarvon',mail, server, database)
202
203     print "\nProcess Completed! \n"