The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env python

from csvn.repos import *
from csvn.auth import User
import csvn.core
import time, sys, gc
from optparse import OptionParser
import textwrap

usage = """python log.py [OPTION]... URL

Print all of the log messages for a repository at a given URL,
similar to 'svn log URL'. Useful for demo purposes only.
"""

parser = OptionParser(usage=usage)
parser.add_option("-u", "--username", dest="username",
                  help="commit the changes as USERNAME")
parser.add_option("-v", "--verbose", dest="verbose",
                  action='store_true', help="verbose mode",
                  default=False)
parser.add_option("", "--stop-on-copy", dest="stop_on_copy",
                  action='store_true', help="verbose mode",
                  default=False)
parser.add_option("-r", "", dest="rev",
                  help="revision range")

(options, args) = parser.parse_args()

if len(args) != 1:
    parser.print_help()
    sys.exit(1)

csvn.core.svn_cmdline_init("", csvn.core.stderr)
repos_url = args[0]
revs = options.rev
if revs and ":" in revs:
    [start_rev, end_rev] = revs.split(":")
elif revs:
    start_rev = revs
    end_rev = revs
else:
    start_rev = 1
    end_rev = "HEAD"

session = RemoteRepository(repos_url, user=User(options.username))

if end_rev == "HEAD":
    end_rev = session.latest_revnum()
if start_rev == "HEAD":
    start_rev = session.latest_revnum()
start_rev = int(start_rev)
end_rev = int(end_rev)

def count_lines(message):
    num_lines = message.count("\n") + 1
    if num_lines == 1:
        num_lines = "1 line"
    else:
        num_lines = "%d lines" % num_lines
    return num_lines

for entry in \
     session.log(start_rev, end_rev, discover_changed_paths=options.verbose,
                 stop_on_copy=options.stop_on_copy):

    num_lines = count_lines(entry.message)
    print("-" * 72)
    print("r%d | %s | %s | %s" % (entry.revision, entry.author,
                                  entry.date.as_human_string(), num_lines))
    if options.verbose:
        print("Changed paths:")
        for key, value in entry.changed_paths.items():
            value = value[0]
            if value.copyfrom_rev != SVN_INVALID_REVNUM:
                print("   %s %s (from %s:%d)" % (value.action, key,
                                                 value.copyfrom_path,
                                                 value.copyfrom_rev))
            else:
                print("   %s %s" % (value.action, key))
    print("")
    print(entry.message)

print("-" * 72)