def log_receiver (self, changed_paths, rev, author, date, log, pool): if not changed_paths: return # Store the copyfrom-information so we can follow the file/dir # through tags/banches/copy/renames. for newpath in changed_paths.keys(): change = changed_paths[newpath] if change.copyfrom_path: self.branch_info.setdefault(rev, []).append((change.copyfrom_path, newpath)) shortlog = util.shorten_line(util.wiki_escape_newline(log)) t = svn.core.svn_time_from_cstring(date, pool) / 1000000 gmt = time.gmtime(t) item = { 'rev' : rev, 'author' : author and util.escape(author) or 'None', 'date' : util.svn_date_to_string (date, pool), 'gmt' : time.strftime('%a, %d %b %Y %H:%M:%S GMT', gmt), 'log.raw' : util.escape(log), 'log' : wiki_to_oneliner(util.shorten_line(util.wiki_escape_newline(log)), self.req.hdf, self.env,self.db), 'shortlog' : util.escape(shortlog), 'file_href': self.env.href.browser(self.path, rev), 'changeset_href': self.env.href.changeset(rev) } self.log_info.insert (0, item)
def get_attachments_hdf(self, cnx, type, id, hdf, prefix): from Wiki import wiki_to_oneliner files = self.get_attachments(cnx, type, id) idx = 0 for file in files: p = '%s.%d' % (prefix, idx) hdf.setValue(p + '.name', file['filename']) hdf.setValue(p + '.descr', wiki_to_oneliner(file['description'], hdf, self, cnx)) hdf.setValue(p + '.author', util.escape(file['author'])) hdf.setValue(p + '.ipnr', file['ipnr']) hdf.setValue(p + '.size', util.pretty_size(file['size'])) hdf.setValue(p + '.time', time.strftime('%c', time.localtime(file['time']))) hdf.setValue(p + '.href', self.href.attachment(type, id, file['filename'])) idx += 1
def get_info(self, path, revision, rev_specified): """ Extracts information for a given path and revision """ # We need to really make sure it's an ordinary string. The FieldStorage # class provided by modpython might give us some strange string-like object # that svn doesn't like. path = str(path) try: root = svn.fs.revision_root(self.fs_ptr, revision, self.pool) except svn.core.SubversionException: raise util.TracError('Invalid revision number: %d' % revision) node_type = svn.fs.check_path(root, path, self.pool) if not node_type in [svn.core.svn_node_dir, svn.core.svn_node_file]: raise util.TracError('"%s": no such file or directory in revision %d' \ % (path, revision), 'No such file or directory') # Redirect to the file module if the requested path happens # to point to a regular file if svn.fs.is_file(root, path, self.pool): if rev_specified: self.req.redirect(self.env.href.file(path, revision)) else: self.req.redirect(self.env.href.log(path)) entries = svn.fs.dir_entries(root, path, self.pool) info = [] for item in entries.keys(): fullpath = posixpath.join(path, item) is_dir = svn.fs.is_dir(root, fullpath, self.pool) if is_dir: name = item + '/' fullpath = fullpath + '/' else: name = item created_rev = svn.fs.node_created_rev(root, fullpath, self.pool) date = svn.fs.revision_prop(self.fs_ptr, created_rev, svn.core.SVN_PROP_REVISION_DATE, self.pool) if date: date_seconds = svn.core.svn_time_from_cstring(date, self.pool) / 1000000 date = time.strftime('%x %X', time.localtime(date_seconds)) else: date_seconds = 0 date = '' author = svn.fs.revision_prop(self.fs_ptr, created_rev, svn.core.SVN_PROP_REVISION_AUTHOR, self.pool) change = svn.fs.revision_prop(self.fs_ptr, created_rev, svn.core.SVN_PROP_REVISION_LOG, self.pool) item = { 'name' : name, 'fullpath' : fullpath, 'created_rev' : created_rev, 'date' : date, 'date_seconds' : date_seconds, 'age' : util.pretty_age(date_seconds), 'is_dir' : is_dir, 'author' : author, 'change' : wiki_to_oneliner(util.shorten_line(util.wiki_escape_newline(change)), self.req.hdf, self.env,self.db), 'permission' : self.authzperm.has_permission(fullpath) } if rev_specified: item['log_href'] = self.env.href.log(fullpath, revision) if is_dir: item['browser_href'] = self.env.href.browser(fullpath, revision) else: item['browser_href'] = self.env.href.file(fullpath, revision) else: item['log_href'] = self.env.href.log(fullpath) if is_dir: item['browser_href'] = self.env.href.browser(fullpath) else: item['browser_href'] = self.env.href.file(fullpath) info.append(item) return info
def get_info (self, start, stop, maxrows, tickets, changeset, wiki, milestone): cursor = self.db.cursor () tickets = tickets and self.perm.has_permission(perm.TICKET_VIEW) changeset = changeset and self.perm.has_permission(perm.CHANGESET_VIEW) wiki = wiki and self.perm.has_permission(perm.WIKI_VIEW) milestone = milestone and self.perm.has_permission(perm.MILESTONE_VIEW) if tickets == changeset == wiki == milestone == 0: return [] CHANGESET = 1 NEW_TICKET = 2 CLOSED_TICKET = 3 REOPENED_TICKET = 4 WIKI = 5 MILESTONE = 6 q = [] if changeset: q.append("SELECT time, rev AS idata, '' AS tdata, 1 AS type, " " message, author " "FROM revision WHERE time>=%s AND time<=%s" % (start, stop)) if tickets: q.append("SELECT time, id AS idata, '' AS tdata, 2 AS type, " "summary AS message, reporter AS author " "FROM ticket WHERE time>=%s AND time<=%s" % (start, stop)) q.append("SELECT time, ticket AS idata, '' AS tdata, 4 AS type, " "'' AS message, author " "FROM ticket_change WHERE field='status' " "AND newvalue='reopened' AND time>=%s AND time<=%s" % (start, stop)) q.append("SELECT t1.time AS time, t1.ticket AS idata," " t2.newvalue AS tdata, 3 AS type," " t3.newvalue AS message, t1.author AS author" " FROM ticket_change t1" " INNER JOIN ticket_change t2 ON t1.ticket = t2.ticket" " AND t1.time = t2.time" " LEFT OUTER JOIN ticket_change t3 ON t1.time = t3.time" " AND t1.ticket = t3.ticket AND t3.field = 'comment'" " WHERE t1.field = 'status' AND t1.newvalue = 'closed'" " AND t2.field = 'resolution'" " AND t1.time >= %s AND t1.time <= %s" % (start,stop)) if wiki: q.append("SELECT time, -1 AS idata, name AS tdata, 5 AS type, " "comment AS message, author " "FROM wiki WHERE time>=%s AND time<=%s" % (start, stop)) if milestone: q.append("SELECT time, -1 AS idata, '' AS tdata, 6 AS type, " "name AS message, '' AS author " "FROM milestone WHERE time>=%s AND time<=%s" % (start, stop)) q_str = string.join(q, ' UNION ALL ') q_str += ' ORDER BY time DESC' if maxrows: q_str += ' LIMIT %d' % maxrows cursor.execute(q_str) # Make the data more HDF-friendly info = [] while 1: row = cursor.fetchone() if not row: break t = time.localtime(int(row['time'])) gmt = time.gmtime(int(row['time'])) item = {'time': time.strftime('%H:%M', t), 'date': time.strftime('%x', t), 'datetime': time.strftime('%a, %d %b %Y %H:%M:%S GMT', gmt), 'idata': int(row['idata']), 'tdata': row['tdata'], 'type': int(row['type']), 'message': row['message'] or '', 'author': util.escape(row['author'] or 'anonymous') } if item['type'] == CHANGESET: item['href'] = self.env.href.changeset(item['idata']) msg = item['message'] item['shortmsg'] = util.escape(util.shorten_line(msg)) item['msg_nowiki'] = util.escape(msg) item['msg_escwiki'] = util.escape(wiki_to_html(msg, self.req.hdf, self.env, self.db, absurls=1)) item['message'] = wiki_to_oneliner(msg, self.req.hdf, self.env, self.db,absurls=1) try: max_node = int(self.env.get_config('timeline', 'changeset_show_files', 0)) except ValueError, e: self.env.log.warning("Invalid 'changeset_show_files' value, " "please edit trac.ini : %s" % e) max_node = 0 if max_node != 0: cursor_node = self.db.cursor () cursor_node.execute("SELECT name, change " "FROM node_change WHERE rev=%d" % item['idata']) node_list = '' node_data = '' node_count = 0; while 1: row_node = cursor_node.fetchone() if not row_node: break if node_count != 0: node_list += ', ' if (max_node != -1) and (node_count >= max_node): node_list += '...' break if row_node['change'] == 'A': node_data = '<span class="diff-add">' + row_node['name'] + "</span>" elif row_node['change'] == 'M': node_data = '<span class="diff-mod">' + row_node['name'] + "</span>" elif row_node['change'] == 'D': node_data = '<span class="diff-rem">' + row_node['name'] + "</span>" node_list += node_data node_count += 1 item['node_list'] = node_list + ': ' elif item['type'] == WIKI: item['href'] = self.env.href.wiki(row['tdata']) item['message'] = wiki_to_oneliner(util.shorten_line(item['message']), self.req.hdf, self.env, self.db, absurls=1)
node_count += 1 item['node_list'] = node_list + ': ' elif item['type'] == WIKI: item['href'] = self.env.href.wiki(row['tdata']) item['message'] = wiki_to_oneliner(util.shorten_line(item['message']), self.req.hdf, self.env, self.db, absurls=1) elif item['type'] == MILESTONE: item['href'] = self.env.href.milestone(item['message']) item['message'] = util.escape(item['message']) else: # TICKET item['href'] = self.env.href.ticket(item['idata']) msg = item['message'] item['shortmsg'] = util.escape(util.shorten_line(msg)) item['message'] = wiki_to_oneliner( util.shorten_line(item['message']), self.req.hdf, self.env, self.db, absurls=1) item['msg_escwiki'] = util.escape(wiki_to_html(msg, self.req.hdf, self.env, self.db, absurls=1)) # Kludges for RSS item['author.rss'] = item['author'] if item['author.rss'].find('@') == -1: item['author.rss'] = '' item['message.rss'] = util.escape(item['message'] or '') info.append(item) return info