#!perl -w
# Copyright (C) 1997 Capella Computers Ltd.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# :FILE:
# End integration of a job.
use strict;
use English;
use P4;
# Takes (optional) job id.
sub usage {
P4::crash("Usage: p4ie [<job>]");
}
# Parse command line.
my $job;
if ($#ARGV < 0) {
$job = P4::current_job();
} elsif ($ARGV[0] eq '-h') {
usage();
} elsif ($ARGV[0] =~ /^\d+$/) {
$job = shift(@ARGV);
}
if ($#ARGV >= 0) {
usage();
}
# No need to lock - it is expected that p4ib did it for us already.
# Note that the lock is NOT released on error.
P4::verify_lock($job);
P4::verify_lock('depot');
# Obtain the job record.
my %record = P4::job_record($job);
# Verify pre-conditions.
P4::verify_job_status($job, \%record, 'integ');
P4::verify_current_user(1, 'integ');
P4::verify_job_integration_client($job, \%record, P4::current_client());
# Verify that job is ready for integration.
# Requires setting the version number in the record first.
my $version = P4::get_version() + 1;
$record{version} = $version;
P4::verify_job_ready($job, \%record);
# This helps in case something goes wrong.
$record{status} = '_clear';
P4::update_job($job, \%record);
# Submit the integration change.
my $change = $record{int_chg};
$change = P4::submit_change($change);
# Re-get all the baseline, just in case
$::OUTPUT_AUTOFLUSH = 1;
print "### Get integration files ...\n";
P4::get_files('//depot/baseline/...');
# Remove all locks held by this job.
my %locked_files = P4::locked_files();
my ($locked_file, $locking_job);
while (($locked_file, $locking_job) = each(%locked_files)) {
if ($locking_job eq $job) {
delete($locked_files{$locked_file});
}
}
P4::lock_files(\%locked_files);
# Create a version for the new baseline,
# increasing the current version number by one.
$::OUTPUT_AUTOFLUSH = 1;
print "### Create new baseline version ...\n";
P4::set_version($version);
# Create a changable version.
P4::create_version($version, $job, \%record, 0);
# Fill it with the current state of affairs.
P4::sync_version($version);
# Freeze it forever.
P4::create_version($version, $job, \%record, 1);
# It is now safe to unlock the depot.
# We are not done with the job yet, though.
P4::unlock('depot');
# Update the job record.
$record{status} = 'clear';
$record{int_chg} = $change;
$record{version} = $version;
P4::update_job($job, \%record);
# It is now safe to unlock the job.
P4::unlock($job);
# If this is different from the development host (the typical case),
# and due to the particular way we work around bug #350, we need to
# remove the local copy of the development directory. This can be done
# after unlock - if something goes wrong, the files can be removed by hand.
my $int_client = $record{int_client};
my $dev_client = $record{dev_client};
if ($int_client ne $dev_client) {
$::OUTPUT_AUTOFLUSH = 1;
my $user = $record{user};
my $retry = $record{retry};
print "### Delete copy of developement directory ...\n";
P4::get_files("//depot/$user/$job-$retry/...#none\n");
my $dir = P4::view_root() . "/$user/$job-$retry";
P4::remove_dir($dir);
}
# Notify caller.
my $user = $record{user};
my $retry = $record{retry};
print "Integration of job $job (attempt #$retry) by $user ",
"creating baseline version $version is complete.\n";
# Be nice.
1;