annotate scripts/beta-notify/notify-roundup.py @ 4164:6750b2dae53e gsoc-2009

Did some work on hg support
author Pygi <pygi@users.sourceforge.net>
date Thu, 02 Jul 2009 17:57:27 +0000
parents 5d8246ac6e89
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4162
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
1 #!/usr/bin/python
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
2 #
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
3 # notify-roundup.py: call into a roundup tracker to notify it of commits
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
4 #
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
5 # USAGE: notify-roundup.py TRACKER-HOME REPOS-DIR REVISION
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
6 # notify-roundup.py TRACKER-HOME REPOS-DIR REVISION AUTHOR PROPNAME
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
7 #
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
8 # TRACKER-HOME is the tracker to notify
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
9 #
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
10 # See end of file for change history
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
11
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
12 import sys, os, time, cStringIO, re, logging, smtplib, ConfigParser, socket
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
13
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
14
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
15 # configure logging
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
16 logger = logging.getLogger('notify-roundup')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
17 hdlr = logging.FileHandler('/tmp/log')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
18 formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
19 hdlr.setFormatter(formatter)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
20 logger.addHandler(hdlr)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
21 logger.propogate = False
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
22 logger.setLevel(logging.DEBUG)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
23
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
24 #print sys.argv
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
25 # now try to import stuff that might not work
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
26 try:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
27 import roundup.instance, roundup.date
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
28
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
29 import svn.fs
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
30 import svn.delta
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
31 import svn.repos
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
32 import svn.core
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
33 except:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
34 logger.exception('Exception while importing Roundup and SVN')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
35 sys.exit(1)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
36
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
37 class Failed(Exception):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
38 pass
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
39 class Unauthorised(Failed):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
40 pass
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
41
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
42 def main(pool):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
43 '''Handle the commit revision.
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
44 '''
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
45 # command-line args
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
46 cfg = ConfigParser.ConfigParser()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
47 cfg.read(sys.argv[1])
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
48 repos_dir = sys.argv[2]
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
49 revision = int(sys.argv[3])
4164
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
50
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
51 vcs_type = cfg.get('vcs', 'type')
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
52
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
53 # get a handle on the revision in the VCS repository
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
54 if vcs_type == 'svn':
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
55 repos = SVNRepository(repos_dir, revision, pool)
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
56 elif vcs_type == 'hg':
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
57 repos = HGRepository(repos_dir, revision, pool)
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
58 else:
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
59 logging.error('we currently don\'t support %s VCS type'%vcs_type)
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
60
4162
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
61 repos.klass = cfg.get('main', 'item-class')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
62 if not repos.extract_info():
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
63 return
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
64
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
65 if cfg.has_option('main', 'host'):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
66 repos.host = cfg.get('main', 'host')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
67 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
68 repos.host = socket.gethostname()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
69
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
70 mode = cfg.get('main', 'mode')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
71 if mode == 'local':
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
72 notify_local(cfg.get('local', 'tracker-home'), repos)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
73 elif mode == 'email':
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
74 tracker_address = cfg.get('email', 'tracker-address')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
75 domain = cfg.get('email', 'default-domain')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
76 smtp_host = cfg.get('email', 'smtp-host')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
77 if cfg.has_option('address mappings', repos.author):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
78 mapped_email = cfg.get('address mappings', repos.author)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
79 elif cfg.has_option('address mappings', '*'):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
80 mapped_email = cfg.get('address mappings', '*')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
81 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
82 mapped_email = repos.author
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
83 if '@' not in mapped_email:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
84 mapped_email += domain
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
85 notify_email(tracker_address, mapped_email, smtp_host, repos)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
86 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
87 logging.error('invalid mode %s in config file'%mode)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
88
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
89
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
90 def notify_email(tracker_address, from_address, smtp_host, repos):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
91 subject = '[%s%s] SVN commit message'%(repos.klass, repos.itemid)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
92 if repos.status:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
93 subject += ' [status=%s]'%repos.status
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
94 date = time.strftime('%Y-%m-%d %H:%M:%S', repos.date)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
95 message = '''From: %s
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
96 To: %s
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
97 Subject: %s
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
98
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
99 revision=%s
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
100 host=%s
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
101 repos=%s
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
102 date=%s
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
103 summary=%s
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
104
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
105 %s'''%(from_address, tracker_address, subject, repos.rev, repos.host,
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
106 repos.repos_dir, date, repos.summary, repos.message)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
107
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
108 logger.debug('MESSAGE TO SEND\n%s'%message)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
109
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
110 smtp = smtplib.SMTP(smtp_host)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
111 try:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
112 smtp.sendmail(from_address, [tracker_address], message)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
113 except:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
114 logging.exception('mail to %r from %r via %r'%(tracker_address,
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
115 from_address, smtp_host))
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
116
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
117 def notify_local(tracker_home, repos):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
118 # get a handle on the tracker db
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
119 tracker = roundup.instance.open(tracker_home)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
120 db = tracker.open('admin')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
121 try:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
122 notify_local_inner(db, tracker_home, repos)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
123 except:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
124 db.rollback()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
125 db.close()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
126 raise
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
127
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
128 def notify_local_inner(db, tracker_home, repos):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
129 # sanity check
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
130 try:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
131 db.getclass(repos.klass)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
132 except KeyError:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
133 logger.error('no such tracker class %s'%repos.klass)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
134 raise Failed
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
135 if not db.getclass(repos.klass).hasnode(repos.itemid):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
136 logger.error('no such %s item %s'%(repos.klass, repos.itemid))
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
137 raise Failed
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
138 if repos.status:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
139 try:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
140 status_id = db.status.lookup(repos.status)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
141 except KeyError:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
142 logger.error('no such status %s'%repos.status)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
143 raise Failed
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
144
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
145 print repos.host, repos.repos_dir
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
146 # get the svn repo information from the tracker
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
147 try:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
148 svn_repo_id = db.svn_repo.stringFind(host=repos.host,
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
149 path=repos.repos_dir)[0]
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
150 except IndexError:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
151 logger.error('no repository %s in tracker'%repos.repos_dir)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
152 raise Failed
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
153
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
154 # log in as the appropriate user
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
155 try:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
156 matches = db.user.stringFind(svn_name=repos.author)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
157 except KeyError:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
158 # the user class has no property "svn_name"
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
159 matches = []
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
160 if matches:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
161 userid = matches[0]
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
162 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
163 try:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
164 userid = db.user.lookup(repos.author)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
165 except KeyError:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
166 raise Failed, 'no Roundup user matching %s'%repos.author
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
167 username = db.user.get(userid, 'username')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
168 db.close()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
169
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
170 # tell Roundup
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
171 tracker = roundup.instance.open(tracker_home)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
172 db = tracker.open(username)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
173
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
174 # check perms
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
175 if not db.security.hasPermission('Create', userid, 'svn_rev'):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
176 raise Unauthorised, "Can't create items of class 'svn_rev'"
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
177 if not db.security.hasPermission('Create', userid, 'msg'):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
178 raise Unauthorised, "Can't create items of class 'msg'"
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
179 if not db.security.hasPermission('Edit', userid, repos.klass,
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
180 'messages', repos.itemid):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
181 raise Unauthorised, "Can't edit items of class '%s'"%repos.klass
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
182 if repos.status and not db.security.hasPermission('Edit', userid,
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
183 repos.klass, 'status', repos.itemid):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
184 raise Unauthorised, "Can't edit items of class '%s'"%repos.klass
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
185
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
186 # create the revision
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
187 svn_rev_id = db.svn_rev.create(repository=svn_repo_id, revision=repos.rev)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
188
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
189 # add the message to the spool
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
190 date = roundup.date.Date(repos.date)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
191 msgid = db.msg.create(content=repos.message, summary=repos.summary,
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
192 author=userid, date=date, revision=svn_rev_id)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
193 klass = db.getclass(repos.klass)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
194 messages = klass.get(repos.itemid, 'messages')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
195 messages.append(msgid)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
196 klass.set(repos.itemid, messages=messages)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
197
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
198 # and set the status
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
199 if repos.status:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
200 klass.set(repos.itemid, status=status_id)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
201
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
202 db.commit()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
203 logger.debug('Roundup modification complete')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
204 db.close()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
205
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
206
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
207 def _select_adds(change):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
208 return change.added
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
209 def _select_deletes(change):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
210 return change.path is None
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
211 def _select_modifies(change):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
212 return not change.added and change.path is not None
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
213
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
214
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
215 def generate_list(output, header, changelist, selection):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
216 items = [ ]
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
217 for path, change in changelist:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
218 if selection(change):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
219 items.append((path, change))
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
220 if not items:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
221 return
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
222
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
223 output.write('%s:\n' % header)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
224 for fname, change in items:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
225 if change.item_kind == svn.core.svn_node_dir:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
226 is_dir = '/'
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
227 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
228 is_dir = ''
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
229 if change.prop_changes:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
230 if change.text_changed:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
231 props = ' (contents, props changed)'
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
232 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
233 props = ' (props changed)'
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
234 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
235 props = ''
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
236 output.write(' %s%s%s\n' % (fname, is_dir, props))
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
237 if change.added and change.base_path:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
238 if is_dir:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
239 text = ''
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
240 elif change.text_changed:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
241 text = ', changed'
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
242 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
243 text = ' unchanged'
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
244 output.write(' - copied%s from r%d, %s%s\n'
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
245 % (text, change.base_rev, change.base_path[1:], is_dir))
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
246
4164
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
247 class HGRepository:
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
248 '''Holds roots and other information about the hg repository.'
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
249 '''
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
250
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
251 def __init__(self,repos_dir,rev,pool):
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
252 pass
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
253
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
254 class SVNRepository:
6750b2dae53e Did some work on hg support
Pygi <pygi@users.sourceforge.net>
parents: 4162
diff changeset
255 '''Hold roots and other information about the svn repository. From mailer.py
4162
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
256 '''
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
257 def __init__(self, repos_dir, rev, pool):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
258 self.repos_dir = repos_dir
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
259 self.rev = rev
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
260 self.pool = pool
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
261
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
262 self.repos_ptr = svn.repos.svn_repos_open(repos_dir, pool)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
263 self.fs_ptr = svn.repos.svn_repos_fs(self.repos_ptr)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
264
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
265 self.roots = {}
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
266
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
267 self.root_this = self.roots[rev] = svn.fs.revision_root(self.fs_ptr,
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
268 rev, self.pool)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
269
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
270 self.author = self.get_rev_prop(svn.core.SVN_PROP_REVISION_AUTHOR)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
271
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
272 def get_rev_prop(self, propname):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
273 return svn.fs.revision_prop(self.fs_ptr, self.rev, propname, self.pool)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
274
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
275 def extract_info(self):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
276 issue_re = re.compile('^\s*(%s)\s*(\d+)(\s+(\S+))?\s*$'%self.klass,
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
277 re.I)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
278
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
279 # parse for Roundup item information
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
280 log = self.get_rev_prop(svn.core.SVN_PROP_REVISION_LOG) or ''
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
281 for line in log.splitlines():
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
282 m = issue_re.match(line)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
283 if m:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
284 break
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
285 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
286 # nothing to do
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
287 return
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
288
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
289 # parse out the issue information
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
290 klass = m.group(1)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
291 self.itemid = m.group(2)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
292
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
293 issue = klass + self.itemid
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
294 self.status = m.group(4)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
295
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
296 logger.debug('Roundup info item=%r, status=%r'%(issue, self.status))
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
297
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
298 # get all the changes and sort by path
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
299 editor = svn.repos.RevisionChangeCollector(self.fs_ptr, self.rev,
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
300 self.pool)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
301 e_ptr, e_baton = svn.delta.make_editor(editor, self.pool)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
302 svn.repos.svn_repos_replay(self.root_this, e_ptr, e_baton, self.pool)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
303
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
304 changelist = editor.changes.items()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
305 changelist.sort()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
306
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
307 # figure out the changed directories
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
308 dirs = { }
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
309 for path, change in changelist:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
310 if change.item_kind == svn.core.svn_node_dir:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
311 dirs[path] = None
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
312 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
313 idx = path.rfind('/')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
314 if idx == -1:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
315 dirs[''] = None
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
316 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
317 dirs[path[:idx]] = None
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
318
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
319 dirlist = dirs.keys()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
320
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
321 # figure out the common portion of all the dirs. note that there is
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
322 # no "common" if only a single dir was changed, or the root was changed.
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
323 if len(dirs) == 1 or dirs.has_key(''):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
324 commondir = ''
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
325 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
326 common = dirlist.pop().split('/')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
327 for d in dirlist:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
328 parts = d.split('/')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
329 for i in range(len(common)):
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
330 if i == len(parts) or common[i] != parts[i]:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
331 del common[i:]
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
332 break
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
333 commondir = '/'.join(common)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
334 if commondir:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
335 # strip the common portion from each directory
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
336 l = len(commondir) + 1
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
337 dirlist = [ ]
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
338 for d in dirs.keys():
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
339 if d == commondir:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
340 dirlist.append('.')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
341 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
342 dirlist.append(d[l:])
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
343 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
344 # nothing in common, so reset the list of directories
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
345 dirlist = dirs.keys()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
346
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
347 # compose the basic subject line. later, we can prefix it.
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
348 dirlist.sort()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
349 dirlist = ' '.join(dirlist)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
350
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
351 if commondir:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
352 self.summary = 'r%d - in %s: %s' % (self.rev, commondir, dirlist)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
353 else:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
354 self.summary = 'r%d - %s' % (self.rev, dirlist)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
355
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
356 # Generate email for the various groups and option-params.
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
357 output = cStringIO.StringIO()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
358
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
359 # print summary sections
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
360 generate_list(output, 'Added', changelist, _select_adds)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
361 generate_list(output, 'Removed', changelist, _select_deletes)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
362 generate_list(output, 'Modified', changelist, _select_modifies)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
363
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
364 output.write('Log:\n%s\n'%log)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
365
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
366 self.message = output.getvalue()
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
367
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
368 svndate = self.get_rev_prop(svn.core.SVN_PROP_REVISION_DATE)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
369 self.date = time.localtime(svn.core.secs_from_timestr(svndate,
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
370 self.pool))
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
371
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
372 return True
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
373
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
374 if __name__ == '__main__':
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
375 try:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
376 svn.core.run_app(main)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
377 except Failed, message:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
378 logger.error(message)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
379 sys.exit(1)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
380 except:
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
381 logger.exception('top level')
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
382 sys.exit(1)
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
383
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
384 #
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
385 # 2005-05-16 - 1.2
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
386 #
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
387 # - Status wasn't being set by ID in local mode
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
388 # - Wasn't catching errors in local changes, hence not cleaning up db
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
389 # correctly
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
390 # - svnauditor.py wasn't handling the fifth argument from notify-roundup.py
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
391 # - viewcvs_url formatting wasn't quite right
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
392 #
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
393 # 2005-05-04 - 1.1
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
394 # - Several fixes from Ron Alford
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
395 # - Don't change issue titles to "SVN commit message..."
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
396 #
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
397 # 2005-04-26 - 1.0
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
398 # - Initial version released
5d8246ac6e89 Added beta notify development dir
Pygi <pygi@users.sourceforge.net>
parents:
diff changeset
399 #

Roundup Issue Tracker: http://roundup-tracker.org/