# Task: identify groups that have obsolete 'user' entries. require "readp4marshal" require "GetOptLong" # # num of calls to 'p4': 2 # status: tested on Darwin Mac OS X using Ruby 1.8.1 # room for optimization/improvement: add getopts call # debugOption = false defaultPort = nil defaultClient = nil defaultUser = nil options = GetoptLong.new( [ '--debug', '-d', GetoptLong::OPTIONAL_ARGUMENT], [ '--user', '-u', GetoptLong::REQUIRED_ARGUMENT], [ '--client', '-c', GetoptLong::REQUIRED_ARGUMENT], [ '--port', '-p', GetoptLong::REQUIRED_ARGUMENT] ) options.each do |opt, arg| case opt when "--debug" debugOption = true when "--client" defaultClient = true when "--user" defaultUser = arg when "--port" defaultPort = arg end end p4 = P4Marshal.new("p4port" => defaultPort, "p4user" => defaultUser, "p4client" => defaultClient) userlist = {} #----------------------------------------------------------- # first call to P4: 'p4 users' #----------------------------------------------------------- userout = p4.run("users") userout.each { |u| userid = u['User'] userlist[userid] = u # save the entry } #----------------------------------------------------------- # second call to P4: 'p4 groups' (2004.2 and later output) #----------------------------------------------------------- groupsout = p4.run("groups") groupsout.each { |g| userid = g['user'] groupid = g['group'] if userlist[userid].nil? puts "User #{userid} is in group #{groupid} (invalid user)" end }