Removed /usr/local from CDPATH
[clearscm.git] / Perforce / renameUser.pl
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4
5 =pod
6
7 =head1 NAME RenameUser.pl
8
9 Renames a Perforce user in Perforce
10
11 =head1 VERSION
12
13 =over
14
15 =item Author
16
17 Andrew DeFaria <Andrew@ClearSCM.com>
18
19 =item Revision
20
21 $Revision: #1 $
22
23 =item Created
24
25 Fri Oct 30 12:16:39 PDT 2015
26
27 =item Modified
28
29 $Date: $
30
31 =back
32
33 =head1 SYNOPSIS
34
35   $ RenameUser.pl [-oldusername <username> -newusername <username> |
36                   -file <filename>] [-p4port <p4port>]
37                   [-username <user>] [-password <password>]
38                   [-[no]exec]  
39                  
40                   [-verbose] [-debug] [-help] [-usage]
41
42   Where:
43
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
52
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
57
58 Note that -file is a list of whitespace separated usernames, one per line listed
59 as <oldusername> <newusername>
60
61 =head1 DESCRIPTION
62
63 This script will rename a Perforce user from -oldusername to -newusername. It
64 will also update the users email address.
65
66 =cut
67
68 use Getopt::Long;
69 use Pod::Usage;
70 use FindBin;
71
72 use lib "$FindBin::Bin/../lib";
73
74 use CMUtils;
75 use Display;
76 use Logger;
77 use Perforce;
78 use Utils;
79 use TimeUtils;
80
81 my ($p4, $log, $keys);
82
83 my %total;
84
85 my %opts = (
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)},
93 );
94
95 sub check4Dups (%) {
96   my (%users) = @_;
97   
98   my %newusers;
99   
100   for my $key (keys %users) {
101     my $value = $users{$key};
102     
103     if ($users{$value}) {
104       $log->warn ("$value exists as both a key and a value");
105     } else {
106       $newusers{$key} = $users{$key};
107     } # if
108   } # for
109   
110   return %newusers;
111 } # check4Dups
112
113 sub renameUsers (%) {
114   my (%users) = @_;
115
116   for my $olduser (keys %users) {
117     my $newuser = $users{$olduser};
118     
119     if ($opts{exec}) {
120       if ($p4->getUser ($olduser)) {
121         my $status = $p4->renameUser ($olduser, $newuser);
122       
123         unless ($status) {
124           $log->msg ("Renamed $olduser -> $newuser");
125           
126           $total{'Users renamed'}++;
127         } else {
128           $log->err ("Unable to rename $olduser -> $newuser");
129           
130           return 1;
131         } # unless
132       } else {
133         $total{'Non Perforce users'}++;
134         
135         $log->msg ("$olduser is not a Perforce user");
136         
137         next;
138       } # if
139     } else {
140       $total{'Users would be renamed'}++;
141         
142       next;
143     } # if
144
145     my %user = $p4->getUser ($newuser);
146     
147     $log->err ("Unable to retrieve user info for $newuser", 1) unless %user;
148     
149     my $email = getUserEmail ($newuser);
150     
151     if ($user{Email} ne $email) {
152       $user{Email} = $email;
153       
154       my $result = $p4->updateUser (%user);
155       
156       $log->err ("Unable to update user $newuser", 1) unless $result;
157       
158       $log->msg ("Updated ${newuser}'s email to $email");
159       
160       $total{'User email updated'}++;
161     } # if
162   } # for
163   
164   return $log->errors;
165 } # renameUsers
166
167 sub main () {
168   GetOptions (
169     \%opts,
170     'verbose',
171     'debug',
172     'usage',
173     'help',
174     'jiradbserver=s',
175     'username=s',
176     'password=s',
177     'file=s',
178     'oldusername=s',
179     'newusername=s',
180     'exec!',
181   ) or pod2usage;
182
183   $opts{debug}   = get_debug   if ref $opts{debug}   eq 'CODE';
184   $opts{verbose} = get_verbose if ref $opts{verbose} eq 'CODE';
185   
186   $log = Logger->new;
187   
188   if ($opts{username} && !$opts{password}) {
189     $opts{password} = GetPassword;
190   } # if
191
192   $p4 = Perforce->new (%opts);
193
194   my %users;
195
196   my $startTime = time;
197
198   if ($opts{oldusername} and $opts{newusername}) {
199     $opts{oldusername} = lc $opts{oldusername};
200     $opts{newusername} = lc $opts{newusername};
201     
202     $users{$opts{oldusername}} = $opts{newusername}; 
203   } elsif ($opts{file}) {
204     for (ReadFile $opts{file}) {
205       my ($olduser, $newuser) = split;
206       
207       $users{lc $olduser} = lc $newuser;
208     } # while
209   } else {
210     pod2usage "You must specify either -file or -oldname/-newname";
211   } # if
212
213   %users = check4Dups %users;
214   
215   my $status = renameUsers (%users);
216   
217   display_duration $startTime, $log;
218   
219   Stats \%total, $log;
220   
221   return $status;
222 } # main
223
224 exit main;