182cac398SCraig Rodrigues#!/usr/bin/env python 282cac398SCraig Rodrigues# 382cac398SCraig Rodrigues# Copyright (c) 2014, Craig Rodrigues <rodrigc@FreeBSD.org> 482cac398SCraig Rodrigues# All rights reserved. 582cac398SCraig Rodrigues# 682cac398SCraig Rodrigues# Redistribution and use in source and binary forms, with or without 782cac398SCraig Rodrigues# modification, are permitted provided that the following conditions 882cac398SCraig Rodrigues# are met: 982cac398SCraig Rodrigues# 1. Redistributions of source code must retain the above copyright 1082cac398SCraig Rodrigues# notice unmodified, this list of conditions, and the following 1182cac398SCraig Rodrigues# disclaimer. 1282cac398SCraig Rodrigues# 2. Redistributions in binary form must reproduce the above copyright 1382cac398SCraig Rodrigues# notice, this list of conditions and the following disclaimer in the 1482cac398SCraig Rodrigues# documentation and/or other materials provided with the distribution. 1582cac398SCraig Rodrigues# 1682cac398SCraig Rodrigues# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1782cac398SCraig Rodrigues# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1882cac398SCraig Rodrigues# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1982cac398SCraig Rodrigues# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2082cac398SCraig Rodrigues# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2182cac398SCraig Rodrigues# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2282cac398SCraig Rodrigues# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2382cac398SCraig Rodrigues# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2482cac398SCraig Rodrigues# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2582cac398SCraig Rodrigues# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2682cac398SCraig Rodrigues# 2782cac398SCraig Rodrigues 2882cac398SCraig Rodrigues# Display SVN log entries for changesets which have files which were 2982cac398SCraig Rodrigues# Added or Deleted. 3082cac398SCraig Rodrigues# This script takes arguments which would normally be 3182cac398SCraig Rodrigues# passed to the "svn log" command. 3282cac398SCraig Rodrigues# 3382cac398SCraig Rodrigues# Examples: 3482cac398SCraig Rodrigues# 3582cac398SCraig Rodrigues# (1) Display all new changesets in stable/10 branch: 3682cac398SCraig Rodrigues# 3782cac398SCraig Rodrigues# list-new-changesets.py --stop-on-copy \ 3882cac398SCraig Rodrigues# svn://svn.freebsd.org/base/stable/10 3982cac398SCraig Rodrigues# 4082cac398SCraig Rodrigues# (2) Display all new changesets between r254153 and r261794 in 4182cac398SCraig Rodrigues# stable/9 branch: 4282cac398SCraig Rodrigues# 4382cac398SCraig Rodrigues# list-new-changesets.py -r254153:261794 \ 4482cac398SCraig Rodrigues# svn://svn.freebsd.org/base/stable/9 4582cac398SCraig Rodrigues 46*c151731fSCraig Rodriguesfrom __future__ import print_function 4782cac398SCraig Rodriguesimport os 4882cac398SCraig Rodriguesimport subprocess 4982cac398SCraig Rodriguesimport sys 5082cac398SCraig Rodriguesimport xml.etree.ElementTree 5182cac398SCraig Rodrigues 5282cac398SCraig Rodriguesdef print_logentry(logentry): 5382cac398SCraig Rodrigues """Print an SVN log entry. 5482cac398SCraig Rodrigues 5582cac398SCraig Rodrigues Take an SVN log entry formatted in XML, and print it out in 5682cac398SCraig Rodrigues plain text. 5782cac398SCraig Rodrigues """ 5882cac398SCraig Rodrigues rev = logentry.attrib['revision'] 5982cac398SCraig Rodrigues author = logentry.find('author').text 6082cac398SCraig Rodrigues date = logentry.find('date').text 6182cac398SCraig Rodrigues msg = logentry.find('msg').text 6282cac398SCraig Rodrigues 63*c151731fSCraig Rodrigues print("-" * 71) 64*c151731fSCraig Rodrigues print("%s | %s | %s" % (rev, author, date)) 65*c151731fSCraig Rodrigues print("Changed paths:") 6682cac398SCraig Rodrigues for paths in logentry.findall('paths'): 6782cac398SCraig Rodrigues for path in paths.findall('path'): 68*c151731fSCraig Rodrigues print(" %s %s" % (path.attrib['action'], path.text)) 6982cac398SCraig Rodrigues 70*c151731fSCraig Rodrigues print() 71*c151731fSCraig Rodrigues print(msg.encode('utf-8')) 7282cac398SCraig Rodrigues 7382cac398SCraig Rodriguesdef main(args): 7482cac398SCraig Rodrigues """Main function. 7582cac398SCraig Rodrigues 7682cac398SCraig Rodrigues Take command-line arguments which would be passed to 'svn log'. 7782cac398SCraig Rodrigues Prepend '-v --xml' to get verbose XML formatted output. 7882cac398SCraig Rodrigues Only display entries which have Added or Deleted files. 7982cac398SCraig Rodrigues """ 8082cac398SCraig Rodrigues cmd = ["svn", "log", "-v", "--xml"] 8182cac398SCraig Rodrigues cmd += args[1:] 8282cac398SCraig Rodrigues 83*c151731fSCraig Rodrigues print(" ".join(cmd)) 8482cac398SCraig Rodrigues 8582cac398SCraig Rodrigues proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 8682cac398SCraig Rodrigues (out, err) = proc.communicate() 8782cac398SCraig Rodrigues 8882cac398SCraig Rodrigues if proc.returncode != 0: 89*c151731fSCraig Rodrigues print(err) 9082cac398SCraig Rodrigues sys.exit(proc.returncode) 9182cac398SCraig Rodrigues 9282cac398SCraig Rodrigues displayed_entries = 0 9382cac398SCraig Rodrigues root = xml.etree.ElementTree.fromstring(out) 9482cac398SCraig Rodrigues 9582cac398SCraig Rodrigues for logentry in root.findall('logentry'): 9682cac398SCraig Rodrigues show_logentry = False 9782cac398SCraig Rodrigues 9882cac398SCraig Rodrigues for paths in logentry.findall('paths'): 9982cac398SCraig Rodrigues for path in paths.findall('path'): 10082cac398SCraig Rodrigues if path.attrib['action'] == 'A': 10182cac398SCraig Rodrigues show_logentry = True 10282cac398SCraig Rodrigues elif path.attrib['action'] == 'D': 10382cac398SCraig Rodrigues show_logentry = True 10482cac398SCraig Rodrigues 10582cac398SCraig Rodrigues if show_logentry == True : 10682cac398SCraig Rodrigues print_logentry(logentry) 10782cac398SCraig Rodrigues displayed_entries += 1 10882cac398SCraig Rodrigues 10982cac398SCraig Rodrigues if displayed_entries == 0: 110*c151731fSCraig Rodrigues print("No changesets with Added or Deleted files") 11182cac398SCraig Rodrigues 11282cac398SCraig Rodrigues if displayed_entries > 0: 113*c151731fSCraig Rodrigues print("-" * 71) 11482cac398SCraig Rodrigues 11582cac398SCraig Rodrigues 11682cac398SCraig Rodriguesif __name__ == "__main__": 11782cac398SCraig Rodrigues main(sys.argv) 118