--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/build/buildutils/svn2change.pl Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,354 @@
+#!/bin/perl
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+# script to process one or more changes implemented via a single Synergy task importing code from an external system (e.g., Subversion or a zip file):
+# - checks that the task is in completed state
+# - associates the task to the change object
+# - (optionally) sets "external task id(s)" -attribute to a value supplied
+# - (optionally) moves the change to the next state (provided on the command line), including setting modifiable_in to integration_db
+#
+# Usage 1: If a change id is provided as argument, the script process a single change object as above
+# perl change2released.pl -user username -change "xx1xx1#23456" -task 213
+#
+# Usage 2: If an input file is provided as arguments, the script will read change ids (and optional external task ids) from the filw and
+# process all the changes listed in the file
+# with those tasks and transition the change to the target state
+#
+#
+
+my $program_name;
+BEGIN {
+ # Get the name of the program executable:
+ ($program_name) = $0 =~ m{([^/]+)$};
+}
+
+my $VERSION = do { (my $v = q%version: 1 %) =~ s/.*://; sprintf("%d.%02d", 0, split(/\./, $v)) };
+
+
+use FindBin qw($Bin $Script);
+use lib "$Bin/lib";
+
+use ChangeSynergy::csapi;
+use Getopt::Long;
+use Data::Dumper;
+
+my $username = "";
+my $password = "";
+my $crId = "";
+my $taskId = "";
+my $newState = "";
+my $protocol = "https";
+#my $host = "sachswww.nmp.nokia.com";
+my $host = "trchswww.nmp.nokia.com";
+#my $port = "58613";
+my $port = "58602";
+#my $db = "/nokia/sa_nmp/groups/gscm/dbs/sa1trqa2";
+my $db = "/nokia/tr_nmp/groups/gscm/dbs/tr1jrt";
+my $inFile = "";
+
+# read options
+my $result = GetOptions ("user=s" => \$username,
+ "password=s" => \$password,
+ "debug" => \$debug,
+ "preview" => \$preview,
+ "version" => \$show_version,
+ "protocol=s" => \$protocol,
+ "host=s" => \$host,
+ "port=s" => \$port,
+ "db=s" => \$db,
+ "in=s" => \$inFile,
+ "state=s" => \$newState,
+ "task=s" => \$taskId,
+ "change=s" => \$crId);
+
+print "$program_name ver. $VERSION\n";
+
+# Handle standard command line parameters
+if ($show_version) {
+ # Exit immediately after having printed version information
+ exit 0;
+}
+
+if (!$taskId)
+{
+ die "Error: No Task Id provided\n";
+}
+
+# Get the password from the terminal unless already provided on the command line
+unless ($password) {
+ eval {
+ require Term::ReadKey;
+ print STDERR "CIM Password for user '$username' (input will be hidden): ";
+ Term::ReadKey::ReadMode('noecho');
+ $password = Term::ReadKey::ReadLine(0);
+ Term::ReadKey::ReadMode('normal');
+ print STDERR "\n";
+ };
+ if ($@) {
+ print STDERR "Warning: Perl module Term::ReadKey not available." .
+ " Password echo cannot be switched off!\n";
+ print STDERR "CIM Password for user '$username': ";
+ $password = <STDIN>;
+ }
+ chomp $password;
+}
+
+
+print "Using $protocol://$host:$port, database $db\n";
+
+my $externalTaskAttribute = "external_task_ids";
+
+my $aUser;
+
+my $csapi = new ChangeSynergy::csapi();
+my $globals = new ChangeSynergy::Globals();
+
+sub displayCRData
+{
+ my $cr = shift;
+ my $j = $cr->getDataSize();
+ for($i=0;$i<$j;$i++)
+ {
+ print "\t" . $cr->getDataObject($i)->getName() . ": " . $cr->getDataObject($i)->getValue() . "\n";
+ }
+}
+
+sub associateTaskToChange
+{
+ my $crId = shift;
+ my $taskId = shift;
+
+ # check if the task exists
+ my $tmp = $csapi->QueryStringData($aUser, "Basic Summary", "cvtype='task' and task('$taskId\')", "task_synopsis|status|release");
+ my $j = $tmp->getDataSize();
+ if ($j)
+ {
+ my $taskData = $tmp->getDataObject(0);
+ my $taskStatus = $taskData->getDataObjectByName("status")->getValue();
+ my $taskRelease = $taskData->getDataObjectByName("release")->getValue();
+ if ($debug)
+ {
+ for($i=0;$i<$j;$i++)
+ {
+ print "\tinstance:\t" . $taskData->getDataObjectByName("instance")->getValue() . "\n";
+ print "\tstatus: \t" . "$taskStatus\n";
+ print "\trelease: \t" . "$taskRelease\n";
+ print "\tsynopsis:\t" . $taskData->getDataObjectByName("task_synopsis")->getValue() . "\n";
+ #my $j2 = $taskData->getDataSize();
+ #for($i2=0;$i2<$j2;$i2++)
+ #{
+ # print "\t" . $taskData->getDataObject($i2)->getName() . ": " . $taskData->getDataObject($i2)->getValue() . "\n";
+ #}
+ }
+ }
+
+ if ($taskStatus ne 'completed')
+ {
+ die "Error: task is not completed\n";
+ }
+
+ if (!$preview)
+ {
+ print "Associating Task \'$taskId\' to Change \'$crId\'\n";
+
+ my $result = $csapi->CreateRelation($aUser, "TRUE", $crId, $taskId, "associated_task", $globals->{CCM_PROBLEM_TASK});
+ print $result->getResponseData() . "\n";
+ }
+ else
+ {
+ print "Would associate Task \'$taskId\' to Change \'$crId\'\n";
+ }
+ }
+ else
+ {
+ die "Error: task \'$taskId\' does not exist\n";
+ }
+}
+
+# main program
+
+eval
+{
+ $csapi->setUpConnection("$protocol", "$host", "$port");
+
+ $aUser = $csapi->Login("$username", "$password", "User", "$db");
+
+ print "eval11\n";
+
+ # 1. find all the change objects to process
+
+ my @crTable = ();
+ my %extTaskIdTable = ();
+
+ my $query = "";
+ if ($crId)
+ {
+ if ($debug)
+ {
+ print "Using Change id: \"$crId\"\n";
+ }
+ push(@crTable, $crId);
+ }
+ elsif ($inFile)
+ {
+ my $fh;
+ my $extTaskId = "";
+
+ open($fh, $inFile) or die "Failed to read input file $inFile: $!\n";
+ if ($debug)
+ {
+ print "Using input file: \"$inFile\"\n";
+ }
+ while (<$fh>) {
+ chomp;
+
+ # Skip comments and blanks
+ next if (substr($_, 0, 1) eq '#' || /^\s*$/);
+
+ ($crId, $extTaskId) = split(/[\s]+/, $_);
+
+ if ($debug)
+ {
+ print "Read Change id \"$crId\"\n";
+ if ($extTaskId)
+ {
+ print "- external task id \"$extTaskId\"\n";
+ }
+ }
+ push(@crTable, $crId);
+ if ($extTaskId)
+ {
+ $extTaskIdTable{$crId} = $extTaskId;
+ }
+ }
+ }
+ else
+ {
+ die "No change id or input file provided\n";
+ }
+
+ # 2. Loop over the change objects and process them
+
+ foreach $crId (@crTable)
+ {
+ my @taskList = ();
+
+ print "Processing change: \'$crId\'\n";
+
+ # 3. find the tasks to associate with this change object
+
+ if ($taskId)
+ {
+ # use the one from the command line
+ print "Using task: \'$taskId\'\n";
+ push(@taskList, $taskId);
+ }
+
+ # 4: associate all tasks and change the state
+ # bail out on failure and move to the next CR
+ eval
+ {
+ foreach $t (@taskList)
+ {
+ print "Processing task \'$t\'\n";
+ &associateTaskToChange($crId, $t);
+ }
+
+ my $externalTaskId = $extTaskIdTable{$crId};
+
+ my $crData = $csapi->GetCRData($aUser, $crId, "crstatus|integration_db|modifiable_in|$externalTaskAttribute");
+
+ if ($newState)
+ {
+ my $crStatus = "change_" . $newState;
+
+ if (!$preview)
+ {
+ print "Transitioning Change \'$crId\' to $crStatus\n";
+ }
+ else
+ {
+ print "Would transition Change \'$crId\' to $crStatus\n";
+ }
+
+ # get the transition form
+
+ # my $crData = $csapi->GetCRData($aUser, $crId, "crstatus|integration_db|modifiable_in|$externalTaskAttribute");
+ my $tmp = $csapi->TransitionCRData($aUser, $crId, $crData->getTransitionLink(1)->getTransition());
+ if ($debug)
+ {
+ &displayCRData($tmp);
+ }
+
+ # set the status on the form
+ $tmp->getDataObjectByName("crstatus")->setValue($crStatus);
+ # $tmp->getDataObjectByName("crstatus")->setValue($cr->getTransitionLink(1)->getToState());
+
+ if (!$preview)
+ {
+ # transition the CR
+ $result = $csapi->TransitionCR($aUser, $tmp);
+ print $result->getResponseData() . "\n";
+ }
+
+ # and finally, set the modifiable in
+
+ my $integration_db = $crData->getDataObjectByName("integration_db")->getValue();
+ if (!$preview)
+ {
+ print "Setting modifiable_in to " . $integration_db . "\n";
+
+ $crData->getDataObjectByName("modifiable_in")->setValue($integration_db);
+ }
+ else
+ {
+ print "Would set modifiable_in to " . $integration_db . "\n";
+ }
+ }
+
+ if (!$preview)
+ {
+ if ($externalTaskId)
+ {
+ print "Setting $externalTaskAttribute to " . $externalTaskId . "\n";
+
+ $crData->getDataObjectByName($externalTaskAttribute)->setValue($externalTaskId);
+ }
+
+ $result = $csapi->ModifyCR($aUser, $crData);
+ print $result->getResponseData() . "\n";
+ }
+ else
+ {
+ if ($externalTaskId)
+ {
+ print "Would set $externalTaskAttribute to " . $externalTaskId . "\n";
+ }
+ }
+ };
+
+ if ($@)
+ {
+ print $@;
+ }
+ }
+};
+
+if ($@)
+{
+ print $@;
+}
+