New features of SCCS-5.09: 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. WARNING: the last separate sccs release has been 5.08 and this release was published in 2015. Since then, frequent SCCS updates have been available inside the "schilytools" tar ball. In case the "schily"-libraries are going to be installed as shared libraries, is highly recommended to install SCCS from the "schilytools" bundle instead of using this SCCS only archive. This is the only way to have the commonly used code always at a recent development state. New features included with SCCS-5.09a01: - README.compile: added documentation on how to compile with clang - README.compile: completely reworked - README.SCCS has been enhanced and now documents compile time and installation options. - README.SCCS: Added hints on how to recompile for a new install path - "cstyle", "installman" and other new targets have been added to the makefile system - New make rules for the "Bitrig" BSD distro - New make rules for the "Minix" - New make rules to permit 32 and 64 bit compilations on AIX - GCC makefile rules now all use the universal rule for 32 and 64 bit compilation - Support for WIN-NT-6.x added (Win-DOS Server 2008 ... Win-DOS 10) - Rules for the automated testing "make tests" added to the makefile system - Rules for files names from versioned libraries have been added - Rules for versioned libraries on Linux and NetBSD have been added - Rules for OS400 have been added - Rules for the enhanced SunPro Make have been added - autoconf: Various new configure tests - Schily Makefilesystem: Shared libraries now may have different numbers than "1" as part of the file name if the related Makefile includes definitions for SHL_MAJOR and SHL_MINOR. Plenty of RULES files have been updated to make this change effective. This is needed as we needed to introduce a binary incompatible libfind. See libfind below. All libs used to be hardwired to the filename "libxxx.so.1". Adding a SHL_MAJOR=2 to the shared library makefile (see libfind/shlfind.mk) ressults in a "libfind.so.2". - Schily Makefilesystem: Shared libraries for HP-UX are no longer only *.sl files but *.sl.$(SHL_MAJOR) with a symlink from *.sl to *.sl.$(SHL_MAJOR). - Schily Makefilesystem: Before the locale envorinment is set to "C", we now keep saved versions with the original content under OLD_LC_* - inc/avoffset.c: workaround against a clang bug that causes core cumps - sha3 support added to libmdigest - include/schily/wait.h reworked - include/schily/stdint.h & include/schily/utypes.h: added a workarounf for a Solaris _CHAR_IS_SIGNED / _CHAR_IS_UNSIGNED Bug - include/schily/stdio.h enhanced to include speed up code got getc() with Solaris 64 bit compilations. - New autoconf test for haiku posix/malloc.h - New autoconf test for arpa/aixrcmds.h - New autoconf test for tcgetsid() - New autoconf test whether waitpid() supports NOWAIT - New autoconf test whether we have d_type in struct dirent - inc/align_test.c workaround for wrong "unused" GCC warning - inc/getfp.c workaround for a address sanitizer bug - include/schily: new files: getopt.h getopt.mk strar.h strar.mk - include/schily/checkerr.h: Added E_ICONV - include/schily/fcntl.h: Linux uses O_PATH instead of the POSIX O_SEARCH - include/schily/find.h: various interface enhancements - include/schily/getargs.h: various interface enhancements - include/schily/maxpath.h: fixed some typos - include/schily/mconfig.h: Added ASAN support - include/schily/stdint.h: Use a new macro for Two's complement machines to avoid undefined C behavior - include/schily/walk.h: various interface enhancements - include/schily/values.h: new include file. - include/schily/dbgmalloc.h: added more prototypes for libdbgmalloc. - libschily/astoul.c added - libschily/jsdprintf.c added - libschily/movecbytes.c added - libschily/cmpbytes.3 added - libschily/cmpbytes.mk3 added - libschily/fgtcomerr.c added - libschily/format.h added - libschily/fpoff.c added - libschily/fstatat64.c added - libschily/gtcomerr.c added - libschily/gterror.c added - libschily/gtprintf.c added - libschily/matchmb.c added - libschily/matchmbl.c added - libschily/openat64.c added - libschily/ovstrcpy.c added - libschily/putenv.c added - libschily/unsetenv.c added - libschily/waitid.c added - libschily/wctype.c added - libschily/astoi.c and libschily/astoll.c now check for overflows and report ERANGE - libschily/*printf.c now support a locale dependent decimal separator - libschily/format.c (the printf worker code) has been enhanced to be faster with STDIO on most platforms. - libschily: getargs, getallargs and getfiles man pages have been reworked - libschily/getargs.c: combined single char boolean flags now work with callback type formats. - libschily/searchinpath.c added a new flag SIP_NO_STRIPBIN - libschily::breakline() fixed a bug that caused the return code to be larger than the number of array elements in some cases. - libschily::checkerr() added new category "ICONV" - libschily::comerr() A new environemtn variable "COMERR_EXCODE" disables exit code mapping of codes that cannot be returned via the outdated waitpid() call. - libschily::opendir() added a missing nul byte for the Win32 opendir() emulation - libschily::format() the schily printf implementation now prints floating point numbers in a POSIX compliant way. - libschily::fnmatch() a new algorithm avoids recursion and is much faster. - libschily::fnmatch() Support for [:alpha:] and similar has been added. - libschily::patmatch() Support for [:alpha:] and similar has been added. - libschily: resolvenpath() did not work as expected when some path names do not exist. A stat() call that should check whether we already reached the "/" directory caused a return (-1) even with (flags & RSPF_EXIST) == 0 - libschily: Fixed the behavior of the umask/chmod perm parser for the case where "who" was not specified and the operator is '='. POSIX requires here to first clear all bits in the old value before adding new bits. The old implementation did clear only the bits retrieved from umask(2). - libschily: The umask/chmod perm parser now returns -1 for the mode string "u", since the operator is missing. Before, it just printed an error message but did not return -1. - libschily: astoul() and astoull() now by default permit to prefix the unsigned number by a "-". This is required by POSIX for strtoul() and strtoull() and our implementation needs to be compatible to POSIX to make the printf(1) implementation in the Bourne Shell POSIX compatible on older platforms. Thanks to Robert Elz for reporting - libschily: emulations for *at() have been fixed. - libschily/stdio/fgetstr.c now includes a speedup for AT&T stdio using the new movecbytes() - libschily/stdio/getdelim.c now includes a speedup for AT&T stdio using the new movecbytes() - libschily/ man pages reworked. - libschily::format.c The schily printf is now able to do %.*s with a significance > 8192 without overwriting the internal buffer. The new code is implemented via strnlen() and no longer copies the string - thus it should be even faster. - libschily::fnmatch.c: added a forgotten fix (from last January) for a problem with missing brackets with if/then/else related to [:upper:] and [:lower:] - libschily::fnmatch.c: added a forgotten _partial_ enhancement from last January for [= ... =] and [. ... .] support. Warning: this is not yet fully functional since the POSIX standard does not include an interface to get this functionality from the i18n part of libc. - libschily::match.c: Added a missing /* FALLTHROUGH */ comment. Thanks to Pavel Raiskup for poiting to a related Coverity message. - libschily::fstream.c: Added a /* NOTREACHED */ comment to make coverity quiet. Thanks to Pavel Raiskup for poiting to a related Coverity message. - libfind: the code now supports the *BSD enhancement "d_ino" in struct dirent. This speeds up stat()less jobs. - libfind: the code now supports the *BSD enhancement "d_type" in struct dirent. This speeds up stat()less jobs. - libfind: localization in libfind no longer affects the calling program - libfind: Arguments containing a '=' character did result in the related argument to become incremented inside the input arg vector. This caused problems with a free() loop on the arg vector. ********** Warning: the fix causes a binary incompatibility as the struct finda_t changed it's size. As a result, we now install libfind.so.2 and changed the map file in order to require newer versions of the interface functions that are affected by the finda_t size change. ********** Thanks to Heiko Eißfeldt for reporting. - libfind: the -newer and -newerXY primaries now compare nanoseconds as well. - libfind: removed blank line in the linker map file - libfind: the id cache (uid/gid <->name mapping) now helps star to find whether a user name or group name is not completely 7 bit ASCII and thus needs a locale conversion in star POSIX.1-2001 extended headers. - libfind: Some open() calls now use O_DIRECTORY - libfind: walk.c now uses fchdir() on platforms that support dirfd(DIR*) and by this change, libfind is now aprox. 30% faster than before and makes libfind faster than other find implementations. - libfind: walk.c: "!isdot" has been renamed to "need_cd" for better readability of the code. - libfind: WALK_STRIPLDOT now strips even multiple occurences of "./" and if there is no text after that, it replaces the empty string by ".". - libfind: new functions wstat() and wlstat() have been added (both are based on fstatat()). - libfind: treewalk() now works even without fa.walkflags |= WALK_CHDIR - libfind: The code compiles again on platforms without dirfd(), like e.g. DOS. On such a platform, there is currently however no way to use libfind without WALK_CHDIR. - libfind: Added a better ENAMETOOLONG discovery for the function dopendir() that is able to open a directory with a very long name. - libfind: In case of very long path names, the intermediate directories are now opened with O_SEARCH instead of O_RDONLY. - libfind/bsh/Bourne Shell: The "long" stat() implementation now works with absolute path names as well. - libfind: added support for a new feature: -call allows to do calls into the shell that started "find" as a builtin program. This is approx. 40x faster than using -exec. - libfind: A new function walkcwd() allows to chdir() back from the start directory (that has been reached by calling walkhome()) to the directory where the treewalker has been before calling walkhome(). - libfind: new source ptime.c - libfind: new source version.h - libfind: the major file name version number was bumped from 2 to 3 since the new code causes binary incompatibility with the previous libfind. - libfind: A set of new primiary operators has been added: -newerat -newerct -newermt These primaries allow to check whether a file is newer than a time stamp description in it's argument. The argument to this primary is a date and time description that is similar to ISO 8601. The time description may look like: yyyy-mm-ddThh:mm:ss.nnnnnnnnn+-zzzz for a time with timezone or yyyy-mm-ddThh:mm:ss.nnnnnnnnnZ for GMT based time or yyyy-mm-ddThh:mm:ss.nnnnnnnnn for local time. The 'T' may be replaced by a space. The description may be shortened from the right side, in this case the missing fields are assumed to have the maximum value. It can be shortened from the left side and in that case, the missing fields are substituted by the current date. The call find . -newermt 2017 will find all files with a modification time with the start of 2018 or newer. The call find . -mewermt T will check for files that have a modification time of the start of tomorrow or newer. - libfind: The "-perm +mode" feature before has been recognised if the + sign appeared before any character from the set "ugoa", but since the string "+u" represents a POSIXly valid "permcopy" operation, the new version of libfind only accepts this specific feature if the mode string starts with a "a". Since (with find) the start value of the perm parser is 0, any valid mode string may be prefixed by "a+," without changing the resulting value, the feature is usable with "-perm +a+,mode". - libfind: The phrase "-perm /mode" has been added as an alias for "-perm +mode", but since "/" is not permitted in a POSIX mode string, this methos does not require to prefix the mode string with "a+," to work. "-perm /mode" also helps to give comptibility with GNU find. - libfind: "-chmod mode" no longer causes a wrong treatment in some cases as the special treatment for "-perm +mode" no longer applies to -chmod too. - libfind: new function find_strvers() returns the version string. - libfind: version bumped to 1.7 - libfind: treewalk() now supports a new flag WALK_MOUNTPLUS. This new flag reports mount points but does not descend into them. The existing flag WALK_MOUNT does not report mount points and does not descend into them. The background for this change is: 1) "star -cM ..." and "star -c -find . -xdev ..." differ in their behavior and there was no way to get the star -M behavior from libfind. 2) The POSIX standard for "find -xdev ..." is in conflict with the documented behavior for "find -xdev ..." on UNIX and with the documented and POSIX standard behavior of nftw() with the FTW_MOUNT flag (The UNIX find(1) implementation is based on nftw()). 3) There is a general need to have the other behavior where mount points are reported. - libfind: find(1) gets a new primary operator "-mount+" as a supplement to the historic UNIX "-mount" behavior that is based on WALK_MOUNT. -mount+ is based on WALK_MOUNTPLUS - libfind: Added a date to the -version output and added version.h - libfind/star/mkisofs/bsh/Bourne Shell: "find -xdev" is no longer UNIX compatible but rather POSIX compatible. *** Incompatible change *** *** POSIX wording from 1992 is in conflict with UNIX implementation *** Background: POSIX in 1992 introduced a wording for -xdev that was in conflict with existing implementations and required a behavior that is impossible to implement with nftw(3). Today, half of the implementations follow the UNIX rules and half of the implementations follow the POSIX text. To solve the conflict, POSIX decided to add the old UNIX "find -mount" (that was intended as an alias to "find -xdev") and to be implemented with the old UNIX behavior and requires "find -xdev" to follow the POSIX text from 1992. At the same time, POSIX introduced a new nftw(3) flag FTW_XDEV as a complement to FTW_MOUNT with the behavior that matches the POSIX requirements for "find -xdev". As a result, libfind now makes -xdev an alias to -mount+ and keeps the -mount primary with the old behavior. The difference is: -mount does not lists mount points at all and does not descend into them. -xdev lists directories that are mount points but does not descend into these directories. - libfind: walkcwd() no longer tries to call dirfd() unless it exists or DIR->dd_fd exists. This should make it compile with DJGPP again. - libfind: the time parser now supports the new time spec "now" for the current time. - libfind: The new primaries -chatime, -chctime, -chmtime allow to set the time stamps in struct stat to arbitrary values. - libfind: A new primaries -chfile allows to set the modified struct stat values from -chown, -chgrp, -chmod, -chatime, -chctime, -chmtime to the file. On platforms where chmod() is not possible on a symbolic link, symbolic links are skipped with that change. On platforms where it is not possible to set times on symbolic links, symbolic linkes are skipped with that change. - libfind: Added support for being able to use simple shell scripts (scripts that do not start with a #! line) as commands for the -exec and -exec + primaries. This requires a reordering of the arg vector and to insert a "sh" as new argv[0] before the original arguments. - libfind: added a new timestamp to the libfind version. - libfind::find.c: Added a missing /* FALLTHROUGH */ comment. Thanks to Pavel Raiskup for poiting to a related Coverity message. - libgetopt: -long-option is now supported in addition to --gnu-long-option. - libgetopt: getopt(ac, av, "") no longer dumps core with --help - libgetopt: New files getopt.3c, shlgetopt.mk and libgetopt-mapvers - libgetopt/Bourne Shell: added an #ifndef __CYGWIN__ in order to avoid overwriting non-standard definitions by standard definitions on Cygwin for the global getopt() variables. Thanks to Heiko Eißfeldt for proposing a fix. - SCCS, patch: "make tests" now works from the top level directory and from sub directories. - patch: The random tests from the conformance tests now also check ed(1) type patches. - patch: patch/tests/basic/offset.sh new conformance test uses variable offsets of changed text. - patch: Bugfix for CVE-2015-1416 avoid system() with meta characters - patch: Workaround for diff -e single '.' lines added. - patch: patch -Wv / -Wversion now prints current compatibility mode name. - patch: New option -T for touch files to the time stamp from the patch - patch: New option -Z Assume GMT for diff timestamps that are not from a "diff -u" and thus miss the timezone. - patch: If called under the name "spatch", the implemented interface now is POSIX + extensions. - SCCS: the command prs(1) again compiles with smake COPTX=-DGMT_TIME Note that GMT_TIME is a hack from Sun that is no longer needed with the SCCSv6 history format as the SCCSv6 history format archives the local time + GMT offset instead of an untagged local time. Thanks to a hint from: Bruce Lilly - SCCS: the library function dodelt() no longer warns: "Time stamp later than current clock time (co10)\n" when SCCS was compiled with smake COPTX=-DGMT_TIME - SCCS: get(1) now includes specific code for smake COPTX=-DGMT_TIME but this is probably the last change related to this deprecated compile time option. - SCCS: add sccs/README.SCCS and include information about compile time options. - SCCS: some man pages now mention the TZ environemt variable. - SCCS: Mention in the sccs-admin man page and online-help that SCCSv6 supports anything but nul characters in text files. - SCCS: diff: fixed a bug introduced in August 2015 while introducing a workaround for a HP-UX strftime() bug. The bug caused diff with "-c" to print a rotten time string. The workaround now only hits when using "diff -u" and thus includes the "%z" format from HP-UX that needs to be fixed. - SCCS: sccs/lib/comobj/src/dodelt.c Fixed a bug with time stamp handling that has been introduced Oct 14 2015 while trying to add better support for a GMT variant of SCCS. The bug could cause messages like: "Time stamp later than current clock time" - SCCS: sccs/lib/comobj/src/putmeta.c was fixed to avoid emitting empty "^AG r" entries in SCCSv4 format. The entry is a SCCSv6 meta data entry. The bug has been introduced Feb 25 2015 while making the code better structured. - SCCS: sccs/cmd/src/get.c was fixed for the GMT variant of SCCS. - SCCS: When the special test binaries for /tmp/SCCSTEST have been built, a new set of normal binaries is built. - SCCS Added a test for the correctness of the history format created by sccs admin. - SCCS: The testsuite did use "tail +2" but some "tail" implementations do not support "tail +2" while UNIX tail does not support the POSIX command line "tail -n +2". We now test what works and use a command line that fits the actual implementaion. - SCCS: The testsuite did use "touch 0101000090 $g", but some "touch" implementations (such as gtouch on Linux) do not support that. We now use "touch -t 199001010000 $g" if needed. - SCCS man pages: the order of CDDL header / Copyright header has been aligned with the rest of the OpenSolaris man pages. - SCCS sccs: Permit new diff options: -q -a -B -N -p - README.SCCS: The expansion of SCCS keywords has been rediced to the first 5 lines to prevent to expand keywords that should be readable unexpanded. - SCCS/bdiff: the bdiff program now supports embedded NUL bytes and uses getdelim() instead of fgets(). It calls "diff -a" with the segments. - SCCS get: Compile support for BUG_1205145 and GMT_TIME added - SCCS prs: Time zones are now handled correctly. - SCCS sccs: Permit new diff options: -q -a -B -N -p - SCCS diff: Implement new diff options: -q -a -B -N -p, speed up things by replacing vfork()/exec() by recursive function calls. diff is now up to 16x faster than Solaris diff. - SCCS diffh: The program now supports lines of arbitrary length. - SCCS libcomobj::dodelt.c: fixed a Timezone bug with the compile option GMT_TIME - SCCS libcomobj::putmeta.c: The unified speudo random number from SCCSv6 is now printed correctly even when on a platform without "long long" support. - SCCS test suite: After compiling special binaries for /tmp/SCCSTEST/, we now again build default binaries. - SCCS test suite: If the classical UNIX "touch" command line did not work, try out the POSIX command line. - SCCS test suite: If the classical UNIX "tail" command line did not work, try out the POSIX command line. - SCCS test suite: Added a new random test that verifies that "bdiff" and sccs delta correctly interact. - SCCS test suite: Added a new format test that verifies the correctness of the basic SCCSv4 and SCCSv6 history file format. - SCCS the man pages have been updated to match the current state - SCCS the NSE -f and -q flags have been documented and made working. This permits it to use the NSE -f (force) mode where deltas can be made from files that have not been checked out for editing. - SCCS::diff: diff -u dir1 dir2 no longer dumps core while trying to print the filenames. This bug was introduced while converting diff to avoid fork()/exec() in October 2016 and to use recursive function calls instead. - SCCS::diff: diff -u dir1 dir2 now uses the right stat() time stamps instead of using the lstat() time stamps for files in the context diff header. This bug was also introduced in October 2016. - SCCS::diff: diff -u dir1 dir2 now writes nanoseconds for the timestamp of the first file. This was not done before because of a typo in an #ifdef statement that was introduced in June 2016 while adding support to print POSIX compliant timestamps for HP-UX and AIX. - SCCS: diff did not always exit(2) in case of errors since the code was restructured in late 2016. - SCCS: new help page: "sccs help admin_flags" prints a summary od the flags supported by the admin command. - SCCS: "sccs get SCCS" no longer suppresses keyword expansion in case that the 's' flag is set. Old versions did not reset the line count for multiple files, the new version uses the "line number in g-file" variable in struct packet instead and thus something that gets reset automatically. - SCCS: the man page sccs-delta.1 has been enhanced to mention that the force delta option (-f) is usually used together with -q and -n. - SCCS: the man page sccsfile.4 has been enhanced with respect to the weave format. - SCCS: added a test to verify that the admin -fs# flag works correctly even when retrieving more than one file at once. - SCCS: "sccs help" now includes a short help for "add", "commit", "remove", "rename", "status" The commands: "commit", "remove", "rename", "status" still do not work. - SCCS: get no longer dumps core when it is told to retrieve more than one annotated file (using -A) at a time. The bug was caused by calling ffreeall() that freed up the user name cache as well, but did not NULL out the pointer to the name hash table at the same time. - SCCS: sccs no longer dumps core when calling "sccs -R unedit" and more than a single file is affected. The reason was a misplaced bracket while computing the number of bytes needed for the path name of the current file. - SCCS:sccs now forwards the -o option to "get" as well, while implementing the macros: "delget", "deledit" and "create" - SCCS:admin, the -o option now also sets the time stamps for the s. file and the g-file - SCCS:delta, the -o option now also sets the time stamps for the s. file and the g-file - SCCS:get, the -o option now also sets the time stamps for the g-file in a way that uses the nanoseconds to make sure that SunPro make and gmake do not try to run "sccs get" on the files. - SCCS:sccs man page now mentions that "sccs create" not only permits the -o option but passes other options to "admin". - SCCS:sccs help create now mentions that "sccs create" not only permits the -o option but passes other options to "admin". - SCCS: fixed a missing semicolon in libcassi/fatal.c that was active when not compiling inside the Schily Makefilesystem. - SCCS: removed the "help2" program and put the content from help2.c into the program help.c - SCCS: the delta program now uses the same search strategy for "bdiff" as already used for "diff". - SCCS: several source files removed a superfluous semicolon after a "#pragma ident" statement. - SCCS: sccs/README.SCCS no longer mentions "help2" that has been removed. - SCCS: "sccs -R log SCCS" now gives useful output. - SCCS: "sccs log ...." now silently skips files that do not start with "^Ah" - OCSW/CSWsccs: removed the help2 binary - SCCS: "bdiff" no longer tries to install a signel handler for SIGCHLD and then exits after the called "diff" program exited. This was caused by an unusual numbering for the signals on Haiku. Thanks to Heiko Eißfeldt for reporting - SCCS: "delta" now prints the really used path for the diff program in some failure cases. Thanks to Heiko Eißfeldt for reporting - patch: The conformance tests "cmptest" and "gentest" now also check for "/bin/patch" while searching for a reference patch binary. This is needed s Haiku does not have a /usr/bin/ directory. Thanks to Heiko Eißfeldt for reporting - patch: The conformance tests "cmptest" and "gentest" now also check whether the system supports an "ed" binary and skips "diff -e" tests in case "ed" is missing. This is needed on Haiku that does not have an "ed" binary. Thanks to Heiko Eißfeldt for reporting - SCCS: sccs admin/delta, ... could write nanoseconds to the timestamp into the history file even when in SCCSv4 mode and the time stamp is from before 1968 or past 2037. This is no longer possible as the nanosecods are now cleared in that case. - SCCS: val now checks whether a SCCSv4 history file contains SCCSv6 elements in the delta line. The checks in the schilytools development area did not discover the problem, so it seems that our bug was only triggered on Haiku due to a time_t implementation bug in the Haiku libc. - SCCS: sccs/man/Makefile if now a normal serial Makefile using "rules.mks" in order to make all localizations and the directory OBJ//man which "make all" already. This avoids that OBJ//man is created late by root when running "make install" as root after a "make all" call from a normal user. Thanks to a report from Heiko Eißfeldt - SCCS: libcassi: Avoided a malloc() call that created an unneeded and unfreed space. Thanks to Heiko Eißfeldt for reporting - SCCS: libcomobj: make date_ab() safe against date strings then end in '.' but do not include nanoseconds. Thanks to Heiko Eißfeldt for reporting - SCCS: libmpw: added a missing va_end() in cat(). Thanks to Heiko Eißfeldt for reporting - SCCS: Changed $(MAKE) -> "$(MAKE)" Thanks to Heiko Eißfeldt for reporting - patch: the unit test now searches for "cpp" and may fall back to our self compiled cpp. This is needed as Minix does not come with "cpp". Thanks to Heiko Eißfeldt for reporting - SCCS testsuite: The file sccs/tests/Makefile now contains more rules to avoid to run the tests in an unexpected order with a parallel make program. We partially had the test staring before the binaries were fully installed in /tmp/SCCSTESTS and SCCSv4 and SCCSv6 tests running contemporarily in the same directory. - SCCS: sccs now supports to use the options -f and -q for delget and deledit - SCCS: the test for "sccs help get_kywds" has been enhanced to mention that the enhanced (lower case) get keywords are only available if enabled via "admin -fx" or "admin -fy". - SCCS: man pages: Fixed typos Thanks to Leah Neukirchen for reporting. - SCCS: val.c: Fixed typos Thanks to Leah Neukirchen for reporting. - SCCS: sccslog.c: removed the debug print "Einträge" Thanks to Leah Neukirchen for reporting. - SCCS log command: Avoid a coredump with "sccs -R log" from a directory that does not include a SCCS directory. - SCCS: The SCCS help file installation now makes use of the new makefile feature $(PREINSDIR). This allows to install SCCS in /usr/bin. - SCCS: The SCCS binaries installation now makes use of the new makefile feature $(PREINSDIR). This allows to install SCCS in /usr/bin. - SCCS: The help program now also auto expands help messages for own malfunctions. - SCCS: The sccs-help.1 man page now explains the algorithm, the way localization works and how the file /usr/ccs/lib/help/helploc works. - SCCS: The sccs-get.1 man page now includes the fallback PATH for the &sccs.include.filename% keyword directive. - SCCS: all commands: SCCS_HELP_PRE and SCCS_BIN_PRE are now used for external files and for searching the locale definition files. - SCCS: README.SCCS now mentions the new make command line macro options SCCS_HELP_PRE and SCCS_BIN_PRE. See $(PREINSDIR) above. - SCCS: unit tests now honor SCCS_BIN_PRE. - SCCS: The logname() function in libcomobj now substitutes " " by "_". This is needed as Cygwin permits to have spaces in the user name but this would be in conflict with our history file format that uses " " as a field separator. Thanks to Heiko Eißfeldt for reporting - SCCS: The username arguments for "admin" and "sccs" are now modified in case that they contain space characters (" "). This is needed to match the modifications for the history file format - see above. - SCCS: The sccsfile(4) man page has been enhanced to mention the fact that spaces in usernames are impossible in the history file. - SCCS: The conformance tests have been rewritten to deal with user names and working directories that include spaces. - SCCS: Some sources have been converted to better follow the Cstyle conventions. - SCCS: bdiff now includes an #undef INS_BASE for the K&R compiler to make it quiet. - SCCS: The makefiles for sccsdiff and rcssccs now include $(CPP_FLAGS) as needed since the definitions have been changed with schilytools-2018-08-24 - SCCS: sccs.c Some Cstyle changes. - SCCS: sccs.c fixed a malloc() bug related to recursive (-R) use that could cause a core dump with command lines like this: sccs -R diffs path/to/file1 path/to/file2 path/to/file3 - SCCS: sccs.c: the command "sccs add" is now able to convert all kind of legal path names into path names that are relative to the change set home directory and it is able to recognise whether a path is outside the change set home directry tree. - SCCS: libcomobj: added new source files: homesubs.c includes fchdir(2) management functions fdirsubs.c includes open(2)/close(2) dir management functions intree.c Check and manage whether a path is inside the project tree. sclose.c To close the FILE * from a struct packet and mark it closed - SCCS: libcomobj: getline.c now uses getdelim() to read lines. This avoids the need to call strlen() for the line length and it allows to have embedded nul characters in a line. This is a preparation for a future sccs version that will be able to avoid "uuencode" for so called "binary" files. In former times, this was impossible but since diff(1) includes a -a ooption to treat binary files as text files, any type of file could be treated as a text file with line by line checks for changes. - SCCS: libcomobj: getline.c now implements a new function grewind() - SCCS: helpfiles: added new error codes for the enhanced code for "sccs add". - SCCS: the "ut" helpfile did still contain explanation text from 1977 that mentions a maximum file size of 1MB. The new text mentions platform specific and process specific limitations and leaves the value open. - SCCS: All programs now accept -version in addition to -V and --version - SCCS: The man pages now mention -version and --version - SCCS: The get(1) man page now correctly mentions the differences between the UNIX get(1) program and the POSIX get(1) documentation. - SCCS: delta.c: The comment has been enhanced in order to help future enhancements. - SCCS: delta.c: Added a new option -X to allow to add many more new options. - SCCS: delta.c: Added a new option -Xprepend to allow an efficient way of adding the content of a file to the beginning of the g-content of an existing SCCS history file. This method is needed in order to manage the SCCS changeset file, see "man sccschangeset" in a performant way after a huge project like the Linux kernel did introduce commits over many dozens of years. Since we do not have the changeset file as g-file in the filesystem and since we do not need to call diff(1), creating the needed delta for the changeset file to handle a new commit is 2.5x faster with this new method than it would be using the standard method. - SCCS man pages now document the new option -X for delta(1) - SCCS "sccs help delta" now documents the new option -X for delta(1) - SCCS "sccs help delta_Xopts" now lists the new delta -X options - SCCS: cdc.c: This command now supports a -N option like admin, delta and get. This allows it to be used in project mode with the SCCS history files in a separate tree that starts in .sccs/ in the project home directory. - SCCS: comb.c: This command now supports a -N option like admin, delta and get. This allows it to be used in project mode with the SCCS history files in a separate tree that starts in .sccs/ in the project home directory. - SCCS: prs.c: This command now supports a -N option like admin, delta and get. This allows it to be used in project mode with the SCCS history files in a separate tree that starts in .sccs/ in the project home directory. - SCCS: prt.c: This command now supports a -N option like admin, delta and get. This allows it to be used in project mode with the SCCS history files in a separate tree that starts in .sccs/ in the project home directory. - SCCS: rmchg.c: This command now supports a -N option like admin, delta and get. This allows it to be used in project mode with the SCCS history files in a separate tree that starts in .sccs/ in the project home directory. - SCCS: unget.c: This command now supports a -N option like admin, delta and get. This allows it to be used in project mode with the SCCS history files in a separate tree that starts in .sccs/ in the project home directory. - SCCS: val.c: This command now supports a -N option like admin, delta and get. This allows it to be used in project mode with the SCCS history files in a separate tree that starts in .sccs/ in the project home directory. - SCCS: sccslog.c: This command now supports a -N option like admin, delta and get. This allows it to be used in project mode with the SCCS history files in a separate tree that starts in .sccs/ in the project home directory. - SCCS: sccscvt.c: This command now supports a -N option like admin, delta and get. This allows it to be used in project mode with the SCCS history files in a separate tree that starts in .sccs/ in the project home directory. - SCCS: sccsdiff: This command now supports a -N option like admin, delta and get. This allows it to be used in project mode with the SCCS history files in a separate tree that starts in .sccs/ in the project home directory. - SCCS: comb.c: If a SCCS history file has been a V6 history file, the new history file is created as V6 history file as well. - SCCS: val.c: This command now supports a -v option to print the SCCS history file type. The output is: SCCS V4 or SCCS V6 No other checks (except for a valid magic first line) are done. - SCCS: val.c the internal getline function now uses getdelim() as it is done in libcomobj. This is needed once we allow nul Bytes in history files. - patch: The patch unit test suite now allows to disable the random delta tests that take a long time but verify whether patch is able to deal with arbitrary changes in the files. To disable the random tests call: cd patch/tests NO_RANDOM=TRUE smake tests - SCCS: libcomobj: A parser for the SCCS v6 flags has been added. Since there are currently no SCCS v6 flags, this parser prints a warning for all SCCS v6 flags and thus will warn, when it sees SCCS history files created from newer SCCS versions. - SCCS: libcomobj: A parser for SCCS v6 global meta data has been added. It currently supports the inital path name and the unified random number that is given to files to make them unique. - SCCS: libcomobj: a new function sfree() frees the line buffer that is used by getdelim() - SCCS: all programs that call the SCCS v4 flag parser now also call the SCCS v6 flag parser and the parser for SCCS v6 meta data. - SCCS: prs: now prints the SCCS v6 initial path using the new keyword :Gp: - SCCS: prs: now prints the SCCS v6 unified random using the new keyword :Gr: - SCCS: The sccs unit test suite now allows to disable the random delta tests that take a long time but verify whether sccs is able to deal with arbitrary changes in the files. To disable the random tests call: cd sccs/tests NO_RANDOM=TRUE smake tests - SCCS: admin no longer has a file descriptor leak when is is used to modify more than one SCCS history file (e.g. by modifying flag values). - SCCS: All low level programs no call sfree() and thus avoid a memory leak from the line buffer when they are used with more than one file. - SCCS: admin now supports two new options: - -XGp The initial SCCS v6 path If specified as "-XGp=", no initial path is written to the history file. - -XGr The SCCS v6 unified random If specified as "-XGr=", no unified random is written to the history file. Both options are oly honored when a new history file is created. If one of these options is used, admin only supports one file type argument. - SCCS: comb now supports to retain SCCS v6 initial path and SCCSv6 urand to be retained in the new reduced history file. - SCCS man pages: more hints on SCHILY specific options have been added. - SCCS: val: the check for a back-going clock now also checks nanoseconds from SCCS v6 history files. - SCCS: libcomobj: the check for a back-going clock in dodelt() now also checks nanoseconds from SCCS v6 history files. - SCCS: libcomobj: the bulk mode path handler bulkprepare() now permits files that do not (yet) exist. This is needed for several reasons for e.g. the new admin features and to permit get(1) to be able to extract a g-file that has not yet been checked out. - SCCS: admin: when the bulk option -N has been introduced in Summer 2011, this has been done mainly to be able to verify whether SCCS is still faster than other version control software. It was used to allow to test the performance for importing large amounts of files into SCCS and thus -N implied -n and -i and the SCCS history files have always been intialized from the related g-files. Now the -N option no longer implies -n or -i. If a new history file should be created, "admin -N... -n ..." needs to be used and if the history files should be initialized from the g-files, the command "admin -N... -i. ..." needs to be used. The option -i followed by a dot now tells admin to use the computed related g-file name to initialize history files on bulk mode. With this change, admin now allows to e.g. use the -N option to set flags in a larger list of files by e.g. calling "admin -NSCCS -fx *.c". - SCCS: sccscvt: When converting from SCCS v4 to SCCS v6, the initial path and the unified random are now added if not yet present. - SCCS: sact: the program now identifies itself as "sact" instead of "unget" which was a result of being a single program with hard links. - SCCS unit tests: New tests for checking the SCHILY SCCS specific new val(1) options -v and -T have been added. - SCCS unit tests: A new test checks whether delta -Xprepend works correctly - SCCS: defines.h: New flags for the Nparms allow to tell the function bulkprepate() from libcomobj to know whether a file or directory needs to exist. - SCCS: libcomobj::bulkprepare() The space for Nparms.n_prefix is no longer allocated via fmalloc() but with malloc(), since the content of Nparms must survice a call to ffreeall() that is called after working on one file from the file list. - SCCS: libcomobj::bulkprepare() in case that a new s.file should be created, the directory for the s.file is auto created in case that it is missing. - SCCS: libcomobj::bulkprepare() in case that the N_GETI flag is set, the directory for the g-file is auto created in case that it is missing. - SCCS: libcomobj::bulkprepare() use resolvenpath() instead of resolvepath() in case that the base directory of a file does not need to exist. - SCCS: libcomobj::bulkprepare() The program is aborted again in case that the base directory of a file needs to exist but is missing. - SCCS: libcomobj::bulkprepare() The libschily implementation for resolvepath() does not allow to use the same space for the input path and the output path name. We now copy the input path to a temporary variable to allow it to work on platforms other that Solaris. - SCCS: libcomobj::bulkprepare() We now use fallback code in case that the base directory of the s.file does not yet exist and chdir() thus does not work. - SCCS: libcomobj::bulkprepare() The struct member N->n_dir_name is now set to NULL in case that we did not do a chdir(). - SCCS: libcomobj New function freeN() allows to free Nparms.n_prefix - SCCS: libcomobj New function Ndbg() allows to to debug bulkprepare(), e.g. the result from parseN(). - SCCS: libcomobj::set_init_path() fixed a bug that could cause a core dump in SCCS v6 mode, when the dir parameter is a NULL pointer. - SCCS: libmpw::sname() no longer addresses out of bound data from the string parameter (s[-1]). - SCCS: admin now marks the Nparms structure to indicate that in case of "admin -N -n file", the s-file does not need to exist when running bulkprepare(). - SCCS: admin now marks the Nparms structure to indicate that in case of "admin -N+ -n file", the directory to place the g-file does not need to exist while running bulkprepare(). - SCCS: get now marks the Nparms structure to indicate that in case of "get -N file", the directory to place the g-file does not need to exist while running bulkprepare(). - SCCS: comb no longer prints the PATH= line repeated in case that more than one file type argument was used. - SCCS: comb now prints a "cd" command in the script in cace that comb(1) did chdir() while calling bulkprepare() for the -N bulk mode. - SCCS: all commands: setsig() and xsethome(NULL) are now called before calling parseN(). This helps to prevent core dumps from bad code in parseN() and this allows parseN() to know whether a command runs in "project off tree" mode. - SCCS: admin & delta: the function parseX() has been moved to libcomobj. - SCCS: admin & sccscvt: the Initial Path is now only created in case that the -N option was used as otherwise, the program cannot know the real g-file name. This is because up to now, the handling of the "SCCS/" subdirectory is handled in the program sccs(1) and not understood by the low end programs. - SCCS: libcomobj::putmeta() now first prints the unified random and then the initial path. This helps to keep the order even when the initial path is added later. - SCCS: libcomobj::set_init_path() now expects a g-file name instead of an s.file name. This helps to have correct initial path names in the history file. - SCCS: libmpw: added a new xmalloc() that checks for NULL and aborts. - SCCS: man pages: the man pages now explain that with "-N" and "-Ns", the s.files are in the same directory as the g-files. - SCCS unit tests: A new test for even longer lines now checks whether sccs works with lines of 100000 bytes length. - SCCS unit tests: New tests check whether admin(1) correctly deals with all kind of -N parameters and more than file type argument. - SCCS unit tests: New tests check whether delta(1) correctly deals with all kind of -N parameters and more than file type argument. - SCCS unit tests: New tests check whether get(1) correctly deals with all kind of -N parameters and more than file type argument. - SCCS unit tests: New tests check whether sccscvt(1) correctly deals with all kind of -N parameters and more than file type argument. - SCCS unit tests: New tests check whether cdc(1), prs(1), prt(1), rmdel(1), sact(1), sccslog(1), unget(1), val(1) deal with all kind of -N parameters and more than file type argument. These tests are simpler than the tests for admin(1) and get(1). - SCCS unit tests: A set of unit tests for sccscvt(1) have been added. - SCCS unit tests: A set of unit tests for comb(1) have been added. - SCCS unit tests: A set of unit tests for sccscvt(1) have been added to check whether sccscvt adds the initial path while converting. - SCCS is now in a state that is close before being ready with project support. This means that SCCS soon will be able to deal with lists of files as a whole and have a global locking for operations on file lists. The current state is that SCCS most likely is ready with all infra structure enhancements for project support except for the code to deal with the changeset file and the name cache. - SCCS the prs man page now tries to make the table less wide. - SCCS: libcomobj::bulkprepare() the current working directory inside the project home directory tree now gets an appendet "/" before "SCCS" is appended. - SCCS: sccs: now has better comment in the function makefile() that usually prepends simple file names by "SCCS/s." before passing them to the low level programs. This is the main place where future versions of sccs.c need to be modified to be able to use the new -N option from the low level programs. The -N option however is needed for "off tree" repositories. - SCCS: sccs now checks for SCCS/s. in the function makefile(). This results in attempts to check for SCCS/SCCS/s.x.file, but previous versions complained: "SCCS/x.file not an SCCS file" which is not better. In order to prepare the future use of -NSCCS, the new method is needed. - SCCS: sccs now has a new variable "NewMode" that is set if the directory ".sccs" is seen in the project set home directory. This is the upcomming switch between the old mode where "sccs" translates g-file names into s.file names before calling the SCCS low level programs and the new mode where g-files + the option -NSCCS are used as argument for the low level SCCS prrograms. This can be controlled via the environment "SCCS_NMODE". If present and set to "FALSE", "NewMode" is disabled regardless of the presence of ".sccs" and otherwise "NewMode" is enabled regardless of the presence of ".sccs". WARNING: currently you need to set the environment SCCS_NMODE=TRUE to enable this test mode since there is a need to change a lot in the code to make it work again this way. - SCCS: sccs: Now using strdup() instead of malloc(strlen(buf) + 1) + strcpy() - SCCS: sccs now has a new subcommand "root" that prints the project set home directory in case it has been initialized via "sccs init". - SCCS: libcomobj: the get(1) implementation from admin(1) has been moved to libcomobj::doget() - SCCS: libcomojb::doget() now calls sclose() and sfree(). - SCCS: libcomojb::parseN() now recognizes a space character as a placeholder for a flag that is ignored. This allows to make sccs.c simpler as it is now able to modify the behavor of called low level programs, e.g. to use "-N SCCS" to get a vanilla delta(1) or to use "-N+SCCS" to get the behavior of "sccs delget". - SCCS: delta now supports new options -k and -N+... This permits do do a "delget" operation with only using delta(1). - SCCS: a test for the new implicit get(1) in dalta(1) with -N+SCCS has been added. - SCCS: sccsdiff shell script is now able to deal with a -N option that contains space characters. This needs the use of IFS= and $Nflag as "$Nflag" would otherwise result in an unwanted empty argument. - SCCS: all programs: added some more gettext() calls e.g. for the -version option. - SCCS: sccslog: added support for setlocale()/gettext() - SCCS: sccsfile man page now contains an overview of all files used by all SCCS commands. - SCCS: man pages now contain a hint on where to download the sourcecode. - SCCS: sccslog man page fixed a bug with a typo that used .PD 0 instead of just .PD - SCCS: libcomobj: dodelt.c & idsubst.c: added a forgotten /* FALLTHRU */ - SCCS: sccs.c Cstyle changes - SCCS: sccs.c Added support for new separate macro string defintions that apply to the "new mode". - SCCS: sccs.c New code allows to specify -N options specific to macro stgring defitions. - SCCS: sccs.c New environment "SCCS_NOEXEC" allows to disable command execution for debugging purposes. - SCCS: admin.c: added some /* NOTREACHED */ comments to tell Coverity that fatal() does not return. Thanks to Pavel Raiskup for poiting to a related Coverity message. - SCCS: admin.c: The function adjust() did call strlen() on a non-null terminated string. Thanks to Pavel Raiskup for poiting to a related Coverity message. - SCCS: admin.c: The function adjust() returned a local string array. Thanks to Pavel Raiskup for poiting to a related Coverity message. - SCCS: bdiff.c: added some /* NOTREACHED */ comments to tell Coverity that fatal() does not return. Thanks to Pavel Raiskup for poiting to a related Coverity message. - SCCS: prs.c: The getopt() string did not contain 'q' for the expected support to the -q option. - SCCS: prs.c The code for handling the -d option was indented but curly brackets have been missing. Thanks to Pavel Raiskup for poiting to a related Coverity message. - SCCS: unget.c: The getopt() string did not contain 'q' for the expected support to the -q option. - SCCS: The version has been bumped to 5.09 with date 2019/01/02. - SCCS TODO: - Convert sccs.c to use -NSCCS in the back end programs instead of converting g-file names from the command line into s.file names in the frontend in order to forward s.file names to the backend programs. Doing it this way allows us to have the SCCS history files "off tree" in a separate directory tree starting with ".sccs/" at the "project root" directory, as the related code to convert path names is in libcomobj::bulkprepare(). - Add code to admin(1) and delta(1) to retrieve the list of new or modified files in order to have all important code for a "sccs commit" in a single program that does not need to deal with ARG_MAX limitations. - Add code to admin(1), delta(1) and get(1) to maintain/understand the changeset file. - Add code to libcomobj to understand the changeset file, which is needed in order to e.g. know the file names and file specific SIDs/state that correspond to a project global SID. - Add code to all programs to maintain a lock (for the file $PROJECTHOME/.sccs/SCCS/s.changeset, that would be in the file $PROJECTHOME/.sccs/SCCS/z.changeset) to maintain a project global lock. - Find/verify a complete transactional model that allows to repair complex changes to the set of files for a project that have been aborted in the middle. The current idea is to create the file $PROJECTHOME/.sccs/changeset with the deltas to the changeset during a complex update operation. - Find a way to decide when to use SCCS v6 type history files. For the project mode, this is needed in order to prevent historic SCCS implementations to believe they could modify files without knowing about project global locks. 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.