7 =head1 NAME RenameUser.pl
9 Renames a Perforce user in Perforce
17 Andrew DeFaria <Andrew@ClearSCM.com>
25 Fri Oct 30 12:16:39 PDT 2015
35 $ RenameUser.pl [-oldusername <username> -newusername <username> |
36 -file <filename>] [-p4port <p4port>]
37 [-username <user>] [-password <password>]
40 [-verbose] [-debug] [-help] [-usage]
44 -o|ldusername: Old username to rename
45 -ne|wusername: New username
46 -f|ile: File of usernames to process
47 (<oldusername> <newusername>)
48 -p|4port: Perforce port (Default: perforce:1666)
49 -use|rname: Username to log in as (Default: root)
50 -p|assword: Password for -username (Defaul: <root's password>)
51 -[no]e|xec: Whether or not to update the database
53 -v|erbose: Display verbose info about actions being taken
54 -d|ebug: Display debug info
55 -h|elp: Display full documentation
56 -usa|ge: Display usage
58 Note that -file is a list of whitespace separated usernames, one per line listed
59 as <oldusername> <newusername>
63 This script will rename a Perforce user from -oldusername to -newusername. It
64 will also update the users email address.
72 use lib "$FindBin::Bin/../lib";
81 my ($p4, $log, $keys);
86 p4port => $ENV{P4PORT},
87 username => $ENV{P4USER},
88 password => $ENV{P4PASSWD},
89 verbose => $ENV{VERBOSE} || sub { set_verbose },
90 debug => $ENV{DEBUG} || sub { set_debug },
91 usage => sub { pod2usage },
92 help => sub { pod2usage (-verbose => 2)},
100 for my $key (keys %users) {
101 my $value = $users{$key};
103 if ($users{$value}) {
104 $log->warn ("$value exists as both a key and a value");
106 $newusers{$key} = $users{$key};
113 sub renameUsers (%) {
116 for my $olduser (keys %users) {
117 my $newuser = $users{$olduser};
120 if ($p4->getUser ($olduser)) {
121 my $status = $p4->renameUser ($olduser, $newuser);
124 $log->msg ("Renamed $olduser -> $newuser");
126 $total{'Users renamed'}++;
128 $log->err ("Unable to rename $olduser -> $newuser");
133 $total{'Non Perforce users'}++;
135 $log->msg ("$olduser is not a Perforce user");
140 $total{'Users would be renamed'}++;
145 my %user = $p4->getUser ($newuser);
147 $log->err ("Unable to retrieve user info for $newuser", 1) unless %user;
149 my $email = getUserEmail ($newuser);
151 if ($user{Email} ne $email) {
152 $user{Email} = $email;
154 my $result = $p4->updateUser (%user);
156 $log->err ("Unable to update user $newuser", 1) unless $result;
158 $log->msg ("Updated ${newuser}'s email to $email");
160 $total{'User email updated'}++;
183 $opts{debug} = get_debug if ref $opts{debug} eq 'CODE';
184 $opts{verbose} = get_verbose if ref $opts{verbose} eq 'CODE';
188 if ($opts{username} && !$opts{password}) {
189 $opts{password} = GetPassword;
192 $p4 = Perforce->new (%opts);
196 my $startTime = time;
198 if ($opts{oldusername} and $opts{newusername}) {
199 $opts{oldusername} = lc $opts{oldusername};
200 $opts{newusername} = lc $opts{newusername};
202 $users{$opts{oldusername}} = $opts{newusername};
203 } elsif ($opts{file}) {
204 for (ReadFile $opts{file}) {
205 my ($olduser, $newuser) = split;
207 $users{lc $olduser} = lc $newuser;
210 pod2usage "You must specify either -file or -oldname/-newname";
213 %users = check4Dups %users;
215 my $status = renameUsers (%users);
217 display_duration $startTime, $log;