#!/usr/bin/env python
# ====================================================================
# Copyright (c) 2004 CollabNet.  All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution.  The terms
# are also available at http://subversion.tigris.org/license.html.
# If newer versions of this license are posted there, you may use a
# newer version instead, at your option.
#
# This software consists of voluntary contributions made by many
# individuals.  For exact contribution history, see the revision
# history and logs, available at http://subversion.tigris.org/.
# ====================================================================

import sys, os, string

SVNLOOK='/usr/local/bin/svnlook'
MESSAGE="""
Dear {AUTHOR}:

We're sorry, but we just couldn't allow you to have the
revision {REVISION} commit.

       -- Love, Your Administrator(s).
"""

if len(sys.argv) < 5:
    sys.stderr.write(
        "Usage: %s REPOS AUTHOR BLOCKED_REV BLOCKED_AUTHOR [...]\n"
        "\n"
        "Disallow a set BLOCKED_AUTHORS from committing the revision\n"
        "expected to bring REPOS to a youngest revision of BLOCKED_REV.\n"
        "Written as a prank for use as a start-commit hook (which provides\n"
        "REPOS and AUTHOR for you).\n"
        "\n"
        "NOTE: There is a small chance that while HEAD is BLOCKED_REV - 2,\n"
        "a commit could slip in between the time we query the youngest\n"
        "revision and the time this commit-in-progress actually occurs.\n"
        "\n"
        % sys.argv[0])
    sys.exit(1)

repos = sys.argv[1]
author = sys.argv[2]
blocked_rev = sys.argv[3]
blocked_authors = sys.argv[4:]

if author in blocked_authors:
    youngest_cmd = '%s youngest %s' % (SVNLOOK, repos)
    youngest = os.popen(youngest_cmd, 'r').readline().rstrip('\n')

    # See if this is the blocked revision
    if int(youngest) == int(blocked_rev) - 1:
        MESSAGE = MESSAGE.replace('{AUTHOR}', author)
        MESSAGE = MESSAGE.replace('{REVISION}', blocked_rev)
        sys.stderr.write(MESSAGE)
        sys.exit(1)

sys.exit(0)
