xref: /freebsd/release/scripts/list-new-changesets.py (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
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