181404Speter#! @CSH@ -f 2175282Sobrien 3175282Sobrien# Copyright (C) 1995-2005 The Free Software Foundation, Inc. 4175282Sobrien 5175282Sobrien# This program is free software; you can redistribute it and/or modify 6175282Sobrien# it under the terms of the GNU General Public License as published by 7175282Sobrien# the Free Software Foundation; either version 2, or (at your option) 8175282Sobrien# any later version. 981404Speter# 10175282Sobrien# This program is distributed in the hope that it will be useful, 11175282Sobrien# but WITHOUT ANY WARRANTY; without even the implied warranty of 12175282Sobrien# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13175282Sobrien# GNU General Public License for more details. 14175282Sobrien# 1581404Speter# Sccs2rcs is a script to convert an existing SCCS 1681404Speter# history into an RCS history without losing any of 1781404Speter# the information contained therein. 1881404Speter# It has been tested under the following OS's: 1981404Speter# SunOS 3.5, 4.0.3, 4.1 2081404Speter# Ultrix-32 2.0, 3.1 2181404Speter# 2281404Speter# Things to note: 2381404Speter# + It will NOT delete or alter your ./SCCS history under any circumstances. 2481404Speter# 2581404Speter# + Run in a directory where ./SCCS exists and where you can 2681404Speter# create ./RCS 2781404Speter# 2881404Speter# + /usr/local/bin is put in front of the default path. 2981404Speter# (SCCS under Ultrix is set-uid sccs, bad bad bad, so 3081404Speter# /usr/local/bin/sccs here fixes that) 3181404Speter# 3281404Speter# + Date, time, author, comments, branches, are all preserved. 3381404Speter# 3481404Speter# + If a command fails somewhere in the middle, it bombs with 3581404Speter# a message -- remove what it's done so far and try again. 3681404Speter# "rm -rf RCS; sccs unedit `sccs tell`; sccs clean" 3781404Speter# There is no recovery and exit is far from graceful. 3881404Speter# If a particular module is hanging you up, consider 3981404Speter# doing it separately; move it from the current area so that 4081404Speter# the next run will have a better chance or working. 4181404Speter# Also (for the brave only) you might consider hacking 4281404Speter# the s-file for simpler problems: I've successfully changed 4381404Speter# the date of a delta to be in sync, then run "sccs admin -z" 4481404Speter# on the thing. 4581404Speter# 4681404Speter# + After everything finishes, ./SCCS will be moved to ./old-SCCS. 4781404Speter# 4881404Speter# This file may be copied, processed, hacked, mutilated, and 4981404Speter# even destroyed as long as you don't tell anyone you wrote it. 5081404Speter# 5181404Speter# Ken Cox 5281404Speter# Viewlogic Systems, Inc. 5381404Speter# kenstir@viewlogic.com 5481404Speter# ...!harvard!cg-atla!viewlog!kenstir 5581404Speter# 5681404Speter# Various hacks made by Brian Berliner before inclusion in CVS contrib area. 57128269Speter# 58128269Speter# Modified to detect SCCS binary files. If binary, skip the keyword 59128269Speter# substitution and flag the RCS file as binary (using rcs -i -kb). 60128269Speter# -Allan G. Schrum schrum@ofsoptics.com agschrum@mindspring.com 61128269Speter# Fri Sep 26 10:40:40 EDT 2003 62128269Speter# 6381442Speter# $FreeBSD$ 6481404Speter 6581404Speter 6681404Speter#we'll assume the user set up the path correctly 6781404Speter# for the Pmax, /usr/ucb/sccs is suid sccs, what a pain 6881404Speter# /usr/local/bin/sccs should override /usr/ucb/sccs there 6981404Speterset path = (/usr/local/bin $path) 7081404Speter 7181404Speter 7281404Speter############################################################ 7381404Speter# Error checking 7481404Speter# 7581404Speterif (! -w .) then 7681404Speter echo "Error: ./ not writeable by you." 7781404Speter exit 1 7881404Speterendif 7981404Speterif (! -d SCCS) then 8081404Speter echo "Error: ./SCCS directory not found." 8181404Speter exit 1 8281404Speterendif 8381404Speterset edits = (`sccs tell`) 8481404Speterif ($#edits) then 8581404Speter echo "Error: $#edits file(s) out for edit...clean up before converting." 8681404Speter exit 1 8781404Speterendif 8881404Speterif (-d RCS) then 8981404Speter echo "Warning: RCS directory exists" 9081404Speter if (`ls -a RCS | wc -l` > 2) then 9181442Speter echo "Error: RCS directory not empty" 9281404Speter exit 1 9381404Speter endif 9481404Speterelse 9581404Speter mkdir RCS 9681404Speterendif 9781404Speter 9881404Spetersccs clean 9981404Speter 10081404Speterset logfile = /tmp/sccs2rcs_$$_log 10181404Speterrm -f $logfile 10281404Speterset tmpfile = /tmp/sccs2rcs_$$_tmp 10381404Speterrm -f $tmpfile 10481404Speterset emptyfile = /tmp/sccs2rcs_$$_empty 10581404Speterecho -n "" > $emptyfile 10681404Speterset initialfile = /tmp/sccs2rcs_$$_init 10781404Speterecho "Initial revision" > $initialfile 10881404Speterset sedfile = /tmp/sccs2rcs_$$_sed 10981404Speterrm -f $sedfile 11081404Speterset revfile = /tmp/sccs2rcs_$$_rev 11181404Speterrm -f $revfile 11281404Speter 11381404Speter# the quotes surround the dollar signs to fool RCS when I check in this script 11481404Speterset sccs_keywords = (\ 11581404Speter '%W%[ ]*%G%'\ 11681404Speter '%W%[ ]*%E%'\ 11781404Speter '%W%'\ 11881404Speter '%Z%%M%[ ]*%I%[ ]*%G%'\ 11981404Speter '%Z%%M%[ ]*%I%[ ]*%E%'\ 12081404Speter '%M%[ ]*%I%[ ]*%G%'\ 12181404Speter '%M%[ ]*%I%[ ]*%E%'\ 12281404Speter '%M%'\ 12381404Speter '%I%'\ 12481404Speter '%G%'\ 12581404Speter '%E%'\ 12681404Speter '%U%') 12781404Speterset rcs_keywords = (\ 12881404Speter '$'Id'$'\ 12981404Speter '$'Id'$'\ 13081404Speter '$'Id'$'\ 13181404Speter '$'SunId'$'\ 13281404Speter '$'SunId'$'\ 13381404Speter '$'Id'$'\ 13481404Speter '$'Id'$'\ 13581404Speter '$'RCSfile'$'\ 13681404Speter '$'Revision'$'\ 13781404Speter '$'Date'$'\ 13881404Speter '$'Date'$'\ 13981404Speter '') 14081404Speter 14181404Speter 14281404Speter############################################################ 14381404Speter# Get some answers from user 14481404Speter# 14581404Speterecho "" 14681404Speterecho "Do you want to be prompted for a description of each" 14781404Speterecho "file as it is checked in to RCS initially?" 14881404Speterecho -n "(y=prompt for description, n=null description) [y] ?" 14981404Speterset ans = $< 15081404Speterif ((_$ans == _) || (_$ans == _y) || (_$ans == _Y)) then 15181404Speter set nodesc = 0 15281404Speterelse 15381404Speter set nodesc = 1 15481404Speterendif 15581404Speterecho "" 15681404Speterecho "The default keyword substitutions are as follows and are" 15781404Speterecho "applied in the order specified:" 15881404Speterset i = 1 15981404Speterwhile ($i <= $#sccs_keywords) 16081404Speter# echo ' '\"$sccs_keywords[$i]\"' ==> '\"$rcs_keywords[$i]\" 16181404Speter echo " $sccs_keywords[$i] ==> $rcs_keywords[$i]" 16281404Speter @ i = $i + 1 16381404Speterend 16481404Speterecho "" 16581404Speterecho -n "Do you want to change them [n] ?" 16681404Speterset ans = $< 16781404Speterif ((_$ans != _) && (_$ans != _n) && (_$ans != _N)) then 16881404Speter echo "You can't always get what you want." 16981404Speter echo "Edit this script file and change the variables:" 17081404Speter echo ' $sccs_keywords' 17181404Speter echo ' $rcs_keywords' 17281404Speterelse 17381404Speter echo "good idea." 17481404Speterendif 17581404Speter 17681404Speter# create the sed script 17781404Speterset i = 1 17881404Speterwhile ($i <= $#sccs_keywords) 17981404Speter echo "s,$sccs_keywords[$i],$rcs_keywords[$i],g" >> $sedfile 18081404Speter @ i = $i + 1 18181404Speterend 18281404Speter 18381404Speteronintr ERROR 18481404Speter 185128269Spetersort -k 1,1 /dev/null >& /dev/null 186128269Speterif ($status == 0) then 187128269Speter set sort_each_field = '-k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9' 188128269Speterelse 189128269Speter set sort_each_field = '+0 +1 +2 +3 +4 +5 +6 +7 +8' 190128269Speterendif 191128269Speter 19281404Speter############################################################ 19381404Speter# Loop over every s-file in SCCS dir 19481404Speter# 19581404Speterforeach sfile (SCCS/s.*) 19681404Speter # get rid of the "s." at the beginning of the name 19781404Speter set file = `echo $sfile:t | sed -e "s/^..//"` 19881404Speter 19981404Speter # work on each rev of that file in ascending order 20081404Speter set firsttime = 1 201128269Speter 202128269Speter # Only scan the file up to the "I" keyword, then see if 203128269Speter # the "f" keyword is set to binary. The SCCS file has 204128269Speter # <ctrl>-aI denoting the start of the file (or end of header). 205128269Speter set binary = (`sed -e '/^.I/,$d' < $sfile | grep '^.f e 1$'`) 206128269Speter #if ($#binary) then 207128269Speter # echo This is a binary file 208128269Speter #else 209128269Speter # echo This is not a binary file 210128269Speter #endif 211128269Speter 212128269Speter sccs prs $file | grep "^D " | @AWK@ '{print $2}' | sed -e 's/\./ /g' | sort -n -u $sort_each_field | sed -e 's/ /./g' > $revfile 21381404Speter foreach rev (`cat $revfile`) 21481404Speter if ($status != 0) goto ERROR 21581404Speter 21681404Speter # get file into current dir and get stats 217102843Speter 218102843Speter # Is the substr stuff and the +0 in the following awk script really 219102843Speter # necessary? It seems to me that if we didn't find the date format 220102843Speter # we expected in the output we have other problems. 221128269Speter # Note: Solaris awk does not like the following line. Use gawk 222128269Speter # mawk, or nawk instead. 223128269Speter set date = `sccs prs -r$rev $file | @AWK@ '/^D / {print (substr($3,0,2)+0<70?20:19) $3, $4; exit}'` 224128269Speter set author = `sccs prs -r$rev $file | @AWK@ '/^D / {print $5; exit}'` 22581404Speter echo "" 22681404Speter echo "==> file $file, rev=$rev, date=$date, author=$author" 22781404Speter sccs edit -r$rev $file >>& $logfile 22881404Speter if ($status != 0) goto ERROR 22981404Speter echo checked out of SCCS 23081404Speter 231128269Speter # add RCS keywords in place of SCCS keywords (only if not binary) 232128269Speter if ($#binary == 0) then 233128269Speter sed -f $sedfile $file > $tmpfile 234128269Speter if ($status != 0) goto ERROR 235128269Speter echo performed keyword substitutions 236128269Speter cp $tmpfile $file 237128269Speter endif 23881404Speter 23981404Speter # check file into RCS 24081404Speter if ($firsttime) then 24181404Speter set firsttime = 0 242128269Speter 243128269Speter if ($#binary) then 244128269Speter echo this is a binary file 245128269Speter # Mark initial, empty file as binary 246128269Speter rcs -i -kb -t$emptyfile $file 247128269Speter endif 248128269Speter 24981404Speter if ($nodesc) then 25081404Speter echo about to do ci 25181404Speter echo ci -f -r$rev -d"$date" -w$author -t$emptyfile $file 25281404Speter ci -f -r$rev -d"$date" -w$author -t$emptyfile $file < $initialfile >>& $logfile 25381404Speter if ($status != 0) goto ERROR 25481404Speter echo initial rev checked into RCS without description 25581404Speter else 25681404Speter echo "" 25781404Speter echo Enter a brief description of the file $file \(end w/ Ctrl-D\): 25881404Speter cat > $tmpfile 25981404Speter ci -f -r$rev -d"$date" -w$author -t$tmpfile $file < $initialfile >>& $logfile 26081404Speter if ($status != 0) goto ERROR 26181404Speter echo initial rev checked into RCS 26281404Speter endif 26381404Speter else 26481404Speter # get RCS lock 26581404Speter set lckrev = `echo $rev | sed -e 's/\.[0-9]*$//'` 26681404Speter if ("$lckrev" =~ [0-9]*.*) then 26781404Speter # need to lock the brach -- it is OK if the lock fails 26881404Speter rcs -l$lckrev $file >>& $logfile 26981404Speter else 27081404Speter # need to lock the trunk -- must succeed 27181404Speter rcs -l $file >>& $logfile 27281404Speter if ($status != 0) goto ERROR 27381404Speter endif 27481404Speter echo got lock 27581404Speter sccs prs -r$rev $file | grep "." > $tmpfile 27681404Speter # it's OK if grep fails here and gives status == 1 27781404Speter # put the delta message in $tmpfile 27881404Speter ed $tmpfile >>& $logfile <<EOF 27981404Speter/COMMENTS 28081404Speter1,.d 28181404Speterw 28281404Speterq 28381404SpeterEOF 28481404Speter ci -f -r$rev -d"$date" -w$author $file < $tmpfile >>& $logfile 28581404Speter if ($status != 0) goto ERROR 28681404Speter echo checked into RCS 28781404Speter endif 28881404Speter sccs unedit $file >>& $logfile 28981404Speter if ($status != 0) goto ERROR 29081404Speter end 29181404Speter rm -f $file 29281404Speterend 29381404Speter 29481404Speter 29581404Speter############################################################ 29681404Speter# Clean up 29781404Speter# 29881404Speterecho cleaning up... 29981404Spetermv SCCS old-SCCS 30081404Speterrm -f $tmpfile $emptyfile $initialfile $sedfile 30181404Speterecho =================================================== 30281404Speterecho " Conversion Completed Successfully" 30381404Speterecho "" 30481404Speterecho " SCCS history now in old-SCCS/" 30581404Speterecho =================================================== 30681404Speterset exitval = 0 30781404Spetergoto cleanup 30881404Speter 30981404SpeterERROR: 31081404Speterforeach f (`sccs tell`) 31181404Speter sccs unedit $f 31281404Speterend 31381404Speterecho "" 31481404Speterecho "" 31581404Speterecho Danger\! Danger\! 31681404Speterecho Some command exited with a non-zero exit status. 31781404Speterecho Log file exists in $logfile. 31881404Speterecho "" 31981404Speterecho Incomplete history in ./RCS -- remove it 32081404Speterecho Original unchanged history in ./SCCS 32181404Speterset exitval = 1 32281404Speter 32381404Spetercleanup: 32481404Speter# leave log file 32581404Speterrm -f $tmpfile $emptyfile $initialfile $sedfile $revfile 32681404Speter 32781404Speterexit $exitval 328