VCP.pm #12

  • //
  • guest/
  • perforce_software/
  • revml/
  • lib/
  • VCP.pm
  • View
  • Commits
  • Open Download .zip Download (3 KB)
package VCP ;

=head1 NAME

VCP - Versioned Copy, copying hierarchies of versioned files

=head1 SYNOPSIS

see the vcp command line.

=head1 DESCRIPTION

This module copies hierarchies of versioned files between repositories, and
between repositories and RevML (.revml) files.

Stay tuned for more documentation.

=head1 METHODS

=over

=for test_scripts t/10vcp.t t/50revml.t

=cut

$VERSION = 0.1 ;

use strict ;
use VCP::Logger qw( lg pr );

require VCP::Source ;
require VCP::Dest ;

use fields (
   'PLUGINS',     # The VCP::Source to pull data from
) ;


=item new

   $ex = VCP->new( $source, $dest ) ;

where

   $source  is an instance of VCP::Source
   $dest    is an instance of VCP::Dest

=cut

sub new {
   my $class = shift ;
   $class = ref $class || $class;

   my VCP $self = do {
      no strict 'refs' ;
      bless [ \%{"$class\::FIELDS"} ], $class;
   };

   my $w = length $#_;
   for ( my $i = 0; $i <= $#_; ++$i ) {
      lg sprintf "plugin %${w}d is %s", $i, ref $_[$i];
   }

   $self->{PLUGINS} = [ @_ ];

   return $self ;
}


=item insert_required_sort_filter

Called if a sorting filter must be inserted.

Does nothing if there's already a sort filter in place.

=cut

sub insert_required_sort_filter {
   my VCP $self = shift ;

   my @sort_keys;

   for ( @{$self->{PLUGINS}}[ 1 .. $#{$self->{PLUGINS}} - 1 ] ) {
      @sort_keys = $_->sort_keys( @sort_keys );
   }

   my @sort_filters = $self->{PLUGINS}->[-1]->sort_filters( @sort_keys );

   if ( @sort_filters ) {
      pr "appending required ",
         join( ", ", map $_->filter_name, @sort_filters ),
         @sort_filters == 1 ? " filter" : " filters";
      splice @{$self->{PLUGINS}}, -1, 0, @sort_filters;
   }

}


=item copy_all

   $vcp->copy_all( $header, $footer ) ;

Calls $source->handle_header, $source->copy_revs, and $source->handle_footer.

=cut

sub copy_all {
   my VCP $self = shift ;

   my ( $header, $footer ) = @_ ;

   lg "Plugins: ",
      join ", ",
      map $_->isa( "VCP::Filter" ) ? $_->filter_name : ref $_,
      @{$self->{PLUGINS}};

   {
      my $dest = $self->{PLUGINS}->[-1];
      for ( reverse @{$self->{PLUGINS}}[0..$#{$self->{PLUGINS}} -1] ) {
         $_->dest( $dest );
         $dest = $_;
      }
   }

   my VCP::Source $s = $self->{PLUGINS}->[0];
   my $ok = eval {
      $s->handle_header( $header ) ;
      $s->copy_revs() ;
      $s->handle_footer( $footer ) ;
      1;
   };

   if ( ! $ok ) {
      my $x = $@;
      VCP::Logger::_interrupt_progress();
      die $x;
   }


   ## Removing this link allows the dest to be cleaned up earlier by perl,
   ## which keeps VCP::RefCountedFile from complaining about undeleted revs.
   $s->dest( undef ) ;

   return ;
}


=back

=head1 COPYRIGHT

Copyright 2000, Perforce Software, Inc.  All Rights Reserved.

This module and the VCP package are licensed according to the terms given in
the file LICENSE accompanying this distribution, a copy of which is included in
L<vcp>.

=head1 AUTHOR

Barrie Slaymaker <barries@slaysys.com>

=cut

1
# Change User Description Committed
#19 4232 Barrie Slaymaker - bin/vcp now prints a version info banner
#18 4231 Barrie Slaymaker - See if the $Date:$ keyword updates
#17 4230 Barrie Slaymaker - VCP.pm now tracks its $CHANGE_ID
#16 4077 Barrie Slaymaker - VCP on Win32 no longer whines about permission denied errors
  for some disk file cleanup tasks.
#15 4021 Barrie Slaymaker - Remove all phashes and all base & fields pragmas
- Work around SWASHGET error
#14 4012 Barrie Slaymaker - Remove dependance on pseudohashes (deprecated Perl feature)
#13 3929 Barrie Slaymaker - Minor debugging aid
#12 3916 Barrie Slaymaker - Reduce memory consumption
#11 3912 Barrie Slaymaker - ChangeSets goes on the end of the filters, not the beginning
#10 3858 Barrie Slaymaker - Final tweaks for 0.5 release
#9 3855 Barrie Slaymaker - vcp scan, filter, transfer basically functional
    - Need more work in re: storage format, etc, but functional
#8 3824 Barrie Slaymaker - Better display of errors that occur while a progress bar is
  displayed
#7 3155 Barrie Slaymaker Convert to logging using VCP::Logger to reduce stdout/err spew.
       Simplify & speed up debugging quite a bit.
       Provide more verbose information in logs.
       Print to STDERR progress reports to keep users from wondering
       what's going on.
       Breaks test; halfway through upgrading run3() to an inline
       function for speed and for VCP specific features.
#6 3120 Barrie Slaymaker Move changeset aggregation in to its own filter.
#5 2301 Barrie Slaymaker A chain of plugins instead of source & dest
#4 2293 Barrie Slaymaker Update CHANGES, TODO, improve .vcp files, add --init-cvs
#3 628 Barrie Slaymaker Cleaned up POD in bin/vcp, added BSD-style license.
#2 468 Barrie Slaymaker - VCP::Dest::p4 now does change number aggregation based on the
  comment field changing or whenever a new revision of a file with
  unsubmitted changes shows up on the input stream.  Since revisions of
  files are normally sorted in time order, this should work in a number
  of cases.  I'm sure we'll need to generalize it, perhaps with a time
  thresholding function.
- t/90cvs.t now tests cvs->p4 replication.
- VCP::Dest::p4 now doesn't try to `p4 submit` when no changes are
  pending.
- VCP::Rev now prevents the same label from being applied twice to
  a revision.  This was occuring because the "r_1"-style label that
  gets added to a target revision by VCP::Dest::p4 could duplicate
  a label "r_1" that happened to already be on a revision.
- Added t/00rev.t, the beginnings of a test suite for VCP::Rev.
- Tweaked bin/gentrevml to comment revisions with their change number
  instead of using a unique comment for every revision for non-p4
  t/test-*-in-0.revml files.  This was necessary to test cvs->p4
  functionality.
#1 467 Barrie Slaymaker Version 0.01, initial checkin in perforce public depot.