#!/usr/bin/ruby
#--
#-------------------------------------------------------------------------------
#++
#
#= Introduction
#
#== Name: check_format_rel_name.rb
#
#== Author: Robert Cowham <robert@vaccaperna.co.uk>
#
#== Description
#
# Example trigger to enforce release naming convention
# e.g. //software/releases/release_NN_NN.br/...
# to avoid no-leading zeroes etc.
#
#== Requires
# Ruby
# P4Ruby
# P4Triggers module
#
#== Example 'triggers' section:
#
# Restrict to only releases area of the repository
#
# Parameters Pass in serverport/username/changelist
# Triggers:
# release_check //software/releases/... "ruby whatever/check_format_rel_name.rb %serverport% perforce %changelist%"
#
#--
#-------------------------------------------------------------------------------
#++
$:.unshift(File.dirname(__FILE__))
require "P4"
require "P4Triggers"
#
# The trigger class itself. The main method in here is validate() which
# is invoked from the super-class' parse_change() method.
#
class RelNameTrigger < P4Trigger
@@EXCEPTIONS = %w{
//software/releases/some-exception_01_05.br
//software/releases/release_01p_00.br
//software/releases/release_01p_01.br
}
def initialize(options)
@exceptions = @@EXCEPTIONS.collect{|e| Regexp.new(e)}
super(options)
end
#
# The error message we give to the user
#
@@USER_MESSAGE =
"\n\n" +
"Your submission has been rejected because the release name was of the\n" +
"wrong format, i.e. not: //software/releases/release_nn_nn.br\n\n"
# Enforce name checking.
def validate()
re_valid_file = Regexp.new('//software/releases/release_\d\d_\d\d.br/')
change.each_file do
|file|
# Ignore files not open for add
next unless ( file.revisions[ 0 ].action == "add" ||
file.revisions[ 0 ].action == "branch" )
if file.depot_file !~ re_valid_file
if @exceptions.select{|re| re.match(file.depot_file)}.size == 0
message(@@USER_MESSAGE)
return false
end
end
end
return true
end
end
#--
#-------------------------------------------------------------------------------
# Start of main script execution
#-------------------------------------------------------------------------------
#++
# By this stage it's pretty simple. Even argument validation is handled by
# the p4Trigger class so we don't even need to check that we were passed
# a changelist number.
trig = RelNameTrigger.new(P4TriggerOptions.new(ARGV))
result = trig.parse_change(ARGV.shift)
exit(result)