diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2002-01-18 16:53:40 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2002-01-18 16:53:40 +0000 |
commit | c04c6343899eaf249f4afba30506913695416ab3 (patch) | |
tree | 30821755a4ba79b52dd6eb91551450dde541e610 /solenv/bin/merge2top.pl | |
parent | 920c3e78c2dc64dbb9ac47556c50751743f23846 (diff) |
first implementation
Diffstat (limited to 'solenv/bin/merge2top.pl')
-rw-r--r-- | solenv/bin/merge2top.pl | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/solenv/bin/merge2top.pl b/solenv/bin/merge2top.pl new file mode 100644 index 000000000000..14e2f3b39c68 --- /dev/null +++ b/solenv/bin/merge2top.pl @@ -0,0 +1,232 @@ +: +eval 'exec perl -wS $0 ${1+"$@"}' + if 0; +#************************************************************************* +# +# $RCSfile: merge2top.pl,v $ +# +# $Revision: 1.1 $ +# +# last change: $Author: hr $ $Date: 2002-01-18 17:53:40 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc.. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +# +# merge2top.pl - merge branch into top level revision +# + +use Cvs; +use Cwd; +use File::Basename; + +#### script id ##### + +( $script_name = $0 ) =~ s/^.*\b(\w+)\.pl$/$1/; + +$id_str = ' $Revision: 1.1 $ '; +$id_str =~ /Revision:\s+(\S+)\s+\$/ + ? ($script_rev = $1) : ($script_rev = "-"); + +print "$script_name -- version: $script_rev\n"; + +#### globals #### + +$is_debug = 0; # debug flag + +$files = (); # files to merge + +#### main #### + +my $branchlabel = parse_args(\@ARGV); +my ($success, $failure) = process_files($branchlabel, \@files); + +print "Merged $success file(s) successfully\n" if $success; +print "Failed to merge $failure file(s)\n" if $failure; +$failure ? exit(2) : exit(0); + +#### subroutines ##### + +sub parse_args +{ + # parse command line arguments + + my $args_ref = shift; + + # check for branchlabel + my $branchlabel_next = 0; + foreach (@{$args_ref}) { + /^-b$/ && ++$branchlabel_next && next; + /^-b(\w+)$/ && ($branchlabel=$1) && next; + if ( $branchlabel_next ) { + $branchlabel = $_; + $branchlabel_next = 0; + } + else { + push(@files, $_); + } + } + + print STDERR "branchlabel: $branchlabel\n" if $is_debug; + print STDERR "file(s) to merge: " . join(',', @files) . "\n" if $is_debug; + + if ( !$branchlabel || $#files < 0 ) { + usage(); + exit(1); + } + return $branchlabel; +} + +sub process_files +{ + # iterate over file list and merge + + my $branchlabel = shift; + my $files_ref = shift; + my $success; + my $failure; + my $cwd = getcwd(); + foreach my $file (@{$files_ref}) { + if ( -r $file ) { + chdir(dirname($file)); + merge($branchlabel, basename($file)) ? $success++ : $failure++; + chdir($cwd); + } + else { + print STDERR "$script_name: can't read $file: $!\n"; + } + } + return ($success, $failure); +} + +sub merge +{ + # Merge $branchlabel branch to top for $file. + # Expects cwd to be tuned to $file. + + my $branchlabel = shift; + my $file = shift; + + my $archive = Cvs->new(); + $archive->name($file); + + # Check if branchlabel exists. + if ( !$archive->is_tag($branchlabel) ) { + print STDERR "$script_name: '$file': no such branchlabel '$branchlabel'!\n"; + return $0; + } + # Is $branchlabel really a branchlabel? + my $branch_rev = $archive->get_branch_rev($branchlabel); + if ( !$branch_rev ) { + print STDERR "$script_name: '$file': '$branchlabel' is not a branchlabel!\n"; + return $0; + } + + # Ok we got the branch root. + # Now collect all the logging information of the revisions on the branch + my @merge_comment = (); + push(@merge_comment, "$script_name: merge branch $branchlabel ($branch_rev)\n"); + my $revs_ref = $archive->get_sorted_revs(); + foreach my $rev (@{$revs_ref}) { + if ( $rev =~ /^$branch_rev\.\d+/ ) { + my $log_ref = $archive->get_data_by_rev()->{$rev}; + my $comment = "$$log_ref{'DATE'} $$log_ref{'AUTHOR'} $rev: $$log_ref{'COMMENT'}"; + push(@merge_comment, $comment); + } + } + + # update to top level revision + if ( $archive->update('-A -kk') ne 'success' ) { + print STDERR "$script_name: failed to update '$file', cancel merge!\n"; + return 0; + } + # write out merge comment + my $mergecommentfile = $file . '.mergecomment'; + if ( !open(COMMENTFILE, ">$mergecommentfile") ) { + print STDERR "$script_name: can't open $mergecommentfile $!\n"; + return 0; + } + print COMMENTFILE @merge_comment; + close(COMMENTFILE); + + # merge + my $rc = $archive->update("-j $branchlabel -kk"); + if ( $rc eq 'conflict' ) { + print STDERR "$script_name: '$file': merge conflicts!\n"; + print STDERR "Resolve conflict manually and commit again with:\n"; + print STDERR "cvs commit -F $mergecommentfile $file\n"; + return 0; + } + elsif ( $rc ne 'success' ) { + print STDERR "$script_name: '$file': merge failed for unknown reasons!\n"; + print STDERR "Resolve problem manually\n"; + unlink($mergecommentfile); + return 0; + } + + if ( $archive->commit("-F $mergecommentfile") ne 'success' ) { + print STDERR "$script_name: '$file': PANIC: commit failed for unknown reasons\n"; + return 0; + } + + # ok, everything went well, remove comment file + unlink($mergecommentfile); + return 1; +} + +sub usage +{ + print STDERR "usage:\n"; + print STDERR " $script_name -b <branch_label> <files> ...\n"; +} |