Code Management System
The Code Management System (CMS) is a library system for software development and maintenance, part of DECset. Its features include:
- storing code and other related files in libraries
- controlling versions of code (generations)
- manipulating groups of objects as a unit
- manipulating versions of the entire system (classes)
- managing code reviews
- keeping track of history and storing comments
- merging changes made to different generations of the software
- additional security mechanisms
- providing notifications when an event occurs
Contents
Concepts
- A CMS library is a repository for CMS objects. It resides in a directory that has been initialized for use solely by CMS; your default directory cannot be a CMS library. The CREATE LIBRARY command creates CMS control files in the specified directory. A working library is chosen with the SET LIBRARY command; CMS$LIBRARY logical is defined to point to your current library. Once the library is created, it should only be accessed through CMS commands.
- A CMS element represents all versions of a particular file in a CMS library. An element cannot be a directory file.
- A CMS generation represents a specific version of an element. When an element is first created, CMS creates generation 1 of that element. When the element is later modified (reserved and replaced), CMS creates a new generation of that element.
- A CMS group is a set of elements that can be manipulated as a unit.
- A CMS class is a set of particular generations of elements. Typically generations of elements are combined into classes to represent progressive stages, or base levels, in the development of an entire system.
- A reservation is when an element is taken out for modification and then replaced with a new version.
- A reference copy directory is a directory that stores the copies of the latest main-line generation of selected library elements.
Working with Libraries
A CMS library is a bit like a Git repository: it is a directory where the code files are stored and where CMS stores its files. All CMS work happens within a library. To start working with CMS, you need to create a library first.
If there is already a CMS library in a directory, you can just do a CMS SET LIBRARY followed by that directory:
$ CMS SET LIBRARY [JDOE.TEST]
Files that are already in the directory can be added to the library with the following command:
$ CMS CREATE ELEMENT/KEEP full-path-to-file "Commit message"
To create a CMS library, make sure your default directory is NOT the directory that you want your CMS library to be in. Then execute CMS CREATE LIBRARY directory-specification "Commit message":
$ CMS CREATE LIBRARY [.TEST] "First library"
To display elements in the library, issue the CMS SHOW ELEMENT command:
$ CMS SHOW ELEMENT
Working with Elements
Elements in a library are files that you want to track, e.g. code files. Add them to the library with the CREATE ELEMENT command; if the file already exists, use the /KEEP qualifier:
CMS CREATE ELEMENT/KEEP TEST.C "First version"
To change an element:
- RESERVE it
- edit it
- REPLACE it
For example, here is how to change TEST.C:
First, set the library where the file is:
CMS> set library [.test] %CMS-I-LIBIS, library is WORK7:[JDOE.TEST] %CMS-S-LIBSET, library set -CMS-I-SUPERSEDE, library list superseded
View the latest generation for TEST.C:
CMS> show generation test.c
Element generations in CMS Library WORK7:[JDOE.TEST]
TEST.C 3 16-DEC-2022 07:26:30 JDOE"Changed the message"
Reserve the file. By default, the latest generation is reserved; you can specify the generation using /GENERATION:
CMS> reserve test.c _Remark: "Add another message" %CMS-S-RESERVED, generation 3 of element WORK7:[JDOE.TEST]TEST.C reserved
Exit CMS and edit the file using EVE:
CMS> exit $ edit test.c #include<stdio.h> void main() { printf("Hello Everyone!"); printf("Goodbye!"); getch (); } [End of file] Buffer: TEST.C 7 lines written to file WORK7:[JDOE]TEST.C;2
Enter CMS and see that the file is still reserved:
$ cms CMS> sh reservation
Reservations in CMS Library WORK7:[JDOE.TEST]
TEST.C (1) JDOE 3 16-DEC-2022 08:56:18 "Add another message"
Replace the file:
CMS> replace test.c "Added a message" %CMS-S-GENCREATED, generation 4 of element WORK7:[JDOE.TEST]TEST.C created
See that the new generation has been added:
CMS> sh generation
Element generations in CMS Library WORK7:[JDOE.TEST]
TEST.C 4 16-DEC-2022 08:57:11 JDOE "Added a message"
Variant Generations
To create an alternative development path for an element (similar to a branch in Git, but for a particular file), you need to create a variant generation. When you replace the file, use /VARIANT to specify a letter that will be used to refer to that variant generation:
$ CMS RESERVE TEST.C $ EDIT TEST.C !some edits happen here $ CMS REPLACE TEST.C /VARIANT=C
Before, there were 4 generations of TEST.C: 1, 2, 3 and 4. After the REPLACE command is executed, generation 4C1 appears. If then CMS RESERVE TEST.C is executed without /GENERATION, generation 4 is reserved and when the file is replaced, generation 5 is created. To reserve generation 4C1, execute RESERVE TEST.C /GENERATION=4C1; when the file is replaced, generation 4C2 is created.
Merging
You can merge two variant generations into one with RESERVE/MERGE:
CMS> reserve test.c /merge=4c2 _Remark: Merging the Christmas version with master %CMS-W-MERGECONFLICT, 0 changes successfully merged with 1 conflict %CMS-W-RESERVED, generation 5 of element WORK7:[JDOE.TEST]TEST.C reserved and merged with 4C2 CMS> sh generation test.c
Element generations in CMS Library WORK7:[JDOE.TEST]
TEST.C 5 16-DEC-2022 08:57:11 JDOE "Added a message" CMS> exit
Because the same lines were changed in versions 5 and 4C2, there was a merge conflict. When we EDIT the reserved file, it looks like this:
$ edit test.c #include<stdio.h> void main() { **************** Conflict 1 ************************************************ printf("Goodbye!"); printf("Hello Everyone!"); ******************************************************************************** printf("Merry Christmas Everyone!"); printf("And happy New Year!"); ************** End of Conflict 1 ******************************************* getch (); } [End of file]
When the conflict is resolved, generation 6 of TEST.C is created.