diff options
Diffstat (limited to 'solenv/bin/cws.pl')
-rw-r--r-- | solenv/bin/cws.pl | 1160 |
1 files changed, 45 insertions, 1115 deletions
diff --git a/solenv/bin/cws.pl b/solenv/bin/cws.pl index f24db23897af..439ce02e2742 100644 --- a/solenv/bin/cws.pl +++ b/solenv/bin/cws.pl @@ -56,10 +56,7 @@ use Cws; #### globals #### -# TODO: replace dummy vales with actual SVN->hg and source_config migration milestones -my $dev300_migration_milestone = 'm64'; -my $dev300_source_config_milestone = 'm65'; -my $ooo320_migration_milestone = 'm13'; +# TODO: replace dummy vales with actual source_config migration milestone my $ooo320_source_config_milestone = 'm999'; # valid command with possible abbreviations @@ -67,11 +64,8 @@ my @valid_commands = ( 'help', 'h', '?', 'create', 'fetch', 'f', - 'rebase', 'rb', 'query', 'q', 'task', 't', - 'integrate', - 'cdiff', 'cd', 'eisclone', 'setcurrent' ); @@ -80,13 +74,10 @@ my @valid_commands = ( my %valid_options_hash = ( 'help' => ['help'], 'create' => ['help', 'milestone', 'migration', 'hg'], - 'fetch' => ['help', 'switch', 'milestone', 'childworkspace','platforms','quiet', + 'fetch' => ['help', 'milestone', 'childworkspace','platforms','quiet', 'onlysolver'], - 'rebase' => ['help', 'milestone','commit'], 'query' => ['help', 'milestone','masterworkspace','childworkspace'], 'task' => ['help'], - 'integrate' => ['help', 'childworkspace'], - 'cdiff' => ['help', 'childworkspace', 'masterworkspace', 'files', 'modules'], 'setcurrent' => ['help', 'milestone'], 'eisclone' => ['help'] ); @@ -128,12 +119,9 @@ sub parse_command_line 'debug', 'profile', 'commit|C', - 'switch|s', 'platforms|p=s', 'onlysolver|o', 'quiet|q', - 'files', - 'modules', 'help|h' ); @@ -151,18 +139,12 @@ sub parse_command_line elsif ($command eq 'f') { $command = 'fetch'; } - elsif ($command eq 'rb') { - $command = 'rebase'; - } elsif ($command eq 'q') { $command = 'query'; } elsif ($command eq 't') { $command = 'task'; } - elsif ($command eq 'cd') { - $command = 'cdiff'; - } # An unkown option might be accompanied with a valid command. # Show the command specific help @@ -202,8 +184,6 @@ sub verify_options } } - # TODO here should be specific checks for the arguments - # if the check is globally valid } # Dispatches to the do_xxx() routines depending on command. @@ -259,66 +239,6 @@ BEGIN { } } -# Fetches milestone URL for given server and milestone. -sub get_milestone_url -{ - my $server = shift; - my $master = shift; - my $milestone = shift; - - my $milestone_url = "$server/tags/${master}_${milestone}"; - return $milestone_url; -} - -# Fetches CWS URL for given server and CWSname. -sub get_cws_url -{ - my $server = shift; - my $cws = shift; - - my $cws_url = "$server/cws/$cws"; - return $cws_url; -} - -sub get_master_url -{ - my $server = shift; - my $master = shift; - my $revision = shift; - - my $url = "${server}/"; - - # TODO: update EIS function for subversion - my $cws = get_this_cws(); - my $trunk = $cws->get_cvs_head(); - if ( $master eq $trunk ) { - $url .= 'trunk'; - } - else { - my $master_label = uc($master); - $url .= "branches/$master_label"; - } - - # attach revision if needed - if ( $revision != 0 ) { - $url .= "\@$revision"; - } - return $url; -} - -# Returns the URL shortened by the server part -sub get_short_url -{ - my $server = shift; - my $url = shift; - - my $offset = length("$server/"); - $url = substr($url, $offset); - - return $url; -} - - # Fetches the current CWS from environment, returns a Cws object sub get_cws_from_environment { @@ -849,11 +769,11 @@ sub query_latest if ( $latest ) { print_message("Master workspace '$masterws':"); - print_message("Latest milestone available for rebase:"); + print_message("Latest milestone available for update:"); print "$masterws $latest\n"; } else { - print_error("Can't determine latest milestone of '$masterws' available for rebase.", 3); + print_error("Can't determine latest milestone of '$masterws' available for update.", 3); } return; @@ -1420,106 +1340,6 @@ sub update_solver } } -sub write_rebase_configuration -{ - my $workspace = shift; - my $cwsname = shift; - my $master = shift; - my $milestone = shift; - - my $rebase_config = "$workspace/REBASE.CONFIG_DONT_DELETE"; - - open(REBASE, ">$rebase_config") or print_error("Can't open file '$rebase_config' for writing: $!", 98); - print REBASE "CWS-TOOLING: do not delete this file, it's needed for 'cws rebase -C'\n"; - print REBASE "CWS: $cwsname\n"; - print REBASE "New MWS: $master\n"; - print REBASE "New milestone: $milestone\n"; - close(REBASE); -} - -sub read_rebase_configuration -{ - my $workspace = shift; - - my $rebase_config = "$workspace/REBASE.CONFIG_DONT_DELETE"; - - my $master; - my $milestone; - - open(REBASE, "<$rebase_config") or print_error("Can't open file '$rebase_config' for reading: $!", 98); - while(<REBASE>) { - if ( /New MWS: (\w+)/ ) { - $master = $1; - } - if ( /New milestone: (\w+)/ ) { - $milestone = $1; - } - } - close(REBASE); - - if ( !defined($master) || !defined($milestone) ) { - print_error("File '$rebase_config' seems to be garbled. Can't continue.", 98) - } - - return ($master, $milestone); -} - -sub diff_print_files -{ - my $files_ref = shift; - my $diff_options = shift; - - my @files = sort(@{$files_ref}); - - if ( $diff_options eq 'files') { - foreach(@files) { - print "$_\n"; - } - } - else { - my @modules; - foreach(@files) { - my ($module) = split(/\//, $_); - push(@modules, $module); - } - # remove adjacent uniques - my $prev = 'nosuchmodule'; - my @unique_modules = grep($_ ne $prev && (($prev) = $_), @modules); - foreach(@unique_modules) { - print "$_\n"; - } - } -} - -# TODO: special provisions for SVN->HG migrations, remove this -# some time after migration -sub get_scm_for_milestone -{ - my $masterws = shift; - my $milestone = shift; - - my $milestone_sequence_number = extract_milestone_sequence_number($milestone); - my $dev300_migration_sequence_number = extract_milestone_sequence_number($dev300_migration_milestone); - my $ooo320_migration_sequence_number = extract_milestone_sequence_number($ooo320_migration_milestone); - - my $scm = 'SVN'; - - if ( $masterws eq 'DEV300' ) { - if ( $milestone_sequence_number >= $dev300_migration_sequence_number ) { - $scm = 'HG'; - } - } - elsif ( $masterws eq 'OOO320' ) { - if ( $milestone_sequence_number >= $ooo320_migration_sequence_number ) { - $scm = 'HG'; - } - } - else { - $scm = 'SVN'; - } - return $scm; -} - # TODO: special provisions for "source_config" migration, remove this # some time after migration sub get_source_config_for_milestone @@ -1528,24 +1348,14 @@ sub get_source_config_for_milestone my $milestone = shift; my $milestone_sequence_number = extract_milestone_sequence_number($milestone); - my $dev300_migration_sequence_number = extract_milestone_sequence_number($dev300_source_config_milestone); my $ooo320_migration_sequence_number = extract_milestone_sequence_number($ooo320_source_config_milestone); - my $source_config = 0; - - if ( $masterws eq 'DEV300' ) { - if ( $milestone_sequence_number >= $dev300_migration_sequence_number ) { - $source_config = 1; - } - } - elsif ( $masterws eq 'OOO320' ) { - if ( $milestone_sequence_number >= $ooo320_migration_sequence_number ) { - $source_config = '1'; + my $source_config = 1; + if ( $masterws eq 'OOO320' ) { + if ( $milestone_sequence_number < $ooo320_migration_sequence_number ) { + $source_config = 0; } } - else { - $source_config = 0; - } return $source_config; } @@ -1577,12 +1387,9 @@ sub do_help print STDERR "\thelp (h,?)\n"; print STDERR "\tcreate\n"; print STDERR "\tfetch (f)\n"; - print STDERR "\trebase (rb) (SVN only)\n"; print STDERR "\tquery (q)\n"; print STDERR "\ttask (t)\n"; - print STDERR "\tcdiff (cd) (SVN only)\n"; print STDERR "\tsetcurrent\n"; - print STDERR "\tintegrate *** release engineers only ***\n"; print STDERR "\teisclone *** release engineers only ***\n"; } @@ -1594,13 +1401,10 @@ sub do_help } elsif ($arg eq 'create') { print STDERR "create: Create a new child workspace\n"; - print STDERR "usage: create [--hg] [-m milestone] <master workspace> <child workspace>\n"; + print STDERR "usage: create [-m milestone] <master workspace> <child workspace>\n"; print STDERR "\t-m milestone: Milestone to base the child workspace on. If ommitted the\n"; print STDERR "\t last published milestone will be used.\n"; print STDERR "\t--milestone milestone: Same as -m milestone.\n"; - print STDERR "\t--hg: Create Mercurial (hg) based CWS.\n"; - print STDERR "\t--migration: Used only for the migration of an exitisting CWS from CVS to SVN.\n"; - print STDERR "\t Disables existence check in EIS, creates CWS branch in SVN, sets SVN flag.\n"; } elsif ($arg eq 'task') { print STDERR "task: Add a task to a child workspace\n"; @@ -1651,18 +1455,16 @@ sub do_help } elsif ($arg eq 'fetch') { print STDERR "fetch: fetch a milestone or CWS\n"; - print STDERR "usage: fetch [-q] [-s] [-p platforms] [-o] <-m milestone> <workspace>\n"; - print STDERR "usage: fetch [-q] [-s] [-p platforms] [-o] <-c cws> <workspace>\n"; - print STDERR "usage: fetch [-q] [-s] <-m milestone> <workspace>\n"; - print STDERR "usage: fetch [-q] [-s] <-c cws> <workspace>\n"; + print STDERR "usage: fetch [-q] [-p platforms] [-o] <-m milestone> <workspace>\n"; + print STDERR "usage: fetch [-q] [-p platforms] [-o] <-c cws> <workspace>\n"; + print STDERR "usage: fetch [-q] <-m milestone> <workspace>\n"; + print STDERR "usage: fetch [-q] <-c cws> <workspace>\n"; print STDERR "\t-m milestone: Checkout milestone <milestone> to workspace <workspace>\n"; print STDERR "\t Use 'latest' for the for lastest published milestone on the current master\n"; print STDERR "\t For cross master checkouts use the form <MWS>:<milestone>\n"; print STDERR "\t--milestone milestone: Same as -m milestone\n"; print STDERR "\t-c childworkspace: Checkout CWS <childworkspace> to workspace <workspace>\n"; print STDERR "\t--child childworkspace: Same as -c childworkspace\n"; - print STDERR "\t-s: Try to switch an existing workspace <workspace> to milestone or CWS\n"; - print STDERR "\t--switch: Same as -s\n"; print STDERR "\t-p platform: Copy one or more prebuilt platforms 'platform'. \n"; print STDERR "\t Separate multiple platforms with commas.\n"; print STDERR "\t--platforms platform: Same as -p\n"; @@ -1671,36 +1473,6 @@ sub do_help print STDERR "\t-q Silence some of the output of the command.\n"; print STDERR "\t--quiet: Same as -q\n"; } - elsif ($arg eq 'rebase') { - print STDERR "rebase: Rebase a child workspace to a new milestone (SVN only)\n"; - print STDERR "usage: rebase <-m milestone> <workspace>\n"; - print STDERR "usage: rebase <-C> <workspace>\n"; - print STDERR "\t-m milestone: Merge changes on MWS into CWS up to and including milestone <milestone>\n"; - print STDERR "\t Use 'latest' for the for lastest published milestone on the current master\n"; - print STDERR "\t For cross master rebases use the form <MWS>:<milestone>\n"; - print STDERR "\t--milestone milestone: Same as -m milestone\n"; - print STDERR "\t-C: Commit changes made by merge step and update current milestone in database\n"; - print STDERR "\t--commit: Same as -C\n" - } - elsif ($arg eq 'integrate') { - print STDERR "integrate: Integrate a child workspace into a master workspace\n"; - print STDERR "usage: integrate <-c childworkspace>\n"; - print STDERR "usage: integrate <-C>\n"; - print STDERR "\t-c childworkspace: Merge changes on CWS <childworkspace> into MWS\n"; - print STDERR "\t--child childworkspace: Same as -c childworkspace\n"; - print STDERR "\t-C: Commit changes made by merge step and update CWS status in database\n"; - print STDERR "\t--commit: Same as -C\n" - } - elsif ($arg eq 'cdiff') { - print STDERR "cdiff: Show changes on CWS relative to current milestone (SVN only)\n"; - print STDERR "usage: cdiff [-M master] [-c child] [--files] [--modules]\n"; - print STDERR "\t-M master:\t\toverride MWS specified in environment\n"; - print STDERR "\t-c child:\t\toverride CWS specified in environment\n"; - print STDERR "\t--master master:\tSame as -M master\t\n"; - print STDERR "\t--child child:\t\tSame -c child\n"; - print STDERR "\t--files: Print only file names\n"; - print STDERR "\t--modules: Print only top level directories aka modules\n" - } elsif ($arg eq 'setcurrent') { print STDERR "setcurrent: Set the current milestone for the CWS (only hg based CWSs)\n"; print STDERR "usage: setcurrent [-m milestone]\n"; @@ -1726,14 +1498,8 @@ sub do_create do_help(['create']); } - my $is_migration = 0; - if ( exists $options_ref->{'migration'} ) { - $is_migration = 1; - } - - my $is_hg = 0; if ( exists $options_ref->{'hg'} ) { - $is_hg = 1; + print_warning("All childworkspaces are now hosted on Mercurial. The switch --hg is obsolete."); } my $master = uc $args_ref->[0]; @@ -1765,12 +1531,7 @@ sub do_create $is_promotion++; } else { - if ( $is_migration ) { - print_message("Create CWS branch in Subversion for migrating CWS '$cws_name' from CVS."); - } - else { - print_error("Child workspace '$cws_name' already exists.", 7); - } + print_error("Child workspace '$cws_name' already exists.", 7); } } else { @@ -1796,332 +1557,11 @@ sub do_create # set milestone $cws->milestone($milestone); - # handle mercurial(hg) based CWSs - if ( $is_hg ) { - register_child_workspace($cws, 'hg', $is_promotion); - return; - } - - # Refuse to create Subversion hosted cildworkspaces after - # migration milestone - my $milestone_scm = get_scm_for_milestone($cws->master(), $cws->milestone()); - if ( $milestone_scm eq 'HG' ) { - print_error("This code line has been migrated to Mercurial.", 0); - print_error("Please use the '--hg' option to create a Mercurial hosted CWS.", 8); - } - - my $config = CwsConfig->new(); - my $ooo_svn_server = $config->get_ooo_svn_server(); - my $so_svn_server = $config->get_so_svn_server(); - - if (!defined($ooo_svn_server)) { - print_error("No OpenOffice.org SVN server defined, please check your configuration file.", 8); - } - - my $ooo_milestone_url = get_milestone_url($ooo_svn_server, $cws->master(), $milestone); - my $ooo_cws_url = get_cws_url($ooo_svn_server, $cws_name); - - my $so_milestone_url; - my $so_cws_url; - if ( defined($so_svn_server) ) { - $so_milestone_url = get_milestone_url($so_svn_server, $cws->master(), $milestone); - $so_cws_url = get_cws_url($so_svn_server, $cws_name); - } - - # There is a slight chance that the cws creation was interrupted before registration before. - # Check for potential remains in the repository - my $ooo_path_exists = 0; - my $so_path_exists = 0; - - print STDERR "... check cws path:\t'$ooo_cws_url'"; - if ( svn_path_exists($ooo_cws_url) ) { - $ooo_path_exists=1; - print STDERR "\n"; - } - else { - print STDERR ", OK\n"; - } - - if ( defined($so_svn_server) ) { - print STDERR "... check cws path:\t'$so_cws_url'"; - if ( svn_path_exists($so_cws_url) ) { - print STDERR "\n"; - $so_path_exists = 1; - } - else { - print STDERR ", OK\n"; - } - } - - if ( $ooo_path_exists ) { - print_error("SVN path '$ooo_cws_url' already exists.\nThis can happen if a previous CWS creation attempt failed before registering the CWS with EIS.\nIf this is the case, please delete the path with:\n\t svn delete -m'CWS-TOOLING: undo broken CWS creation' $ooo_cws_url\n", 0); - } - - if ( $so_path_exists ) { - print_error("SVN path '$so_cws_url' already exists.\nThis can happen if a previous CWS creation attempt failed before registering the CWS with EIS.\nIf this is the case, please delete the path with:\n\t svn delete -m'CWS-TOOLING: undo broken CWS creation' $so_cws_url\n", 0); - } + register_child_workspace($cws, 'hg', $is_promotion); - if ( $ooo_path_exists || $so_path_exists ) { - exit(15); - } - - # determine the revision from which the milestone was copied - my $ooo_milestone_revision; - my $so_milestone_revision; - - $ooo_milestone_revision = svn_milestone_revision($ooo_milestone_url); - if ( !$ooo_milestone_revision ) { - print_error("Can't retrieve revision for milestone '$milestone', url '$ooo_milestone_url.", 17 ); - } - if ( defined($so_svn_server) ) { - $so_milestone_revision = svn_milestone_revision($so_milestone_url); - if ( !$so_milestone_revision ) { - print_error("Can't retrieve revision for milestone '$milestone', url '$so_milestone_url.", 17 ); - } - } - - my $ooo_master_url; - my $so_master_url; - - $ooo_master_url = get_master_url($ooo_svn_server, $cws->master(), $ooo_milestone_revision); - if ( defined($so_svn_server) ) { - $so_master_url = get_master_url($so_svn_server, $cws->master(), $so_milestone_revision); - } - - my $ooo_short_url = get_short_url($ooo_svn_server, $ooo_master_url); - my $ooo_creation_comment = "CWS-TOOLING: create CWS " . $cws->child() . " from $ooo_short_url (milestone: " . $cws->master() . ":$milestone)"; - # create branches an ooo server and an optional so server - print STDERR "... create branch:\t'$ooo_cws_url'"; - svn_copy($ooo_creation_comment, $ooo_master_url, $ooo_cws_url); - if ( defined($so_svn_server) ) { - my $so_short_url = get_short_url($so_svn_server, $so_master_url); - my $so_creation_comment = "CWS-TOOLING: create CWS " . $cws->child() . " from $so_short_url (milestone: " . $cws->master() . ":$milestone)"; - print STDERR "... create branch:\t'$so_cws_url'"; - svn_copy($so_creation_comment, $so_master_url, $so_cws_url); - } - - if ( $is_migration ) { - # Set master and milestone - $cws->master($master); - $cws->milestone($milestone); - my $rc = $cws->set_subversion_flag(1); - if ( !$rc ) { - print_error("Failed to set subversion flag on child workspace '$cws_name'.\nContact EIS administrator!\n", 12); - } - } - else { - register_child_workspace($cws, 'svn', $is_promotion); - } return; } -sub do_rebase -{ - my $args_ref = shift; - my $options_ref = shift; - - my $commit_phase = 0; - my $milestone; - - # TODO: Switching to a new master dooes work not correctly yet - - if (exists $options_ref->{'help'} || @{$args_ref} != 1) { - do_help(['rebase']); - } - if ( exists($options_ref->{'commit'}) && exists($options_ref->{'milestone'}) ) { - print_error("Option -m (--milestone) and -C (--commit) are mutually exclusive.", 0 ); - do_help(['rebase']); - } - if ( !exists($options_ref->{'commit'}) && !exists($options_ref->{'milestone'}) ) { - print_error("At least one of the options -m (--milestone) or -C (--commit) are required.", 0 ); - do_help(['rebase']); - } - - if ( !svn_version_check() ) { - print_error("cws rebase requires svn-1.5.4 or later (merge tracking and bug fixes). Please upgrade your svn client.", 1); - } - - my $cws = get_cws_from_environment(); - - my $old_masterws = $cws->master(); - my $new_masterws; - my $new_milestone; - - my $workspace = $args_ref->[0]; - - if ( ! -d $workspace ) { - print_error("Can't find workspace '$workspace': $!", 99); - } - - if ( exists($options_ref->{'commit'}) ) { - $commit_phase=1; - ($new_masterws, $new_milestone) = read_rebase_configuration($workspace); - } - elsif( exists($options_ref->{'milestone'}) ) { - $milestone = $options_ref->{'milestone'}; - if ( $milestone eq 'latest' ) { - my $latest = $cws->get_current_milestone($old_masterws); - - if ( !$latest ) { - print_error("Can't determine latest milestone of '$old_masterws' available for rebase.", 22); - } - $new_masterws = $old_masterws; - $new_milestone = $latest; - } - else { - ($new_masterws, $new_milestone) = verify_milestone($cws, $milestone); - } - } - else { - do_help(['rebase']); - } - - if ( $cws->get_scm() eq 'HG' ) { - my $child = $cws->child(); - print_error("cws rebase is not supported for mercurial based childworkspaces", 0); - print_error("re-synchronize your CWS with:", 0); - print_error("hg pull <master>", 0); - print_error("hg merge", 0); - print_error("hg commit -m\"$child: merge with $new_masterws $new_milestone\"", 0); - print_error("and update EIS with:", 0); - print_error("cws setcurrent -m $new_milestone", 99); - } - - my $so_setup = 0; - my $ooo_path; - my $so_path; - # Determine if we got a three directory (so) setup or a plain (ooo) setup. - # This is only needed as long the build system still relies - # on having "modules" from different repositories in the same - # directory besides each other. - if ( -d "$workspace/$old_masterws/sun" ) { - $so_setup = 1; - $ooo_path = "$workspace/$old_masterws/ooo"; - $so_path = "$workspace/$old_masterws/sun"; - } - else { - $ooo_path = "$workspace"; - } - - my $config = CwsConfig->new(); - my $ooo_svn_server = $config->get_ooo_svn_server(); - my $so_svn_server = $config->get_so_svn_server(); - - if (!defined($ooo_svn_server)) { - print_error("No OpenOffice.org SVN server defined, please check your configuration file.", 8); - } - - my $ooo_milestone_url = get_milestone_url($ooo_svn_server, $new_masterws, $new_milestone); - my $ooo_cws_url = get_cws_url($ooo_svn_server, $cws->child()); - - my $so_milestone_url; - my $so_cws_url; - if ( $so_setup ) { - $so_milestone_url = get_milestone_url($so_svn_server, $new_masterws, $new_milestone); - $so_cws_url = get_cws_url($so_svn_server, $cws->child()); - } - - my $ooo_milestone_revision; - my $so_milestone_revision; - - $ooo_milestone_revision = svn_milestone_revision($ooo_milestone_url); - if ( !$ooo_milestone_revision ) { - print_error("Can't retrieve revision for milestone '$new_milestone', url '$ooo_milestone_url.", 17 ); - } - if ( defined($so_svn_server) ) { - $so_milestone_revision = svn_milestone_revision($so_milestone_url); - if ( !$so_milestone_revision ) { - print_error("Can't retrieve revision for milestone '$new_milestone', url '$so_milestone_url.", 17 ); - } - } - - my $ooo_master_url; - my $so_master_url; - - $ooo_master_url = get_master_url($ooo_svn_server, $new_masterws, $ooo_milestone_revision); - if ( defined($so_svn_server) ) { - $so_master_url = get_master_url($so_svn_server, $new_masterws, $so_milestone_revision); - } - - if ( $commit_phase ) { - # commit - print_message("... committing merged changes to workspace '$workspace'."); - my $ooo_short_url = get_short_url($ooo_svn_server, $ooo_master_url); - my $commit_message = "CWS-TOOLING: rebase CWS " . $cws->child() . " to $ooo_short_url (milestone: " . $new_masterws . ":$new_milestone)"; - svn_commit($ooo_path, $commit_message); - if ( $so_setup ) { - my $so_short_url = get_short_url($so_svn_server, $so_master_url); - $commit_message = "CWS-TOOLING: rebase CWS " . $cws->child() . " to $so_short_url (milestone: " . $new_masterws . ":$new_milestone)"; - svn_commit($so_path, $commit_message); - } - if ( $so_setup) { - print_message("... rename '$workspace/$old_masterws' -> '$workspace/$new_masterws'\n"); - if ( !rename("$workspace/$old_masterws", "$workspace/$new_masterws") ) { - print_error("Can't rename '$workspace/$old_masterws' -> '$workspace/$new_masterws': $!", 98); - } - print_message("... relinking workspace\n"); - relink_workspace("$workspace/$new_masterws/src.$new_milestone", 1); - if ( !unlink("$workspace/REBASE.CONFIG_DONT_DELETE") ) { - print_error("Can't unlink '$workspace/REBASE.CONFIG_DONT_DELETE': $!", 0); - } - - } - - print_message("... updating EIS database"); - my $push_return = $cws->set_master_and_milestone($new_masterws, $new_milestone); - # sanity check - if ( $$push_return[1] ne $new_milestone) { - print_error("Couldn't push new milestone '$new_milestone' to database", 0); - } - } - else { - # merge phase - - # check if working directory is switched to the right cws branch - my $ooo_wc_url; - my $so_wc_url; - my $cwsname = $cws->child(); - print_message("... verifying if workspace '$workspace' is switched to CWS '$cwsname'."); - $ooo_wc_url = svn_wc_url($ooo_path); - if ( $ooo_wc_url !~ /\/$cwsname$/ ) { - print_error("Your working copy '$ooo_path' is not switched to the cws branch.\nPlease fix and restart rebasing.", 24); - } - if ( $so_setup ) { - $so_wc_url = svn_wc_url($so_path); - - if ( $so_wc_url !~ /\/$cwsname$/ ) { - print_error("Your working copy '$so_path' is not switched to the cws branch.\nPlease fix and restart rebasing.", 24); - } - } - # check for mixed revisions, locally modified files etc - if ( !svn_wc_is_clean($ooo_path) || ($so_setup && !svn_wc_is_clean($so_path)) ) { - print_error("Please fix and restart rebasing.", 25); - } - - print_message("... merging changes up to '$new_masterws:$new_milestone' to workspace '$workspace'."); - svn_merge($ooo_milestone_url, $ooo_path); - if ( $so_setup ) { - svn_merge($so_milestone_url, $so_path); - } - # write out the rebase configuration to store new milestone and master information - write_rebase_configuration($workspace, $cwsname, $new_masterws, $new_milestone); - } -} - -sub do_integrate -{ - my $args_ref = shift; - my $options_ref = shift; - - if (exists $options_ref->{'help'} || @{$args_ref} > 0) { - do_help(['integrate']); - } - if ( exists($options_ref->{'commit'}) && exists($options_ref->{'childworkspace'}) ) { - print_error("Option -c (--child) and -C (--commit) are mutually exclusive.", 0 ); - do_help(['integrate']); - } -} - # Executes the fetch command. sub do_fetch { @@ -2150,11 +1590,6 @@ sub do_fetch do_help(['fetch']); } - if ( defined($platforms) && $switch ) { - print_error("Option '-p' is not usuable with Option '-s'.", 0); - do_help(['fetch']); - } - if ( $onlysolver && !defined($platforms) ) { print_error("Option '-o' is Only usuable combination with option '-p'.", 0); do_help(['fetch']); @@ -2167,7 +1602,6 @@ sub do_fetch } $cws->master($masterws); my $milestone; - my $scm; if( defined($milestone_opt) ) { if ( $milestone_opt eq 'latest' ) { $cws->master($masterws); @@ -2181,29 +1615,19 @@ sub do_fetch else { ($masterws, $milestone) = verify_milestone($cws, $milestone_opt); } - $scm = get_scm_for_milestone($masterws, $milestone); } elsif ( defined($child) ) { $cws = get_cws_by_name($child); $masterws = $cws->master(); # CWS can have another master than specified in ENV $milestone = $cws->milestone(); - $scm = $cws->get_scm(); } else { do_help(['fetch']); } - if ( $switch && $scm eq 'HG' ) { - print_error("Option '-s' is not supported with a hg based CWS.", 0); - do_help(['fetch']); - } - - if ( $debug ) { - print STDERR "CWS-DEBUG: SCM: $scm\n"; - } - my $config = CwsConfig->new(); - my $ooo_svn_server = $config->get_ooo_svn_server(); + # $so_svn_server is still required to determine if we are in SO environment + # TODO: change this configuration setting to something more meaningful my $so_svn_server = $config->get_so_svn_server(); my $prebuild_dir = $config->get_prebuild_binaries_location(); my $external_tarball_source = $prebuild_dir; @@ -2262,111 +1686,43 @@ sub do_fetch my $workspace = $args_ref->[0]; if ( !$onlysolver ) { - my $url_suffix = $milestone_opt ? ("/tags/$masterws" . "_$milestone") : ('/cws/' . $cwsname); - if ( $switch ) { - # check if to be switched working copy exist or bail out - if ( ! -d $workspace ) { - print_error("Can't open workspace '$workspace': $!", 21); - } - - my $so_setup = 0; - my $ooo_path; - my $so_path; - # Determine if we got a three directory (so) setup or a plain (ooo) setup. - # This is only needed as long the build system still relies - # on having "modules" from different repositories in the same - # directory besides each other. - if ( -d "$workspace/$masterws/sun" ) { - $so_setup = 1; - $ooo_path = "$workspace/$masterws/ooo"; - $so_path = "$workspace/$masterws/sun"; - } - else { - $ooo_path = "$workspace"; - } - - # get the working copy URLs - my $ooo_new_url = svn_wc_root($ooo_path) . $url_suffix; - my $so_new_url; - if ( $so_setup ) { - $so_new_url = svn_wc_root($so_path) . $url_suffix; - } - - print_message("... switching '$ooo_path' to URL '$ooo_new_url'"); - svn_switch($ooo_path, $ooo_new_url, $quiet); - # switch working copies - if ( $so_setup ) { - print_message("... switching '$so_path' to URL '$so_new_url'"); - svn_switch($so_path, $so_new_url, $quiet); - } - - if ( $so_setup ) { - relink_workspace("$workspace/$masterws/$linkdir", 0); - } + if ( -e $workspace ) { + print_error("File or directory '$workspace' already exists.", 8); } - else { - if (!defined($ooo_svn_server)) { - print_error("No OpenOffice.org SVN server defined, please check your configuration file.", 8); - } - my $ooo_url = $ooo_svn_server . $url_suffix; - if ( -e $workspace ) { - print_error("File or directory '$workspace' already exists.", 8); + my $clone_milestone_only = $milestone_opt ? $milestone : 0; + if ( defined($so_svn_server) ) { + if ( !mkdir($workspace) ) { + print_error("Can't create directory '$workspace': $!.", 8); } - - if ( !(($scm eq 'SVN') || ($scm eq 'HG')) ) { - print_error("Unsupported SCM '$scm'.", 8); + my $work_master = "$workspace/$masterws"; + if ( !mkdir($work_master) ) { + print_error("Can't create directory '$work_master': $!.", 8); } - - my $clone_milestone_only = $milestone_opt ? $milestone : 0; - if ( defined($so_svn_server) ) { - if ( !mkdir($workspace) ) { - print_error("Can't create directory '$workspace': $!.", 8); - } - my $work_master = "$workspace/$masterws"; - if ( !mkdir($work_master) ) { - print_error("Can't create directory '$work_master': $!.", 8); - } - if ( $scm eq 'SVN' ) { - print_message("... checkout '$ooo_url' to '$work_master/ooo'"); - svn_checkout($ooo_url, "$work_master/ooo", $quiet); - my $so_url = $so_svn_server . $url_suffix; - print_message("... checkout '$so_url' to '$work_master/sun'"); - svn_checkout($so_url, "$work_master/sun", $quiet); - } - else{ - hg_clone_cws_or_milestone('ooo', $cws, "$work_master/ooo", $clone_milestone_only); - hg_clone_cws_or_milestone('so', $cws, "$work_master/sun", $clone_milestone_only); - } - if ( get_source_config_for_milestone($masterws, $milestone) ) { - # write source_config file - my $source_config_file = "$work_master/source_config"; - if ( !open(SOURCE_CONFIG, ">$source_config_file") ) { - print_error("Can't create source_config file '$source_config_file': $!.", 8); - } - print SOURCE_CONFIG "[repositories]\n"; - print SOURCE_CONFIG "ooo=active\n"; - print SOURCE_CONFIG "sun=active\n"; - close(SOURCE_CONFIG); - } - else { - my $linkdir = "$work_master/src.$milestone"; - if ( !mkdir($linkdir) ) { - print_error("Can't create directory '$linkdir': $!.", 8); - } - relink_workspace($linkdir); + hg_clone_cws_or_milestone('ooo', $cws, "$work_master/ooo", $clone_milestone_only); + hg_clone_cws_or_milestone('so', $cws, "$work_master/sun", $clone_milestone_only); + if ( get_source_config_for_milestone($masterws, $milestone) ) { + # write source_config file + my $source_config_file = "$work_master/source_config"; + if ( !open(SOURCE_CONFIG, ">$source_config_file") ) { + print_error("Can't create source_config file '$source_config_file': $!.", 8); } + print SOURCE_CONFIG "[repositories]\n"; + print SOURCE_CONFIG "ooo=active\n"; + print SOURCE_CONFIG "sun=active\n"; + close(SOURCE_CONFIG); } else { - if ( $scm eq 'SVN' ) { - print_message("... checkout '$ooo_url' to '$workspace'"); - svn_checkout($ooo_url, $workspace, $quiet); - } - else { - hg_clone_cws_or_milestone('ooo', $cws, $workspace, $clone_milestone_only); + my $linkdir = "$work_master/src.$milestone"; + if ( !mkdir($linkdir) ) { + print_error("Can't create directory '$linkdir': $!.", 8); } + relink_workspace($linkdir); } } + else { + hg_clone_cws_or_milestone('ooo', $cws, $workspace, $clone_milestone_only); + } } if ( !$onlysolver && defined($external_tarball_source) ) { @@ -2516,91 +1872,6 @@ sub do_task return; } -sub do_cdiff -{ - my $args_ref = shift; - my $options_ref = shift; - - if ( exists $options_ref->{'help'} || @{$args_ref} != 0) { - do_help(['cdiff']); - } - - my $files = exists $options_ref->{'files'} ? 1 : 0; - my $modules = exists $options_ref->{'modules'} ? 1 : 0; - - if ( $files && $modules ) { - print_error("Options --files and --modules are mutally exclusive", 0); - do_help(['cdiff']); - } - - my $diff_option; - if ( $files ) { - $diff_option = 'files'; - } - elsif ( $modules ) { - $diff_option = 'modules'; - } - else { - $diff_option = 0; - } - - - my $masterws = exists $options_ref->{'masterworkspace'} ? uc($options_ref->{'masterworkspace'}) : $ENV{WORK_STAMP}; - my $childws = exists $options_ref->{'childworkspace'} ? $options_ref->{'childworkspace'} : $ENV{CWS_WORK_STAMP}; - - if ( !defined($masterws) ) { - print_error("Can't determine master workspace environment.\n", 30); - } - - if ( !defined($childws) ) { - print_error("Can't determine child workspace environment.\n", 30); - } - - my $cws = Cws->new(); - $cws->child($childws); - $cws->master($masterws); - - if ( !is_valid_cws($cws) ) { - print_error("'$childws' is not a valid CWS name.\n", 30); - } - - if ( $cws->get_scm() eq 'HG' ) { - print_error("cws cdiff is not supported for mercurial based childworkspaces", 80); - } - my $milestone = $cws->milestone(); - - my $config = CwsConfig->new(); - my $ooo_svn_server = $config->get_ooo_svn_server(); - my $so_svn_server = $config->get_so_svn_server(); - - my $ooo_milestone_url = get_milestone_url($ooo_svn_server, $masterws, $milestone); - my $ooo_cws_url = get_cws_url($ooo_svn_server, $childws); - my $ooo_files; - if ( $diff_option ) { - $ooo_files = svn_diff($ooo_milestone_url, $ooo_cws_url, $diff_option); - diff_print_files($ooo_files, $diff_option); - } - else { - svn_diff($ooo_milestone_url, $ooo_cws_url, 0); - } - - my $so_files; - if ( $so_svn_server ) { - my $so_milestone_url = get_milestone_url($so_svn_server, $masterws, $milestone); - my $so_cws_url = get_cws_url($so_svn_server, $childws); - if ( svn_path_exists($so_cws_url) ) { - if ( $diff_option ) { - $so_files = svn_diff($so_milestone_url, $so_cws_url, $diff_option); - diff_print_files($so_files, $diff_option); - } - else { - svn_diff($so_milestone_url, $so_cws_url, 0); - } - } - } - -} - sub do_setcurrent { my $args_ref = shift; @@ -2685,347 +1956,6 @@ sub usage print STDERR "Type 'cws help' for usage.\n"; } -### SVN glue ### - -# TODO: is it a better idea to use the SVN bindings? -# pro: -# - SVN make guarantees about API stability but no about the command line -# - finer access to the SVN functionality, better error reporting -# - prevents parsing errors due to localized SVN messages -# con: -# - the bindings are difficult to install, mostly due to subtle install bugs -# - we do not really use much of the SVN functionality here - -sub svn_wc_is_clean -{ - my $wc_path = shift; - - my $result = execute_svnversion_command($wc_path); - - my $error = 0; - - if ( $result =~ /:/ ) { - print_error("Working copy '$wc_path' contains mixed revisions. Please run 'svn update'!", 0); - $error++; - } - if ( $result =~ /M/ ) { - print_error("Working copy '$wc_path' contains locally modified files. Please commit or revert all modified files.", 0); - $error++; - } - if ( $result =~ /S/ ) { - print_error("Working copy '$wc_path' is partially switched. The whole working copy needs to be switched to the CWS branch.", 0); - $error++; - } - if ( $result =~ /P/ ) { - print_error("Working copy '$wc_path' is only partially checked out. CWS tools can't work on partially checked out working copies.", 0); - $error++; - } - - return !$error; -} - -sub svn_version_check -{ - my $major_required = 1; - my $minor_required = 5; - my $patchlevel_required = 4; - - my $version_required = $major_required*1000000 + $minor_required*1000 + $patchlevel_required; - - if ( $debug ) { - print STDERR "\nCWS-DEBUG: ... svn version\n"; - } - - my @result = execute_svn_command(0, '--version --quiet', " "); - # svn --version --quiet returns the version in major.minor.patchlevel scheme - # for example: 1.5.4 or 1.6.0-dev (for developer codelines) - # hopefully they don't change the versioning scheme - my ($major, $minor, $patchlevel); - if ( $result[0] =~ /^(\d+)\.(\d+)\.(\d+)/ ) { - $major = $1; - $minor = $2; - $patchlevel = $3; - } - else { - print_error("Can't determine svn version. Please file an issue with the output of 'svn --version --quiet'. CWS tooling requires svn-1.5.4 or later\n", 1) - } - - my $version = $major*1000000 + $minor*1000 + $patchlevel; - - if ( $version < $version_required ) { - return 0; - } - return 1; -} - -sub svn_copy -{ - my $comment = shift; - my $source = shift; - my $dest = shift; - - if ( $debug ) { - print STDERR "\nCWS-DEBUG: ... preparing branch: '$source' -> '$dest'\n"; - } - - my @result = execute_svn_command(0, 'copy', "-m '$comment'", $source, $dest); - if ( $result[1] =~ /Committed revision (\d+)\./ ) { - print STDERR ", committed revision $1\n"; - } else { - print STDERR "failed!\n"; - print STDERR @result; - } -} - -sub svn_milestone_revision -{ - my $milestone_url = shift; - - if ( $debug ) { - print STDERR "\nCWS-DEBUG: ... preparing log --stop-on-copy: '$milestone_url'\n"; - } - - my @result = execute_svn_command(0, 'log', '--stop-on-copy', $milestone_url); - - # There might be revisions committed to a tag (allowed in subversion). - # The lowestmost revision listed in a 'log --stop-on-copy' is the one which - # was current when the tag was created - my $revision = 0; - foreach ( @result ) { - if ( /^r(\d+)\s+\|\s+/ ) { - $revision = $1; - } - } - - return $revision; -} - -sub svn_path_exists -{ - my $url = shift; - - my @result = svn_info($url); - - foreach ( @result ) { - if ( /^Path: / ) { - return 1; - } - } - return 0; -} - -sub svn_wc_url -{ - my $wc_path = shift; - - my @result = svn_info($wc_path); - - foreach ( @result ) { - if ( /^URL: (.+)$/ ) { - return $1; - } - } - - print_error("Can't retrieve svn info from working copy '$wc_path'\n", 23); -} - -sub svn_wc_root -{ - my $wc_path = shift; - - my @result = svn_info($wc_path); - - foreach ( @result ) { - if ( /^Repository Root: (.+)$/ ) { - return $1; - } - } - - print_error("Can't retrieve svn info from working copy '$wc_path'\n", 23); -} - -sub svn_info -{ - my $url = shift; - - if ( $debug ) { - print STDERR "\nCWS-DEBUG: ... preparing info: '$url'\n"; - } - - my @result = execute_svn_command(0, 'info', '--depth empty', $url); - return @result; -} - -sub svn_merge -{ - my $url = shift; - my $wc = shift; - - if ( $debug ) { - print STDERR "\nCWS-DEBUG: ... preparing merge: '$url -> $wc'\n"; - } - - my $log_file = "$wc/REBASE.LOG"; - my @result = execute_svn_command($log_file, 'merge', '--accept postpone', $url, $wc); - return @result; -} - -sub svn_switch -{ - my $wc = shift; - my $url = shift; - my $quiet = shift; - - if ( $debug ) { - print STDERR "\nCWS-DEBUG: ... preparing switch: '$url -> $wc'\n"; - } - - my $switch = $quiet ? 'switch --quiet' : 'switch'; - - my @result = execute_svn_command('print', $switch, $url, $wc); - return @result; -} - -sub svn_checkout -{ - my $url = shift; - my $wc = shift; - my $quiet = shift; - - if ( $debug ) { - print STDERR "\nCWS-DEBUG: ... preparing checkout: '$url -> $wc'\n"; - } - - my $checkout = $quiet ? 'checkout --quiet' : 'checkout'; - - my @result = execute_svn_command('print', $checkout, $url, $wc); - return @result; -} - -sub svn_commit -{ - my $wc = shift; - my $commit_message = shift; - - if ( $debug ) { - print STDERR "\nCWS-DEBUG: ... preparing commit: '$wc'\n"; - } - - my $log_file = "$wc/REBASE.LOG"; - my @result = execute_svn_command($log_file, 'commit', "-m '$commit_message'", $wc); - return @result; -} - -sub svn_diff -{ - my $url1 = shift; - my $url2 = shift; - my $diff_option = shift; - - my $summarize = ''; - if ( $diff_option ) { - $summarize = '--summarize'; - } - - if ( $debug ) { - print STDERR "\nCWS-DEBUG: ... preparing diff $summarize: '$url1' vs. '$url2'\n"; - } - - if ( $summarize ) { - my $result = execute_svn_command(0, 'diff', $summarize, $url1, $url2); - my $nlen = length($url1); - my @files; - foreach( @{$result} ) { - my ($dummy, $url) = split(); - next if length($url) <= $nlen; # skip short URLs (like $url1) - my $file = substr($url, $nlen+1); - next if index($file, '/') == -1; # skip 'modified' top level dirs - push (@files, $file); - } - return \@files; - } - else { - execute_svn_command('print', 'diff', $url1, $url2); - } -} - -sub execute_svn_command -{ - my $log = shift; - my $command = shift; - my $options = shift; - my @args = @_; - - my $args_str = join(" ", @args); - - # we can only parse english strings, hopefully a C locale is available everywhere - $ENV{LC_ALL}='C'; - $command = "svn $command $options $args_str"; - - if ( $debug ) { - print STDERR "\nCWS-DEBUG: ... execute command line: '$command'\n"; - } - - my @result; - my $date; - if ( $log && $log ne 'print') { - open(LOG, ">>$log") or print_error("can't open log file '$log'", 30); - $date = localtime(); - print LOG "Start $command $args_str at $date\n"; - } - open(OUTPUT, "$command 2>&1 |") or print_error("Can't execute svn command line client", 98); - STDOUT->autoflush(1) if $log; - while (<OUTPUT>) { - if ( $log ) { - print STDOUT $_; - print LOG $_ if $log ne 'print'; - } - else { - push(@result, $_); - } - } - STDOUT->autoflush(0) if $log; - close(OUTPUT); - if ( $log && $log ne 'print') { - $date = localtime(); - print LOG "Stop $command $args_str at $date\n"; - close (LOG); - } - - my $rc = $? >> 8; - - if ( $rc > 0) { - print STDERR "\n"; - print STDERR @result if !$log; - print_error("The subversion command line client failed with exit status '$rc'", 99); - } - return wantarray ? @result : \@result; -} - -sub execute_svnversion_command -{ - my $options = shift; - my @args = @_; - - my $args_str = join(" ", @args); - - # we can only parse english strings, hopefully a C locale is available everywhere - $ENV{LC_ALL}='C'; - $command = "svnversion $options $args_str"; - - if ( $debug ) { - print STDERR "\nCWS-DEBUG: ... execute command line: '$command'\n"; - } - - my $result = `$command`; - my $rc = $? >> 8; - if ($rc > 0) { - print_error("The subversion command line tool 'svnversion' failed with exit status '$rc'", 99); - } - - return $result; -} - ### HG glue ### sub hg_clone |