An Intro to Concurrent Versions System (CVS) ECE 417/617: Elements of Software Engineering Stan Birchfield Clemson University What is CVS? • CVS – is a version (or revision) control system – maintains entire history of source file (for each change: who, when, and why) – is open-source and free (unlike SourceSafe) • What does it do? – – – – – – stores entire history of each file efficiently allows multiple people to work simultaneously enables retrieval of old systems helps to manage different versions, releases works well over WAN (server/client) works for any ASCII file, and limited support for binary • What is it not? – a build system – a substitute for management or communication Why CVS? • Problem: how to coordinate source file changes from multiple developers? – Solution #1: Manual merging and coordination – Solution #2: lock-modify-unlock (RCS, SCCS) – Solution #3: concurrent development (CVS) How CVS manages changes • Scenarios: – People work on different files trivial – People work on different parts of the same file CVS essentially runs ‘diff’ – People work on the same part of the same file CVS alerts user, requires manual merging of changes CVS model Server (Unix/Linux) Local machine (any O/S) checkout, update, diff Respository: central, official copy, as well as entire history Local copy: used for editing add, remove, commit, tag Note: checkout is a one-time operation CVS directory structure Repository on server /pub/cvsprojects/ece417 | +--CVSROOT (admin. files) +--3dmm | +-- data | +-- main.cpp,v | +-- database.cpp,v | +-- ui | +-- MainFrame.cpp,v | +-- SettingsDlg.cpp,v | +--klt-ui +--bibtex-manager ... Copy on local machine C:/user/me/mycode | +--CVS (admin. files) | +--data +-- CVS (admin. files) +-- main.cpp +-- database.cpp +--ui +-- CVS (admin. files) +-- MainFrame.cpp +-- SettingsDlg.cpp Note: All information stored on a per-file basis Pserver authentication • Each CVS command needs to authenticate you • Instead of a password for each command, first login • Steps: – cvs login (server checks its passwd file; if no passwd, then falls back to Unix system authentication) – now your password is stored locally in ~/.cvspass – local password is automatically used in the future as long as it’s there – CVS_PASSFILE can be used to change location of .cvspass • Note: pserver authentication provides minimal security; do NOT use an important password CVS commands • Syntax: cvs [goptions] command [coptions] [arguments] • Example: cvs -d :pserver:me@cvs.ces.clemson.edu:/pub/cvsprojects/ece417 login • Common commands: – – – – – cvs checkout modules ; create private copy cvs update ; incorporate others’ changes into private copy cvs add file ; add private file to repository cvs remove file ; remove file from repository cvs commit file ; publish changes to others • Customizing: – .cvsrc file contains default options, both global and commandspecific Create / checkout module • To put a directory under CVS control, cvs import –m “New file” foo me start – All files in current directory are stored in foo subdirectory of repository – -m “New file” specifies the log comment – foo is directory name in repository – me is vendor tag (can be anything) – start is start tag (can be anything) • To checkout a directory, cvs checkout foo – All files in foo subdirectory of repository are copied to current directory Changing files • To add a file to the repository, cvs add file ; takes effect at the next commit • To remove a file from the repository, cvs remove file ; takes effect at the next commit • To commit changes you’ve made to a file, cvs commit files • To tag a file revision, cvs tag –c MyProject-v1.0.0.0 files (-c warns and aborts if source files are not up-to-date) Bringing files up to date • To bring local files up to date, cvs update – All files in current directory are updated using repository – For each file, prints one-letter code: • • • • U (update): your file has been updated with someone’s changes M (merge): same, but you had made changes to the file, too C (conflict): same, but CVS could not merge the changes ? (unknown): file is not under CVS control • Note: You cannot commit a file unless it’s up-to-date Other useful commands • To get information about a file, cvs status file • To examine a file’s log, cvs log file • To see who made what change, cvs annotate file Conflicts • If two people modify the same part of a file, there is a conflict • CVS retains both sets of changes in the file, separated by <<<< (changes1) ==== (changes2) >>>> • Example: main() { <<<<<<< hello.c puts("Hello, World!"); ======= printf("Hello World"); >>>>>>> 1.2 } Setting up server • • Create a CVS repository if there is not already one Add this to /etc/services: cvs 2401/tcp # remote cvs server • Add this to /etc/inetd.conf: • • Restart inetd To encrypt password for CVSHOME/passwd file, cvs stream tcp nowait root /path/to/cvs cvs pserver – /usr/local/bin/perl -e 'print crypt("MyPassword","St") . "\n";‘ – copy and paste into passwd file as name:epswd • • To use RSH instead, use :ext instead of :pserver for CVSROOT. Might want to add set CVS_RSH to ssh which makes CVS use SSH and encryption for remote access. Initialize CVS repository, cvs –d /usr/local/cvsrep init ; sets up CVSROOT directory Versions and revisions • Each file has a unique revision number – Even number of dot-separated integers (start with 1.1) – Successive revisions increment the rightmost number • Each branch has a unique branch number – Number appended to revision number – Correspond to user versions Suggested CVS policies • Each file has an owner • You may – completely modify your own file (but don’t change class interface) – make minor/obvious bug fixes to others’ files, but only if 100% confident (also notify them, just in case) – ask for permission before making bigger changes, or request the change from the developer • Alternative: You are never allowed to modify anyone else’s file – Good: no chance of conflict – Bad: extra overhead, not taking advantage of the “C” in CVS (might as well be using lock-modify-unlock) Other suggestions • Make sure system clock reflects real time • Frequently update (stay in sync with repository) • Frequently commit changes (once compiled, completed, tested, reviewed) • Do NOT share code except via repository (e.g., emails) • Build early, build often (BEBO) • Tag early, tag often • Save executables associated with tagged builds Obtaining CVS • CvsGui (WinCVS/MacCvs,gCvs): http://www.wincvs.org Download and install; this is a GUI front-end and also includes CVS CVS: http://www.cvshome.org If you just want the command-line version; documentation is here, too