ClearCase-Wrapper-DSB
view release on metacpan or search on metacpan
will make them into derived objects and create a 4th DO ".WINKSET"
containing references to the others. A subsequent
ct winkin -recurse -adirs /view/extended/path/to/.WINKSET
from a different view will wink all four files into the current view.
The list of files to convert may be derived via
B<-dir/-rec/-all/-avobs>, provided in a file containing a list of files
with B<-flist>, or specified as a literal list of view-private files.
When using B<-dir/-rec/-all/-avobs> to derive the file list only the
output of C<lsprivate -other> is considered unless B<-do> is used;
B<-do> causes existing DO's to be re-converted. Use B<-do> with care as
it may convert a useful CR to a meaningless one.
The B<"-flist -"> flag can be used to read the file list from stdin,
which may be useful in a script.
=cut
sub winkout {
warn Msg('E', "this may work on &%@# Windows but I haven't tried") if MSWIN;
my %opt;
GetOptions(\%opt, qw(directory recurse all avobs flist=s
do meta=s print promote));
my $ct = ClearCase::Argv->new({-autochomp=>1, -syfail=>1});
my $dbg = Argv->dbglevel;
my $cmd = shift @ARGV;
my @list;
if (my @scope = grep /^(dir|rec|all|avo|f)/, keys %opt) {
die Msg('E', "mutually exclusive flags: @scope") if @scope > 1;
if ($opt{flist}) {
open(LIST, $opt{flist}) || die Msg('E', "$opt{flist}: $!");
@list = <LIST>;
close(LIST);
} else {
my @type = $opt{'do'} ? qw(-other -do) : qw(-other);
@list = Argv->new([$^X, '-S', $0, 'lsp'],
['-s', @type, "-$scope[0]"])->qx;
}
} else {
@list = @ARGV;
}
chomp @list;
my %set = map {$_ => 1} grep {-f}
grep {!m%\.(?:mvfs|nfs)\d+|cmake\.state%} @list;
exit 0 if ! %set;
if ($opt{'print'}) {
for (keys %set) {
print $_, "\n";
}
print $opt{meta}, "\n" if $opt{meta};
exit 0;
}
# Shared DO's should be g+w!
(my $egid = $)) =~ s%\s.*%%;
for (keys %set) {
my($mode, $uid, $gid) = (stat($_))[2,4,5];
if (!defined($mode)) {
warn Msg('W', "no such file: $_");
delete $set{$_};
next;
}
next if $uid != $> || ($mode & 0222) || ($mode & 0220 && $gid == $egid);
chmod(($mode & 07777) | 0220, $_);
}
my @dolist = sort keys %set;
# Add the -meta file to the list of DO's if specified.
if ($opt{meta}) {
if ($dbg) {
my $num = @dolist;
print STDERR "+ associating $num files with $opt{meta} ...\n";
}
open(META, ">$opt{meta}") || die Msg('E', "$opt{meta}: $!");
for (@dolist) { print META $_, "\n" }
close(META);
push(@dolist, $opt{meta});
}
# Convert regular view-privates into DO's by opening them
# under clearaudit control.
{
my $clearaudit = MSWIN ? 'clearaudit' : '/usr/atria/bin/clearaudit';
local $ENV{CLEARAUDIT_SHELL} = $^X;
my $ecmd = 'chomp; open(DO, ">>$_") || warn "Error: $_: $!\n"';
my $cmd = qq($clearaudit -n -e '$ecmd');
$cmd = "set -x; $cmd" if $dbg && !MSWIN;
open(AUDIT, "| $cmd") || die Msg('E', "$cmd: $!");
for (@dolist) {
print AUDIT $_, "\n";
print STDERR $_, "\n" if $dbg;
}
close(AUDIT) || die Msg('E', $! ?
"Error closing clearaudit pipe: $!" :
"Exit status @{[$?>>8]} from clearaudit");
}
if ($opt{promote}) {
my $scrubber = MSWIN ? 'view_scrubber' : '/usr/atria/etc/view_scrubber';
my $cmd = "$scrubber -p";
$cmd = "set -x; $cmd" if $dbg && !MSWIN;
open(SCRUBBER, "| $cmd") || die Msg('E', "$scrubber: $!");
for (@dolist) { print SCRUBBER $_, "\n" }
close(SCRUBBER) || die Msg('E', $! ?
"Error closing $scrubber pipe: $!" :
"Exit status $? from $scrubber");
}
exit 0;
}
=item * WORKON
New command, similar to I<setview> but provides hooks to cd to a
preferred I<initial working directory> within the view and to set
up any required environment variables. The I<initial working directory>
is defined as the output of B<ct catcs -start> (see).
If a file called I<.viewenv.pl> exists in the I<initial working
directory>, it's read before starting the user's shell. This file uses
Perl syntax and must end with a "1;" like any C<require-d> file. Any
( run in 3.353 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )