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