{seismo,sdcsvax}!esosun!pete (Pete Ware) (619) 458-2520
>Is RCS fading away? Who is distributing it with their systems
>these days -- Sun and Alliant do not. I always thought RCS
>had more features and is faster then SCCS; why does Sun prefer
>SCCS? On what machines can I count on make supporting
>either RCS or SCCS?
Ultrix-32 has both SCCS and RCS. RCS is under the Unsupported subsets
while SCCS is Supported. (Read warrantied for support...) By the
way, SCCS with Ultrix is System V's SCCS, not the one distributed with
BSD. I don't use either enough to comment on why one is better than
the other.
Fred
UTek comes with RCS, and we use it extensively internally.
SCCS is also provided.
Snoopy
tektronix!doghouse.gwd!snoopy
sno...@doghouse.gwd.tek.com
Disclaimer: This is me speaking, not Tektronix.
Is RCS fading away? Who is distributing it with their systems
these days -- Sun and Alliant do not. I always thought RCS
had more features and is faster then SCCS; why does Sun prefer
SCCS? On what machines can I count on make supporting
either RCS or SCCS?
Sequent distributes RCS as part of their system. They are basically
4.2 based, altho they run Doug Gwyn's System V emulation, supporting
parallel `universes' much like Pyramid does.
Sequent also distributes GNU EMACS as User Contributed software.
I don't know why SUN doesn't, altho they seem bent towards Unipress
in a lisp distribution I saw. I guess vendors stick together.
(Root Boy) Jim Cottrell <r...@icst-cmr.arpa>
National Bureau of Standards
Flamer's Hotline: (301) 975-5688
Define "fading away". Have people *stopped* providing or supporting it?
If it's just that some people never *started* providing it or
supporting it, this can hardly be said to indicate that it's "fading
away".
> I always thought RCS had more features and is faster then SCCS; why does
> Sun prefer SCCS?
Define "prefer". We use SCCS in house, for what is probably a
combination of technical and historical reasons. We only supply SCCS
with our systems, probably because we don't want to have to support
the user-supplied software that comes with 4.3BSD (note that DEC
doesn't support RCS, either, they just supply it - see the article
from Frederick Avolio of DEC). In short, we "prefer" to use SCCS,
and we "prefer" not to have to support RCS.
RCS has features that SCCS doesn't, and *vice versa*; the only really
big feature that RCS has and SCCS doesn't that I wish SCCS did is
symbolic version numbers.
RCS is faster for the common case where you're retrieving the latest
version, although SCCS is faster for retrieving earlier versions and,
I'm told, when dealing with branches. (The time to retrieve a
version from SCCS is pretty much constant; the time to retrieve a
version from RCS increases the older the revision or, more generally,
the more changes have to be applied to the version "currently" stored
in the RCS file.)
If you have the source to the version of RCS that came with 4.3BSD,
and are running SunOS 3.2 or later, you can bring up RCS by applying
a patch to keep it from dereferencing a null pointer. It won't be
supported by us, but as I mentioned other people don't support RCS
either, even though they supply it.
Here's the patch; it also includes other bug fixes from Jay Lepreau,
Ray Chen, and me:
diff -c old/ci.c new/ci.c
*** old/ci.c Tue Jan 27 13:43:23 1987
--- new/ci.c Tue Jan 27 13:58:01 1987
***************
*** 123,128 ****
--- 123,129 ----
{
register int i;
register char * sp, *tp;
+ char * nametest;
char * cmdusage; /* holds command format */
char command[NCPPN+50]; /* holds diff commands */
char curdate[datelength];/* date for new delta */
***************
*** 194,200 ****
if ((*argv)[2]!='\0'){
if (symbol!=nil)warn("Redefinition of symbolic name");
symbol = (*argv)+2;
! checkid(symbol,' ');
} else warn("Missing name for -n option");
break;
--- 195,202 ----
if ((*argv)[2]!='\0'){
if (symbol!=nil)warn("Redefinition of symbolic name");
symbol = (*argv)+2;
! if (!(nametest=checkid(symbol,' '))||*nametest)
! faterror("Name %s must be one word",symbol);
} else warn("Missing name for -n option");
break;
***************
*** 203,209 ****
if ((*argv)[2]!='\0'){
if (symbol!=nil)warn("Redefinition of symbolic name");
symbol = (*argv)+2;
! checkid(symbol,' ');
} else warn("Missing name for -N option");
break;
--- 205,212 ----
if ((*argv)[2]!='\0'){
if (symbol!=nil)warn("Redefinition of symbolic name");
symbol = (*argv)+2;
! if (!(nametest=checkid(symbol,' '))||*nametest)
! faterror("Name %s must be one word",symbol);
} else warn("Missing name for -N option");
break;
diff -c old/rcs.c new/rcs.c
*** old/rcs.c Tue Jan 27 13:43:25 1987
--- new/rcs.c Tue Jan 27 13:56:32 1987
***************
*** 988,993 ****
--- 988,995 ----
trail = &dummy;
while (next!=nil) {
numr = strcmp(num, next->delta->num);
+ if (num!=nil)
+ numr = strcmp(num, next->delta->num);
if ((whor=strcmp(who,next->login))==0 &&
(num==nil || numr==0))
break; /* found a lock */
diff -c old/rcsdiff.c new/rcsdiff.c
*** old/rcsdiff.c Tue Jan 27 13:43:26 1987
--- new/rcsdiff.c Tue Jan 27 13:55:10 1987
***************
*** 2,8 ****
* RCS rcsdiff operation
*/
static char rcsid[]=
! "$Header: rcsdiff.c,v 3.7 86/05/19 02:36:16 lepreau Exp $ Purdue CS";
/*****************************************************************************
* generate difference between RCS revisions
*****************************************************************************
--- 2,8 ----
* RCS rcsdiff operation
*/
static char rcsid[]=
! "$Header: rcsdiff.c,v 3.8 86/06/18 15:02:32 lepreau Exp $ Purdue CS";
/*****************************************************************************
* generate difference between RCS revisions
*****************************************************************************
***************
*** 20,25 ****
--- 20,29 ----
/* $Log: rcsdiff.c,v $
+ * Revision 3.8 86/06/18 15:02:32 lepreau
+ * I broke -c<number> in last rev.
+ * Also, mixing a bopt with an otheropt was broken.
+ *
* Revision 3.7 86/05/19 02:36:16 lepreau
* Pass on new diff options, and allow them to be clustered.
*
***************
*** 42,47 ****
--- 46,52 ----
* Initial revision.
*
*/
+ #include <ctype.h>
#include "rcsbase.h"
static char rcsbaseid[] = RCSBASE;
***************
*** 56,61 ****
--- 61,67 ----
char * temp1file, * temp2file;
char bops[10] = "-";
+ char otherops[10] = "-";
main (argc, argv)
int argc; char **argv;
***************
*** 75,81 ****
register c;
catchints();
! otheroption="";
boption = bops + 1;
cmdid = "rcsdiff";
cmdusage = "command format:\n rcsdiff [-biwt] [-cefhn] [-rrev1] [-rrev2] file";
--- 81,87 ----
register c;
catchints();
! otheroption = otherops + 1;
boption = bops + 1;
cmdid = "rcsdiff";
cmdusage = "command format:\n rcsdiff [-biwt] [-cefhn] [-rrev1] [-rrev2] file";
***************
*** 106,113 ****
case 'f':
case 'h':
case 'n':
! if (*otheroption=='\0') {
! otheroption= argp-2;
} else {
faterror("Options c,e,f,h,n are mutually exclusive");
}
--- 112,126 ----
case 'f':
case 'h':
case 'n':
! if (otheroption == otherops + 1) {
! *otheroption++ = c;
! if (c == 'c' && isdigit(*argp)) {
! while (isdigit(*argp))
! *otheroption++ = *argp++;
! if (*argp)
! faterror("-c: bad count");
! argp = "";
! }
} else {
faterror("Options c,e,f,h,n are mutually exclusive");
}
***************
*** 117,125 ****
};
} /* end of option processing */
if (boption != bops + 1) {
! *boption = ' ';
boption = bops;
}
if (argc<1) faterror("No input file\n%s",cmdusage);
/* now handle all filenames */
--- 130,142 ----
};
} /* end of option processing */
if (boption != bops + 1) {
! *boption = ' ';
boption = bops;
}
+ if (otheroption != otherops + 1) {
+ *otheroption = ' ';
+ otheroption = otherops;
+ }
if (argc<1) faterror("No input file\n%s",cmdusage);
/* now handle all filenames */
***************
*** 166,172 ****
}
if (revnums<=1) {
temp2file=workfilename;
! diagnose("diff %s%s -r%s %s",boption,otheroption,xrev1,workfilename);
} else {
temp2file=mktempfile("/tmp/",TMPFILE2);
diagnose("retrieving revision %s",xrev2);
--- 183,189 ----
}
if (revnums<=1) {
temp2file=workfilename;
! diagnose("diff %s%s-r%s %s",boption,otheroption,xrev1,workfilename);
} else {
temp2file=mktempfile("/tmp/",TMPFILE2);
diagnose("retrieving revision %s",xrev2);
***************
*** 176,184 ****
error("co failed");
continue;
}
! diagnose("diff %s%s -r%s -r%s",boption,otheroption,xrev1,xrev2);
}
! sprintf(command,"%s %s %s %s %s\n",DIFF,boption,
otheroption, temp1file, temp2file);
exit_stats = system (command);
if (exit_stats != 0 && exit_stats != (1 << BYTESIZ)) {
--- 193,201 ----
error("co failed");
continue;
}
! diagnose("diff %s%s-r%s -r%s",boption,otheroption,xrev1,xrev2);
}
! sprintf(command,"%s %s%s%s %s\n",DIFF,boption,
otheroption, temp1file, temp2file);
exit_stats = system (command);
if (exit_stats != 0 && exit_stats != (1 << BYTESIZ)) {
diff -c old/rcsutil.c new/rcsutil.c
*** old/rcsutil.c Tue Jan 27 13:43:31 1987
--- new/rcsutil.c Tue Jan 27 13:51:20 1987
***************
*** 178,188 ****
void catchints()
{
! signal(SIGINT,catchsig); signal(SIGHUP,catchsig);
! signal(SIGQUIT,catchsig); signal(SIGPIPE,catchsig);
! signal(SIGTERM,catchsig);
}
void ignoreints()
{
signal(SIGINT,SIG_IGN); signal(SIGHUP,SIG_IGN);
--- 178,196 ----
void catchints()
{
! cksignal(SIGINT); cksignal(SIGHUP);
! cksignal(SIGQUIT); cksignal(SIGPIPE);
! cksignal(SIGTERM);
}
+
+ cksignal(sig)
+ int sig;
+ {
+ if (signal(sig,SIG_IGN) != SIG_IGN)
+ VOID signal(sig,catchsig);
+ }
+
void ignoreints()
{
signal(SIGINT,SIG_IGN); signal(SIGHUP,SIG_IGN);
***************
*** 204,210 ****
while ((--inf->_cnt)>=0) {
putc(*inf->_ptr++&0377,outf);
}
! fflush(outf);
/*now read the rest of the file in blocks*/
while ((rcount=read(fileno(inf),buf,BUFSIZ))>0) {
--- 212,220 ----
while ((--inf->_cnt)>=0) {
putc(*inf->_ptr++&0377,outf);
}
! if (fflush(outf) == EOF) {
! faterror("write error");
! }
/*now read the rest of the file in blocks*/
while ((rcount=read(fileno(inf),buf,BUFSIZ))>0) {
Guy Harris
{ihnp4, decvax, seismo, decwrl, ...}!sun!guy
g...@sun.com
The SCCS distributed with System V is infinitely superior to the one
distributed with BSD, for one simple reason - the one distributed
with BSD doesn't exist. The "sccs" front-end command is distributed
with 4BSD, but none of the SCCS commands are. (This raises an
interesting question about "dual-universe" systems - do they supply
the "sccs" front end only in the 4BSD universe and the SCCS commands
only in the System V universe, and if so can the "sccs" front end use
the SCCS commands?)
On Pyramid's dual port, anyway, we just used hard links to bring all the SCCS
commands from /usr/bin in the System VR3 universe (/usr/.attbin) into /usr/bin
in the BSD universe (/usr/.ucbbin). That seemed to be what most users wanted,
and those that don't like it are encouraged to make libaral use of rm. :-)
The alternatives would be to either run the BSD sccs command in the 'att'
universe,
att /usr/.ucbucb/sccs
or to add /usr/.attbin to the PATH environment variable. I do this anyway, so
that I get the BSD versions of commands when they exist, but I automatically
get SVR3-unique commands too. Most other dual-ports should behave similarly.
(Note that system calls and libraries are bound at load time, while directory
trees are determined at run time.)
BTW, Pyramid also provides RCS as a fully-supported product. We've also made
local enhancements (such as preservation of m_time on checkin and checkout).
It lives in /usr/new, which is visible from both universes.
<csg>
Fading away means it is available at proportionally fewer sites compared
to some short time ago. Dying means it is availabe at fewer sites then
some short time ago.
>Define "prefer".
Preferring SCCS means it is used in house and supported whereas RCS
is not used in house and is not provided. I certainly sympathize with
not wanting to support two source control systems, however I would
like to be able to choose one or the other (even if one is not supported).
I was looking for a technical reason (which is why I sited Sun, because
I knew they used SCCS and I knew you (Guy) would provide a response)
for using SCCS vs RCS. The chief argument against RCS is that SCCS is
more widely available (and supported). On the other hand, I was hoping
to get a slew of responses saying, "Yes, RCS is supported/provided on
our machine" and remove this argument against RCS.
> (The time to retrieve a
>version from SCCS is pretty much constant; the time to retrieve a
>version from RCS increases the older the revision or, more generally,
>the more changes have to be applied to the version "currently" stored
>in the RCS file.)
>
I thought the time to retrieve a version from SCCS was proportional
to the number of changes since the original version was created. In
other words, a lot of versions implies slow retrieve time for SCCS.
I'd imagine the time to retrieve intermediate versions (i.e. between 1.1
and the current version) is completely dependant on the number of changes
between (1.1 for SCCS and current version of RCS) and the desired version.
I mentioned make because I also wanted to know those systems that I
can count on typing "make" and have it retrieve the appropriate files
from SCCS/RCS without having to go and check out every file in sight.
Thanks for posting the diffs. I'm sure many people will appreciate it
What if it's available at more, but proportionally fewer, sites than
some short time ago? "Fading away" is a loaded term, implying that
it is losing favor; it may just not be *gaining* sufficient favor to
encourage more vendors to adopt it.
> I thought the time to retrieve a version from SCCS was proportional
> to the number of changes since the original version was created. In
> other words, a lot of versions implies slow retrieve time for SCCS.
> I'd imagine the time to retrieve intermediate versions (i.e. between 1.1
> and the current version) is completely dependant on the number of changes
> between (1.1 for SCCS and current version of RCS) and the desired version.
Nope. The time to retrieve a version from SCCS is proportional to
the size of the file, and to the number of lines that have been
changed in all the versions checked in, but is independent of the
version being retrieved. SCCS does not store forward "diff"s; it
stores text lines, and control lines that say "the next batch of
lines first appear in version N", "the next batch of lines disappear
in version M", etc..
Someone on campus at University of Illinois did some comparisions between
revision control systems. I forget what program it was that was chosen as the
best, but I do remember that RCS was better rated than SCCS.
Patrick Wolfe internet: p...@kai.com
System Manager uucp: seismo!kailand!pat
Kuck & Associates, Inc. bitnet: pat%kailand@uiucuxc
1808 Woodfield Dr. csnet: pat%kailand%u...@uiuc.csnet
Savoy, IL 61874 milnet: pat%kai...@uiucuxc.arpa
(217) 356-2288 telex-2: 9102409772
Well, if you're willing to forego the RCS directory (TDI's and ncoast's
versions of SCCS don't have subdirectories, so I never bothered to use
RCS subdirectories), you can build RCS-handling make dependencies. I
generally put an "include $(HOME)/.makedefs" in my Makefiles; this file
sets SHELL to /bin/sh (since I use csh) and sets up the following rules:
CO = co
.SUFFIXES: .c,v .h,v
.c,v.o:
$(CO) -q $*.c
$(CC) $(CFLAGS) -c $*.c
/bin/rm -f $*.c
.c,v.c:
$(CO) -q $*.c
.h,v.h:
$(CO) -q $*.h
It works fine, with a standard SysIII/SysV augmake. The only minor problem is
that .h files checked out don't get removed afterward; I usually keep .h files
checked out anyway, so it doesn't bother me much.
++Brandon
--
Copyright (C) 1987 Brandon S. Allbery. Redistribution permitted only if the
redistributor permits further redistribution.
---- Moderator for comp.sources.misc ----
Brandon S. Allbery {decvax,cbosgd}!cwruecmp!ncoast!allbery
aXcess Company {ames,mit-eddie,talcott}!necntc!ncoast!allbery
6615 Center St. #A1-105 necntc!ncoast!all...@harvard.HARVARD.EDU
Mentor, OH 44060-4101 +01 216 974 9210 (also eddie.MIT.EDU)
1. Make all dependencies explicit in the makefile. The best way
is to generate them automatically with one of the "make depends"
hacks that are floating around the network. On 4.3 systems you
can use "cc -M" to generate a list of dependencies.
2. Add a ".DEFAULT" entry to your makefile that tries to check
out the "to be made" file.
This scheme works even with the use of an RCS directory. For example,
under 4.3 you can use:
----------------------- START OF EXAMPLE ------------------------
depends: all your source files
mv -f Makefile Makefile.orig
(sed -e '/^#DEPENDS/,$$d' Makefile.orig ; \
echo "#DEPENDS" ; \
cc -M $(CFLAGS) $$< \
) > Makefile
.DEFAULT:
co -q $@
------------------------ END OF EXAMPLE -------------------------
If you don't have "cc -M", you can replace it with call to the
following shell script (cc -E just invokes "cpp"):
----------------------- START OF SCRIPT ------------------------
#! /bin/sh
#
# Produce a list of object file dependencies from a list of sources.
#
# depends [options] name...
#
options=
while true
do
case "${1-xxx}" in
-I|-o)
options="$options $1 ${2?No second argument for -I}"
shift; shift
;;
-*)
options="$options $1"
shift
;;
*)
break
;;
esac
done
for file in $@
do
object=`expr "$file" : "\(.*\)\..*"`.o
if test ".o" = "$object"
then
object="$file.o"
fi
cc $options -E $file | sed -n -e "s/^# 1 \"\(.*\)\"\$/$object: \1/p"
done
------------------------ END OF SCRIPT -------------------------
-- Jim
--
(Grapevine) mayer.wbst (Arpa) mayer...@Xerox.com
(NS) mayer:wbst128:xerox (Phone) (716) 422-9407
(UUCP) {seismo|allegra}!rochester!rocksanne!mayer
The -I flag takes the include path without a space, i.e.,
cc -I. -I../h foo.c
so this should be modified a bit.
> object=`expr "$file" : "\(.*\)\..*"`.o
> if test ".o" = "$object"
> then
> object="$file.o"
> fi
> cc $options -E $file | sed -n -e "s/^# 1 \"\(.*\)\"\$/$object: \1/p"
This last fails if "$file" contains slashes:
... -I. -I../h ../gorp/foo.c
Here is the script I provide with the current ctex. I avoided `cc
-E', assuming that the -E option may not exist in some `cc's. It
should be obvious how to change this as appropriate for your system.
The dependency extraction scheme here is rather more complex, so
as to depend less upon whatever features are peculiar to the Reiser
cpp. Whether it will be successful is another matter.
: getdep - get dependency lists.
: change ":" comments to "#" comments if your shell supports those;
: the result will run faster.
: find cpp
cpp=unknown
for where in /lib /usr/lib /bin /usr/bin; do
if test -f $where/cpp; then cpp=$where/cpp; break; fi
done
if test $cpp = unknown; then
echo "I cannot find cpp, sorry" 1>&2; exit 1
fi
: handle arguments
incl=
for i
do
case "$i" in
-I*)
incl="$incl $i";;
*)
: assume source file
: put '$dep' in front of dependencies
dep=`echo "$i" | sed -e 's,/,\\\\/,g' -e 's/\.c$/.o/'`
: Find includes, remove leading numerics, remove ./,
: remove double quotes, and remove trailing numerics.
: Sort that, discarding duplicates, and add '$dep'.
$cpp $incl "$i" | grep "^#" |
sed -e 's/# [0-9]* //' -e 's,"./,",' -e 's/"\(.*\)"/\1/' \
-e 's/ [ 0-9]*$//' |
sort -u | sed -e "s/^/$dep: /";;
esac
done
--
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7690)
Domain: ch...@mimsy.umd.edu Path: seismo!mimsy!chris
OK, here goes...
"Yes, RCS is supported/provided on our machines."
(Both provided and supported.)
(Then again, so is SCCS...)
--
///==\\ (No disclaimer - nobody's listening anyway.)
/// Roger B.A. Klorese, CELERITY (Northeast Area)
\\\ 40 Speen St., Framingham, MA 01701 +1 617 872-1552
\\\==// celtics!ro...@seismo.CSS.GOV - seismo!celtics!roger
If your flavor of make has a .PREFIXES list, you can use RCS subdirectories,
too. Just add this .PREFIXES list:
.PREFIXES: ./RCS
Then, if make can't find the RCS (,v) file in the current directory, it'll
look in the ./RCS subdirectory. Since "co" doesn't mind checking out files
from other directories, this trick works great.
--Jerry Peek
uucp-style: {allegra,decvax,hplabs,ihnp4,ucbvax}!tektronix!tektools!jerryp
Domain-style: jer...@tektools.TEK.COM
I don't speak for Tektronix or its employees.