Files
2025-09-29 00:52:08 +02:00

197 lines
6.6 KiB
Ruby
Executable File

# File:: update_asset_deltas.rb
# Description:: updates asset deltas spreadsheet.
#
# Author:: Derek Ward <derek.ward@rockstarnorth.com>
# Date:: 28 June 2012
#
#-----------------------------------------------------------------------------
# Uses
#-----------------------------------------------------------------------------
require 'win32ole'
require 'pipeline/os/path'
require 'time'
require 'pipeline/os/getopt'
require 'pipeline/os/path'
require 'fileutils'
include FileUtils
require 'dl'
include Pipeline
require 'pipeline/log/log'
require 'util/ExcelTools/excel_tools'
#-----------------------------------------------------------------------------
# Constants
#-----------------------------------------------------------------------------
OPTIONS = [
[ '--xlsfilename', '-x', Getopt::REQUIRED, 'destination xls filename' ],
[ '--datafilename', '-d', Getopt::REQUIRED, 'source filename from which data is extracted for insertion' ],
[ '--disablecheckin', '-c', Getopt::BOOLEAN, 'prevent checkin ( for development )' ],
[ '--row', '-r', Getopt::REQUIRED, 'the row of the dest xls file to update' ],
]
INFO = "[colourise=black]INFO_MSG: "
INFO_BLUE = "[colourise=blue]INFO_MSG: "
#-----------------------------------------------------------------------------
# Implementation
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------
begin
#-------------------------------------------------------------------------
# Entry-Point
#-------------------------------------------------------------------------
g_AppName = File::basename( __FILE__, '.rb' )
g_xls_filename = ''
g_Config = Pipeline::Config.instance()
g_Log = Log.new( 'exceltools' )
#-------------------------------------------------------------------------
# Parse & validate Command Line
#-------------------------------------------------------------------------
opts, trailing = OS::Getopt.getopts( OPTIONS )
if ( opts['help'] ) then
puts OS::Getopt.usage( OPTIONS )
response = message_box( "#{g_AppName} will exit.",g_AppName, BUTTONS_OK, ICON_QUESTION)
exit( 1 )
end
if not opts['row']
$stderr.puts "Error : Specify a row in the dest xls to update."
exit( 2 )
end
g_xls_filename = ( nil == opts['xlsfilename'] ) ? nil : opts['xlsfilename']
g_enable_checkin = ( nil == opts['disablecheckin'] ) ? true : false
g_row = opts['row'].to_i
#-------------------------------------------------------------------------
# --- Sync, check out file ---
#-------------------------------------------------------------------------
puts "#{INFO_BLUE} Creating p4"
p4 = SCM::Perforce::create( g_Config.sc_server, g_Config.sc_username, g_Config.sc_workspace )
puts "#{INFO_BLUE} Connecting to p4 servers"
raise Exception if not p4
p4.connect( )
raise Exception if not p4.connected?
puts "#{INFO_BLUE} Creating CL"
change_id = p4.create_changelist( "Automated Build of 'asset deltas' via Cruise Control @ #{Time.now} on #{ENV["COMPUTERNAME"]}." )
raise Exception if change_id.nil?
puts "#{INFO_BLUE}Changelist #{change_id} is created"
puts "#{INFO_BLUE} Syncing to XLS file."
depot_filename = p4.local2depot(g_xls_filename)
p4.run_sync( depot_filename )
depot_filename = p4.local2depot(g_xls_filename)
p4.run_sync( depot_filename )
3.times {
fstat = p4.run_fstat( depot_filename ).shift
otherOpen = fstat["otherOpen"]
if (otherOpen != nil)
otherOpen.each do |oo|
if (oo.downcase.include?('builder'))
puts "#{INFO_BLUE} Sleeping builder has the shared XLS file checked out!"
Kernel.sleep 60 # wait for lock to be freed
end
end
else
break
end
}
puts "#{INFO_BLUE}Checking out #{depot_filename} in CL #{change_id.to_s}"
puts "Checking out #{depot_filename} in CL #{change_id.to_s}"
p4.run_edit( '-c', change_id.to_s, depot_filename )
p4.run_reopen( '-c', change_id.to_s, depot_filename )
#-------------------------------------------------------------------------
# --- Append the row ---
#-------------------------------------------------------------------------
if (trailing)
#-------------------------------------------------------------------------
# --- Search for data in log.
#-------------------------------------------------------------------------
trailing.each do |data_filename|
idx = 0
vals = [ 0,0,0,0,0,0 ]
puts "#{INFO_BLUE} opening #{data_filename}"
File.open(data_filename) do |file|
file.each_line do |line|
if line =~ /^\s*(-?\d*)\s*(-?\d*)\s*\*\*\*\sTOTAL\s\*\*\*\s*$/i
vals[idx] = $1
idx = idx + 1
vals[idx] = $2
idx = idx + 1
puts "#{INFO_BLUE} Matched #{line}, retrieved values #{$1} and #{$2} for row #{g_row}"
end
end
end
puts "#{INFO_BLUE} vals"
vals.each_with_index do |val,index|
col = index+2
puts "#{INFO_BLUE} setting #{g_xls_filename} (#{col},#{g_row}) = #{val}"
ExcelTools::SetCell(g_xls_filename, g_row, index+2, val)
end
g_row = g_row + 1
end
else
$stderr.puts "No data filenames passed as trailing args"
exit( 4 )
end
#-------------------------------------------------------------------------
# --- Submit changes
#-------------------------------------------------------------------------
puts "#{INFO_BLUE}Reverting unchanged files #{change_id}"
p4.run_revert( '-a', '-c', change_id.to_s, '//...')
files = p4.run_opened( '-c', change_id.to_s )
raise Exception if files.nil?
puts "#{INFO_BLUE}There are #{files.size} files to submit."
files.each do |file|
puts "#{INFO_BLUE}#{file['depotFile']} has been updated and will be submitted."
end
if ( g_enable_checkin )
if ( files.size > 0 )
puts "#{INFO_BLUE}Submitting file currently in #{change_id}"
submit_result = p4.run_submit( '-c', change_id.to_s )
puts submit_result.to_s
elsif ( 0 == files.size )
puts "#{INFO_BLUE}Deleting #{change_id} no files changed."
p4.run_change('-d', change_id.to_s)
end
else
puts "#{INFO_BLUE}Checkin is disabled the CL is pending."
end
rescue Exception => ex
puts "#{g_AppName} unhandled exception: #{ex.message}"
puts "Call stack:"
puts ex.backtrace.join( "\n\t" )
end
# update_asset_deltas.rb