New features of SCCS-5.08: With the upcoming SCCS-6.0 we introduce a new SCCS history file format that intentionally causes historic SCCS implementations to abort (to prevent file corruption) but that can be easily converted back into a SCCS-5.x compliant history file using a conversion program. This conversion does not cause a loss of information as the new information is encoded as special comment that is accepted by all other SCCS implementations except for the current version of GNU "CSSC". Since SCCS-5.04, the first (partial) support for the upcoming SCCS v6 history format has been introduced. See the file TODO_V6 for more information. Please join the discussion mainling list for the development of enhancements on: http://lists.sourceforge.net/lists/listinfo/sccs-devel sccs-devel@lists.sourceforge.de The next task for SCCS is to introduce a changeset file that brackets a group of single file changes into a change set related to a commit. New features included with SCCS-5.08: - ALL: README.compile now mentions how to compile with instrumented variants of existing compilers. - The makefile rules for installing man pages have been changed so that OBJ//man/ is no longer a direct dependency of the man page. This results in repeated "make install" calls not to reinstall up-to-date man pages again. - The makefile rules for installing localized sripts have been changed so hat OBJ// is no longer a direct dependency of the man page. This results in repeated "make install" calls not to reinstall up-to-date scripts again. - Support for ARM-64 (aarch64) was added - rules.dep (r-make.dep, r-smake.dep, r-gmake.dep) now create $(ARCHDIR)/man together with $(ARCHDIR) tp make shure this directory exists before someone calls "*make install" as root. - rules.dep (r-make.dep, r-smake.dep, r-gmake.dep) now make sure that $(ARCHDIR)/Dnull will not be touched in case it already exists. This prevents some unneeded file rebuilds if the make program is changed between two builds. Note that echo > $(ARCHDIR)/Dnull already enforces a shell (because the command contains a ">") and the use of an if statement thus does not cause extra costs. - $(ARCHDIR)/Dnull no longer depends on $(ARCHDIR), this prevents attempts to re-create $(ARCHDIR)/Dnull after an update in $(ARCHDIR) - it is now ensured that $(SRCROOT)/incs/Dnull will not be touched in case it already exists. - TEMPLATES/MKLINKS now creates a dummy link to allow it to recognise whether the links already exist. - The SCCS manpage sccsfile.4 has been changed to use bold text for the hanging tags on the first page. - All SCCS programs have been fixed to provide a sufficient amount of string space for the SID -> string conversion. AT&T used 32 bytes but historic SCCS was only planned for a maximum SID component value of 30000. That would need a string space of 24 bytes. Today, we permit max unsigned with 31 bit that needs a maximum string space of 44 bytes if all SID components use the maximum value (but this is impopssible). The maximum possible value (all components at aprox. 500000000) would still consume 40 bytes. - A new #define SID_STRSIZE (45) helps to avoid buffer overflows with large SIDs. Before, most SID string buffers have only been 32 chars. - When the SCCSv6 history format is used, negative GMT offsets (e.g. USA) are now printed correctly. This was a fix in libcomobj. - The SCCS struct packet now includes p_insser - the serial number for the last extracted line. - New SCCS source file sccs/lib/comobj/src/lhash.c implements a string hash for programmer names. - SCCS libcomobj now allows to keep a list of programmer names for each SID. This is done with hashed strings to limit the needed memory space for that operation. - The SCCS get command now implements an experimental option -A that annotates the gotten lines with programmer names and dates. - The SCCS get command restructured the code to make it cleaner. - Some tests in the directory sccs/tests have been modified to avoid error messages like rmdir: directory not empty. - SCCS admin fixed a bug that caused it in bulk mode (using -N) to cause checksum errors if the previous file was a binary file that had to be uuencoded. Admin now reinitializes the related variable on each new entry of the admin() function. - SCCS admin now also reads filenames from stdin if called "admin -N" (without '-') as sccs(1) also expands stdin to an arg vector and calling "sccs admin -N -" would cause sccs(1) to overflow the max. arg vector size. - SCCS sccs now avoids to print annoying "file not found" messages from libfind if called as "sccs -R clean". These messages were from the fact that "sccs clean" removes files that will be processed by libfind later. - SCCS sccs: fix(), unedit(), diffs(), enter(), editor() and istext() are now separate functions. "sccs editor" now checks whether EDITOR= points to a name from the sccs-Subcommands. The new diffs() code frees "args". - SCCS help2 has been fixed to no longer print: "Unrecognized locale... setting to English\n" as a result os a superfluous "/usr" in the help path that was left over from reorganizing the source to support the INS_BASE definition. - A new SCCS helpfile /ccs/lib/help/locale/C/sc has been introduced to the help system to allow sccs(1) specific help texts. - The SCCS function sinit() from libcomobj now implements more functionality with the openflag. There os now: SI_INIT -> 0 SI_OPEN -> 1 SI_FORCE -> 2 New to avoid the check toe s.filename - Some more sprintf() calls have been replaced by snprintf() - Some BUFSIZEd buffers are now MAXLINE as they are really line buffers. - Some MAXLINEd buffers are noe FILESIZE as they are file path buffers. - The MAX #define from sccs/sccs/hdr/defines.h has been removed and some of the uses have been replaced by MAXR,others by MAXL. - The #defined MAXLINE and FILESIZE from sccs/sccs/hdr/defines.h are now to be granted 8192 or more. - Some previous buffer overflows now create a fatal error. - Some new "common" error messages have been defined. - SCCS admin now correctly uses error number cm13 for the text: "resolved path too long (cm13)" instead of using cm11. - SCCS admin now allows "admin -N file1 file2" without complaining: "more than one file (ad15)" - SCCS admin now incorporates the get(1) code and thus is able to run a get operation immediately after initializeing a sccs history file while in a bulk init operation. This makes a bulk init more efficient than with calling admin(1) and get(1) one after the other. - SCCS admin implements two new bulk mode flags with -N: "-" remove the original g-file after initializing the related sccs history file. "+" remove the original g-file and replace it by a file that is retrieved by a get(1) operation from the new history file. "+" can be used together with the "," flag. - SCCS admin now supports get(1) like options -k and -w. Except for the code that is needed to support sccs history files in a separate tree under $PROJECT_HOME/.sccs/ admin now implements everything that is needed to support the upcomming sccs project mode. - SCCS admin now implements an experimental piece of code to emit change set lines as documented by changeset(4). To enable this code, call smake 'COPTX=-DTEST_CHANGE'. The changeset data is written to stderr. Note that it is still mixed with other diagnostic messages. A test discovered that on a 11 year old Opteron systen, the current state of the OpenSolaris source tree (~ 52000 files ~ 560 MB of data) takes ~ 15 seconds to enter into the SCCS using the bulk mode: find . -type f > names admin -V6 -fy -N-SCCS < names This makes SCCS the fastest revision control system available. - SCCS delta -q -f s.file works again as it did in the 1980s with Sun NSE. The call "delta -q -f ..." enforces a delta even when there is no p. file. The new revision number is computed using the same algorithm as with "get -e" when no newrevision is specified. Testing is recommended with: "delta -q -f -n s.file" to keep the g-file after creating the delta. Using SCCS this way works if there are no keywords to expand. - SCCS get now uses the keyword expansion code that was moved to libcomobj. - SCCS prs needed to change name for it's local idsetup() function as libcomobj now incorporates the different code of the same name from get(1). - SCCS delta now correctly inserts the right ghash checksum in SCCSv6 history format when called as: "delta -g ...". Note that with this delta usage, the checked out file intentionally differs from the checked in file and thus the checksum cannot be computed from the edited g-file, but must be computed for the checked out g-file. - SCCS delta now dupports to provide a prepared delta file using -Ddelta-file to tell delta(1) not to call get(1)+diff(1) but to apply the delta directly from the prepared file. This will be used in project mode to insert new lines at the top of the "changeset" file in an efficient way. - SCCS sccs now calls sethome() to check for a source tree in project mode. - SCCS sccs changed code like: if (!strcmp(cmd->sccsname, "deledit") to if (strcmp(cmd->sccsname, "deledit") == 0 - SCCS sccs now gies a better error message when struct sccsprog SccsProg[] contains content that has no implementation in the function command(). - SCCS sccs now introduces the experimental commands: add add specified files on next commit commit commit changes to project repository init initialize empty project repository remove remove specified files on next commit rename rename specified files on next commit status show changed files in the project to help introducing a project oriented behavior of sccs. Currently only "add" and "init" are implemented and "status" helps no more than to time a stat(2) call over all files in the name cache. Some hints for playing: add currently does not yet support libfind and thus you need to provide it a list of plain files. As there is a a ARG_MAX limitation and as the number of files in e.g. OpenSolaris is way beyond ARG_MAX even on Solaris that supports ore than other OS, I recommend to run: find . -type f | sccs add - init initialises the directories. By default, it marks the tree as "off-tree" repository where the SCCS history file for a/file is in .sccs/data/a/SCCS/s.file but admin(1) currrently ignores this and creates an "in-tree" repository. - SCCS admin changes some line buffer sizes from BUFSIZ -> MAXLINE - SCCS admin changes cat() (no length check) to strlcatl() when processing a -fl... argument. - SCCS admin changes cat() to strlcatl() in bulkprepare() - SCCS admin changes copy() to strlcpy() in bulkprepare() - SCCS admin fixed a bug that could cause admin in -V6 mode to assume that a file that has a null byte past a newline but before any other newline in a file to be non-binary. This caused such files not to be uuencoded and thus not restorable. - SCCS admin now supports a bulk-creation of many files using the new off-tree repository mode. In the off-tree mode, the SCCS history files are not on a subdirectory SCCS in the same directory as the sources but in a SCCS directory inside a shadow tree that starts in the directory ".sccs/data" in the project set home directory. - SCCS admin now manually null-terminates all buffers from resolvepath() - SCCS sccs now manually null-terminates all buffers from resolvepath() calls. - SCCS sccs when reading filenames from stdin for "sccs -" sccs(1) now uses a more efficient way to append the next argument to the list. This speeds up "find . -type f | sccs add -" by a factor os 200. - The SCCS compliance test "ei27" now expects "delta -g ..." to create correct ghash checksums for SCCSv6 history files. - SCCS delta now correctly uses the nanoseconds from the files timestamp when applying a delta in SCCSv6 mode using -o. - SCCS libcomobj:sethome() has been reworked to be able to look for a SCCS home set root directors relatively to arbitrary directories and not only for the current working directory. - SCCS libcomobj:idsubst.c new code that has been taken from the get(1) source to permit admin(1) to incorporate the get(1) code. - SCCS libmpw:xmkdir.c new function that checks for errors other than EEXIST. - SCCS libmpw:xmkdirs.c new function that checks for errors other than EEXIST. - SCCS hdr/defines.h New #define URAND_BASE for the epoche of time used to compute "unified random" numbers. At the same time, the value was changed from 0x40000000 to 0x50000000, making 2012 Jul 13 11:01:20 UTC the new base for the urand epoche. The change was done as this feature was defined in 2011 but not used until now. - SCCS New libcomobj functions urand_ab() and urand_ba() - SCCS New libcomobj functions change_ab() and change_ba() - SCCS libcomobj function auxf() noiw implements a new operator 'I' to return the full path for the g-file from the s.file. - SCCS libcomobj function set_init_path() now correctly computes the initial pathname for a file when admin(1) is not doing a chdir to the final directory in bulk (-M) mode. - libschily new functions strlcatl() and wcslcatl() - libschily::linkat.c now manually null-terminates the result from resolvepath() as the Solaris syscall implementation does not null-terminate it in all cases. - libschily::resolvepath.c comment added to remind on the fact that in contrary to out implementation the Solaris resolvepath() syscall does not null-terminate the buffer. - SCCS bulkprepare() and related functions have been moved to libcomobj to allow to use them in other SCCS commands as well. - SCCS get now also supports the -N bulk names option. Note that get -l does not yet work as expected together with -N - SCCS delta now also supports the -N bulk names option. - SCCS man pages now mention that the existence of a file "dump.core" in the current directory will cause a coredump with fatal errors. - SCCS the programs bdiff, delta, diff, sccs not use * macros to evaulate the wait(2) status. - SCCS: diff now returns correct line numbers for diff -U0 and inserted lines. This fixes a Solaris diff bug that is a result of a bug in the POSIX standard. Note that this bug affected patch(1) but not SCCS delta. - SCCS: diff now uses strftime() for diff -u where cftime() is missing. Thanks to David Clissold from IBM for reporting the wrong time format from the ctime() fallback. - SCCS: diff now includes a workaround for HP/UX strftime() that returns the %Z string for both %z and %Z. - SCCS: signal handling in mpwlib now has been enhanced and uses #ifdef's to avoid dealing with locally unsupported signals. The signal SIGBUS is now catched as well. - libschily/getargs.c now is more careful with calling va_arg() and only calls it as many times as a related format is found in the format string. - libschily now contains a getdelim() implementation and always uses getdelim() to implement the fgetaline() function. - libschily: the *mem.c implementations now include new *mexval() functions to set the exit code on failure to a static value instead of the default "errno" value for the failure. - libschily: the linker map file now also lists the forgotten new entries: strlcatl() and wcslcatl() - libfind: the forgotten entries find_hasexec() and find_hasprint() have been added to the linker map file - Support for x86_64-haiku-cc.rul and x86_64-haiku-gcc.rul was added to the makefile system. - The file RULES/r-gmake.dep was modified to make fure that the dependency files (*.d) depend from the include files as well. Previous versions included xxx.d instread of $(ARCHDIR)/xxx.d - Makefile system: two new targets have been addes: man creates localized versions of the man pages in the OBJ directory installman installs only the manual pages - Added support for cygwin32_wow (not the already present cygwin32_wow64). - The makefile system now allows to use: COPTX=-DNO_PRAGMA_WEAK to disable the use of #pragma weak. This may help to debug some oddities of the GNU linker. - The makefile system now includes a new test that needs constraints that are not really supported by autoconf: it checks whether the linker supports to link against external weak symbols in another file. For this reason, a handcrafted complest was written. This (currently) should fail on Cygwin due to a Cygwin bug. A platform that allows to link against weak symbols defines HAVE_LINK_WEAK. This permits the system to automatically detect usability once e.g. linking on Cygwin will be fixed. Thanks to Thomas Plank for reporting the known #pragma weak problem in a new source file (libschily/error.c). Note that error() is a UNIX (UNOS) libc function that exists since 1980 but some libc implementors do not follow the rule not to introduce incompatible interfaces for existing names. So we need to find a workaround on these platforms. - autoconf now checks for the type rlim_t in sys/resource.h - libschily and libmdigest now use the test: #if defined(HAVE_PRAGMA_WEAK) && defined(HAVE_LINK_WEAK) to prevent assuming that is suffucuent when the compiler supports #pragma weak. We also need to have a linker that links against weak symbols in libraries. HAVE_LINK_WEAK is e.g. not defined on Cygwin... - libschily/comerr.c and libschily/fcomerr.c now have better comment. - README.compile now includes an example on how to cross compile on Linux for Android. - include/schily/find.h modified to avoid a GCC warning from using libfind in the Bourne Shell. - include/schily/dlfcn.h modified to avoid a GCC warning from the new builtin management code in the Bourne Shell. - libschily/resolvepath.c now #define's lstat stat if lstat() is missing. - libschily/error.c now allows to be compiled without weak symbols by using -DNO_WEAK_SYMBOLS - libschily/spawn.c:wait_chld() no longer returns 0 if the child process was killed by a signal. - libschily now adds some of the existing (old) man pages for various functions from libschily. - libfind/idcache.c now saves uname/gname as long as possible and uses strlcpy() instead of strncpy(). - Support for Win-10 when compiling with non automake-aware make implementations like "gmake" was added. - man2html: This was added to schilytools as the original man2html command has a bug with processing sub-sections and as the original man2html is completely unmaintained since August 12 1997. - man2html: subsections are now handled correctly and may be longer than a single character. - include/schily/stat.h now includes #define lstat stat in case lstat() does not exist on the current platform. - include/schily/stat.h now correctly #defines and uses S_IFCTG and S_ISCTG instead of the S_IFCNT and S_ISCNT which have been erreneously introduced in 1998. - include/schily/mconfig.h: fixed a typo - include/schily/resource.h: added comment to the struct rusage members that are unsopported on Solaris. - include/schily/dbgmalloc.h: Added a workaround for source files that first #include and thus have no viable BOOL defintion while is included. This now permits to compile the whole libschily with smake COPTX=-DDBG_MALLOC LDOPTX=-ldbgmalloc in order to debug malloc()/free() calls. - libfind: added a workaround for a Linux/gcc bug that causes a variable that has been initialized to NULL to have a value != NULL in doexec() when calling free(aav) even though that variable was never assined a value != NULL before. This prevents a core dump with libfind when calling: find /usr/include -type f -exec grep 123abc {} \; - libfind: a final workaround for the problems with vfork() in the linux system include files has been introduced and a variable has been declared volatile. - include/schily/signal.h now includes siginfo.h to make sure it compiles even on very old Solaris versions where signal.h did not yet include siginfo.h. - include/schily/wait.h add a missing closing bracket for Haiku - include/schily/wait.h added CLD_* macros and the enum idtype_t in case they are missing. This allows to implement a waitid() emulation. - include/schily/wait.h now includes schily/signal.h in case that the local /usrinclude/sys/wait.h is non-POSIX and does not define siginfo_t. This is e.g. the case on FreeBSD. - The configure tests now include test that correctly identify Mac OS X as non-POSIX with respect to waitid(). This prevents potential users of waitid() from the unusable implementation on Mac OS X. The rule for accepting an existing waitid() is the following: - si.si_pid is set to be equal to the awaited pid - si.si_code == CLD_EXITED for a chilt terminated by exit(2) - si.si_status contains at least 16 bits from the exit(2) code. This is still not POSIX but better than what we would get from a historical wait*() call. - The configure tests now check for the new FreeBSD wait6() and for idtype_t. - A new symlink for x86_64-cygwin32_nt-gcc.rul was added - A autoconf test that caused a hang on newer Cygwin versions has been disables as it seems that Cygwin is unmantained and does not fix bugs even within several years. - libgetopt now supports long only options. - patch now uses STD*_FILENO macros instead od 0, 1, 2. - patch added a security fix say(buf) -> say("%s", buf) as buf is text that was read from stdin before. - patch no longer uses atol() to parse line numbers in patches as atol() does not include a range overflow indication. A new function atolnum() was written to replace atol(). - patch no longer tries to apply a patch to a place where no match was found at all. This usually happens with patches without context that need fuzzy matching. Previous patch versions tried fuzzy matching and under some conditions returned a "match" even though the loop with the match code was never entered. - patch no longer exit()s with -1 by default. This was a bug introduced when we where trying to avoid to cause wait() to report "exit code 0" just because wait() (in contrary to waitid()) limits the exit code to 8 bits and only the lower 8 bits have been 0. - The patch usage output for the POSIX variant now mentions the -u option. - The patch man page now mentions all names: "patch", "spatch", "opatch" and "sccspatch" and explains whether they behave like POSIX or like an enhanced original patch program from Larry Wall. - Patch: The arbitrary limit MAXHUNKSIZE has been removed - Patch: the previous line length limit (8192 bytes) has been removed. patch now supports an arbitrary line length as long as memory serves. - Patch: An "out of memory" situation is now handled more carefully. Recovery from Pan A to Plan B may now work again. - Patch: exit() codes are now POSIX compliant. - Patch: The man page now documents the differences between patch, traditional patch and gpatch. - Patch: The method to detect ED scripts was enhanced. Before, patch could believe that parts of a multi patch script were comment where the same patches put into separte files worked fine. - Patch: The man page now documents the patch file format and the filename determination algorithm. - Patch: A typo from the old ages from before 1990 was fixed. Patch no longer complains about a non-existing write error on stdout. - Patch: New option -W with the folowing meaning: -W+ Allow extensions to the strict POSIX behavior. -W is the POSIX option reserved to vendor unique behavior so implementing -W is OK for a strict POSIX program. -Wall Revert to old Larry Wall behavior. This currenty only affects the algorithm for Filename Determination and causes patch to use the shortest name from old and new name. The default it to let the original filename win. -Wposix Switch tp POSIX behavior - Patch: If called as "sccspatch", patch now defaults to POSIX behavior with extensions enabled. "patch" and "spatch" default to strict POSIX as before and "opatch" defaults to pre-POSIX behavior except for the filename determination. - Patch: If there is a failing "normal" patch that starts with a delete only hunk, patch no longer tries to reverse the patch as a context free insertion will always succeed but makes no sense. - Patch: now passes extensive systematic tests that use random files with random differences. - Patch: Version is now 3.0 - Patch: A function pfatal() that uses strerror() has been added to get better error messages for syscall errors. - Patch: New option -W-posix allows to revert the effect os a previous -W+ and -Wposix option. - Patch: is*() functions like isspace() now get an argument that is casted to unsigned char. This avoids strange effects with chars > 127. - Patch: Support to parse the time format from diff -c was added. - Patch: Now all numbers are checked for lexcalical correctness - even those that are parsed from command line switches. - Patch: The verbosity has been reduced in the default case. Patch hunks that apply without offset and without fuzz are no longer mentioned by default. To get the old behavior, use patch -vv - Patch: Some unit tests have been added to the directory patch/tests/. To use them: chdir patch/tests and then call "make". There are two test methods: basic handcrafted tests to check specific behavior random automated tests that create random diffs and apply them to files to check whether unpredictable patches work as expected. Note that gpatch (the GNU patch implementation) does not pass our tests because of POSIX deviations and bugs. - Patch: The license is now definitively compatible to the OpenSource.org rules. We now use a 1-clause BSD license with permission from Larry Wall. This replaced the original patch license from 1984. Thank you Larry! - Patch: version has been bumped to 3.1 SCCS-5.08 is 2.5x faster than Sun SCCS and consumes 4.7x less CPU time than Sun SCCS. SCCS-5.08 is 2x..50x faster than GNU CSSC and needs 4x..10x less memory than GNU CSSC. SCCS-5.08 is 6x faster than RCS-5.8 and consumes 7x less CPU time than RCS-5.8. For RCS files > 256 kB, add factor of 2x to CPU times when you use RCS-5.8. SCCS now has been tested to compile and work on the following platforms: - SunOS-4.x - SunOS-5.x (Solaris 2.x, 7, 8, 9, 10, 11) - FreeBSD - HP-UX - Linux - Mac OS X - AIX - IRIX - VMS - Cygwin The portability now reached a state that should allow SCCS to compile and run on other platforms too. SCCS compiles and has been verified on all major platforms.