/[svn2cvs]/trunk/svn2cvs.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/svn2cvs.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 10 by dpavlin, Thu Mar 11 16:48:38 2004 UTC revision 12 by dpavlin, Sat Mar 13 17:22:53 2004 UTC
# Line 8  Line 8 
8  # http://raw.no/personal/blog  # http://raw.no/personal/blog
9  #  #
10  # 2004-03-09 Dobrica Pavlinusic <dpavlin@rot13.org>  # 2004-03-09 Dobrica Pavlinusic <dpavlin@rot13.org>
11    #
12    # documentation is after __END__
13    
14  use strict;  use strict;
15  use File::Temp qw/ tempdir /;  use File::Temp qw/ tempdir /;
# Line 62  sub commit_svnrev { Line 64  sub commit_svnrev {
64          } else {          } else {
65                  my $msg="subversion revision $rev commited to CVS";                  my $msg="subversion revision $rev commited to CVS";
66                  print "$msg\n";                  print "$msg\n";
67                  system "$cvs commit -m \"$msg\" $path" || die "cvs commit of $path failed: $!";                  system "$cvs commit -m '$msg' $path" || die "cvs commit of $path failed: $!";
68          }          }
69  }  }
70    
# Line 81  if (! -e ".svnrev") { Line 83  if (! -e ".svnrev") {
83    
84  Your CVS repository doesn't have .svnrev file!  Your CVS repository doesn't have .svnrev file!
85    
86  This file is used to keep CVS repository and SubVersion in sync, so  This file is used to keep CVS repository and Subversion in sync, so
87  that only newer changes will be commited.  that only newer changes will be commited.
88    
89  It's quote possible that this is first svn2cvs run for this repository.  It's quote possible that this is first svn2cvs run for this repository.
# Line 90  corresponds to current version of CVS re Line 92  corresponds to current version of CVS re
92  been checkouted.  been checkouted.
93    
94  If you migrated your cvs repository to svn using cvs2svn, this will be  If you migrated your cvs repository to svn using cvs2svn, this will be
95  last SubVersion revision. If this is initial run of conversion of  last Subversion revision. If this is initial run of conversion of
96  SubVersion repository to CVS, correct revision is 0.  Subversion repository to CVS, correct revision is 0.
97    
98  _USAGE_  _USAGE_
99    
# Line 133  close(LOG); Line 135  close(LOG);
135  my $xml = XMLin($log, ForceArray => [ 'logentry', 'path' ]);  my $xml = XMLin($log, ForceArray => [ 'logentry', 'path' ]);
136    
137    
138  =begin log_example  #=begin log_example
139    #
140  ------------------------------------------------------------------------  #------------------------------------------------------------------------
141  r256 | dpavlin | 2004-03-09 13:18:17 +0100 (Tue, 09 Mar 2004) | 2 lines  #r256 | dpavlin | 2004-03-09 13:18:17 +0100 (Tue, 09 Mar 2004) | 2 lines
142    #
143  ported r254 from hidra branch  #ported r254 from hidra branch
144    #
145  =cut  #=cut
146    
147  my $fmt = "\n" . "-" x 79 . "\nr%5s| %8s | %s\n\n%s\n";  my $fmt = "\n" . "-" x 79 . "\nr%5s| %8s | %s\n\n%s\n";
148    
149  if (! $xml->{'logentry'}) {  if (! $xml->{'logentry'}) {
150          print "no newer log entries in SubVersion repostory. CVS is current\n";          print "no newer log entries in Subversion repostory. CVS is current\n";
151          exit 0;          exit 0;
152  }  }
153    
# Line 185  print "## tmppath: $tmppath tmpsvn: $tmp Line 187  print "## tmppath: $tmppath tmpsvn: $tmp
187                  }                  }
188    
189                  my $msg = $e->{'msg'};                  my $msg = $e->{'msg'};
190                  $msg =~ s/"/\\"/g;      # quote "                  $msg =~ s/'/\\'/g;      # quote "
191    
192                  if ($action =~ /M/) {                  if ($action =~ /M/) {
193                          print "svn2cvs: modify $path -- nop\n";                          print "svn2cvs: modify $path -- nop\n";
194                  } elsif ($action =~ /A/) {                  } elsif ($action =~ /A/) {
195                          if (-d $path) {                          if (-d $path) {
196                                  chdir($path) || die "can't cd into dir $path for import: $!";                                  chdir($path) || die "can't cd into dir $path for import: $!";
197                                  log_system("$cvs import -d -m \"$msg\" $CVSREP/$path svn r$rev", "cvs import of $path failed");                                  log_system("$cvs import -d -m '$msg' $CVSREP/$path svn r$rev", "cvs import of $path failed");
198                                  chdir("$TMPDIR") || die "can't cd to $TMPDIR/$CVSREP: $!";                                  chdir("$TMPDIR") || die "can't cd to $TMPDIR/$CVSREP: $!";
199                                  log_system("$cvs checkout $CVSREP/$path", "cvs checkout of imported dir $path failed");                                  log_system("$cvs checkout $CVSREP/$path", "cvs checkout of imported dir $path failed");
200                                  chdir("$TMPDIR/$CVSREP") || die "can't cd back to $TMPDIR/$CVSREP: $!";                                  chdir("$TMPDIR/$CVSREP") || die "can't cd back to $TMPDIR/$CVSREP: $!";
201                          } else {                          } else {
202                                  log_system("$cvs add -m \"$msg\" $path", "cvs add of $path failed");                                  log_system("$cvs add -m '$msg' $path", "cvs add of $path failed");
203                          }                          }
204                  } elsif ($action =~ /D/) {                  } elsif ($action =~ /D/) {
205                          log_system("$cvs delete -m \"$msg\" $path", "cvs delete of $path failed");                          log_system("$cvs delete -m '$msg' $path", "cvs delete of $path failed");
206                  } else {                  } else {
207                          print "WARNING: action $action not implemented on $path. Bug or missing feature of $0\n";                          print "WARNING: action $action not implemented on $path. Bug or missing feature of $0\n";
208                  }                  }
209    
210                  # now commit changes                  # now commit changes
211                  log_system("$cvs commit -m \"$msg\" $path", "cvs commit of $path failed");                  log_system("$cvs commit -m '$msg' $path", "cvs commit of $path failed");
212    
213          }          }
214    
215          commit_svnrev($rev);          commit_svnrev($rev);
216  }  }
217    
218    __END__
219    
220    =pod
221    
222    =head1 NAME
223    
224    svn2cvs - save subversion commits to (read-only) cvs repository
225    
226    =head1 SYNOPSIS
227    
228      ./svn2cvs.pl SVN_URL CVSROOT CVSREPOSITORY
229    
230    Usage example (used to self-host this script):
231    
232      ./svn2cvs.pl file:///home/dpavlin/private/svn/svn2cvs/trunk/ \
233                   :pserver:dpavlin@cvs.tigris.org:/cvs svn2cvs/src
234    
235    =head1 DESCRIPTION
236    
237    This script will allow you to commit changes made to Subversion repository also to (read-only) CVS repository manually or from Subversion's C<post-commit> hook.
238    
239    It's using F<.svnrev> file (which will be created on first run) in
240    B<CVSROOT/CVSREPOSITORY> to store last Subversion revision which was
241    committed into CVS.
242    
243    One run will do following things:
244    
245    =over 4
246    
247    =item *
248    checkout B<CVSREPOSITORY> from B<CVSROOT> to temporary directory
249    
250    =item *
251    check if F<.svnrev> file exists and create it if it doesn't
252    
253    =item *
254    loop through all revisions from current in B<CVSROOT/CVSREPOSITORY> (using
255    F<.svnrev>) up to B<HEAD> (current one)
256    
257    =over 5
258    
259    =item *
260    checkout next Subversion revision from B<SVN_URL> over CVS checkout
261    temporary directory
262    
263    =item *
264    make modification (add and/or delete) done in that revision
265    
266    =item *
267    commit modification (added, deleted or modified files/dirs) while
268    preserving original message from CVS
269    
270    =item *
271    update F<.svnrev> to match current revision
272    
273    =back
274    
275    =item *
276    cleanup temporary directory
277    
278    =back
279    
280    If checkout fails for some reason (e.g. flaky ssh connection), you will
281    still have valid CVS repository, so all you have to do is run B<svn2cvs.pl>
282    again.
283    
284    =head1 WARNINGS
285    
286    "Cheap" copy operations in Subversion are not at all cheap in CVS. They will
287    create multiple copies of files in CVS repository!
288    
289    =head1 RELATED PROJECTS
290    
291    B<Subversion> L<http://subversion.tigris.org/> version control system that is a
292    compelling replacement for CVS in the open source community.
293    
294    B<cvs2svn> L<http://cvs2svn.tigris.org/> converts a CVS repository to a
295    Subversion repository. It is designed for one-time conversions, not for
296    repeated synchronizations between CVS and Subversion.
297    
298    =head1 AUTHOR
299    
300    Dobrica Pavlinusic <dpavlin@rot13.org>
301    
302    L<http://www.rot13.org/~dpavlin/>
303    
304    =head1 LICENSE
305    
306    This product is licensed under GNU Public License (GPL) v2 or later.
307    
308    =cut
309    

Legend:
Removed from v.10  
changed lines
  Added in v.12

  ViewVC Help
Powered by ViewVC 1.1.26