#! @CSH@ -f # Copyright (C) 1995-2005 The Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program 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 General Public License for more details. # # Sccs2rcs is a script to convert an existing SCCS # history into an RCS history without losing any of # the information contained therein. # It has been tested under the following OS's: # SunOS 3.5, 4.0.3, 4.1 # Ultrix-32 2.0, 3.1 # # Things to note: # + It will NOT delete or alter your ./SCCS history under any circumstances. # # + Run in a directory where ./SCCS exists and where you can # create ./RCS # # + /usr/local/bin is put in front of the default path. # (SCCS under Ultrix is set-uid sccs, bad bad bad, so # /usr/local/bin/sccs here fixes that) # # + Date, time, author, comments, branches, are all preserved. # # + If a command fails somewhere in the middle, it bombs with # a message -- remove what it's done so far and try again. # "rm -rf RCS; sccs unedit `sccs tell`; sccs clean" # There is no recovery and exit is far from graceful. # If a particular module is hanging you up, consider # doing it separately; move it from the current area so that # the next run will have a better chance or working. # Also (for the brave only) you might consider hacking # the s-file for simpler problems: I've successfully changed # the date of a delta to be in sync, then run "sccs admin -z" # on the thing. # # + After everything finishes, ./SCCS will be moved to ./old-SCCS. # # This file may be copied, processed, hacked, mutilated, and # even destroyed as long as you don't tell anyone you wrote it. # # Ken Cox # Viewlogic Systems, Inc. # kenstir@viewlogic.com # ...!harvard!cg-atla!viewlog!kenstir # # Various hacks made by Brian Berliner before inclusion in CVS contrib area. # # Modified to detect SCCS binary files. If binary, skip the keyword # substitution and flag the RCS file as binary (using rcs -i -kb). # -Allan G. Schrum schrum@ofsoptics.com agschrum@mindspring.com # Fri Sep 26 10:40:40 EDT 2003 # #we'll assume the user set up the path correctly # for the Pmax, /usr/ucb/sccs is suid sccs, what a pain # /usr/local/bin/sccs should override /usr/ucb/sccs there set path = (/usr/local/bin $path) ############################################################ # Error checking # if (! -w .) then echo "Error: ./ not writeable by you." exit 1 endif if (! -d SCCS) then echo "Error: ./SCCS directory not found." exit 1 endif set edits = (`sccs tell`) if ($#edits) then echo "Error: $#edits file(s) out for edit...clean up before converting." exit 1 endif if (-d RCS) then echo "Warning: RCS directory exists" if (`ls -a RCS | wc -l` > 2) then echo "Error: RCS directory not empty" exit 1 endif else mkdir RCS endif sccs clean set logfile = /tmp/sccs2rcs_$$_log rm -f $logfile set tmpfile = /tmp/sccs2rcs_$$_tmp rm -f $tmpfile set emptyfile = /tmp/sccs2rcs_$$_empty echo -n "" > $emptyfile set initialfile = /tmp/sccs2rcs_$$_init echo "Initial revision" > $initialfile set sedfile = /tmp/sccs2rcs_$$_sed rm -f $sedfile set revfile = /tmp/sccs2rcs_$$_rev rm -f $revfile # the quotes surround the dollar signs to fool RCS when I check in this script set sccs_keywords = (\ '%W%[ ]*%G%'\ '%W%[ ]*%E%'\ '%W%'\ '%Z%%M%[ ]*%I%[ ]*%G%'\ '%Z%%M%[ ]*%I%[ ]*%E%'\ '%M%[ ]*%I%[ ]*%G%'\ '%M%[ ]*%I%[ ]*%E%'\ '%M%'\ '%I%'\ '%G%'\ '%E%'\ '%U%') set rcs_keywords = (\ '$'Id'$'\ '$'Id'$'\ '$'Id'$'\ '$'SunId'$'\ '$'SunId'$'\ '$'Id'$'\ '$'Id'$'\ '$'RCSfile'$'\ '$'Revision'$'\ '$'Date'$'\ '$'Date'$'\ '') ############################################################ # Get some answers from user # echo "" echo "Do you want to be prompted for a description of each" echo "file as it is checked in to RCS initially?" echo -n "(y=prompt for description, n=null description) [y] ?" set ans = $< if ((_$ans == _) || (_$ans == _y) || (_$ans == _Y)) then set nodesc = 0 else set nodesc = 1 endif echo "" echo "The default keyword substitutions are as follows and are" echo "applied in the order specified:" set i = 1 while ($i <= $#sccs_keywords) # echo ' '\"$sccs_keywords[$i]\"' ==> '\"$rcs_keywords[$i]\" echo " $sccs_keywords[$i] ==> $rcs_keywords[$i]" @ i = $i + 1 end echo "" echo -n "Do you want to change them [n] ?" set ans = $< if ((_$ans != _) && (_$ans != _n) && (_$ans != _N)) then echo "You can't always get what you want." echo "Edit this script file and change the variables:" echo ' $sccs_keywords' echo ' $rcs_keywords' else echo "good idea." endif # create the sed script set i = 1 while ($i <= $#sccs_keywords) echo "s,$sccs_keywords[$i],$rcs_keywords[$i],g" >> $sedfile @ i = $i + 1 end onintr ERROR sort -k 1,1 /dev/null >& /dev/null if ($status == 0) then set sort_each_field = '-k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9' else set sort_each_field = '+0 +1 +2 +3 +4 +5 +6 +7 +8' endif ############################################################ # Loop over every s-file in SCCS dir # foreach sfile (SCCS/s.*) # get rid of the "s." at the beginning of the name set file = `echo $sfile:t | sed -e "s/^..//"` # work on each rev of that file in ascending order set firsttime = 1 # Only scan the file up to the "I" keyword, then see if # the "f" keyword is set to binary. The SCCS file has # -aI denoting the start of the file (or end of header). set binary = (`sed -e '/^.I/,$d' < $sfile | grep '^.f e 1$'`) #if ($#binary) then # echo This is a binary file #else # echo This is not a binary file #endif sccs prs $file | grep "^D " | @AWK@ '{print $2}' | sed -e 's/\./ /g' | sort -n -u $sort_each_field | sed -e 's/ /./g' > $revfile foreach rev (`cat $revfile`) if ($status != 0) goto ERROR # get file into current dir and get stats # Is the substr stuff and the +0 in the following awk script really # necessary? It seems to me that if we didn't find the date format # we expected in the output we have other problems. # Note: Solaris awk does not like the following line. Use gawk # mawk, or nawk instead. set date = `sccs prs -r$rev $file | @AWK@ '/^D / {print (substr($3,0,2)+0<70?20:19) $3, $4; exit}'` set author = `sccs prs -r$rev $file | @AWK@ '/^D / {print $5; exit}'` echo "" echo "==> file $file, rev=$rev, date=$date, author=$author" sccs edit -r$rev $file >>& $logfile if ($status != 0) goto ERROR echo checked out of SCCS # add RCS keywords in place of SCCS keywords (only if not binary) if ($#binary == 0) then sed -f $sedfile $file > $tmpfile if ($status != 0) goto ERROR echo performed keyword substitutions cp $tmpfile $file endif # check file into RCS if ($firsttime) then set firsttime = 0 if ($#binary) then echo this is a binary file # Mark initial, empty file as binary rcs -i -kb -t$emptyfile $file endif if ($nodesc) then echo about to do ci echo ci -f -r$rev -d"$date" -w$author -t$emptyfile $file ci -f -r$rev -d"$date" -w$author -t$emptyfile $file < $initialfile >>& $logfile if ($status != 0) goto ERROR echo initial rev checked into RCS without description else echo "" echo Enter a brief description of the file $file \(end w/ Ctrl-D\): cat > $tmpfile ci -f -r$rev -d"$date" -w$author -t$tmpfile $file < $initialfile >>& $logfile if ($status != 0) goto ERROR echo initial rev checked into RCS endif else # get RCS lock set lckrev = `echo $rev | sed -e 's/\.[0-9]*$//'` if ("$lckrev" =~ [0-9]*.*) then # need to lock the brach -- it is OK if the lock fails rcs -l$lckrev $file >>& $logfile else # need to lock the trunk -- must succeed rcs -l $file >>& $logfile if ($status != 0) goto ERROR endif echo got lock sccs prs -r$rev $file | grep "." > $tmpfile # it's OK if grep fails here and gives status == 1 # put the delta message in $tmpfile ed $tmpfile >>& $logfile <>& $logfile if ($status != 0) goto ERROR echo checked into RCS endif sccs unedit $file >>& $logfile if ($status != 0) goto ERROR end rm -f $file end ############################################################ # Clean up # echo cleaning up... mv SCCS old-SCCS rm -f $tmpfile $emptyfile $initialfile $sedfile echo =================================================== echo " Conversion Completed Successfully" echo "" echo " SCCS history now in old-SCCS/" echo =================================================== set exitval = 0 goto cleanup ERROR: foreach f (`sccs tell`) sccs unedit $f end echo "" echo "" echo Danger\! Danger\! echo Some command exited with a non-zero exit status. echo Log file exists in $logfile. echo "" echo Incomplete history in ./RCS -- remove it echo Original unchanged history in ./SCCS set exitval = 1 cleanup: # leave log file rm -f $tmpfile $emptyfile $initialfile $sedfile $revfile exit $exitval