The Source Integrity Professional Edition User Guide - MKS
The Source Integrity Professional Edition User Guide - MKS
The Source Integrity Professional Edition User Guide - MKS
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Mortice Kern Systems (<strong>MKS</strong>) Inc.<br />
<strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong><br />
<strong>Edition</strong><br />
<strong>User</strong> <strong>Guide</strong>
<strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong><br />
<strong>User</strong> <strong>Guide</strong><br />
© Copyright 2000 by Mortice Kern Systems Inc.<br />
All rights reserved.<br />
Printed in Canada.<br />
<strong>MKS</strong>, <strong>MKS</strong> logo, <strong>MKS</strong> Change <strong>Integrity</strong>, and <strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong> are registered trademarks of Mortice Kern Systems Inc.<br />
Other brand and product names are trademarks or registered trademarks of their respective holders.<br />
Portions © copyright BEA Systems Inc. All rights reserved.<br />
Portions © copyright KL Group or its suppliers. All rights reserved.<br />
Portions © copyright PointBase, Inc. All rights reserved.<br />
Customer Support<br />
Include your <strong>MKS</strong> product name, release and serial number, as well as your operating system name and release number<br />
with all Technical Support correspondence. <strong>MKS</strong> product information is available on the CD-ROM label.<br />
Thirty days of free telephone support covering installation and configuration queries are provided with your purchase.<br />
This period begins with your first request for assistance. Support beyond the initial 30 days is available through a Preferred<br />
Customer Subscription package, or through a “pay as you go” program. Charges can be billed to your American Express,<br />
VISA, or MasterCard.<br />
Corporate Headquarters<br />
Mortice Kern Systems (<strong>MKS</strong>) Inc.<br />
185 Columbia Street West<br />
Waterloo, Ontario<br />
Canada N2L 5Z5<br />
Phone: (519) 884-2251<br />
Fax: (519) 884-8861<br />
North American Sales: 1 800 265-2797<br />
E-mail: info@mks.com<br />
<strong>MKS</strong>/DataFocus<br />
12450 Fair Lakes Circle<br />
Suite 400<br />
Fairfax, Virginia 22033<br />
Phone: +1 703 803-3343<br />
Fax: +1 703 803-3344<br />
E-mail: nutcracker@mks.com<br />
<strong>MKS</strong> France<br />
11C Quai Conti<br />
78430 Louveciennes<br />
France<br />
Phone: +331 3082 2762<br />
Fax: +331 3082 7278<br />
E-mail: france@mks.com<br />
4.0-0300<br />
Customer Support: (519) 884-2270<br />
(8:00 a.m. – 8:00 p.m. Eastern Time, Monday – Friday)<br />
Internet: sales@mks.com<br />
support@mks.com<br />
World Wide Web: http://www.mks.com<br />
FAX: (519) 884-8861<br />
US Headquarters<br />
<strong>MKS</strong> US Inc.<br />
2500 S. Highland Ave.<br />
Suite 200<br />
Lombard, Illinois 60148<br />
Phone: (630) 495-2108<br />
Fax: (630) 495-3591<br />
E-mail: sales@mks.com<br />
<strong>MKS</strong> (UK) Ltd.<br />
Block D,<br />
Dukes Court,<br />
Woking, Surrey<br />
United Kingdom<br />
GU21 5BH<br />
Phone: +44 (0) 1483 733 900<br />
Fax: +44 (0) 1483 733 901<br />
E-mail: uk@mks.com<br />
<strong>MKS</strong> US Inc.<br />
9020-I Capital of Texas Highway North<br />
Great Hills Corporate Center<br />
Suite 335<br />
Austin, Texas 78759<br />
Phone: (512) 342-2220<br />
Fax: (512) 342-2939<br />
E-mail: austin@mks.com<br />
<strong>MKS</strong> Germany<br />
Martinstraße 42-44<br />
73728 Esslingen<br />
Deutschland<br />
Phone: +49 711 351775 0<br />
Fax: +49 711 351775 11<br />
E-mail: info@mks.de<br />
<strong>MKS</strong> Japan<br />
Kounike Building 4F<br />
2-5-7 Minamisuna<br />
Koto-Ku, Tokyo<br />
Japan<br />
Phone: (416) 626 7097<br />
Fax: (416) 626 7354<br />
E-mail: japan@mks.com
Table of Contents<br />
1 Welcome to <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong> . . . . 1<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong> <strong>User</strong> <strong>Guide</strong>. . . . . . . . . . . . . . . . .2<br />
Typographical Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4<br />
Related Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4<br />
2 Understanding <strong>Source</strong> <strong>Integrity</strong> . . . . . . . . . . . . . . . . . . . . 5<br />
What Is Configuration Management? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .6<br />
<strong>The</strong> Role of Configuration Management . . . . . . . . . . . . . . . . . . . . . . . . . . . .7<br />
Managing Constant Change . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7<br />
<strong>The</strong> Cost of Change. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7<br />
Managing Change . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9<br />
Implementing Change . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9<br />
Configuration Management Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10<br />
Archives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10<br />
Revisions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10<br />
Branches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11<br />
Metadata. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11<br />
<strong>Source</strong> <strong>Integrity</strong> Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11<br />
Related Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11<br />
Changing States. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12<br />
Understanding Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13<br />
Logical and Functional Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13<br />
Understanding Archives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .13<br />
About Archives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14<br />
What Happens at Check-in Time? . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15<br />
Branches and Trunks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .17<br />
Checkpointing Your Project. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .20<br />
Sandboxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21<br />
Sandbox Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21<br />
A Typical Workplace Scenario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22<br />
How Sandboxes Can Help. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22<br />
Variant Sandboxes and Development Paths. . . . . . . . . . . . . . . . . . . . .24<br />
Build Sandboxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25<br />
<strong>User</strong> <strong>Guide</strong> i
Table of Contents<br />
Locking in Variant Sandboxes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26<br />
Converting Old-Style Variant Sandboxes . . . . . . . . . . . . . . . . . . . . . . .28<br />
Metadata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29<br />
About Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29<br />
About Revision Descriptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30<br />
About Timestamps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31<br />
About Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32<br />
About Log Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33<br />
About Keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33<br />
Security and Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34<br />
<strong>Source</strong> <strong>Integrity</strong> Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34<br />
<strong>The</strong> SAM Hierarchy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34<br />
Managing Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36<br />
Promotion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36<br />
Reporter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .37<br />
3 Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces . . . . . . . . . 39<br />
<strong>The</strong> Windows interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40<br />
Starting the <strong>Source</strong> <strong>Integrity</strong> Windows Interface . . . . . . . . . . . . . . . . .40<br />
<strong>The</strong> Application Window. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40<br />
<strong>The</strong> Project Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42<br />
<strong>The</strong> Archive Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .43<br />
Using Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44<br />
Filtering Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45<br />
Using Tree View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45<br />
Using <strong>Source</strong> <strong>Integrity</strong> With Windows Explorer . . . . . . . . . . . . . . . . .48<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48<br />
Installing the <strong>Source</strong> <strong>Integrity</strong> Web Interface . . . . . . . . . . . . . . . . . . . .49<br />
Installing Additional Browser Plugins . . . . . . . . . . . . . . . . . . . . . . . . .50<br />
Starting the <strong>Source</strong> <strong>Integrity</strong> Web Interface . . . . . . . . . . . . . . . . . . . . .50<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface Home Page . . . . . . . . . . . . . . . . .52<br />
Introduction to Views. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52<br />
Setting the Proxy Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58<br />
Setting Your Timezone Display . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60<br />
<strong>The</strong> Command Line Interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .61<br />
Project Commands Versus Archive Commands . . . . . . . . . . . . . . . . .61<br />
Command-Line Length . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62<br />
Path Separator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62<br />
Wildcard Expansion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .62<br />
File Name Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63<br />
ii <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Table of Contents<br />
4 Getting Started With Projects,<br />
Sandboxes, and Members . . . . . . . . . . . . . . . . . . . . . . . 65<br />
Creating a Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66<br />
Registering a Project in the <strong>Source</strong> <strong>Integrity</strong> Web Interface. . . . . . . . . . . .69<br />
Registering a Sandbox in the <strong>Source</strong> <strong>Integrity</strong> Web Interface . . . . . . . . . .69<br />
Opening a Project or Sandbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70<br />
Opening the Master Project From a Sandbox. . . . . . . . . . . . . . . . . . . . . . . .71<br />
Adding Members to a Project. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .72<br />
Removing Members From a Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .75<br />
Creating a Sandbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .76<br />
Checking Out a Member . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81<br />
Viewing and Editing a Member . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85<br />
Checking In a Member . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .87<br />
Starting a Branch When Checking In a Member . . . . . . . . . . . . . . . . .87<br />
Assigning Revision Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .88<br />
Assigning Revision Descriptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .89<br />
Assigning Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .94<br />
Assigning a State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .94<br />
Assigning a Different Revision Number . . . . . . . . . . . . . . . . . . . . . . . .94<br />
Viewing and Editing Project and Sandbox Information. . . . . . . . . . . . . . .94<br />
Setting Project or Sandbox Attributes . . . . . . . . . . . . . . . . . . . . . . . . . .97<br />
Comparing the Working File to Its Member Revision . . . . . . . . . . . . . . . .99<br />
Discarding Changes to Working Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . .100<br />
Locking a Member . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .101<br />
Unlocking a Member . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .102<br />
Removing Unused Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103<br />
Detecting Sandbox Members Out of Sync With the Project. . . . . . . . . . .104<br />
Resynchronizing Your Project or Sandbox. . . . . . . . . . . . . . . . . . . . . . . . .104<br />
Freezing Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .106<br />
Thawing Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .107<br />
Viewing Member Information (Windows Only). . . . . . . . . . . . . . . . . . . .108<br />
Viewing and Editing Member Attributes . . . . . . . . . . . . . . . . . . . . . .109<br />
Promoting and Demoting a Member . . . . . . . . . . . . . . . . . . . . . . . . . . . . .110<br />
Updating to Head Rev. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .113<br />
Updating to Tip Revision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .114<br />
Scanning Your Project for Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .114<br />
Refreshing Your View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .115<br />
Assigning Labels to Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .116<br />
Deleting a Member’s Label . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .117<br />
Building a Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118<br />
Calculating Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .118<br />
Using the Build Command (Windows) . . . . . . . . . . . . . . . . . . . . . . . .120<br />
Using pj build . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .122<br />
<strong>User</strong> <strong>Guide</strong> iii
Table of Contents<br />
Using pj mkmf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .123<br />
<strong>The</strong> Reporter Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .124<br />
About the Report Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .124<br />
About Graphs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .124<br />
Report Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .125<br />
Creating Reports with the Command Line Interface. . . . . . . . . . . . .128<br />
Using Keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .129<br />
Locating Keywords. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .130<br />
Removing Keyword Values. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131<br />
Table of Keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131<br />
5 Managing Projects and Sandboxes . . . . . . . . . . . . . . . 133<br />
Freezing a Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .134<br />
Thawing a Project. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .135<br />
Checkpointing a Project. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .136<br />
Opening a Project Archive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .140<br />
Promoting and Demoting a Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .140<br />
Logging Project Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .142<br />
Cleaning Up Log Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .142<br />
Viewing Changes to a Project. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .143<br />
Restoring a Project’s Member List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .146<br />
Importing Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .148<br />
Importing SCCS Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149<br />
Importing PVCS Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149<br />
Importing Visual <strong>Source</strong>Safe Files . . . . . . . . . . . . . . . . . . . . . . . . . . . .150<br />
Using Existing RCS Archives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .151<br />
Accessing Project Information With the Command Line Interface . . . .152<br />
List of Members. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .152<br />
Changed Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .152<br />
Variables and Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153<br />
Project and Sandbox Information and System Settings. . . . . . . . . . .153<br />
Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .153<br />
Deleting Variant Projects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .158<br />
Cleaning Up Working Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .159<br />
Encrypting Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .160<br />
Automatic Encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .160<br />
Explicit Encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .160<br />
Choosing an Encryption Key. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .161<br />
Changing the Encryption Key. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .162<br />
Working With Encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .162<br />
Encryption and Other Applications . . . . . . . . . . . . . . . . . . . . . . . . . . .162<br />
iv <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Table of Contents<br />
6 Managing Archives and Revisions . . . . . . . . . . . . . . . 165<br />
Opening a Project’s Archive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .166<br />
Opening a Member’s Archive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .166<br />
Creating Archives. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .167<br />
Importing Archives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .171<br />
Checking Out Revisions From Archives. . . . . . . . . . . . . . . . . . . . . . . . . . .172<br />
Checking Out by Revision Number or Label . . . . . . . . . . . . . . . . . . .173<br />
Checking Out by State Setting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .174<br />
Checking In Revisions to Archives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .174<br />
Checking In—Setting Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .175<br />
Checking In—State Settings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .176<br />
Viewing and Editing Archive Information. . . . . . . . . . . . . . . . . . . . . . . . .176<br />
Viewing and Editing Revision Information . . . . . . . . . . . . . . . . . . . . . . . .178<br />
Viewing Revision Metadata With Archive Commands . . . . . . . . . .180<br />
Locked Revisions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .182<br />
Assigning Labels to Revisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .183<br />
Viewing and Editing the Working File or Revision . . . . . . . . . . . . . . . . .184<br />
Promoting and Demoting a Revision . . . . . . . . . . . . . . . . . . . . . . . . . . . . .185<br />
Locking Revisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .187<br />
Unlocking Revisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .187<br />
Deleting Revisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .189<br />
Comparing Revisions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .190<br />
Merging Revisions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .192<br />
Logging Archive Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .193<br />
Log File Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .194<br />
Cleaning Up Log Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195<br />
Cleaning Up Working Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .195<br />
Storing Binary Files in Reference Format . . . . . . . . . . . . . . . . . . . . . . . . . .196<br />
7 Using Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197<br />
Introduction to <strong>Source</strong> <strong>Integrity</strong> Extensions. . . . . . . . . . . . . . . . . . . . . . . .198<br />
<strong>The</strong> Project Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .199<br />
<strong>The</strong> Archive Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .206<br />
Using the Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .209<br />
Differences Between Extensions and <strong>Source</strong> <strong>Integrity</strong> . . . . . . . . . . . . . . .210<br />
Creating Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .210<br />
Creating Sandboxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .212<br />
Microsoft Visual Basic 5.0 and 6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .214<br />
Creating a <strong>Source</strong> <strong>Integrity</strong> Project. . . . . . . . . . . . . . . . . . . . . . . . . . . .215<br />
Creating a Sandbox. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .216<br />
Checking Out Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .216<br />
Checking In New Revisions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .217<br />
<strong>The</strong> Microsoft Visual C++ 6.0 Extension. . . . . . . . . . . . . . . . . . . . . . . . . . .218<br />
<strong>User</strong> <strong>Guide</strong> v
Table of Contents<br />
Creating a <strong>Source</strong> <strong>Integrity</strong> Project. . . . . . . . . . . . . . . . . . . . . . . . . . . .219<br />
Creating a Sandbox. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .219<br />
Checking Out Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .219<br />
Checking in New Revisions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .220<br />
Using Microsoft Visual C++ 6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .221<br />
<strong>The</strong> Borland Delphi Extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .223<br />
Creating a <strong>Source</strong> <strong>Integrity</strong> Project. . . . . . . . . . . . . . . . . . . . . . . . . . . .224<br />
Creating a Sandbox. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .225<br />
Checking Out Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .225<br />
Checking Out Multiple Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .226<br />
Checking In New Revisions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .226<br />
Checking In Multiple Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .227<br />
<strong>The</strong> Microsoft Windows Explorer Extension . . . . . . . . . . . . . . . . . . . . . . .227<br />
Creating an Archive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .228<br />
Checking Out Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .229<br />
Checking In New Revisions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .229<br />
8 Building Projects With <strong>Source</strong> <strong>Integrity</strong> . . . . . . . . . . . 231<br />
Before You Build. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .232<br />
Creating a Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .233<br />
Building . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .234<br />
Object File Associations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .235<br />
Template Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .236<br />
Language Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .236<br />
Conditional Expansion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .236<br />
@Depends. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .237<br />
@Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .237<br />
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .237<br />
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .239<br />
<strong>The</strong> Build Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .239<br />
Templates and Configuration Language. . . . . . . . . . . . . . . . . . . . . . .240<br />
Templates and Variable Expansion . . . . . . . . . . . . . . . . . . . . . . . . . . .240<br />
9 Using the <strong>MKS</strong> Make Utility . . . . . . . . . . . . . . . . . . . . . 243<br />
Compatibility Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .244<br />
Getting the Right Make . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .244<br />
Search Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .245<br />
Changing Your Search Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .245<br />
Getting Started With <strong>MKS</strong> Make . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .246<br />
Dependency of Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .246<br />
Makefiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .247<br />
Writing a Rule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .248<br />
Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .250<br />
vi <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Table of Contents<br />
More About Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .250<br />
Running <strong>MKS</strong> Make. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .252<br />
Specifying Targets on the Command Line . . . . . . . . . . . . . . . . . . . . .252<br />
Using a Different Makefile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .252<br />
<strong>The</strong> Command Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .253<br />
How Make Finds Its Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .254<br />
Using Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .256<br />
Macro Naming Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .258<br />
Defining Macros on the Command Line . . . . . . . . . . . . . . . . . . . . . . .259<br />
Nesting Macros in other Macros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .259<br />
Modifying Macro Expansions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .261<br />
Controlling <strong>MKS</strong> Make . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .265<br />
Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .265<br />
Special Target Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .267<br />
Special Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .271<br />
How Make Finds Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .277<br />
Using Inference Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .281<br />
Metarules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .282<br />
Suffix Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286<br />
More About Executing Recipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .288<br />
Regular Recipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .288<br />
Built-In Commands. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .289<br />
Group Recipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .289<br />
Control Macros Used With Group Recipes. . . . . . . . . . . . . . . . . . . . .290<br />
Text Diversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .291<br />
Making Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .293<br />
Metarules for Library Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .294<br />
Suffix Rules for Library Support. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .295<br />
Compatibility Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .296<br />
Conditionals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .296<br />
Other Makes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .298<br />
Using the Generic CC Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .302<br />
Compilation Configuration Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . .302<br />
Using CC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .303<br />
Generic Command-line Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .303<br />
Examples of Use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .304<br />
Problem Solving . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .304<br />
Without a Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .304<br />
Simple Makefile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .305<br />
Separate Object Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .305<br />
<strong>MKS</strong> Make and <strong>Source</strong> <strong>Integrity</strong>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .306<br />
Using a Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .306<br />
Recursive Makes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .307<br />
Clean-up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .307<br />
<strong>User</strong> <strong>Guide</strong> vii
Table of Contents<br />
Back-up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .308<br />
Default Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .308<br />
Miscellaneous Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .309<br />
10 Starting a Change <strong>Integrity</strong> Session . . . . . . . . . . . . . . 311<br />
Change <strong>Integrity</strong> Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .312<br />
Issues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .312<br />
Workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .312<br />
<strong>User</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .312<br />
Group . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .313<br />
Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .313<br />
Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .313<br />
Reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .313<br />
Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .313<br />
Before You Start a Change <strong>Integrity</strong> Session . . . . . . . . . . . . . . . . . . . . . . .314<br />
Starting a Change <strong>Integrity</strong> Session. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .314<br />
Logging In . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .314<br />
<strong>The</strong> Change <strong>Integrity</strong> Graphic <strong>User</strong> Interface . . . . . . . . . . . . . . . . . . . . . .317<br />
<strong>The</strong> Application Window. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .317<br />
<strong>The</strong> Change <strong>Integrity</strong> Web Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .320<br />
Setting Session Preferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .321<br />
Email Notification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .323<br />
Saving Session Preferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .327<br />
Ending a Change <strong>Integrity</strong> Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .328<br />
Logging Out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .328<br />
Closing a Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .328<br />
11 Submitting Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331<br />
Submitting an Issue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .332<br />
Relating an Issue With a Submitted Issue . . . . . . . . . . . . . . . . . . . . . .335<br />
Adding Attachments to an Issue . . . . . . . . . . . . . . . . . . . . . . . . . . . . .340<br />
12 Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349<br />
Creating a New Query. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .350<br />
Creating Saved Queries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .354<br />
Reverting a Saved Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .356<br />
Deleting a Saved Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .356<br />
Viewing and Editing Saved Query Properties . . . . . . . . . . . . . . . . . .357<br />
Running Queries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .359<br />
13 Viewing and Editing Issues . . . . . . . . . . . . . . . . . . . . . 363<br />
Viewing Query Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .364<br />
viii <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Table of Contents<br />
Selecting Issues to View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .367<br />
Printing Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .371<br />
Saving Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .373<br />
Editing Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .376<br />
Batch Editing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .377<br />
14 Reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385<br />
Change <strong>Integrity</strong> Reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .386<br />
Creating Reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .386<br />
Editing Reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .393<br />
Running Reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .395<br />
Deleting Reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .397<br />
Copying Reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .398<br />
Saving and Printing Reports. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .400<br />
Saving Reports. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .400<br />
Printing Reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .401<br />
15 Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405<br />
Change <strong>Integrity</strong> Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .406<br />
Creating Distribution Charts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .407<br />
Creating Trend Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .417<br />
Editing Existing Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .427<br />
Running Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .428<br />
Deleting Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .431<br />
Copying Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .432<br />
Saving and Printing Charts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .433<br />
Saving Charts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .434<br />
Printing Charts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .434<br />
16 Integrated Version Control . . . . . . . . . . . . . . . . . . . . . . 437<br />
Configuring Change <strong>Integrity</strong> Connect . . . . . . . . . . . . . . . . . . . . . . . . . . .438<br />
Associating Active Issues With Project Members . . . . . . . . . . . . . . . . . . .441<br />
Viewing Change Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .442<br />
A Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445<br />
<strong>Source</strong> <strong>Integrity</strong> Terms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .445<br />
Change <strong>Integrity</strong> Terms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .454<br />
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457<br />
<strong>User</strong> <strong>Guide</strong> ix
Table of Contents<br />
x <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Welcome to<br />
<strong>Source</strong> <strong>Integrity</strong><br />
<strong>Professional</strong> <strong>Edition</strong><br />
1<br />
<strong>Source</strong> <strong>Integrity</strong> is a comprehensive, project-oriented configuration<br />
management system that gives you control over the evolution of your<br />
files. It not only documents the changes made to your files, but also<br />
tracks who made them, when they were made, and the reasons why.<br />
In addition, its project functionality lets you group related files into<br />
projects that can follow your development cycle. <strong>Source</strong> <strong>Integrity</strong><br />
includes extensive configuration options to provide configuration<br />
management that conforms with your established policies.<br />
As part of <strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>, Change<br />
<strong>Integrity</strong> integrates with <strong>Source</strong> <strong>Integrity</strong>, to give you a highly<br />
customizable issue-tracking, software change management, and team<br />
management tool. Change <strong>Integrity</strong> helps your development team<br />
capture and track all the data related to software change, which is<br />
particularly important when your organization has implemented a<br />
Software Configuration Management (SCM) process for the proposal,<br />
review, and approval of all software changes on your project.<br />
Whether you work on one-person projects, or in multipleprogrammer<br />
development environments, <strong>Source</strong> <strong>Integrity</strong><br />
<strong>Professional</strong> <strong>Edition</strong> has the features to help you get the job done. Its<br />
function set and project-oriented architecture are available in both<br />
command-line and graphical user interfaces.<br />
<strong>User</strong> <strong>Guide</strong> 1
Welcome to <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong><br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong><br />
<strong>User</strong> <strong>Guide</strong><br />
This manual is designed to provide users with an overview of<br />
configuration management and problem tracking and how they can<br />
use <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong> to implement these<br />
principles in their environment. For the purposes of this manual, a<br />
user is considered to be anyone who needs to work with <strong>Source</strong><br />
<strong>Integrity</strong> or Change <strong>Integrity</strong> projects.<br />
This chapter introduces you to the <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong><br />
<strong>User</strong> <strong>Guide</strong> and its contents. <strong>The</strong> following is a list of the book’s other<br />
chapters with a brief description of each chapter’s topic:<br />
Chapter 2: “Understanding <strong>Source</strong> <strong>Integrity</strong>” (page 5)<br />
Discusses basic concepts of software configuration management,<br />
and how they are implemented within <strong>Source</strong> <strong>Integrity</strong>.<br />
Chapter 3: “Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces”<br />
(page 39)<br />
Provides an introduction to the three main interfaces to <strong>Source</strong><br />
<strong>Integrity</strong>: the Windows interface, the <strong>Source</strong> <strong>Integrity</strong> Web<br />
interface, and the command line interface.<br />
Chapter 4: “Getting Started With Projects, Sandboxes, and<br />
Members” (page 65)<br />
Describes how to create projects and sandboxes, and work with<br />
members. Explains tasks in each of the three main <strong>Source</strong><br />
<strong>Integrity</strong> interfaces.<br />
Chapter 5: “Managing Projects and Sandboxes” (page 133)<br />
Describes how to manages projects as a whole, explaining<br />
commands in all three main interfaces.<br />
Chapter 6: “Managing Archives and Revisions” (page 165)<br />
Describes how to manage your <strong>Source</strong> <strong>Integrity</strong> archives directly,<br />
without using projects.<br />
Chapter 7: “Using Extensions” (page 197)<br />
Explains how to integrate <strong>Source</strong> <strong>Integrity</strong> with a number of<br />
popular programming platforms.<br />
Chapter 8: “Building Projects With <strong>Source</strong> <strong>Integrity</strong>”<br />
(page 231)<br />
Explains how to use <strong>Source</strong> <strong>Integrity</strong>’s build features.<br />
2 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong> <strong>User</strong> <strong>Guide</strong><br />
Chapter 9: “Using the <strong>MKS</strong> Make Utility” (page 243)<br />
Explains how to use <strong>Source</strong> <strong>Integrity</strong>’s MAKE utility.<br />
Chapter 2: “Starting a Change <strong>Integrity</strong> Session” (page 5)<br />
Provides an overview of important Change <strong>Integrity</strong> concepts,<br />
logging in to Change <strong>Integrity</strong>, the Change <strong>Integrity</strong> graphic user<br />
interface, the Change <strong>Integrity</strong> Web interface, setting session<br />
preferences, logging out, and exiting a Change <strong>Integrity</strong> session.<br />
Chapter 3: “Submitting Issues” (page 25)<br />
Discusses how to submit new issues.<br />
Chapter 4: “Queries” (page 43)<br />
Describes how you can query the Change <strong>Integrity</strong> database for<br />
issue types that meet specific criteria.<br />
Chapter 5: “Viewing and Editing Issues” (page 57)<br />
Describes how to view issues and edit issue information.<br />
Chapter 6: “Reports” (page 79)<br />
Discusses how to create, edit, and generate reports from issue<br />
data.<br />
Chapter 7: “Charts” (page 99)<br />
Discusses how to create, edit, and generate charts from issue<br />
data.<br />
Chapter 8: “Integrated Version Control” (page 131)<br />
Describes using Change <strong>Integrity</strong> to activate issues for use in<br />
<strong>Source</strong> <strong>Integrity</strong>, configuring Change <strong>Integrity</strong> Connect in <strong>Source</strong><br />
<strong>Integrity</strong>, and associating active issues with project members in<br />
<strong>Source</strong> <strong>Integrity</strong>.<br />
Appendix A: “Glossary” (page 445)<br />
A glossary of common terms and definitions for <strong>Source</strong> <strong>Integrity</strong><br />
and Change <strong>Integrity</strong>.<br />
<strong>User</strong> <strong>Guide</strong> 3
Welcome to <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong><br />
Typographical<br />
Conventions<br />
Related<br />
Documentation<br />
Throughout the manuals, the following typographical conventions<br />
identify the features, functions and components of <strong>Source</strong> <strong>Integrity</strong><br />
<strong>Professional</strong> <strong>Edition</strong>.<br />
Items in documentation Appear as follows<br />
Menu items, nested menu items Edit > Role<br />
Drop-down menus the Archive menu item<br />
Dialog boxes, features Edit Options, Cancel, OK<br />
Command-line commands pj ci<br />
Screen information, messages Enter a name for this<br />
development path:<br />
Environment variables TMPDIR<br />
Path names c:\srcint\work<br />
<strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong><br />
<strong>Edition</strong> terms<br />
appear in italics the first time<br />
Keyboard keys appear in bold between angle<br />
brackets, for example: <br />
Procedures for the Windows<br />
interface, graphic user interface,<br />
Web interface, and Command-Line<br />
interface<br />
<strong>The</strong> <strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong> Reference <strong>Guide</strong> provides<br />
information on <strong>Source</strong> <strong>Integrity</strong> Configuration and <strong>MKS</strong> Make, and<br />
includes the manual pages for both the <strong>Source</strong> <strong>Integrity</strong> commandline<br />
interface and <strong>MKS</strong> Make.<br />
<strong>The</strong> <strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong> Administrator <strong>Guide</strong><br />
provides information on installing, configuring, and administrating<br />
<strong>Source</strong> <strong>Integrity</strong> and Change <strong>Integrity</strong> at your site.<br />
<strong>The</strong> <strong>MKS</strong> Change <strong>Integrity</strong> Solutions <strong>Guide</strong> recommends ways of<br />
configuring Change <strong>Integrity</strong> to best suit your development<br />
processes.<br />
You can access online help from within the <strong>Source</strong> <strong>Integrity</strong> Windows<br />
interface and Change <strong>Integrity</strong> graphic user interface; and through<br />
the <strong>Source</strong> <strong>Integrity</strong> Web interface and Change <strong>Integrity</strong> Web<br />
interface. You can access online man pages for <strong>Source</strong> <strong>Integrity</strong> from<br />
the command line interface.<br />
4 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Understanding <strong>Source</strong><br />
<strong>Integrity</strong><br />
2<br />
This chapter describes basic concepts of configuration management<br />
and how these concepts are applied within <strong>Source</strong> <strong>Integrity</strong>. If you<br />
are unfamiliar with configuration management or revision control<br />
applications, you should read this chapter.<br />
This chapter covers the following topics:<br />
what is configuration management<br />
configuration management concepts<br />
<strong>Source</strong> <strong>Integrity</strong> basics<br />
understanding projects<br />
understanding archives<br />
understanding sandboxes<br />
security and administration<br />
managing development<br />
<strong>User</strong> <strong>Guide</strong> 5
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
What Is Configuration Management?<br />
Configuration management supports developers who create, revise,<br />
and deliver large amounts of interrelated source material that<br />
changes over time.<br />
Developers can include primary software developers, quality<br />
assurance specialists, and others who work with source material. This<br />
source material is usually source code, header or script files, thirdparty<br />
libraries, documentation, graphic files, or other included<br />
resources.<br />
An effective configuration management tool has to address all the<br />
revision-control needs of the development team. Such a tool should<br />
preserve the evolving revisions of source code and resource files<br />
define relationships between the files and the other components<br />
needed to build applications<br />
retrieve previous versions of files, application components, or<br />
entire applications<br />
To enhance the management of the overall project, it should also<br />
protect work in progress from inadvertent loss or overwriting<br />
reduce duplication of effort<br />
isolate work in progress from the testing environment<br />
provide analytical capabilities (it should provide reports to help<br />
managers assess and control the flow of work during the<br />
development cycle)<br />
take advantage of system security facilities to protect valuable<br />
data<br />
encourage a responsible and disciplined approach to<br />
implementing change<br />
allow a managed product-release strategy<br />
reduce maintenance costs by simplifying or automating the<br />
replication of any previous release state<br />
6 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> Role of Configuration Management<br />
Managing<br />
Constant<br />
Change<br />
<strong>The</strong> Cost of<br />
Change<br />
<strong>The</strong> Role of Configuration Management<br />
In today’s competitive software world, developers need to be able to<br />
bring robust, maintainable products to market in a timely way.<br />
Consequently, they need to establish an environment that encourages<br />
disciplined development practices and managed propagation of<br />
change.<br />
In an industry where post-implementation maintenance accounts for<br />
a significant portion of product costs, anything that reduces the<br />
maintenance burden can provide a significant competitive edge.<br />
From the outset, virtually every software development project tries to<br />
hit a moving target, and the need to manage the resulting change<br />
constructively is paramount. For instance, consider a typical project.<br />
Initial designs are modified to accommodate the needs of<br />
implementation, user requirements, and new hardware<br />
platforms.<br />
Maintenance and additional release schedules are based on—and<br />
require changes to—source code and resources produced in the<br />
implementation phase.<br />
No one expects software products to be carved in stone. Pressures<br />
from users and the marketplace mean that every software project is<br />
an ongoing process of upgrade, modification, and maintenance.<br />
<strong>The</strong> issue today is not whether this trend can—or should—be<br />
reversed, but how well it can be managed. <strong>The</strong> challenge is to<br />
minimize its negative impact and attempt to turn it to competitive<br />
advantage.<br />
Undisciplined software development can have an enormous price<br />
tag. Duplication of effort, propagation of changes in “free-fire”<br />
development zones, and constantly changing construction<br />
environments all add to the cost of software production.<br />
Consider two scenarios that are common at software development<br />
sites.<br />
<strong>User</strong> <strong>Guide</strong> 7
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
<strong>Source</strong> Changes<br />
A bug report is issued against a released product, but a check of the<br />
latest source code reveals no obvious reason for the problem. It is<br />
known that the product in the field was built from an earlier release<br />
of the code, but the precise configuration of code and resource<br />
modules used in the release cannot be reproduced.<br />
To make matters worse, the source code currently under<br />
development cannot be shipped as a fix because it is still in a<br />
prerelease state. <strong>The</strong> only way to solve the problem is to take time<br />
and resources away from current development to produce and<br />
distribute an expensive patch.<br />
Environmental Changes<br />
A programmer spends several weeks writing a program. It runs<br />
successfully in the development environment, but when it is turned<br />
over to the product team for integration into a new release it<br />
immediately fails all tests in the product environment.<br />
As a result, both time and money are lost trying to discover the<br />
difference between the programmer’s and the product team’s<br />
development environments.<br />
<strong>The</strong> problems in these scenarios are all too common in the software<br />
industry: companies are unable to replicate previous states of source<br />
code and resources, and efficiency is degraded due to changes in the<br />
development environment. <strong>The</strong> result is wasted time and money.<br />
Common Development Problems<br />
Development problems can occur for a number of reasons.<br />
Two programmers may be working on different modules of the<br />
same set of source-code files, each unaware of the other. When<br />
one programmer finishes a fix and tries a test build, he or she<br />
picks up the incomplete file that the other programmer is<br />
working on and the build fails.<br />
Time is spent debugging a problem that has nothing to do with<br />
the work done by the first programmer.<br />
A programmer alters a fundamental resource file—such as a C<br />
header—resulting in unexpected changes that ripple across the<br />
entire application.<br />
<strong>The</strong> configuration of source files used to build product releases is<br />
not easily replicable when post-release maintenance is needed.<br />
8 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Managing<br />
Change<br />
Implementing<br />
Change<br />
<strong>The</strong> Role of Configuration Management<br />
<strong>The</strong> tools used to build an application are not maintained as part<br />
of the release, along with the source code and resource files.<br />
Libraries are often a culprit here, as are preprocessor scripts or<br />
build scripts, which are modified for current releases and no<br />
longer work for earlier ones.<br />
All of these problems are related to the way source code is<br />
maintained and how product configuration is managed. <strong>The</strong>y<br />
demonstrate poor management practices and a lack of discipline in<br />
the way many organizations develop and maintain software<br />
applications.<br />
Configuration management is the key to streamlining software<br />
development, reducing costs, and increasing the efficiency and<br />
profitability of the process.<br />
A successful configuration management system does more than track<br />
a development project’s structure and contents. It also encourages<br />
and supports healthy practices during all phases of the development<br />
cycle: design, implementation, testing, and maintenance.<br />
At its heart, a configuration management system is a comprehensive<br />
approach to software development that addresses<br />
how the environment is configured (its directory structures and<br />
file distribution, for example)<br />
how programmers work in the development environment (for<br />
instance, their revision management, locking, and promotion<br />
practices)<br />
how discipline is encouraged and how management objectives<br />
are supported throughout the development cycle<br />
In an industry that takes pride in its own creativity, the mention of<br />
discipline or management controls can send people running for<br />
cover. This type of response, however, has led to many of the<br />
problems and bad work habits in the realm of software development.<br />
Discipline, thoughtfully instituted and supported by tools that make<br />
it easy to implement, can provide a well-structured work<br />
environment for managers and programmers alike.<br />
For programmers, it significantly reduces down time. It reduces<br />
time spent recreating previous development states, or time spent<br />
isolating themselves from other developers so that problems can<br />
be identified and corrected.<br />
<strong>User</strong> <strong>Guide</strong> 9
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
For managers, such discipline helps streamline the development<br />
cycle, allowing them to get products to market in a more timely—<br />
and therefore more profitable—manner.<br />
<strong>Source</strong> <strong>Integrity</strong> gives programmers and managers a comprehensive<br />
set of configuration management tools. <strong>The</strong>se tools are flexible<br />
enough to enforce the discipline required by management, and<br />
organized enough to free programmers from endless maintenance<br />
cycles. In short, these tools allow developers to concentrate on what<br />
they are really good at—the creative aspects of developing<br />
applications.<br />
Configuration Management Concepts<br />
Archives<br />
Revisions<br />
Traditional configuration management, and advanced configuration<br />
management systems such as <strong>Source</strong> <strong>Integrity</strong>, have evolved around<br />
a few commonly held concepts.<br />
Traditional source files, even in advanced file systems, do not lend<br />
any advantage to data that changes over time. A file contains one and<br />
only one version of data—if the data changes over time and you want<br />
to retain the changes, you need one file for each new version. <strong>The</strong>se<br />
files can be organized within folders or directories, but they are not<br />
directly interrelated.<br />
Configuration management systems like <strong>Source</strong> <strong>Integrity</strong> create<br />
archives to provide these enhancements. Archives are structures that<br />
store multiple revisions of a source file. <strong>The</strong>y can store many different<br />
types of user-supplied data and can efficiently store data between<br />
revisions that have not changed much. <strong>Source</strong> <strong>Integrity</strong> stores one<br />
archive file for each source file, but other systems use methods such<br />
as databases.<br />
Revisions are the basic unit of data placed under configuration<br />
management control. Each revision corresponds to the content of a<br />
source file at a particular instant in time. <strong>The</strong> collection of revisions of<br />
a particular source file is the archive for that source file. When a<br />
revision is extracted (or checked out) and changed, the new version<br />
(once it is checked in) becomes the next revision.<br />
10 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Branches<br />
Metadata<br />
<strong>Source</strong> <strong>Integrity</strong> Basics<br />
<strong>Source</strong> <strong>Integrity</strong> Basics<br />
Not all development is linear—different developers may want to take<br />
the same piece of source material in different directions.<br />
Configuration management systems like <strong>Source</strong> <strong>Integrity</strong> can branch<br />
an archive, to preserve a copy of the original content for each<br />
developer as they begin their individual work. Through the process<br />
of merging, those different branches can be selectively woven back<br />
together.<br />
Any information about the source material in question is metadata.<br />
Traditional file systems make little provision for metadata. Files<br />
commonly have a file name that can be less than informative.<br />
Systems keep timestamps and ownership information, but they do<br />
not traditionally keep comments for each file.<br />
With configuration management tools, you can assign plain-language<br />
comments to each revision of a source file, communicating to anyone<br />
who will use your revisions exactly what you changed. You can also<br />
assign arbitrary or prescribed labels or state descriptors.<br />
Configuration management tools can also add your identity (as an<br />
author) to the metadata, to preserve an audit trail.<br />
At its heart, any configuration management system must deal with<br />
two basic facts:<br />
Relationships exist between objects in the development<br />
environment.<br />
An object’s revision history must be tracked so that past versions<br />
of projects can be recreated.<br />
Once you understand that these key concepts are the core of your<br />
configuration management system, all the other pieces begin to fall<br />
into place.<br />
Related Objects Even the simplest development effort consists of multiple files that<br />
must come together to build a finished product, and the vast majority<br />
of today’s projects are far from simple. Finished applications consist<br />
of executables, libraries, resource and data files, help systems, and<br />
myriads of other components. Each component of an application may<br />
contain dozens of individual objects.<br />
<strong>User</strong> <strong>Guide</strong> 11
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
Changing<br />
States<br />
Often, the same files are shared by more than one component, and<br />
entire components may be part of several larger modules. <strong>Source</strong><br />
<strong>Integrity</strong>’s projects let you define development objects and the<br />
relationships among them. <strong>Source</strong> <strong>Integrity</strong> handles both simple and<br />
complex objects—files, components, modules, or complete<br />
applications—and automates the intricate weave of their<br />
relationships.<br />
What Are Development Objects?<br />
<strong>Source</strong> <strong>Integrity</strong> lets you define objects and establish their place in the<br />
development hierarchy at every stage of the development process.<br />
<strong>Source</strong> <strong>Integrity</strong> can help you organize your resources into<br />
meaningful, easy-to-manage units, so you can work with confidence<br />
in a stable environment. This ability to group objects into logically<br />
and functionally related projects, and to define relationships between<br />
objects, provides a foundation for good development practices.<br />
If building a software application were like building a house, <strong>Source</strong><br />
<strong>Integrity</strong>’s archives and projects—the building blocks—would be all<br />
you would need. But software development is not a static process.<br />
Imagine trying to build a house when the bricks and timbers keep<br />
changing shape.<br />
Unlike bricks and timbers, the objects used in software applications<br />
change over time: files are updated and code modules are expanded<br />
or broken down into smaller components. Software building blocks<br />
change even after they are put into place.<br />
Dealing With Constant Change<br />
<strong>Source</strong> <strong>Integrity</strong> handles this problem by letting you take “snapshots”<br />
of any object at every stage of its development. This snapshot—or<br />
revision—then becomes a static building block that you use to build<br />
your application while the object continues to evolve.<br />
When a file or code module reaches a milestone, you can check in the<br />
object to preserve its current state as a revision. When you need that<br />
object to build your application or compile another module, it can be<br />
recreated automatically, in precisely the same state as it was saved.<br />
Using this technique, different revisions of the same object (that is,<br />
the same object in different states) can be used to build various<br />
components of an application. You can recreate components—or an<br />
entire product release—if post-release fixes become necessary.<br />
12 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Understanding Projects<br />
Logical and<br />
Functional<br />
Structures<br />
Understanding<br />
Archives<br />
Understanding Projects<br />
With <strong>Source</strong> <strong>Integrity</strong>, you can control the granularity of your<br />
development process. <strong>Source</strong> <strong>Integrity</strong>’s projects let you define<br />
complex development objects and the relationships among them.<br />
Individual files represent the development object at its lowest level.<br />
However, modern software development’s size and complexity make<br />
it impractical to manage at this level. Instead, <strong>Source</strong> <strong>Integrity</strong> takes<br />
another approach.<br />
<strong>Source</strong> <strong>Integrity</strong>’s approach to configuration management lets you<br />
modularize your development effort. It lets you create logically and<br />
functionally related subprojects that come together to build a finished<br />
application. Every unit—or subproject—in the hierarchy is a<br />
development object that can be managed either individually or<br />
relative to the other objects it interacts with.<br />
You can determine the number, size, and complexity of the<br />
objects you work with.<br />
You can define the relationships between development objects.<br />
You can shape the project to address the management<br />
requirements at your site.<br />
<strong>The</strong>re are two key issues to consider when you decide on the best<br />
structure for your projects:<br />
the functional structure, the directory trees where files reside<br />
the logical structure of the <strong>Source</strong> <strong>Integrity</strong> project<br />
Ideally, these two structures should be identical. <strong>The</strong> physical<br />
organization of stored files—the project’s directory tree—should<br />
reflect the logical relationships among files. Except for very small<br />
projects, however, this ideal is almost never achieved. Usually, as a<br />
project grows, new files and modules are added until the internal<br />
relationship among components becomes too varied and complex to<br />
be accurately reflected by the project’s directory tree.<br />
A <strong>Source</strong> <strong>Integrity</strong> archive is the “place” where revisions (snapshots of<br />
an object’s state at a particular point in time) are preserved. Any<br />
development object can have an archive where revisions of itself are<br />
stored, and from which they can be retrieved at any time. It is this<br />
ability to save and recreate every development object—at any stage of<br />
its development—that makes <strong>Source</strong> <strong>Integrity</strong> so effective as a<br />
configuration management tool.<br />
<strong>User</strong> <strong>Guide</strong> 13
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
About Archives<br />
Archives and revisions are fully integrated with <strong>Source</strong> <strong>Integrity</strong><br />
projects. When you add an archived object to a project, you add a<br />
specific revision of the object, not the entire development object, which<br />
might contain dozens or hundreds of different snapshots of itself.<br />
Once the object becomes a project member, the project and object<br />
automatically maintain their relationship: you can freeze the project<br />
or the revision so only that particular revision will ever be used, or<br />
you can track the archive and update the member whenever a newer<br />
revision is available.<br />
Because archives store development objects, you can have them at<br />
any level of your development hierarchy. You can archive<br />
individual files<br />
entire projects consisting of any number of files and subprojects<br />
No matter how simple or complex your objects are, you can save<br />
snapshots of them in an archive and reproduce them—accurately and<br />
reliably—whenever they are needed.<br />
Archives provide the underlying storage structure for <strong>Source</strong><br />
<strong>Integrity</strong>. <strong>The</strong>y contain your source files and the changes you make to<br />
them. Archives also contain detailed information, or metadata, about<br />
your files and their change history.<br />
About Archive Structure<br />
A new archive contains<br />
Archive Information<br />
Information about the archive itself (for example, the archive<br />
description).<br />
<strong>The</strong> first revision of your working file. <strong>The</strong> content of the file you<br />
checked in.<br />
Revision Information<br />
Information about the revision (for example, the revision number<br />
and the name of the person who has it locked).<br />
<strong>The</strong> new archive can be represented graphically, as the following<br />
illustration on the left shows. As you continue to work with your files<br />
and add more revisions to the archive, it develops a structure much<br />
like the trunk of a tree.<br />
Each new revision adds to the line of revisions, as the illustration on<br />
the right shows.<br />
14 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
This main line of revisions is<br />
referred to as the trunk of the<br />
archive.You can also add<br />
branches to the archive to take<br />
the content in a different<br />
direction.<br />
What Happens<br />
at Check-in<br />
Time?<br />
Understanding Projects<br />
When <strong>Source</strong> <strong>Integrity</strong> creates an archive for a source file, it performs<br />
the following steps:<br />
creates a new archive file<br />
adds a revision to the archive and assigns it a unique revision<br />
number (usually number 1.1)<br />
copies the original file into the new revision<br />
During subsequent check-ins to the archive, <strong>Source</strong> <strong>Integrity</strong> does<br />
things slightly differently. <strong>Source</strong> <strong>Integrity</strong><br />
creates a new revision and assigns it a unique revision number<br />
(for example, revision 1.2)<br />
copies the working file into the new revision<br />
compares the new revision (revision 1.2) with the previous<br />
revision (revision 1.1) and calculates the differences between<br />
them<br />
replaces the contents of the previous revision (revision 1.1) with<br />
the differences between it and the newer revision.<br />
<strong>The</strong> list of differences between a revision and its immediate ancestor<br />
is called a delta. An archive usually contains a complete copy of the<br />
latest revision and all of the deltas required to reconstruct earlier<br />
revisions. An archive can also be made up of complete copies of each<br />
revision if you choose to configure the system that way.<br />
<strong>User</strong> <strong>Guide</strong> 15
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
Storing Deltas<br />
When <strong>Source</strong> <strong>Integrity</strong> performs a check-in operation, it calculates<br />
and stores the delta between the new revision and the previous one in<br />
the archive.<br />
For instance, in the situation described earlier, revision 1.1 (that is, the<br />
first revision checked in) now contains a complete description of the<br />
changes that must be made to revision 1.2 to rebuild revision 1.1. This<br />
list of changes, the delta, is the key to understanding how archives<br />
store revisions and rebuild working files on demand.<br />
To check out revision 1.1, <strong>Source</strong> <strong>Integrity</strong><br />
reads the list of differences (that is, the delta) it contains<br />
applies the changes to revision 1.2., rebuilding a duplicate of the<br />
original revision 1.1<br />
copies the revision to a working file<br />
Using this technique, <strong>Source</strong> <strong>Integrity</strong> can recreate any revision<br />
without having to store complete copies. Usually, if you save only the<br />
changed portion of each revision, the archive will be much smaller<br />
than if the entire file were saved each time. <strong>The</strong>re are situations when<br />
this may not be the case; if you are storing binary files in an archive, a<br />
complete copy of each revision is stored by default (see “Storing<br />
Entire File” next).<br />
When <strong>Source</strong> <strong>Integrity</strong> compares the file being checked in to the<br />
preceding revision in the archive, it compares the two files line by<br />
line. While this is a logical—and efficient—way to handle text files, it<br />
is not always effective with binary files, since a relatively small<br />
change at the beginning of a binary file can displace all subsequent<br />
characters in the file, cascading changes through all remaining lines.<br />
As a consequence, the record of changes (that is, the delta) for some<br />
binary files may be as large as, or larger than, the file itself. For this<br />
reason, <strong>Source</strong> <strong>Integrity</strong> provides a number of configurable<br />
techniques for checking in files.<br />
Storing Changes Only<br />
With this method, <strong>Source</strong> <strong>Integrity</strong> calculates and stores a delta for<br />
each revision of a file when it is checked in. This is the default and<br />
recommended method for checking in text files. You can use this<br />
method for storing binary files, but <strong>MKS</strong> does not recommend it.<br />
16 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Branches and<br />
Trunks<br />
Storing Entire File<br />
Understanding Projects<br />
With this method, <strong>Source</strong> <strong>Integrity</strong> does not calculate deltas, but still<br />
stores all of the revisions of the file in one archive.<br />
This is the default and recommended method for checking in binary<br />
files.<br />
Storing Entire File by Reference<br />
With this method, <strong>Source</strong> <strong>Integrity</strong> does not calculate differences<br />
between a file and the current revision. Instead, <strong>Source</strong> <strong>Integrity</strong> uses<br />
the Reference format. In the Reference format, the archive file only<br />
contains a summary of each revision with a pointer to a file that<br />
contains that revision. Although this method requires more disk<br />
space to store archives, it improves performance when checking large<br />
binary files in or out of a project.<br />
Note You can choose Store Changes Only or Store Entire File for both<br />
text and binary files on the Checkin tab of the Personal Configuration<br />
dialog box. You can choose Store By Reference for an individual archive<br />
using the Archive Information dialog box.<br />
<strong>The</strong> original development path of your project is also called the trunk,<br />
and its most recent revision is called the head revision. If you check out<br />
the head revision, modify it, and check it back in, <strong>Source</strong> <strong>Integrity</strong><br />
places a new revision at the top of the trunk, making it the new head<br />
revision.<br />
To move away from the main development path by creating a new<br />
path, you check out, modify, and check in a revision that is not the<br />
head revision. When you check it back in, by default, <strong>Source</strong> <strong>Integrity</strong><br />
will suggest that you create a branch; your new revision will now be<br />
the tip of the branch.<br />
A branch is an independent revision line that uses an existing<br />
revision as its starting point. Branches have several uses. You may be<br />
pursuing a line of development that will not be included in the<br />
finished product or may need to create a branch to perform postrelease<br />
maintenance on an earlier revision.<br />
Revisions on the trunk are characterized by two-part revision<br />
numbers (for example, 1.2 or 3.5), and branch revision numbers are<br />
prefixed with the number of the revision they start from (that is, the<br />
root revision).<br />
<strong>User</strong> <strong>Guide</strong> 17
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
Branching the archive permits<br />
development to continue<br />
unhindered on the trunk.<br />
Contrast the branched<br />
structure, previous<br />
illustration, with the nonbranched<br />
structure.<br />
If a branch is started from trunk revision number 1.2, the revisions of<br />
the branch are numbered (from bottom to top)<br />
1.2.1.3<br />
1.2.1.2<br />
1.2.1.1<br />
and so on. <strong>The</strong> first two digits of the number identify the root revision<br />
the branch springs from; the last two represent a revision on the<br />
branch.<br />
Starting a Branch<br />
<strong>Source</strong> <strong>Integrity</strong> always tries to build the revision tree vertically by<br />
adding a new level every time you check in a file.<br />
When you check in a revision that is not a tip revision, <strong>Source</strong><br />
<strong>Integrity</strong> assumes it should create a branch for the new revision,<br />
because there is already a revision in place above it.<br />
18 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Branching occurs when you<br />
check in a revision that is not<br />
at the top of the revision tree.<br />
Understanding Projects<br />
Replacing an existing revision or inserting a new revision between<br />
two existing ones would alter the archive’s change history—this<br />
behavior would undermine the entire process of revision control and<br />
is therefore not allowed.<br />
Revision Number, Branch Number, Branch Level<br />
<strong>The</strong> revision number is the particular number of a revision. It is<br />
composed of branch.version pairs.<br />
<strong>Source</strong> <strong>Integrity</strong> considers the revision number without the last dot<br />
and digits to be the branch number. As well, the branch level is the<br />
“degree of removal” from the trunk. <strong>The</strong> following table shows the<br />
relationship between revision numbers, branch numbers, and branch<br />
levels.<br />
Example Revision Number Branch Number Branch Level<br />
1.3 1 0<br />
1.9.2.3 1.9.2 1<br />
1.11.2.4.1.1 1.11.2.4.1 2<br />
Example<br />
If you make four revisions to a source file named prog.c, <strong>Source</strong><br />
<strong>Integrity</strong> records revision 1.1 (the original revision), 1.2, 1.3, and 1.4.<br />
This is the trunk of the archive.<br />
If you need to work from revision 1.2 and make some new changes,<br />
trying to check in the result will branch the archive, as our new<br />
changes cannot replace the existing revision 1.3. <strong>Source</strong> <strong>Integrity</strong><br />
creates revision 1.2.1.1 for our changes to 1.2.<br />
<strong>User</strong> <strong>Guide</strong> 19
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
<strong>The</strong>re is no limit to the<br />
number of branches you can<br />
create in an archive. You can<br />
even have multiple branches<br />
stemming from the same<br />
revision.<br />
Checkpointing<br />
Your Project<br />
<strong>The</strong> number of the branch created in the prog.c archive is 1.2.1 (since<br />
it stems from revision 1.2 and it is the first branch from that revision).<br />
<strong>The</strong> branch level of the 1.2.1 branch is 1, because it is one level<br />
removed from the trunk (0). You could create a second branch from<br />
revision 1.2 in the prog.c archive by repeating the steps you used to<br />
create the first one.<br />
Default Branch<br />
Each archive has a default branch. <strong>Source</strong> <strong>Integrity</strong> tries to check in<br />
files as revisions along this branch, unless you explicitly specify a<br />
revision number. <strong>The</strong> default branch is the trunk of the archive, until<br />
changed by the user.<br />
When your project has reached a significant milestone, you should<br />
save the state of the project and all of its components so you can<br />
recreate it later if need be. In <strong>Source</strong> <strong>Integrity</strong>, this is called a<br />
checkpoint. When you checkpoint a project, you create an archive for<br />
your project file and check it in. Since the project file contains your<br />
project’s directory structure and the list of members with their<br />
revision numbers, you can recreate the project as it existed at the time<br />
of the checkpoint.<br />
Some users checkpoint at the end of each day or week, while others<br />
wait until their work has reached a desired level of stability.<br />
20 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Sandboxes<br />
<strong>The</strong> directory structure in the<br />
illustration is typical, although<br />
most projects will be much<br />
more complex, consisting of<br />
dozens of directories and<br />
hundreds (or thousands) of<br />
files.<br />
Sandbox Files<br />
Sandboxes<br />
<strong>The</strong> typical directory structure of a software development project will<br />
look something like the illustration below. Problems can occur in<br />
such structures when multiple users are active in a common<br />
workspace. For example, if two programmers need to make changes<br />
to a module, one has to wait until the other is finished.<br />
Consider programmers working in the traditional “free-fire zone.”<br />
<strong>The</strong>re are obvious problems associated with an environment where<br />
all developers work in the same directory tree.<br />
It is easy to accidentally overwrite somebody else’s changes.<br />
<strong>The</strong>re are no safeguards to protect you from picking up another<br />
developer’s incorrect or incomplete changes.<br />
File access is restricted to one user at a time.<br />
Because all of these situations can mean loss of data and result in<br />
delays, <strong>Source</strong> <strong>Integrity</strong> offers a unique sandbox environment that<br />
can eliminate such collisions. Sandbox environments are private<br />
workspaces where individual programmers can work on projects<br />
outside the free-fire zone. <strong>The</strong>se separate workspaces allow<br />
developers to work more efficiently, without conflict with other users.<br />
When you use a sandbox, <strong>Source</strong> <strong>Integrity</strong> copies any or all of the<br />
project files into an identical directory tree on your local machine,<br />
where changes can be made and fixes tested. You can even test build<br />
an entire project in a sandbox, without interfering with work being<br />
done by other team members. When changes are completed and<br />
tested in the sandbox, you can check them back in to update the<br />
master project.<br />
<strong>User</strong> <strong>Guide</strong> 21
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
Sandboxes mirror the original<br />
project and provide a safe<br />
working environment.<br />
A Typical<br />
Workplace<br />
Scenario<br />
How Sandboxes<br />
Can Help<br />
Consider what could happen in a sample project if a customer<br />
encounters a bug in an earlier release that requires an immediate fix.<br />
In this example, the work is done in a free-fire zone and programmers<br />
need to examine the earlier revisions of affected NT and UNIX files.<br />
This process would halt any development on those files, due to<br />
file naming conflicts in the workspace.<br />
If the NT developer were to complete his or her work before the<br />
UNIX developer, neither could test the fix until both are<br />
complete, since a comprehensive build uses all files in the project.<br />
<strong>The</strong> result is that maintenance only progresses at the pace of the<br />
slowest component.<br />
If more than one iteration is required to complete either or both<br />
fixes, the time delay is further compounded.<br />
<strong>Source</strong> <strong>Integrity</strong> has designed the sandbox environment to deal with<br />
these potential conflicts. A sandbox is a personal workspace where<br />
changes can be made and tested on working copies of project<br />
members, independent of the master project. Sandboxes let each<br />
developer work on a shared project in a personal, protected<br />
workspace, without disrupting the master project or other<br />
developers.<br />
When work takes place using sandboxes, it presents a totally different<br />
picture. When sandboxes are used in the previous scenario, each<br />
developer makes a complete copy of the earlier release in a separate<br />
sandbox and works on the files he or she is responsible for.<br />
<strong>The</strong> developer who finishes first can test the fix in the sandbox—<br />
even build the entire project to make sure it functions as<br />
anticipated—then check the modified files back into the master<br />
project and continue with new development.<br />
22 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Once a <strong>Source</strong> <strong>Integrity</strong><br />
project has been created, you<br />
have the option of creating an<br />
associated sandbox. This<br />
sandbox includes a directory<br />
tree that mirrors the structure<br />
of the master project.<br />
Sandboxes<br />
When the second developer completes and tests changes, they<br />
too are checked into the master project. <strong>The</strong> buildmaster can<br />
make a new sandbox, and do a final build incorporating both sets<br />
of changes. <strong>The</strong> fix can then be shipped to the customer.<br />
When you execute a <strong>Source</strong> <strong>Integrity</strong> command in a sandbox, the<br />
action is redirected to the master project. <strong>Source</strong> <strong>Integrity</strong> can<br />
perform almost the entire range of project commands in the sandbox,<br />
as if it were in the master project. For example, if you check out a<br />
sandbox member, <strong>Source</strong> <strong>Integrity</strong> physically checks out the member<br />
from the master project, but copies the working file to the sandbox<br />
directory.<br />
In this way, you are assured of working with current data from the<br />
master project, with the knowledge that your work will not interfere<br />
with other users (or vice versa). This streamlines product<br />
maintenance, saving time, saving money, reducing delays to ongoing<br />
development, and increasing customer satisfaction.<br />
Within your sandbox, you can see if new updates are available in the<br />
master project. It is up to you to decide when and if you will pick up<br />
these changes in your sandbox. Thus, you are protected from a “freefire<br />
zone”, but still have the ability to coordinate with other users’<br />
work when it is convenient for you.<br />
<strong>User</strong> <strong>Guide</strong> 23
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
Variant<br />
Sandboxes and<br />
Development<br />
Paths<br />
Regular sandboxes are based upon the current or head revision of the<br />
project. You can also create a sandbox that is based upon a previous<br />
checkpointed revision of the project. This type of sandbox is called a<br />
variant. When you create a variant sandbox, you choose a checkpoint<br />
(snapshot) of your project and use it as a starting point for new<br />
development. <strong>Source</strong> <strong>Integrity</strong> allows you to do this by defining a<br />
new development path.<br />
A development path is an identifier given to a new direction of<br />
software development; it includes the new revision history created by<br />
<strong>Source</strong> <strong>Integrity</strong> as developers vary from a main project. Changes<br />
made through the development path are kept separate from the main<br />
development trunk unless you choose to merge them into it later.<br />
<strong>Source</strong> <strong>Integrity</strong> allows multiple developers to point to the same<br />
development path, each using their own variant sandbox. In the<br />
variant sandbox, you can see the current state of software along the<br />
development path and the changes made by other developers using<br />
it.<br />
When a variant sandbox is created for the first time, it is also created<br />
for all subprojects, reserving the assigned name as a unique identifier<br />
and ensuring no two paths can share the same name.<br />
Development paths are useful for performing post-release<br />
maintenance. Variant sandboxes pointing to a post-release<br />
development path allow you to make changes to a previous revision<br />
of a project. Any fixes, patches, or changes you check in go onto a<br />
branch and do not affect the main project, unless you choose to merge<br />
them.<br />
Example: Multiple Development Paths<br />
A team approach to development is shown in the following<br />
illustration. Three development teams work on the product. Each<br />
team is concerned with a slightly different aspect of getting the<br />
product to market and satisfying customer needs.<br />
24 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> labels in the illustration<br />
indicate milestones in the<br />
product’s development, rather<br />
than any particular revision<br />
number.<br />
Build<br />
Sandboxes<br />
Sandboxes<br />
Team one is composed of the developers who work on the main<br />
trunk of development. <strong>The</strong>ir concern is to create new features for<br />
the software and therefore to move from release 3.2 to release 3.3.<br />
This is considered the main development path.<br />
Team two, the beta team, must test the functionality of the<br />
product and prepare it for the beta trial. <strong>The</strong>y work with the same<br />
software, but just before the beta release, they must polish the<br />
beta product on their own and their objectives force them to<br />
diverge from the main path.<br />
Team three is the post-release maintenance team. <strong>The</strong>y want to<br />
change the functionality of a feature in the shipping version to<br />
satisfy a customer request, and then release a patch for the<br />
product.<br />
<strong>The</strong> teams all have slightly different goals for the software and each<br />
group needs to move the product in a different direction without<br />
affecting another team’s ability to work. Each team is following a<br />
different development path.<br />
After major milestones such as product releases, you might want to<br />
recreate a static version of an entire project as it existed at some point<br />
in the past. You use a build sandbox, as it is called, to build or test the<br />
project, not to begin further work along a new development path.<br />
A build sandbox is associated with a particular project revision, and<br />
has no development path (since it is static and not meant for further<br />
development).<br />
Within a build sandbox, you cannot<br />
check out, lock, or check in members<br />
<strong>User</strong> <strong>Guide</strong> 25
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
Locking in<br />
Variant<br />
Sandboxes<br />
remove or add members<br />
set the development path<br />
However, within a build sandbox, you can<br />
change labels and states<br />
resynchronize your sandbox<br />
compare a member revision in the build sandbox to another<br />
revision<br />
merge a member revision in the build sandbox with another<br />
revision (of course, you cannot check that merged file back into<br />
the build sandbox)<br />
query for differences between project revisions, such as changes<br />
to a project since it was last checkpointed<br />
calculate dependencies, but you cannot add dependent files to<br />
the project<br />
update sandbox attributes<br />
<strong>Source</strong> <strong>Integrity</strong> can manage access to source files by locking<br />
revisions in the name of developers who check them out. This<br />
provides a level of security, as it discourages two people from<br />
working on the same revision at the same time.<br />
When developers are following different development paths,<br />
however, this kind of security can become inconvenient. Two (or<br />
more) developers, working along different development paths, may<br />
want to lock the same revision for different purposes.<br />
Even though development paths are logically separate, <strong>Source</strong><br />
<strong>Integrity</strong> maintains one revision history for each source file, in a<br />
corresponding archive. A revision can only be checked out locked by<br />
one <strong>Source</strong> <strong>Integrity</strong> user. Conflicts can arise from this.<br />
Those working in variant sandboxes are forced to lock revisions<br />
that might be needed by developers working in standard<br />
sandboxes.<br />
Similarly, those following one development path would lock out<br />
those following a different path.<br />
To accommodate developers following different development paths,<br />
<strong>Source</strong> <strong>Integrity</strong> will suggest to branch an archive. It does this<br />
whenever a check-out operation would lock out other developers,<br />
who might need access to the revision.<br />
26 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Sandboxes<br />
<strong>The</strong> process starts with developers who use variant sandboxes. If you<br />
are using a variant sandbox, your check-out operations might cause<br />
conflict if you try to lock<br />
a revision in the main trunk of an archive (probably used by the<br />
main project and standard sandboxes)<br />
a revision on a branch that was created by others, working from a<br />
different development path<br />
<strong>Source</strong> <strong>Integrity</strong> will then suggest you start a branch from that<br />
revision. This creates a duplicate of the revision on a new branch. <strong>The</strong><br />
duplicate is locked in your name, allowing you to edit it freely.<br />
On the other hand, there is no perceived conflict when you want to<br />
use a revision on a branch created through your own development<br />
path. <strong>Source</strong> <strong>Integrity</strong> assumes locking is desirable between those<br />
who share your own development path.<br />
<strong>The</strong> process is repetitive: if users on another development path<br />
attempt to check out locked a revision from one of your resulting<br />
branches, they will in turn be encouraged to branch the archive again,<br />
to avoid locking you out of your revisions.<br />
This branching is not mandatory—you can opt to lock a (potentially<br />
conflicting) revision from within a variant sandbox. This amounts to<br />
crossing the invisible line between your development path and<br />
another path or the main project.<br />
For instance, if you have adopted a trunk revision as a member<br />
revision in an otherwise variant sandbox and you intend on checking<br />
in changes to the trunk, locking the revision on check-out is<br />
appropriate.<br />
If for some reason your branch needs to be integrated into the trunk,<br />
this can be accomplished by merging the tip revision of the branch<br />
and the head revision of the trunk (1.x) in a standard merge<br />
operation. This is normally done by a developer using a standard<br />
sandbox.<br />
Note Even if the head revision of an archive is not the member revision<br />
of your variant sandbox, <strong>Source</strong> <strong>Integrity</strong> will suggest to start a branch if<br />
you attempt to check out the head revision locked. This functionality is<br />
maintained for backward compatibility with previous versions of <strong>Source</strong><br />
<strong>Integrity</strong>.<br />
<strong>User</strong> <strong>Guide</strong> 27
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
Converting Old-<br />
Style Variant<br />
Sandboxes<br />
Example<br />
You have created a variant sandbox and a new development path,<br />
based on revision 1.3 of a project. Your sandbox represents an older<br />
version of the project, but you find you still need to make changes to<br />
the head revision, revision 1.5 of main.c. You check out locked<br />
revision 1.5 of main.c.<br />
<strong>Source</strong> <strong>Integrity</strong> will by default suggest to branch the main.c archive.<br />
It does this because you will otherwise lock other developers out of<br />
main.c, and your work is on a development path other than on the<br />
main path.<br />
If you accept the default, <strong>Source</strong> <strong>Integrity</strong> creates revision 1.5.1.1 of<br />
main.c. It copies revision 1.5 to 1.5.1.1, and checks out 1.5.1.1 locked<br />
in your name. You can make changes to the new revision, and check it<br />
back in as 1.5.1.2.<br />
Because <strong>Source</strong> <strong>Integrity</strong> branched the archive, other developers are<br />
not locked out of revision 1.5. <strong>The</strong>y can continue development<br />
unhindered.<br />
If you do not accept the default, you will acquire a lock on revision<br />
1.5 of main.c. You could make changes and check in revision 1.6.<br />
Variant sandboxes created in <strong>Source</strong> <strong>Integrity</strong> version 7.2 or earlier<br />
must be converted to work with later versions. This is a one-way<br />
process that makes the variant sandboxes incompatible with previous<br />
versions of <strong>Source</strong> <strong>Integrity</strong>.<br />
A command-line utility, cnvrnt72, is available to do the conversion<br />
automatically. You must have sufficient permissions in the Security<br />
and Administration Module (SAM) to perform the conversion:<br />
ModifyProject, ModifySandbox, and CreateSandbox. (For details<br />
on usage, see the cnvrnt72 manual page in the <strong>Source</strong> <strong>Integrity</strong><br />
<strong>Professional</strong> <strong>Edition</strong> Reference <strong>Guide</strong>.)<br />
28 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Metadata<br />
About Labels<br />
Metadata<br />
<strong>The</strong> most important conversion step is the establishment of a<br />
development path for the variant sandbox. This development path<br />
will begin at a new checkpoint in the master project.<br />
Note If a master project has other subprojects as members, then a<br />
sandbox based on it will have subsandboxes, individual sandbox files<br />
matching the same structure. cnvrnt72 converts the specified sandbox,<br />
and recursively converts all subsandboxes as well.<br />
Running cnvrnt72 on a subsandbox file will convert it and all of those<br />
below it, but cnvrnt72 cannot convert any sandbox files above it in the<br />
hierarchy. This will cause problems when using the sandbox, and when<br />
later trying to finish the conversion. You should run cnvrnt72 on the<br />
uppermost sandbox, that is, on the one that is not a subsandbox.<br />
<strong>Source</strong> <strong>Integrity</strong> maintains a variety of information about your<br />
development objects. This metadata can be used to monitor and<br />
manage projects, identify and retrieve revisions, update working<br />
files, and prepare activity reports on your development efforts.<br />
An important part of any configuration management system is the<br />
regular input of significant metadata, such as<br />
archive descriptions when archives are created<br />
revision descriptions and labels when objects are checked in, and<br />
at project milestones<br />
automatic records, such as timestamps and transaction logs<br />
This section describes some of the ways you can take advantage of<br />
the metadata <strong>Source</strong> <strong>Integrity</strong> maintains.<br />
When you check in a file, <strong>Source</strong> <strong>Integrity</strong> lets you assign a revision<br />
label to it. Labels serve as identifiers for revisions in an archive, and<br />
make it easier to locate significant revisions of your objects. Many<br />
<strong>Source</strong> <strong>Integrity</strong> functions use labels to specify the revision a<br />
command will operate on. For instance, you can check out a revision<br />
by specifying its label.<br />
<strong>User</strong> <strong>Guide</strong> 29
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
About Revision<br />
Descriptions<br />
Labels provide an effective mechanism for tracking development<br />
objects. Because revisions can have more than one label, they are<br />
perfectly suited to multi-track development. <strong>The</strong> fact that labels are<br />
unique within an archive makes them an efficient tool to mark<br />
milestones for later retrieval.<br />
Labeling Requirements<br />
Labels have a number of restrictions on their contents.<br />
<strong>The</strong>y cannot<br />
exceed 1,024 characters in length<br />
contain left square brackets ([), right square brackets (]), or<br />
colons (:)<br />
contain a leading space<br />
resemble a revision number; that is, a number of the form x.y,<br />
such as 2.13.<br />
Versions of <strong>Source</strong> <strong>Integrity</strong> prior to Release 7.3c, <strong>Source</strong> <strong>Integrity</strong> for<br />
UNIX, and <strong>Source</strong> <strong>Integrity</strong> for OS/2 will still be able to read archives<br />
with the current label format, but labels will show up with new<br />
characters translated (for example, a space will appear as %20).<br />
To be useful, labels must be accessible and convey the same meaning<br />
to everyone who uses them. A well-thought-out system of consistent<br />
labels can simplify the ability to identify and retrieve important<br />
revisions, and let you script repetitious file management tasks.<br />
For example, some sites use a system of standard prefixes to identify<br />
the scope of labels: site-wide labels use a specific prefix (like <strong>MKS</strong>_ or<br />
SITE_); labels for individual projects have prefixes that reflect their<br />
associations.<br />
When you checkpoint your projects, you can also apply a label to the<br />
project itself and, optionally, to every project member. This simple<br />
step makes reconstructing any development environment for postrelease<br />
maintenance a one-step process; just create a new sandbox<br />
based on a labeled checkpoint and let <strong>Source</strong> <strong>Integrity</strong> create and<br />
populate it with all the correct member revisions.<br />
Revision descriptions let you add notes and explanations to your work<br />
every time you check in a revision. <strong>The</strong>y provide a useful tool for<br />
managing your development by helping you document the reasons<br />
for a change. You should develop the habit of including a detailed<br />
description of every revision you check in.<br />
30 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
About<br />
Timestamps<br />
Metadata<br />
When you finish making changes to a file and check it in, the nature<br />
of the changes, and the reasons for them, are clear to you. <strong>The</strong>y may<br />
not be clear to everyone else, and in six months they probably will<br />
not be obvious to you either.<br />
If you consistently add notes to your revisions in the form of revision<br />
descriptions, you can preserve a detailed project record. You can then<br />
use <strong>Source</strong> <strong>Integrity</strong>’s Reporter utility to retrieve, display, and<br />
analyze these revision descriptions.<br />
You can also append new comments onto an existing revision<br />
description. <strong>The</strong> time and author of such additional comments are<br />
automatically included.<br />
Most developers realize how critical timestamps are during the build<br />
process. Building a program requires linking a number of objects that<br />
are themselves compiled from source code. <strong>The</strong>se files could include<br />
header files, source files, object modules, and executables. <strong>The</strong> source<br />
code usually depends on other source modules and one or more<br />
header files. <strong>The</strong>se dependencies are recorded in a makefile that is<br />
used by a build or make program.<br />
During a build, the make program uses timestamps to streamline the<br />
process; it refers to file timestamps to find components that have<br />
changed since the last build and that, therefore, need to be rebuilt.<br />
When the make utility finds a file that another component depends<br />
on—and determines that the file has a newer timestamp than the<br />
component—it assumes that either the file has changed, or the<br />
component that depends on the file must be rebuilt.<br />
If a component’s timestamp is identical to, or newer than, all of the<br />
files it depends on, the make utility reuses the component without<br />
rebuilding it.<br />
When you check a file into or out of an archive, you can specify how<br />
the timestamp of the working file should be set. Since timestamp<br />
changes affect dependencies between files (and therefore the make<br />
process), <strong>Source</strong> <strong>Integrity</strong> must be configured to set timestamps<br />
appropriately for your build environment.<br />
Timestamps can be set at check in and check out. At check in you can<br />
set the timestamp of the new revision to either the current time or to<br />
the timestamp of the working file. At check out, you can set the<br />
working file’s timestamp to the current time or to the timestamp of<br />
the revision.<br />
<strong>User</strong> <strong>Guide</strong> 31
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
For information about<br />
configuring timestamps, see<br />
the “Configuring <strong>Source</strong><br />
<strong>Integrity</strong>” chapter in the<br />
<strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong><br />
<strong>Edition</strong> Administrator <strong>Guide</strong>.<br />
About<br />
Attributes<br />
Example: How Timestamps Affect the Build Environment<br />
<strong>The</strong> significance of timestamp settings can be illustrated with the<br />
following example. If these files are dependent<br />
hello.exe --> hello.obj --> hello.c<br />
and <strong>Source</strong> <strong>Integrity</strong> is configured to set timestamps to the current<br />
time at both check in and check out, the following scenario arises:<br />
On Monday morning hello.c is checked out locked, and some<br />
changes are made to it.<br />
<strong>The</strong> make utility is run to build the program. Everything builds<br />
smoothly and all three files (hello.exe, hello.obj, hello.c)<br />
have Monday’s timestamp.<br />
Since the program was built without incident, hello.c is then<br />
checked in unlocked.<br />
Note When you check in a file unlocked, <strong>Source</strong> <strong>Integrity</strong> actually<br />
checks it in and then checks it out unlocked, replacing the editable working<br />
file with a read-only copy.<br />
<strong>The</strong> make utility is run again, but this time everything is rebuilt,<br />
even though the source files have not changed.<br />
<strong>The</strong> result of using the current time at check-in and check-out is that<br />
components are rebuilt unnecessarily. This is not only frustrating, but<br />
a waste of valuable development time.<br />
This problem can be avoided by using the SaveTimestamp and<br />
RestoreTimestamp configuration options as follows.<br />
SaveTimeStamp sets the timestamp of revisions to the timestamp<br />
of the working files when they are checked in.<br />
RestoreTimeStamp sets the timestamp of working files to that of<br />
the revision they are checked out from.<br />
You can assign attributes to projects and their members. Attributes<br />
can be used to identify members, to define or restrict the scope of<br />
project commands, or to automate project management operations.<br />
Attributes are variable statements with the form<br />
var [=value]<br />
32 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For information about<br />
configuring attributes, see the<br />
“Configuring <strong>Source</strong><br />
<strong>Integrity</strong>” chapter in the<br />
<strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong><br />
<strong>Edition</strong> Administrator <strong>Guide</strong>.<br />
Metadata<br />
where var is the name of the attribute, and value is its optional<br />
assigned value. Attribute names may contain any combination of<br />
alphanumeric or underscore characters; they may not begin with a<br />
number.<br />
Some project attributes are reserved by <strong>Source</strong> <strong>Integrity</strong>. Because of<br />
their special meaning, they are called Configuration Options. If present,<br />
<strong>Source</strong> <strong>Integrity</strong> overrides its built-in defaults and takes its<br />
configuration from them.<br />
<strong>The</strong> value portion of an attribute statement may contain any number<br />
of printable ASCII characters.<br />
About Log Files <strong>Source</strong> <strong>Integrity</strong> can monitor and keep track of actions that change<br />
archives (for example, checking in a new revision). This ability<br />
provides a powerful mechanism your organization can use to<br />
generate audit trails for individual archives, development projects, or<br />
an entire site.<br />
About<br />
Keywords<br />
Whenever you check in or check out locked a revision, <strong>Source</strong><br />
<strong>Integrity</strong> adds a line to a log file describing the operation.<br />
Automatic transaction logging can help managers assess the progress<br />
of development projects, as well as the contributions of individual<br />
programmers. Depending on site requirements, records can be<br />
maintained in two ways:<br />
in a single, monolithic log file describing all activity for all files at<br />
the site<br />
in a project log file containing reports for a single project<br />
A keyword is a placeholder that can be inserted into text-based<br />
working files. <strong>Source</strong> <strong>Integrity</strong> updates keywords with information<br />
about the revision or archive. Keywords provide a handy mechanism<br />
for accessing up-to-the-minute revision information from within a<br />
working file.<br />
<strong>User</strong> <strong>Guide</strong> 33
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
Security and Administration<br />
<strong>Source</strong> <strong>Integrity</strong><br />
Security<br />
For information about filelevel<br />
security, see the <strong>Source</strong><br />
<strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong><br />
Administrator <strong>Guide</strong>, “<strong>Source</strong><br />
<strong>Integrity</strong> Security”.<br />
<strong>The</strong> SAM<br />
Hierarchy<br />
No matter how well-designed or feature-filled your configuration<br />
management system is, it will be less effective if it is not used<br />
consistently by everyone at your site. Since no two sites are alike,<br />
<strong>Source</strong> <strong>Integrity</strong> provides SAM to let administrators define and<br />
enforce <strong>Source</strong> <strong>Integrity</strong>’s configuration management policies.<br />
SAM lets administrators control configuration management activities<br />
at your site by defining which users have access to any or all <strong>Source</strong><br />
<strong>Integrity</strong> functions (and, therefore, to the files in your development<br />
environment). SAM’s management controls can be applied at<br />
whatever level your site and corporate situation require, that is<br />
to all files and users at the site<br />
to specific projects<br />
to specific groups of users<br />
to individual archive files<br />
to individual users<br />
Using SAM, the administrator of your site defines which files and<br />
projects under <strong>Source</strong> <strong>Integrity</strong> you have access to, and the degree of<br />
that access. This is done by defining a number of structures within<br />
SAM: policies, users, groups of users, and roles.<br />
Policies<br />
A policy is a group of <strong>Source</strong> <strong>Integrity</strong> configuration statements that<br />
can be associated with your entire site or with any development<br />
object within it.<br />
Policies are arranged in a hierarchical inheritance structure to<br />
simplify management. Your administrator can define general<br />
practices at the global (that is, site-wide) level, and then fine tune<br />
these policies for individual projects and archives.<br />
For example, your site could have a global policy that establishes a<br />
strict-locking policy for all objects at the site, plus a policy at the<br />
project level to require encryption on a particularly sensitive project.<br />
<strong>User</strong>s<br />
<strong>The</strong> SAM database contains the names of all users with access to<br />
<strong>Source</strong> <strong>Integrity</strong>.<br />
34 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Groups<br />
Security and Administration<br />
<strong>User</strong>s can be placed together in groups according to how they should<br />
be using <strong>Source</strong> <strong>Integrity</strong>.<br />
Roles<br />
A role is a set of <strong>Source</strong> <strong>Integrity</strong> permissions that can be associated<br />
with a user or with a group of users. It defines access and restrictions<br />
for the <strong>Source</strong> <strong>Integrity</strong> users with that role at your site.<br />
When a user invokes a command, <strong>Source</strong> <strong>Integrity</strong> checks any roles<br />
associated with the user and reads the permissions they contain in<br />
order to determine whether to allow the action.<br />
Example: Group Permissions<br />
If your corporate development standards include a protocol for<br />
passing work from one person to another, you may want to take<br />
advantage of the freezing and thawing capabilities of <strong>Source</strong><br />
<strong>Integrity</strong>.<br />
Let’s assume that Development must sign-off on the work by<br />
checkpointing the project. At that point, they might also freeze the<br />
project and alert the Testing group that the product is ready for<br />
evaluation. Testing might thaw the project if they need to make very<br />
minor fixes.<br />
In order to ensure there is no going back, the <strong>Source</strong> <strong>Integrity</strong><br />
administrator can convey FreezeProject (but not ThawProject)<br />
permissions to the Development group.<br />
Rather than doing this individually, the administrator can create a<br />
group in SAM and add all the development members. <strong>The</strong><br />
administrator would also create a role holding the FreezeProject<br />
permission, and assign the role to the group. <strong>The</strong>refore, every <strong>Source</strong><br />
<strong>Integrity</strong> user that is part of the group receives the FreezeProject<br />
permission.<br />
Permissions are additive, so the administrator must ensure a user is<br />
not obtaining the ThawProject permission from any other source,<br />
that is, a role assigned<br />
directly to the user in the same module<br />
directly to a user in another module<br />
to another group the user is a member of<br />
<strong>User</strong> <strong>Guide</strong> 35
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
Managing Development<br />
Promotion<br />
<strong>Source</strong> <strong>Integrity</strong> includes two features that help you track the<br />
development process.<br />
<strong>The</strong> Promotion feature lets you impose a step-by-step<br />
progression on the development cycle.<br />
<strong>The</strong> Reporter utility lets you view the audit trail of files and<br />
resources.<br />
<strong>The</strong> Promotion feature lets you track the progress of your product<br />
through the development cycle to a finished product. <strong>The</strong> Promotion<br />
model at your site<br />
defines your development cycle<br />
specifies how files will be handled at each development stage<br />
controls who can modify development objects at each promotion<br />
state<br />
Although most aspects of the promotion policy at your site will be<br />
defined by your administrator, you can customize some settings<br />
locally.<br />
<strong>The</strong> development cycle at your site might include the stages<br />
Development, when code is being actively written<br />
Testing, when each code module and application is tested<br />
Release, when the code is declared finished, and distribution<br />
disks can be produced<br />
In this case, your administrator could set <strong>Source</strong> <strong>Integrity</strong> promotion<br />
policy as follows:<br />
All development objects must pass through each stage in the<br />
development cycle, from lowest to highest.<br />
During the Development phase, only the Development Leader<br />
can promote objects to the Testing phase. (<strong>Source</strong> <strong>Integrity</strong> lets<br />
you define who may promote and demote.)<br />
Any tester can demote an object back to the Development phase<br />
if it fails a test, but only the Quality Assurance Manager can<br />
promote an object to the Release state.<br />
This policy guarantees that the state of every product component<br />
would be obvious at any time, and that each component would pass<br />
through each phase of the development process successfully before<br />
moving on to the next.<br />
36 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Reporter<br />
Managing Development<br />
Most sites need a way of examining ongoing projects so they can<br />
identify trends, check hot spots, predict problems, or prevent<br />
schedule slippage. To deal with this need, <strong>Source</strong> <strong>Integrity</strong> includes<br />
the Reporter. This utility helps you analyze the revision history of<br />
project members and revisions.<br />
Depending on the requirements at your site, you can view any of the<br />
Reporter’s built-in reports on development patterns and activities.<br />
<strong>The</strong> Reporter also lets you import raw data into your own database,<br />
where you can create custom reports tailored to your own needs.<br />
Report Types<br />
<strong>The</strong> Reporter utility includes nine different types of reports based on<br />
the information <strong>Source</strong> <strong>Integrity</strong> maintains about project members<br />
and revisions. Reports can be presented as formatted text and some<br />
can be displayed as graphs (bar, pie, line, or area charts).<br />
Changes Grouped by Author lists changes to members or revisions<br />
grouped by the person who made them.<br />
Changes Grouped by Author (Summary) summarizes the changes<br />
to project members, or archives, grouped by author.<br />
Revisions Newer Than Member Revision shows which project<br />
members have more recent revisions available.<br />
Changes from Member Revision to Label lists all the revisions<br />
between the project member and another revision with a<br />
specified label.<br />
Changes From Member Revision to Revision lists revisions in a<br />
project member’s archive between the member revision and<br />
another revision (specified by revision number).<br />
List Locked Revisions lists all locked revisions in a project or an<br />
archive, giving the name of the member, the revision number,<br />
and the person who has it locked.<br />
List Revisions Associated with Labels scans the archives of all<br />
project members and extracts any labels they contain.<br />
List Revisions Associated with States scans the archives of all<br />
project members and extracts any state settings they contain.<br />
Project Member History displays change information for all<br />
revisions of a specified project member.<br />
<strong>User</strong> <strong>Guide</strong> 37
Understanding <strong>Source</strong> <strong>Integrity</strong><br />
38 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Introducing the <strong>Source</strong><br />
<strong>Integrity</strong> Interfaces<br />
3<br />
This chapter provides a brief introduction to the three interfaces to<br />
<strong>Source</strong> <strong>Integrity</strong>:<br />
<strong>The</strong> Windows interface, a standard Windows application.<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface, which gives you the ability to<br />
access development projects remotely using their web browser<br />
(either Microsoft Internet Explorer 4.0+ or Netscape Navigator<br />
4.0+).<br />
<strong>The</strong> command-line interface, which allows you to type powerful<br />
commands at a command prompt or develop scripts for<br />
automating common activities.<br />
If you are unfamiliar with <strong>Source</strong> <strong>Integrity</strong>, you should begin with<br />
the Windows interface.<br />
You will probably not use <strong>Source</strong> <strong>Integrity</strong> through just one of these<br />
interfaces exclusively, but rather decide over time which interface is<br />
best for a particular activity within your environment and workflow.<br />
For detailed information about how to use <strong>Source</strong> <strong>Integrity</strong>, with<br />
specific instructions for each of the three interfaces, see Chapter 4:<br />
“Getting Started With Projects, Sandboxes, and Members” on<br />
page 65.<br />
For information about how to use <strong>Source</strong> <strong>Integrity</strong> within<br />
development environments, see Chapter 7: “Using Extensions” on<br />
page 197.<br />
<strong>User</strong> <strong>Guide</strong> 39
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
<strong>The</strong> Windows interface<br />
Starting the<br />
<strong>Source</strong> <strong>Integrity</strong><br />
Windows<br />
Interface<br />
<strong>The</strong> Application<br />
Window<br />
<strong>The</strong> most commonly used interface to <strong>Source</strong> <strong>Integrity</strong> is the standard<br />
Windows application, with a menu bar and tool bar for choosing<br />
commands.<br />
If you have performed the standard installation, you can start the<br />
<strong>Source</strong> <strong>Integrity</strong> Windows interface application by choosing<br />
Programs > <strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong> > <strong>Source</strong> <strong>Integrity</strong> for Win32 from<br />
your Start menu or double-clicking the <strong>Source</strong> <strong>Integrity</strong> icon in the<br />
<strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong> program group.<br />
When you open the application for the first time, <strong>Source</strong> <strong>Integrity</strong><br />
displays a Tip Wizard and Startup Wizard.<br />
If you want to open an existing <strong>Source</strong> <strong>Integrity</strong> project or sandbox,<br />
you can also browse to the project directory in Windows Explorer and<br />
double-click the .pj file.<br />
<strong>The</strong> application window contains a number of common Windows<br />
features explained in this section.<br />
Title bar<br />
Menu bar<br />
Toolbar<br />
Workspace<br />
Status bar<br />
Menu Bar<br />
Context menu<br />
(right click menu)<br />
Filter list<br />
<strong>The</strong> menu bar is located directly below the title bar and contains the<br />
available pull-down menus. When you first start <strong>Source</strong> <strong>Integrity</strong>,<br />
there are three menus in the menu bar: File, Configuration, and Help.<br />
<strong>The</strong> list of available menus and commands varies depending on the<br />
40 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For more information on<br />
filters, see “Using Filters” on<br />
page 44<br />
<strong>The</strong> Windows interface<br />
function you are performing (for example, working with an archive<br />
or a project). In the previous diagram, the <strong>Source</strong> <strong>Integrity</strong> menus that<br />
are available when working with a project or sandbox are displayed.<br />
Toolbar<br />
Immediately below the menu bar is an optional toolbar that provides<br />
easy access to the most commonly used <strong>Source</strong> <strong>Integrity</strong> commands.<br />
Toolbar functions are executed by clicking the appropriate icon with<br />
the left mouse button. If a command is not currently available, its<br />
toolbar icon is grayed out.<br />
Two toolbars are available for <strong>Source</strong> <strong>Integrity</strong>: one for archiverelated<br />
functions and the other for project-related functions. When an<br />
Archive window is current in the application window, the archive<br />
toolbar is displayed; when a Project window is current, <strong>Source</strong><br />
<strong>Integrity</strong> automatically presents the project toolbar. Both toolbars can<br />
be modified in the Toolbar panel of the Personal Configuration dialog<br />
box. To set up a toolbar, choose the one you want to work with from<br />
the Select Toolbar box, and the remaining options in the panel act on<br />
the selected toolbar.<br />
Filter List<br />
Beside the toolbar is an optional list of built-in filters that allows you<br />
to focus your view on a subset of project members you are currently<br />
interested in. Only those members that meet the criteria specified by<br />
the filter are displayed. You can decide whether to display this list of<br />
filters through the View menu. Choose Filters when you want the list<br />
of filters to be available, and deselect it when you want to hide the list<br />
from view.<br />
Note <strong>The</strong> list of built-in filters is disabled when there is no project or<br />
sandbox currently loaded, as well as when you are working in the<br />
Archive window.<br />
Workspace<br />
Everything between the toolbar and the status bar is considered the<br />
workspace. This is where <strong>Source</strong> <strong>Integrity</strong> displays windows<br />
containing your projects, sandboxes, or archives. For example, when<br />
you open a project, its members are presented in a Project window in<br />
the workspace.<br />
When you first start <strong>Source</strong> <strong>Integrity</strong>, the workspace is empty.<br />
<strong>User</strong> <strong>Guide</strong> 41
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
<strong>The</strong> Project<br />
Window<br />
Context Menu<br />
<strong>Source</strong> <strong>Integrity</strong> supports Windows 95/98 and Windows NT<br />
standard context menus. Selecting and right-clicking<br />
a project member in a project window<br />
an archive revision in an archive window<br />
the empty application window<br />
displays a pop-up menu of actions you can perform on the selected<br />
item.<br />
Status Bar<br />
When you select a command in a <strong>Source</strong> <strong>Integrity</strong> pull-down menu, a<br />
brief explanation of its purpose is displayed in the status bar. In<br />
addition, if the Hint mode (in the Toolbar panel of the Configuration<br />
command) is set to Both or Status Bar Tips, explanations of the<br />
toolbar buttons are displayed when the mouse pointer rests over<br />
them.<br />
When you open a <strong>Source</strong> <strong>Integrity</strong> project, the status bar displays<br />
total number of members in the current project<br />
number of members that are currently locked<br />
number of members you have selected<br />
When you open a project or sandbox, <strong>Source</strong> <strong>Integrity</strong> displays its<br />
contents in a Project window. <strong>The</strong> window has the title Sandbox<br />
path\filename or Project path\filename where path\filename represents<br />
the fully qualified DOS filename of the sandbox or project.<br />
<strong>Source</strong> <strong>Integrity</strong> offers you a choice between two different views of<br />
your Project and Sandbox windows: You may choose to work with<br />
the List view or the Tree view.<br />
<strong>The</strong> List view of the Project window contains a selectable list with<br />
entries for every member of the sandbox or project. <strong>The</strong> information<br />
for each member includes:<br />
Type of member.<br />
If you freeze a project or freeze a member, the snowflake icon<br />
alerts you to the archived member’s condition. <strong>The</strong> description<br />
Frozen Member appears at the bottom of the window.<br />
If either the member’s working file or archive has been modified,<br />
a change symbol (delta) appears, and a description of the changes<br />
is shown at the bottom of the window.<br />
42 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> Archive<br />
Window<br />
<strong>The</strong> Windows interface<br />
<strong>The</strong> delta symbol with a page icon means your working file has<br />
changed. It also appears when no working file exists for the<br />
member.<br />
<strong>The</strong> delta symbol with a book icon means the member archive<br />
has later revisions available. It also appears when no archive<br />
exists for the member.<br />
If you lock a member, a padlock alerts you to its condition. <strong>The</strong><br />
date and time the lock was placed also appears next to the user<br />
name of the person who locked the member.<br />
Member’s revision number.<br />
Name of the member’s working file.<br />
State of the member revision.<br />
Any labels assigned to the particular revision.<br />
Select a member by clicking it, or by moving the selector bar to it with<br />
the cursor control keys. A box below the list of members displays<br />
change information if the selected member’s working file has<br />
changed, relative to the member revision. For example, if the working<br />
file has been updated but not checked in, a message alerts you that<br />
the working file is newer than the member revision.<br />
<strong>The</strong> Project window can be resized within the <strong>Source</strong> <strong>Integrity</strong><br />
application window’s workspace or reduced to an icon in the<br />
application window.<br />
<strong>The</strong> Project window also supports Windows 95/98 and Windows NT<br />
standard context menus. Selecting and right-clicking a project<br />
member in a Project window displays a pop-up menu of actions you<br />
can perform on the selected item.<br />
When you open an archive, <strong>Source</strong> <strong>Integrity</strong> displays its contents in<br />
an Archive window. <strong>The</strong> window has the title Archive path\filename<br />
where path\filename represents the fully qualified DOS filename of<br />
the archive.<br />
<strong>The</strong> Archive window contains a selectable list with entries for<br />
working file (if one exists)<br />
every revision in the archive<br />
Select a revision by clicking it or moving the selector bar to it with the<br />
cursor control keys.<br />
<strong>User</strong> <strong>Guide</strong> 43
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
Using Filters<br />
Each entry in the list contains information about a single revision in<br />
the archive. This information is displayed in columns with the<br />
following headings:<br />
Revision. <strong>The</strong> revision number.<br />
Author. <strong>The</strong> user who checked in the revision.<br />
Date. <strong>The</strong> date and time the revision was checked in.<br />
Locker. <strong>The</strong> user name of the person who locked the revision, as<br />
well as the date and time the lock was placed.<br />
State. <strong>The</strong> revision’s state setting.<br />
Labels. <strong>The</strong> label attached to the revision.<br />
A box below the list of revisions displays the revision description for<br />
the currently selected revision. As you move the selector bar from one<br />
revision to another, the description changes to reflect the currently<br />
selected revision.<br />
<strong>The</strong> first entry in the Archive window is the archive’s working file (if<br />
one exists). <strong>The</strong> entry shows the fully qualified filename of the<br />
working file.<br />
If the working file can be edited, the entry is preceded by a pencil<br />
icon. If the working file is read-only, the pencil icon is crossed out in<br />
red.<br />
<strong>The</strong> Archive window can be resized within the <strong>Source</strong> <strong>Integrity</strong><br />
application window’s workspace or reduced to an icon in the<br />
application window.<br />
<strong>The</strong> Archive window also supports Windows 95/98 and<br />
Windows NT standard context menus. Selecting and right-clicking an<br />
archive revision in an Archive window displays a pop-up menu of<br />
actions you can perform on the selected item.<br />
As projects become large, they can become more difficult to navigate.<br />
Finding and selecting the members you are interested in becomes<br />
increasingly difficult. Filters allow you to view and manipulate a<br />
predefined subset of project members that are grouped according to<br />
their properties.<br />
In the Windows interface, the filters appear in a drop-down list<br />
located on the toolbar. Choose one of the following filters, and your<br />
view is filtered accordingly:<br />
All members. All members of the current project or sandbox.<br />
Modified members. Members with a working file that has been<br />
modified.<br />
44 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Filtering Modes<br />
Using Tree View<br />
<strong>The</strong> Windows interface<br />
Out-of-sync members. Members whose revision in a sandbox is<br />
not the same as the member revision in the corresponding<br />
project.<br />
Locked members. Members locked by any user.<br />
Locked by me. Members locked by the current user only.<br />
Frozen members.<br />
Subprojects. Members that are themselves projects.<br />
Members with label. Members with a particular label. If you<br />
choose this filter, <strong>Source</strong> <strong>Integrity</strong> prompts you for a label.<br />
Members with state. Members with a particular state. If you<br />
choose this filter, <strong>Source</strong> <strong>Integrity</strong> prompts you for a state.<br />
Note <strong>The</strong> list of built-in filters is only displayed if a Project or Sandbox<br />
window is the active window.<br />
<strong>Source</strong> <strong>Integrity</strong> provides two filtering modes: Global and Per-<br />
Project. If filtering is set to Global, the filter currently displayed in the<br />
list of filters applies to all open projects. With Per-Project filtering,<br />
each open project has its own filter.<br />
To set the filtering mode:<br />
1. Choose Configuration > Personal.<br />
<strong>The</strong> Personal Configuration dialog box appears with the<br />
Preferences panel displayed.<br />
2. In the View Defaults section, select Global or Per-Project as your<br />
preferred filtering mode and click OK.<br />
<strong>Source</strong> <strong>Integrity</strong> offers you a choice between two different views of<br />
your Project and Sandbox windows: You may choose to work with<br />
the List view or the Tree view.<br />
Note You cannot switch an Archive window from List view to Tree<br />
view.<br />
When expanded, subdirectories and subprojects now appear as tree<br />
branches. <strong>The</strong> right pane of the current window still displays the List<br />
view (list of members and subprojects) with the same columns.<br />
<strong>User</strong> <strong>Guide</strong> 45
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
You can move two sets of pane splitter bars to resize the window<br />
panes: the splitter bar between the left and right pane, and the one<br />
between the right pane and the status area.<br />
Select items from the right pane to perform operations on these<br />
selected items. Multiple members and subprojects can be selected<br />
and operated on in the right pane just like the <strong>Source</strong> <strong>Integrity</strong> List<br />
view window.<br />
To change the current view<br />
Choose View > Tree view or View > List view, depending on the current<br />
view.<br />
If you choose List view when the Tree view is active, the List view<br />
window displays members and subprojects of the master project.<br />
You can set the default view for projects upon startup in your<br />
personal configuration.<br />
1. Choose Configuration > Personal.<br />
<strong>The</strong> Personal Configuration dialog box appears with the<br />
Preferences panel displayed.<br />
2. In the View Defaults section, select either List view or Tree view as<br />
your preferred default Project view and click OK.<br />
Expanding a Project<br />
To expand a project in the left pane of the Tree view:<br />
Click the “+” symbol to see the subprojects and subdirectories (if<br />
applicable) in the project.<br />
Select the subdirectory to update the right pane with the list of<br />
project members in the subdirectory.<br />
Select the project (it becomes highlighted) to see the list of<br />
members in the current directory and any subprojects in the right<br />
pane.<br />
Subprojects expand like the master project: members and subsubprojects<br />
are listed in the right pane.<br />
Double-click the project to both select and expand the project.<br />
This updates both window panes.<br />
In the List view, when you double-click a subproject a new List view<br />
appears. If you double-click a subproject in the right pane of the Tree<br />
view, the corresponding subproject in the left pane is selected and its<br />
46 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> Windows interface<br />
members are displayed in the right pane. To open a separate window<br />
for a subproject, right-click the project in the left pane and choose<br />
Open In New Window.<br />
<strong>The</strong> right pane uses the same context menu as the standard project<br />
window to operate on members selected in the right pane.<br />
<strong>The</strong> left pane has its own context menu items:<br />
Create Sandbox<br />
Open Project Archive<br />
Checkpoint<br />
Open In New Window<br />
Project Information<br />
Development Path (for variant sandboxes)<br />
Drag and Drop<br />
List View<br />
<strong>User</strong>s can drag files and projects from outside the Project window<br />
(for example, from Windows Explorer) and drop them into the<br />
Project window. Dropped items are added to the current project as<br />
members and subprojects.<br />
Tree View<br />
<strong>The</strong> Tree view exhibits similar behavior if the right pane is displaying<br />
members and subprojects: items dropped into either pane are added<br />
to the current project (that is, the project selected in the left pane) as<br />
members and subprojects.<br />
Using the Restore Desktop Feature<br />
When you close <strong>Source</strong> <strong>Integrity</strong> with Project or Sandbox windows<br />
still open, <strong>Source</strong> <strong>Integrity</strong> can save the view type (List or Tree) for<br />
each window so that the same view of each project or sandbox<br />
appears the next time you open <strong>Source</strong> <strong>Integrity</strong>.<br />
To turn on the Restore Desktop feature:<br />
Select the Restore Desktop option in the Preferences panel of<br />
Personal Configuration dialog box.<br />
<strong>User</strong> <strong>Guide</strong> 47
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
Using <strong>Source</strong><br />
<strong>Integrity</strong> With<br />
Windows<br />
Explorer<br />
For more information on the<br />
<strong>Source</strong> <strong>Integrity</strong> extensions,<br />
see “Using Extensions” on<br />
page 197.<br />
In addition to the application window, <strong>Source</strong> <strong>Integrity</strong> commands<br />
are also available from the Windows Explorer. If you installed the<br />
<strong>Source</strong> <strong>Integrity</strong> Windows Explorer Extension when you installed<br />
<strong>Source</strong> <strong>Integrity</strong>, a <strong>Source</strong> <strong>Integrity</strong> sub-menu was automatically<br />
added to the Windows Explorer File menu. You can also access<br />
<strong>Source</strong> <strong>Integrity</strong> commands via the right-click context menu.<br />
If you did not choose this installation option, you can install the<br />
<strong>Source</strong> <strong>Integrity</strong> Extensions any time by double-clicking the<br />
setup.exe file in the root directory of the <strong>Source</strong> <strong>Integrity</strong> CD and<br />
choosing the <strong>Source</strong> <strong>Integrity</strong> Extensions option.<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface allows you to access some <strong>Source</strong><br />
<strong>Integrity</strong> functionality through a web browser. It is a true clientserver<br />
product, with the Internet forming the basic connection<br />
between the client and the server. It has three components:<br />
client<br />
browser plugin<br />
session applet<br />
<strong>The</strong> client component is a local server that generates the interface for<br />
the browser to display and provides local file access. It communicates<br />
directly with the <strong>Integrity</strong> Server over the Internet to access the<br />
version control services. <strong>The</strong> browser plugin starts up the client<br />
component of the <strong>Source</strong> <strong>Integrity</strong> Web interface. <strong>The</strong> session applet is<br />
a small applet that informs the client component of a browser page’s<br />
status.<br />
<strong>The</strong> look and feel of the product has been adapted to its web-based<br />
environment. <strong>Source</strong> <strong>Integrity</strong> users will find that the web-enabled<br />
version of the product provides easier access to common operations,<br />
and that commonly used operations have been simplified.<br />
48 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Installing the<br />
<strong>Source</strong> <strong>Integrity</strong><br />
Web Interface<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface<br />
To install the <strong>Source</strong> <strong>Integrity</strong> Web Interface on a client machine<br />
for the first time:<br />
1. Contact the <strong>Integrity</strong> Server with your browser. <strong>The</strong><br />
administrator can tell you the URL.<br />
A typical URL of the <strong>Integrity</strong> Server may be of the form:<br />
http://machine_name.your_domain_name.com:/<br />
A web page appears inviting you to download the <strong>Source</strong><br />
<strong>Integrity</strong> Web Interface.<br />
2. Download the <strong>Source</strong> <strong>Integrity</strong> Web Interface installation<br />
program (that is, save it to disk).<br />
3. Close the browser.<br />
4. Run the installation program following the instructions<br />
provided.<br />
5. Restart the browser and connect to the <strong>Integrity</strong> Server.<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface home page appears.<br />
6. Add this page to your list of bookmarks (on Netscape) or<br />
favorites (on Internet Explorer) for convenience.<br />
To update an existing version of the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface:<br />
1. Uninstall your current version of the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface by choosing Start > Settings > Control Panel and doubleclicking<br />
Add/Remove Programs.<br />
<strong>The</strong> Add/Remove Programs Properties dialog box appears.<br />
2. From the Install/Uninstall tab, select <strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface from the list of installed applications and click Add/<br />
Remove.<br />
You are asked to confirm that you want to remove the <strong>MKS</strong><br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface and all of its components. Click<br />
Yes.<br />
3. Follow the instructions above, “To install the <strong>Source</strong> <strong>Integrity</strong><br />
Web Interface on a client machine for the first time”.<br />
<strong>User</strong> <strong>Guide</strong> 49
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
Installing<br />
Additional<br />
Browser<br />
Plugins<br />
Starting the<br />
<strong>Source</strong> <strong>Integrity</strong><br />
Web Interface<br />
4. Contact the <strong>Integrity</strong> Server with your browser.<br />
Note <strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface provided with <strong>Source</strong> <strong>Integrity</strong><br />
<strong>Professional</strong> must always be upgraded when a version is available from<br />
the <strong>Integrity</strong> Server. <strong>The</strong>re is no optional upgrade feature available.<br />
When you install the <strong>Source</strong> <strong>Integrity</strong> Web Interface, it installs a<br />
plugin for each chosen browser on your system at installation time.<br />
However, you may also want to use the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface with additional browsers (such as one you installed after the<br />
original installation).<br />
To install a plugin for one or more additional browsers:<br />
1. Click Start > Programs> <strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface ><br />
Plugin Configuration Utility.<br />
<strong>The</strong> Welcome window appears.<br />
2. Click Next>.<br />
<strong>The</strong> Install Plugin window appears and displays the web<br />
browsers the plugin is already installed for.<br />
3. Add or remove a browser from the list by selecting the browser<br />
and clicking the Add or Remove buttons.<br />
4. Click Next> to complete the installation of the plugin.<br />
To start the <strong>Source</strong> <strong>Integrity</strong> Web Interface, start your web browser<br />
and browse to the <strong>Integrity</strong> Server. Your <strong>Source</strong> <strong>Integrity</strong><br />
administrator can provide you with its location.<br />
A typical URL of the <strong>Integrity</strong> Server may be of the form<br />
http://machine_name.your_domain_name.com:/<br />
If the location you entered is correct and the <strong>Integrity</strong> Server is<br />
configured properly, your browser displays the <strong>Integrity</strong> Server home<br />
page.<br />
50 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface<br />
On the <strong>Integrity</strong> Server home page, click <strong>Source</strong> <strong>Integrity</strong>. Your<br />
browser displays one of the following:<br />
If you have already installed the most recent <strong>Source</strong> <strong>Integrity</strong><br />
Web Interface client component on your local machine, your<br />
browser displays a window that prompts you for a user name<br />
and password.<br />
After you enter them, your browser displays the <strong>Source</strong> <strong>Integrity</strong><br />
Web Interface home page (see “<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface Home Page” on page 52). For convenience, add this<br />
page to your list of bookmarks (on Netscape) or favorites (on<br />
Internet Explorer).<br />
If you have not yet installed the client component, your browser<br />
displays a page that allows you to download and install the client<br />
component.<br />
If the version of the server is newer than your client, the client<br />
will still work with the new server. When you want to install the<br />
new client, you must first uninstall the old client.<br />
On that page, click <strong>Source</strong> <strong>Integrity</strong> Web Interface Client Install to<br />
download the client install executable, called siwi.exe. Run the<br />
executable and follow its instructions.<br />
When you have finished installing the client, restart your browser<br />
and return to the <strong>Source</strong> <strong>Integrity</strong> Web Interface home page.<br />
<strong>User</strong> <strong>Guide</strong> 51
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
<strong>The</strong> <strong>Source</strong><br />
<strong>Integrity</strong> Web<br />
Interface Home<br />
Page<br />
Introduction to<br />
Views<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface displays information about your<br />
projects and sandboxes and provides commands in a web browser<br />
window.<br />
Across the top of the window, there are drop-down menus that allow<br />
you to choose commands that affect sandboxes and projects and set<br />
configuration options.<br />
In the Sandbox and Project views (“Introduction to Views” next), you<br />
can use filters to allow you to see a currently significant subset of<br />
information, without having to sort through the entire project. You<br />
can also use selections to choose files that fit a particular category.<br />
In the <strong>Source</strong> <strong>Integrity</strong> Web Interface, you can choose from four ways<br />
to look at your projects and sandboxes, or views. You select a view by<br />
clicking its button on the toolbar on the left side of the window. <strong>The</strong><br />
button for the current view is highlighted, and buttons for views that<br />
are inaccessible or do not apply are disabled and grayed out.<br />
Overview of the Sandbox View<br />
<strong>The</strong> Sandbox view displays the members of a sandbox and provides<br />
commands that act on them.<br />
A hierarchical list of the sandbox members appears in the view. Each<br />
member appears with its corresponding metadata, as well as status<br />
information and icons for some of the commands that may be<br />
performed on that member.<br />
52 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface<br />
Icons that tell you about the state of a particular member appear<br />
beside the name of the member. If you rest your pointer on an icon, a<br />
tooltip describes the action performed by clicking that icon.<br />
In the command area at the top of the window, commands are<br />
grouped into two drop-down menus: commands that can be<br />
performed on members and commands that affect the entire sandbox.<br />
<strong>The</strong>re are two other drop-down menus: a filter menu for choosing<br />
which members are displayed, and a selection menu for selecting<br />
subsets of the sandbox.<br />
<strong>The</strong> hierarchical list of members lets you open and close directories,<br />
allowing you to reduce the number of members visible at one time,<br />
and letting you focus on the task at hand.<br />
For each member, the following appears:<br />
Member Name. <strong>The</strong> name of the sandbox member.<br />
Revision. <strong>The</strong> number of the revision in the sandbox (not the<br />
member revision in the project).<br />
Locked. If the member is locked, a padlock ( ) appears with the<br />
name of the person who placed the lock.<br />
A selection checkbox for selecting a member before choosing a<br />
command to act upon it.<br />
Each member may have one or more symbols displayed in front of it,<br />
to quickly convey the status of that member.<br />
<strong>The</strong> Out-of-Sync delta signals that the revision in your sandbox<br />
does not match the member revision in the project.<br />
<strong>The</strong> Working File delta signals that the working file has been<br />
modified from the revision in your sandbox.<br />
<strong>The</strong> missing file symbol identifies a missing file: the file is part of<br />
the sandbox, but is not on the client machine. To get a copy of the<br />
file, click this symbol.<br />
<strong>The</strong> snowflake icon indicates that the individual member or<br />
project is frozen and therefore cannot be updated.<br />
<strong>The</strong> Inaccessible icon indicates that the project or archive is<br />
currently inaccessible.<br />
Sandbox View Filters<br />
<strong>The</strong> Sandbox view may be filtered to reduce the number of members<br />
that are visible at any one time.<br />
You can choose one of the following filters from the Filters dropdown<br />
list:<br />
<strong>User</strong> <strong>Guide</strong> 53
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
Members displays all members in currently open directories and<br />
subsandboxes in the sandbox<br />
Locked by me displays only those members that are locked by the<br />
user at the current sandbox revision in currently open directories<br />
or subsandboxes.<br />
Out of Sync Members displays only those members that are not at<br />
member revision in currently open directories or subsandboxes.<br />
Modified Members displays only those members that have a<br />
working file delta in currently open directories or subsandboxes.<br />
Not Present Members displays those members that are part of the<br />
current project, but are not on the client machine in currently<br />
open directories or subsandboxes.<br />
Everything displays all files in currently open directories and<br />
subsandboxes of the sandbox, including local files that are not<br />
part of the project.<br />
Non-Members displays all files in currently open directories and<br />
subsandboxes of the sandbox that are not members of the project.<br />
All Members recurses into any subdirectories and subsandboxes<br />
and displays all members.<br />
All Locked by me recurses into any subdirectories and<br />
subsandboxes and displays all members that are locked by the<br />
user at the current sandbox revision.<br />
All Out of Sync Members recurses into any subdirectories and<br />
subsandboxes and displays only those members that are not at<br />
member revision.<br />
All Modified Members recurses into any subdirectories and<br />
subsandboxes and displays only those members that have a<br />
working file delta.<br />
All Not Present Members recurses into any subdirectories and<br />
subsandboxes and displays those members that are part of the<br />
current sandbox, but are not on the client machine.<br />
Sandbox View Selections<br />
<strong>The</strong> Selections drop-down list allows you to select multiple files that<br />
fit a particular category, based on their status, in just one click.<br />
Reset All deselects all files listed in the sandbox.<br />
All Visible Members selects all files listed in the sandbox.<br />
Out of Sync selects all members whose revision is not the same as<br />
the revision in the project.<br />
54 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface<br />
Modified selects all files whose working files have been modified<br />
since the member was last checked out.<br />
Locked by me selects all members that are locked in the current<br />
user’s name.<br />
Archived selects all members that have been archived.<br />
Exists selects all members that have a working file.<br />
Non-Member selects all members that are not members of the<br />
sandbox, but do exist in the sandbox’s directory.<br />
Invert Current reverses the selected and unselected files in the<br />
current filter.<br />
Overview of the Member View<br />
<strong>The</strong> Member view displays detailed information about a particular<br />
member and provides commands that act upon that member.<br />
This view can be reached from either the Project or Sandbox view. To<br />
open the member view for a member, select it and choose Member ><br />
Open Member View.<br />
A list of the revisions in the member’s archive appears, each revision<br />
displayed with its corresponding metadata.<br />
<strong>The</strong> following metadata is displayed:<br />
Revision. <strong>The</strong> revision number of the archive. To view the<br />
contents of a revision, click its revision number (for example,<br />
“1.4”). <strong>The</strong> revision appears in its associated editor.<br />
Locked. If the revision is locked, a padlock (<br />
name of the person who placed the lock.<br />
) appears with the<br />
Author. <strong>The</strong> name of the person who checked in the revision.<br />
Date. <strong>The</strong> date and time when the revision was checked in.<br />
State. <strong>The</strong> current state of the revision.<br />
Description. <strong>The</strong> description of the revision (entered upon check<br />
in).<br />
Labels. Any labels associated with the revision.<br />
Each revision may have a symbol displayed next to it, to convey the<br />
status of that revision quickly:<br />
<strong>The</strong> Member Revision icon identifies the revision that represents<br />
the member revision in the project. To set a different revision as<br />
the member revision in the project, check the checkbox next to the<br />
revision and select Set Member Revision from the list of available<br />
commands.<br />
<strong>User</strong> <strong>Guide</strong> 55
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
<strong>The</strong> revision that is current in the user’s sandbox is highlighted<br />
with a dark line in the view.<br />
Overview of the Project View<br />
<strong>The</strong> Project view focuses on the structure and status of the master<br />
project, and ignores what is in the user’s sandbox. This view provides<br />
some of the same features of the sandbox view, but from a more<br />
administrative perspective.<br />
A hierarchical list of the project members is displayed in the view.<br />
Each member appears with its corresponding metadata, as well as<br />
status information and icons for some of the commands that may be<br />
performed on that member.<br />
In the command area at the top of the window, commands are<br />
grouped into two drop-down menus: commands that can be<br />
performed on members and commands that affect the entire project.<br />
<strong>The</strong>re are two other drop-down menus: a filter menu for choosing<br />
which members are displayed, and a selection menu for selecting<br />
subsets of the project.<br />
<strong>The</strong> hierarchical list of members lets you open and close directories,<br />
allowing you to reduce the number of members visible at one time,<br />
and letting you focus at the task at hand.<br />
Each member is displayed at its member revision (the revision in the<br />
project). <strong>The</strong>refore, all the corresponding metadata, as well as the<br />
member commands, relate to the member revision.<br />
<strong>The</strong> following appears:<br />
Member Name. <strong>The</strong> name of the project member.<br />
Revision. <strong>The</strong> number of the revision in the project.<br />
Locked. If the member is locked, a padlock ( ) appears with the<br />
name of the person who placed the lock.<br />
A selection checkbox for selecting a member before choosing a<br />
command to act upon it<br />
Each member may have a symbol displayed next to it, to convey the<br />
status of that member quickly:<br />
<strong>The</strong> Tip Revision delta signals that the member revision of this<br />
member is not at tip revision. In other words, there is a newer<br />
revision available along the member revision’s branch. Click this<br />
delta to update the member to its most recent revision.<br />
<strong>The</strong> Frozen icon indicates that the individual member or project<br />
is frozen and therefore cannot be updated.<br />
56 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface<br />
<strong>The</strong> Inaccessible icon indicates that the project or archive is<br />
currently inaccessible.<br />
Project View Filters<br />
<strong>The</strong> Project view may be further filtered to reduce the number of<br />
members that are visible at any one time.<br />
You can choose one of the following filters from the drop-down list:<br />
Members displays all members in the project in currently open<br />
directories and subprojects.<br />
Locked by me displays only those members that are locked by the<br />
user at the current project revision in currently open directories<br />
and subprojects.<br />
Locked displays all members that are locked by anyone at the<br />
current project revision in currently open directories and<br />
subprojects.<br />
New Tip Revision display all members whose archive contains a<br />
revision number greater than the current one, but in the same<br />
branch in currently open directories and subprojects.<br />
Frozen Members displays only those members which are frozen<br />
in currently open directories and subprojects.<br />
Everything displays all files in the current project directory,<br />
including local files that are not part of the project in currently<br />
open directories and subprojects.<br />
Non-Members displays all files in the current project directory<br />
that are not members of the project in currently open directories<br />
and subprojects.<br />
All Members recurses into any subprojects and subdirectories and<br />
displays all members.<br />
All Locked by me recurses into any subprojects and subdirectories<br />
and displays all members that are locked by the user at the<br />
current project revision.<br />
All Locked recurses into any subprojects and subdirectories and<br />
displays all members that are locked by anyone at the current<br />
project revision.<br />
All New Tip Revision recurses into any subprojects and<br />
subdirectories and displays all members whose archive contains<br />
a revision number greater than the current one, but in the same<br />
branch.<br />
All Frozen Members recurses into any subprojects and<br />
subdirectories and displays only those members that are frozen.<br />
<strong>User</strong> <strong>Guide</strong> 57
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
Setting the<br />
Proxy Server<br />
Project View Selections<br />
You can select multiple files that fit a particular category, based on<br />
their status, by selecting one of the following options in the Selections<br />
drop-down list:<br />
Reset All deselects all members listed in the project.<br />
All selects all members listed in the project.<br />
New Tip Revision selects all members whose archive contains a<br />
revision number greater than the current one, but in the same<br />
branch.<br />
Frozen selects all members that are frozen.<br />
Locked by me selects all members that are locked in the current<br />
user’s name.<br />
Archived select all members that have been archived.<br />
Invert Current reverses the selected and unselected files in the<br />
current filter.<br />
Overview of the History View<br />
<strong>The</strong> History view displays the history of all checkpoints performed<br />
on the project. It is similar to the Member view, but with a subset of<br />
its features.<br />
<strong>The</strong> History view displays a list of the project revisions. Each revision<br />
is displayed with its corresponding metadata.<br />
<strong>The</strong> following appears:<br />
Revision. <strong>The</strong> number of the revision in the project’s archive.<br />
Author. <strong>The</strong> name of the person who checkpointed the project.<br />
Date. <strong>The</strong> date and time when the project was checkpointed.<br />
State. <strong>The</strong> current state of the revision in the project’s archive.<br />
Description. <strong>The</strong> description of the project revision (entered when<br />
checkpointed).<br />
Labels. Any labels associated with the revision in the project’s<br />
archive.<br />
A selection checkbox for selecting a revision before choosing a<br />
command to act upon it.<br />
A proxy is a server that manages communication between a user and<br />
the Internet to ensure administrative control of your website.<br />
58 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface<br />
Proxy settings for the <strong>Source</strong> <strong>Integrity</strong> Web Interface specify how it<br />
communicates with the <strong>Integrity</strong> server using your browser.<br />
Note Changing your proxy settings can interrupt communication<br />
between the <strong>Source</strong> <strong>Integrity</strong> Web Interface and the <strong>Integrity</strong> server.<br />
Please contract your web administrator before changing your proxy<br />
settings.<br />
To set the proxy servers for the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. Choose Configuration > Configuration.<br />
<strong>The</strong> Configuration <strong>Guide</strong> page appears.<br />
2. Click Set the proxy servers. Your current proxy setting is<br />
displayed beside this link.<br />
<strong>The</strong> Set Proxies page appears.<br />
3. Set the following proxy server options:<br />
Use Proxy Server. Select this checkbox if you are using a<br />
proxy server to access the <strong>Integrity</strong> server. This is not the<br />
same as an autoproxy. If you are using an autoproxy, you<br />
need to set a manual proxy on this page.<br />
Fully compliant to HTTP 1.0. <strong>The</strong> method of communication<br />
between the <strong>Source</strong> <strong>Integrity</strong> Web Interface and the <strong>Integrity</strong><br />
server depends upon whether your proxy is fully compliant<br />
to HTTP 1.0 protocol. If it is, then select this checkbox.<br />
Selecting Use Proxy Server automatically selects this option.<br />
HTTP Proxy and Port. Enter the address of your proxy server<br />
(for example, proxy.mks.com) and the port it uses (for<br />
example, 4040). <strong>The</strong> address does not require the http://<br />
prefix.<br />
Security Proxy and Port. If you use a secure proxy server,<br />
enter the address (for example, proxys.mks.com) and the<br />
port it uses (for example, 200). <strong>The</strong> address does not require<br />
the https:// prefix.<br />
Exceptions. A list, separated by commas or semi-colons, of<br />
sites accessed without using the proxy. You can use the<br />
asterisk (*) character to identify a group of sites (for example,<br />
local.*:*).<br />
4. When you are finished, click OK to accept these settings, or<br />
Cancel to cancel them.<br />
<strong>User</strong> <strong>Guide</strong> 59
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
Setting Your Timezone Display<br />
You can choose whether to display timestamps in Greenwich Mean<br />
Time (GMT) or your own local server timezone. Your administrator<br />
will set the default behavior of your installation, but you can change<br />
this setting in both the Windows interface and the <strong>Source</strong> <strong>Integrity</strong><br />
Web Interface.<br />
If your installation of the the Windows interface or <strong>Source</strong> <strong>Integrity</strong><br />
Web Interface is set to display times in GMT, the letter Z is appended<br />
to the timestamp.<br />
Note This setting does not affect date strings in log files or revision<br />
descriptions.<br />
To set your timezone display in the Windows interface:<br />
1. Choose Configuration > Personal.<br />
<strong>The</strong> Personal Configuration dialog box appears, showing the<br />
Preferences tab.<br />
2. To display timestamps in your server’s local timezone, select the<br />
Use Local Timezone checkbox. To display them in GMT, leave the<br />
checkbox empty.<br />
3. Click OK to accept these settings, or click Cancel.<br />
To set your timezone display in the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface:<br />
1. From the <strong>Source</strong> <strong>Integrity</strong> Web Interface home page, choose<br />
Configuration > Configuration.<br />
<strong>The</strong> Configuration <strong>Guide</strong> page appears.<br />
2. Click Select the default Time Zone. Your current default timezone<br />
setting is displayed beside this link.<br />
<strong>The</strong> Select Timezone Display Mode page appears.<br />
3. Select one of the following options:<br />
GMT. Displays all timestamps in Greenwich Mean Time. If<br />
you choose this option, timestamps will be followed by the<br />
letter Z.<br />
60 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> Command Line Interface<br />
Project<br />
Commands<br />
Versus Archive<br />
Commands<br />
<strong>The</strong> Command Line Interface<br />
Local Time Zone. Displays all timestamps in the time zone of<br />
your local server.<br />
4. When you are finished, click OK to accept these settings, or<br />
Cancel to cancel them.<br />
Note In the <strong>Source</strong> <strong>Integrity</strong> Web Interface, keywords are expanded on<br />
your server, and then copied to your client machine even though your<br />
working files reside on your client machine. <strong>The</strong>refore, any dates and<br />
times will be server-relative rather than client-relative.<br />
<strong>Source</strong> <strong>Integrity</strong> provides a complete command line interface to<br />
manage your projects and archives. With few exceptions, the<br />
command-line interface and Windows interface of <strong>Source</strong> <strong>Integrity</strong><br />
provide the same functionality.<br />
Note <strong>The</strong> command line interface is not accessible from the <strong>Source</strong><br />
<strong>Integrity</strong> Web Interface.<br />
<strong>Source</strong> <strong>Integrity</strong>’s command line interface has two types of<br />
commands:<br />
Project commands operate on project members or entire projects;<br />
they automatically update project metadata when they perform<br />
their functions.<br />
Archive commands operate on archives only, even if the archive is a<br />
member of a <strong>Source</strong> <strong>Integrity</strong> project.<br />
<strong>The</strong>ir main difference concerns project functionality. Project<br />
commands provide extra project management capabilities, assistance<br />
in the build process, and reporting information. <strong>The</strong>y are the most<br />
versatile way to manage source materials.<br />
Archive commands are supplied mainly for legacy purposes.<br />
Although compatible with project commands, they do not provide<br />
project functionality. <strong>The</strong> sole exception to this allows archive<br />
commands to examine a project file to find archives. Most archive<br />
commands accept the -Pprojfile.pj parameter to do this.<br />
<strong>User</strong> <strong>Guide</strong> 61
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
Command-Line<br />
Length<br />
Path Separator<br />
Wildcard<br />
Expansion<br />
While archive commands are individual executables, the project<br />
commands are available through the pj executable. Project<br />
commands follow the general syntax pj directive, where directive is a<br />
<strong>Source</strong> <strong>Integrity</strong> function (ci, co, freeze, build, and others).<br />
Which Project Will Project Commands Operate On?<br />
If you do not specify a project when you call a pj command, it uses<br />
the following order of precedence to determine the project it should<br />
act on<br />
the project named by the PROJECT environment variable<br />
the project named by the ROOTPROJECT environment variable<br />
a sandbox named sandbox.pj in the current working directory<br />
a project named project.pj in the current working directory<br />
<strong>The</strong> operating system and shell where <strong>Source</strong> <strong>Integrity</strong> commands<br />
are run determines the allowable length of the commands.<br />
Under the DOS command.com shell, the maximum length is 128<br />
bytes.<br />
Under the KornShell (provided with <strong>MKS</strong> Toolkit) the maximum<br />
length is 8K.<br />
On UNIX systems, the maximum length is usually greater than<br />
16K.<br />
If the number of files to be included in a command extends the line<br />
past these limits, you can use a file list (explained later) or include all<br />
the files in a project and issue commands for the entire project at<br />
once.<br />
<strong>The</strong> DOS, OS/2 and Windows 95/98 and NT versions of <strong>Source</strong><br />
<strong>Integrity</strong> understand both the DOS and UNIX path separators (that is,<br />
the backslash and slash character, respectively). On these systems, the<br />
following commands are both valid:<br />
rlog c:\src\work\graphics.c<br />
rlog c:/src/work/graphics.c<br />
On UNIX systems, <strong>Source</strong> <strong>Integrity</strong> commands understand only the<br />
UNIX path separator.<br />
Under <strong>Source</strong> <strong>Integrity</strong>, the asterisk wildcard can indicate all files in a<br />
directory, as well as zero or more characters in a filename.<br />
62 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
File Name<br />
Arguments<br />
For more information about<br />
how <strong>Source</strong> <strong>Integrity</strong> resolves<br />
wildcards in filenames, see<br />
“Wildcard Expansion” on<br />
page 62.<br />
<strong>The</strong> Command Line Interface<br />
For example, to check in all of the files in the current directory, you<br />
can use either<br />
pj ci *<br />
pj ci *.*<br />
Wildcards are allowed anywhere in a path or filename. For example,<br />
the characters “*a*” represent any files that contain the letter “a” in<br />
the basename or the extension.<br />
For project commands, file refers to members of a <strong>Source</strong> <strong>Integrity</strong><br />
project. If the file argument is omitted for project commands, the<br />
command is applied to all of the members of the project.<br />
<strong>The</strong> file element must be the last entry of a command statement. <strong>The</strong>re<br />
are three ways to apply a command to multiple files.<br />
Enter Multiple File Names<br />
You can enter two or more filenames, separated by spaces, as the<br />
file component. For example, the command<br />
pj co -l prog.c brochur.toc brochur.idx<br />
checks out all three files. You can name as many files as you like<br />
on the command line (subject to the line length limitations of<br />
your operating system).<br />
Use Wildcards<br />
Use wildcards in the file component. For example, the command<br />
pj ci brochur.*<br />
checks in all files with the basename brochur and any extension.<br />
Specify a File List<br />
A file list (specified with the -Ffilename option) is a text file<br />
containing the names of the files a command should be applied<br />
to. For example, the command<br />
pj ci -Fflist.lst<br />
checks in all the files listed in the flist.lst file.<br />
Files named in the file element may have any level of path<br />
qualification.<br />
A file list is a text file containing a list of filenames, with each name on<br />
a line by itself. When you pass a file list to <strong>Source</strong> <strong>Integrity</strong>, it reads<br />
the filenames and applies the command to them in sequence.<br />
<strong>User</strong> <strong>Guide</strong> 63
Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces<br />
You can create a file list with any text editor by entering filenames—<br />
one name per line—in a plain text file. Alternatively, you can compile<br />
a list of files with the find command and copy them to a text file. <strong>The</strong><br />
find command is a standard UNIX utility and is available on PC<br />
systems with <strong>MKS</strong> Toolkit.<br />
File lists can be used with project commands, as well as the ci, co,<br />
rcs, rcsdiff, rcsclean, rlog, pvcs2rcs, sccs2rcs, and report<br />
commands.<br />
64 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Getting Started With<br />
Projects, Sandboxes,<br />
and Members<br />
4<br />
This chapter describes the <strong>Source</strong> <strong>Integrity</strong> features that you will use<br />
in your day-to-day activities, and explains how to perform tasks<br />
using the three main interfaces to <strong>Source</strong> <strong>Integrity</strong>:<br />
Windows interface<br />
Command line interface<br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface<br />
For introductory information about these three interfaces, see<br />
Chapter 3: “Introducing the <strong>Source</strong> <strong>Integrity</strong> Interfaces” on page 39.<br />
For information about using <strong>Source</strong> <strong>Integrity</strong> in development<br />
environments, see Chapter 7: “Using Extensions” on page 197.<br />
<strong>User</strong> <strong>Guide</strong> 65
Getting Started With Projects, Sandboxes, and Members<br />
Creating a Project<br />
When you are ready to place a group of files under <strong>Source</strong> <strong>Integrity</strong><br />
control, the first step is to create a project. Organizing your files in a<br />
project allows you to perform configuration management operations<br />
on the files as a group.<br />
You should place the project file in the topmost directory of the<br />
source file hierarchy. <strong>Source</strong> <strong>Integrity</strong> projects work best when all<br />
project members reside in a single directory tree under the project<br />
directory. While members can reside anywhere on the system,<br />
spreading projects across multiple directory trees increases the<br />
chances that something will go wrong, since different users may map<br />
network drives differently, and there is no guarantee that all users<br />
will be able to access every directory on the system. Project members<br />
which are not located in the same directory tree as the rest of the<br />
project are called out-of-tree members.<br />
Note <strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface does not support out-of-tree<br />
members. If you want to use the <strong>Source</strong> <strong>Integrity</strong> Web Interface to access<br />
a project, all of its members must be in the same directory tree.<br />
<strong>The</strong> Windows interface provides a wizard to lead you through the<br />
process of creating projects. You can choose to add members and<br />
create a sandbox while you are creating the project, or choose to do it<br />
later.<br />
To create a project in the Windows interface:<br />
1. Choose File > Create Project, or click .<br />
Step 1 of the Create Project Wizard appears.<br />
66 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
2. In Step 1, enter the following options:<br />
<strong>The</strong> Project Name (default is project.pj).<br />
Creating a Project<br />
<strong>The</strong> Project Location. You can type a full directory pathname,<br />
or click Browse to find or create a directory.<br />
Click Next.<br />
Step 2 of the Create Project Wizard appears.<br />
3. In Step 2, enter the names of any members you want to Add to the<br />
project. This step is optional; you can always add members to<br />
your project later. While adding members, you can also choose<br />
the following options:<br />
whether to create member archives, and whether you want<br />
the member archives created automatically or interactively<br />
whether to create a project archive<br />
Note It is recommended that you create archives for all members and<br />
the project, so that all changes to these objects can be tracked.<br />
To create the project without creating an associated sandbox, click<br />
Finish. To create an associated sandbox for the project, click Next.<br />
Step 3 of the Create Project Wizard appears.<br />
<strong>User</strong> <strong>Guide</strong> 67
Getting Started With Projects, Sandboxes, and Members<br />
For information about the<br />
different types of sandboxes,<br />
see “Creating a Sandbox” on<br />
page 76.<br />
4. In Step 3, if you want to create an associated sandbox, click Yes.<br />
Enter a Sandbox Name and Sandbox Location. You can type a full<br />
directory pathname, or click Browse to find or create a directory.<br />
You can specify any name you want for the sandbox.<br />
5. Click Finish.<br />
<strong>Source</strong> <strong>Integrity</strong> opens the project and displays the list of members in<br />
a Project window.<br />
To create a project in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. Choose Project > Create Project.<br />
2. On the Create Project page, choose the drive, directory, and file<br />
name for your project on the server file system and click OK. You<br />
can accept the default project name project.pj.<br />
<strong>The</strong> project is created and the Project page appears.<br />
When you create a project using the <strong>Source</strong> <strong>Integrity</strong> Web Interface, it<br />
is automatically registered (see “Registering a Project in the <strong>Source</strong><br />
<strong>Integrity</strong> Web Interface” on page 69). You cannot add members,<br />
create archives, or create a sandbox while creating a project in the<br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface; you must perform these actions<br />
afterward.<br />
To create a project in the command-line interface:<br />
Change to the directory that will be the root of the project directory<br />
tree, and enter the command<br />
pj create [-Pprojname]<br />
This creates a project file with the name projname in the current<br />
directory. If you omit the optional -P parameter, the project is given<br />
the default name set by the PROJECT environment variable, or<br />
project.pj if there is no PROJECT variable defined.<br />
You cannot add members, create archives, or create a sandbox while<br />
creating a project in the command-line interface; you must perform<br />
these actions afterward.<br />
68 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Registering a Project in the <strong>Source</strong> <strong>Integrity</strong> Web Interface<br />
Registering a Project in the <strong>Source</strong> <strong>Integrity</strong><br />
Web Interface<br />
Before you can use the <strong>Source</strong> <strong>Integrity</strong> Web Interface to access a<br />
project that was created using the <strong>Source</strong> <strong>Integrity</strong> Windows interface<br />
or command-line interface, you must register it first. Any projects<br />
created using the <strong>Source</strong> <strong>Integrity</strong> Web Interface are automatically<br />
registered (see “Creating a Project” on page 66).<br />
If you create (and therefore register) a project with the <strong>Source</strong><br />
<strong>Integrity</strong> Web Interface, you can still use the Windows interface or<br />
command-line interface to <strong>Source</strong> <strong>Integrity</strong> to access the project, as<br />
long as you have file-system access to the project directory.<br />
To register an existing project:<br />
1. Choose Project > Register Project from the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface home page.<br />
<strong>The</strong> Register Project page appears.<br />
2. Browse the server file system to select the project file you want to<br />
register, or enter the full path name and click OK.<br />
Registering a Sandbox in the <strong>Source</strong><br />
<strong>Integrity</strong> Web Interface<br />
Before you can use the <strong>Source</strong> <strong>Integrity</strong> Web Interface to access a<br />
sandbox that was created using the <strong>Source</strong> <strong>Integrity</strong> Windows<br />
interface or command-line interface, you must register it first. Any<br />
sandbox created using the <strong>Source</strong> <strong>Integrity</strong> Web Interface are<br />
automatically registered (see “Creating a Sandbox” on page 76).<br />
If you create (and therefore register) a sandbox with the <strong>Source</strong><br />
<strong>Integrity</strong> Web Interface, you can still use the Windows interface or<br />
command-line interface to <strong>Source</strong> <strong>Integrity</strong> to access the project, as<br />
long as you have file-system access to the project directory.<br />
To register an existing sandbox:<br />
1. Choose Project > Register Sandbox from the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface home page.<br />
<strong>The</strong> Register Sandbox page appears.<br />
<strong>User</strong> <strong>Guide</strong> 69
Getting Started With Projects, Sandboxes, and Members<br />
2. In step 1, to register a sandbox of a registered project, click the<br />
select it link. Whether a project is selected appears to the right of<br />
this link.<br />
3. In step 1, if the project is not registered, click the register it link.<br />
4. In step 2, click the specify link to locate the sandbox.<br />
Opening a Project or Sandbox<br />
5. In step 3, click the register the sandbox link. To close this page<br />
without registering a sandbox, click Cancel.<br />
To perform actions upon a member file in the Windows interface or<br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface, you must first open the project or<br />
sandbox that it belongs to. In the command line interface, just<br />
navigate to the project directory before issuing any commands.<br />
To open a project or sandbox in the Windows interface:<br />
1. Choose File > Open Project/Sandbox, or click .<br />
<strong>The</strong> Open Project/Sandbox browser appears.<br />
2. If the project or sandbox you want to open is not in the current<br />
directory, navigate to the proper drive and directory.<br />
3. Select one or more sandboxes or projects from the list and press<br />
, or click OK.<br />
You can also open recently accessed projects or sandboxes by<br />
choosing their names from the list at the bottom of the File menu.<br />
Upon installation, <strong>Source</strong> <strong>Integrity</strong> creates a Windows association<br />
between itself and files that have the .pj extension. If you have not<br />
changed this association, you can also open a project or sandbox by<br />
double-clicking on the file name in Windows Explorer.<br />
To open a project in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. Register the project, if it has not been registered (see “Registering<br />
a Project in the <strong>Source</strong> <strong>Integrity</strong> Web Interface” on page 69).<br />
2. From the <strong>Source</strong> <strong>Integrity</strong> Web Interface home page, choose the<br />
Project > Open Project command.<br />
<strong>The</strong> Select Project page appears.<br />
70 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Opening the Master Project From a Sandbox<br />
3. In the Select Project page, choose the project you want to open<br />
from the list of registered projects and click OK.<br />
To open a subproject, select the project from the list of registered<br />
projects, click List Subprojects, select the subproject, and click OK.<br />
If you have no projects currently registered, the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface displays an error message.<br />
To open a sandbox in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. Register the sandbox, if it has not been registered (see<br />
“Registering a Sandbox in the <strong>Source</strong> <strong>Integrity</strong> Web Interface” on<br />
page 69).<br />
2. From the <strong>Source</strong> <strong>Integrity</strong> Web Interface home page, choose the<br />
Sandbox > Open Sandbox command.<br />
<strong>The</strong> Select Sandbox page appears.<br />
3. In the Select Sandbox page, choose the sandbox you want to open<br />
from the list of registered sandboxes and click OK.<br />
To open a subsandbox, select the sandbox from the list of registered<br />
sandboxes, click List Subsandboxes, select the subsandbox, and click<br />
OK.<br />
If you have no sandboxes currently registered, the <strong>Source</strong> <strong>Integrity</strong><br />
Web Interface displays an error message.<br />
Opening the Master Project From a Sandbox<br />
If you are working within a sandbox in the Windows interface or<br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface, you can open the sandbox’s master<br />
project.<br />
To open a master project of a sandbox in the Windows interface:<br />
With a Sandbox window active, choose Project > Open Master Project.<br />
<strong>The</strong> master project appears in a Project window.<br />
To open a master project of a sandbox in the <strong>Source</strong> <strong>Integrity</strong><br />
Web Interface:<br />
In the Sandbox view, click Project.<br />
<strong>The</strong> Project view of the master project appears.<br />
<strong>User</strong> <strong>Guide</strong> 71
Getting Started With Projects, Sandboxes, and Members<br />
Adding Members to a Project<br />
As your body of source code grows, you will want to add members to<br />
your existing projects. You can add members using all three<br />
interfaces, but each interface handles the creation of member archives<br />
differently.<br />
In the Windows interface, you can choose to have <strong>Source</strong> <strong>Integrity</strong><br />
create an archive for any file that does not already have one. Archives<br />
can be created either interactively (you will be prompted before the<br />
archive is created) or automatically (default settings will be used).<br />
When you add members using the <strong>Source</strong> <strong>Integrity</strong> Web Interface,<br />
archives are always created for members that do not already have<br />
archives.<br />
<strong>The</strong> command-line interface does not allow you to create archives<br />
automatically as you add members. This must be done by explicitly<br />
checking the members in after you have added them.<br />
To add members to a project in the Windows interface:<br />
1. Choose Project > Add Members, or click (if you previously<br />
added this button to the toolbar).<br />
<strong>The</strong> Add Project Members dialog box appears.<br />
72 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Adding Members to a Project<br />
2. Select one or more files from the displayed file list, navigating to<br />
the desired directory if necessary. You can add all of the files and<br />
subdirectories in the current directory by clicking Select All.<br />
3. Click the Create Archives option to have <strong>Source</strong> <strong>Integrity</strong> create<br />
archives for any files that do not already have one. You may<br />
choose to have the archives created Automatically, in which case<br />
default settings are used, or Interactively, whereby you are<br />
prompted before each archive is created.<br />
4. To recursively add all files in any selected subdirectories, click<br />
Recursive Add.<br />
5. Press or click Add to add the new members to the project.<br />
Note If you want to add a very large number of files (more than 10,000,<br />
for example) from the same directory, you should navigate to the parent<br />
directory, select the directory that contains the files, and click Recursive<br />
Add.<br />
To add members to a project or sandbox using Windows<br />
Explorer:<br />
1. Position the <strong>Source</strong> <strong>Integrity</strong> application window and the<br />
Windows Explorer window so that they are both visible on your<br />
Windows desktop.<br />
2. In Windows Explorer, navigate to the appropriate directory and<br />
select one or more files to add as members. Click and drag the<br />
files onto a Project or Sandbox window in the <strong>Source</strong> <strong>Integrity</strong><br />
application window.<br />
<strong>The</strong> files are added to the project or sandbox. Members added<br />
through Windows Explorer do not have archives created for them<br />
by default. To create archives for these members, check them in.<br />
To add members to a project in the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface:<br />
1. From the Project or Sandbox view, choose Filters > Everything to<br />
display all files in the project or sandbox’s directory or Filters ><br />
Non-Members to display just those files that are not members of<br />
the project or sandbox.<br />
2. In the list of files, select the files you want to add to the project,<br />
and choose Member Commands > Add.<br />
<strong>User</strong> <strong>Guide</strong> 73
Getting Started With Projects, Sandboxes, and Members<br />
3. From the Add Member page, enter an Archive Description and a<br />
Label if desired. If you are adding more than one member, you<br />
can click OK to continue to the next member or choose Apply to<br />
All and then click OK to apply these properties to all of the<br />
members.<br />
<strong>The</strong> files are added to the project as members. If they did not<br />
already have archives, then archives are created for them.<br />
If an archive already exists, the file being added is checked in on a<br />
branch off of the archive’s head revision, to ensure that any<br />
changes to that file are stored in the archive while not creating a<br />
new revision on the trunk.<br />
To add members to a project in the command line interface:<br />
From the project or sandbox directory, use the pj add command. Its<br />
syntax is<br />
pj add [-R] [-rrev] [-ttype] [-Pprojname] [path/]filename<br />
where path is either the absolute path to the file or the path relative to<br />
the project or sandbox directory. Other options include the following:<br />
-R recursively applied this operation to any directories specified<br />
on the command line<br />
-rrev uses rev instead of head revision as the member’s revision<br />
-ttype overrides determination of a member’s type. A member’s<br />
type cannot be set to archived unless the member already has an<br />
archive.<br />
Normally, pj add and other pj commands use the file name of the<br />
working file, not of its archive (archives can be used, but are not<br />
required). <strong>Source</strong> <strong>Integrity</strong> uses the project file (and its own defaults)<br />
to locate archives. If archives exist for members you add, <strong>Source</strong><br />
<strong>Integrity</strong> sets the member revision to the head revision of the archive.<br />
If archives do not exist for members you have just added, you can<br />
create them by checking them in with the pj ci command.<br />
74 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Removing Members From a Project<br />
Removing Members From a Project<br />
If a member has outlived its usefulness or just does not belong in a<br />
project anymore, you can remove it at any time.<br />
After you remove a member from a project, the member is no longer<br />
listed as part of the project, but the member’s working file and<br />
archive remains, in case you need to recreate an earlier version of the<br />
project.<br />
To remove a member in the Windows interface:<br />
1. In a Project or Sandbox window, select one or more members to<br />
remove from the project.<br />
2. Choose Project > Remove Members, or click .<br />
A message box appears asking you to confirm the deletions.<br />
3. To remove the selected member(s), click Yes or Yes to All.<br />
<strong>The</strong> members are removed from the project.<br />
To close the dialog box without removing any members, click No<br />
or No to All.<br />
To remove a member in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. In the Project or Sandbox view, choose the member(s) you want<br />
to remove, and choose Member Commands > Drop.<br />
You are asked for confirmation.<br />
2. Click Yes.<br />
To remove a member in the command line interface:<br />
From the project directory, use the pj drop command. Its syntax is<br />
pj drop [-R] [options] file…<br />
where -R recursively applies this operation to any directories<br />
specified on the command line. <strong>The</strong> command line interface does not<br />
ask for confirmation.<br />
<strong>User</strong> <strong>Guide</strong> 75
Getting Started With Projects, Sandboxes, and Members<br />
Creating a Sandbox<br />
For more information, see<br />
“Freezing Members” on<br />
page 106.<br />
When you want to work in your own workspace without interfering<br />
with the work of others, you create a sandbox of the project you are<br />
working in.<br />
If you create a sandbox of a project that contains frozen subproject<br />
members, the members that populate your sandbox correspond to<br />
the member revisions in the checkpointed frozen revision of the<br />
subproject.<br />
While you can create a sandbox when you create a new project in the<br />
Windows interface, most users will create their own sandboxes to<br />
access the contents of existing projects. <strong>The</strong> Windows interface<br />
provides a wizard to lead you through the process of creating a<br />
sandbox.<br />
To create a sandbox in the Windows interface:<br />
1. Choose File > Create Sandbox, or click .<br />
<strong>The</strong> Step 1 panel of the Create Sandbox Wizard appears.<br />
2. In Step 1, enter the fully qualified name of the Master Project, or<br />
click Browse to locate it. If you have a project currently open, that<br />
project will be the default. Click Next.<br />
<strong>The</strong> Step 2 panel of the Create Sandbox Wizard appears.<br />
76 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For more information, see<br />
“Build Sandboxes” on<br />
page 25.<br />
Creating a Sandbox<br />
3. In the Step 2 panel, enter the Sandbox Name (default is<br />
sandbox.pj), and enter or Browse for the Sandbox Location. If<br />
you want to have working copies of the project’s members copied<br />
to the sandbox workspace, select the Copy Members to Sandbox<br />
option. If this option is not selected, the sandbox is created, but<br />
working copies of member files must then be copied or checked<br />
out to the sandbox workspace. Click Next.<br />
<strong>The</strong> Step 3 panel of the Create Sandbox Wizard appears.<br />
4. In the Step 3 panel, select the type of sandbox you want to create:<br />
Normal Sandbox, one that is based upon the most recent or<br />
head revision of the project. Click Finish.<br />
Variant Sandbox, one that is based upon a specific revision of<br />
the master project and is used for branching off of the main<br />
development path. Click Next.<br />
<strong>The</strong> Step 4 panel of the Create Sandbox Wizard appears,<br />
allowing you to select an Existing Development Path by<br />
specifying the Development Path Name; or a New Development<br />
Path by selecting By Revision or By Label and entering a new<br />
Development Path Name.<br />
Build Sandbox, a static sandbox that is based upon a specific<br />
revision of the master project, but is used for building or<br />
testing the project, not for further development. Click Next.<br />
<strong>User</strong> <strong>Guide</strong> 77
Getting Started With Projects, Sandboxes, and Members<br />
<strong>The</strong> Step 4 panel of the Create Sandbox Wizard appears.<br />
Select a project By Revision or By Label. Click Finish.<br />
<strong>The</strong> wizard dialog box closes, and a Sandbox window appears<br />
displaying the contents of the new sandbox.<br />
If the Create Sandbox option is set in the Recursion panel of the<br />
Personal Configuration dialog box, this command recursively creates<br />
sandboxes for subprojects that are members of the project (or<br />
members of subprojects) a sandbox is being created for. If this option<br />
is not enabled, <strong>Source</strong> <strong>Integrity</strong> prompts you to recurse for each<br />
subproject encountered in the master project.<br />
To create a sandbox in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. Choose Sandbox > Create Sandbox.<br />
<strong>The</strong> Create Sandbox <strong>Guide</strong> appears.<br />
2. To create a sandbox from a registered project, click the select it<br />
link. On the Create Sandbox - Select Project page, select the<br />
desired project (click List Subprojects if you want to select a<br />
subproject), and click OK.<br />
If the desired project is not registered on the server, click the<br />
register it link. On the Create Sandbox - Register Project page,<br />
browse to the location of the desired project, select it, and click<br />
OK.<br />
3. On the Create Sandbox <strong>Guide</strong> page, click the link to select (or<br />
create) the directory where you want to locate the sandbox. On<br />
the Create Sandbox - Locate Sandbox Directory page, type the<br />
path of the desired directory on your local client file system, or<br />
click Browse to locate a path, and click OK. In the <strong>Source</strong> <strong>Integrity</strong><br />
Web Interface, the name of the sandbox file must be the same as<br />
that of the project (for example, project.pj).<br />
4. To choose whether or not to copy the project members to your<br />
local sandbox, click the Choose a populate sandbox option link.<br />
<strong>The</strong> current setting is displayed beside the link.<br />
5. When you are finished setting options, click the create the<br />
sandbox link.<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface then displays the Sandbox<br />
view of your new sandbox.<br />
You cannot create a variant or build sandbox through the <strong>Source</strong><br />
<strong>Integrity</strong> Web Interface.<br />
78 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Creating a Sandbox<br />
To create a sandbox in the command line interface:<br />
Use the pj sandbox command. Its syntax is<br />
pj sandbox [-Ssbxname] -Pprojname<br />
where sbxname is the name of the new sandbox file (must be either<br />
fully qualified or relative to the current directory), and projname is the<br />
fully qualified file name of the master project.<br />
<strong>The</strong> -S argument is usually omitted in favor of the default file name<br />
sandbox.pj, as long as you are in the directory where you want to<br />
create the sandbox. Naming your sandboxes sandbox.pj or<br />
project.pj relieves you from using the -Psbxname argument in pj<br />
commands.<br />
By default, <strong>Source</strong> <strong>Integrity</strong> copies the project member files into the<br />
sandbox directory. If a project member is archived, <strong>Source</strong> <strong>Integrity</strong><br />
copies the revision of the member listed in the project. If the sandbox<br />
directory tree already contains writable copies of project members,<br />
they are not overwritten.<br />
To create a variant sandbox in the command line interface:<br />
Use the pj sandbox command with the syntax<br />
pj sandbox [-krev] -Npathname [-Ssbxname] [-Pprojname]<br />
where<br />
<strong>The</strong> -krev option specifies which revision of an archived project<br />
you want to use as the starting point for your new development<br />
path. A development path is a named diversion from the main<br />
evolution of the project. <strong>The</strong> -krev option automatically<br />
creates a sandbox for a specific revision of the project<br />
rebuilds a sandbox copy of the master project’s directory tree<br />
as it existed when the project was checkpointed<br />
populates the sandbox directory tree with copies of the<br />
appropriate revisions of project members<br />
<strong>The</strong> -Npathname option takes a development path name<br />
parameter. It uses the revision named with -krev as a starting<br />
point, and changes to variant sandboxes based on this path do<br />
not influence the main project (or sandboxes based on it).<br />
Other users can join an existing development path by issuing<br />
pj sandbox with only the -Npathname parameter, not the -krev<br />
option.<br />
<strong>User</strong> <strong>Guide</strong> 79
Getting Started With Projects, Sandboxes, and Members<br />
After creating a new variant sandbox, you should checkpoint the<br />
master project recursively by changing to the master project directory<br />
and issuing the pj checkpoint command<br />
pj -Pprojname -i checkpoint<br />
This step preserves <strong>Source</strong> <strong>Integrity</strong>’s record of the variant sandbox.<br />
For example, suppose you are currently working on Release 2 of a<br />
project; six months ago you finished Release 1, which you<br />
checkpointed and labeled as “Release_1”. Now, a change request has<br />
come in from a user of the Release_1 product and you have to go back<br />
and work on the earlier version.<br />
You create a sandbox just as you would any other, but you use the<br />
-krev option to specify the starting revision of the project, and the<br />
-Ndevname option to specify a development path name that others<br />
may use to follow the same path. For example, to recreate the revision<br />
of the gamble project that was labeled Release_1, enter<br />
pj sandbox -Pp:\gamble\project.pj -N postrm -k<br />
Release_1<br />
This creates a variant sandbox named sandbox.pj in the current<br />
directory that points to the Release_1 revision of the gamble project. It<br />
also creates a new development path, postrm that others can use to<br />
work on the same new direction of development.<br />
To preserve the record of the development path, issue the<br />
pj checkpoint command from the project directory. This checkpoints<br />
the master project, so that all its development paths can be recreated<br />
if necessary.<br />
You can now check out files and make changes in the variant sandbox<br />
of the gamble project.<br />
If others want to participate in the same divergent development, they<br />
can create their own variant sandboxes by specifying the<br />
development path name, without giving a revision.<br />
pj sandbox -Pp:\gamble\project.pj -N postrm<br />
To create a build sandbox in the command line interface:<br />
Use the pj sandbox command with the syntax<br />
pj sandbox -krev [-Ssbxname] [-Pprojname]<br />
where -krev option allows you to specify which revision of an<br />
archived project you want to recreate. It automatically<br />
creates a sandbox for a specific revision of the project<br />
80 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For more information about<br />
build sandboxes, see “Build<br />
Sandboxes” on page 25.<br />
Checking Out a Member<br />
rebuilds a sandbox copy of the master project’s directory tree as it<br />
existed when the project was checkpointed<br />
populates the sandbox directory tree with copies of the<br />
appropriate revisions of project members<br />
Note that you do not specify a development path name when<br />
creating a build sandbox.<br />
To create “Sparse Sandboxes” in the command line interface:<br />
When a sandbox is sparse, only those project members that you check out<br />
are actually copied to the sandbox. This can minimize your local<br />
storage requirements when working with large projects.<br />
You can include a policy option Sparse in SAM to cause <strong>Source</strong><br />
<strong>Integrity</strong> to make sparse sandboxes by default. If the Sparse option is<br />
present in SAM, <strong>Source</strong> <strong>Integrity</strong> does not automatically copy project<br />
members to your sandbox when it is created or refreshed.<br />
<strong>The</strong> pj sandbox command then creates only the sandbox file and a<br />
member usage file.<br />
If SPARSE is not set as the default, you can still create a sparse<br />
sandbox with the command<br />
pj sandbox -Vsparse …<br />
Checking Out a Member<br />
Before you can make changes to a member, you must first check it out<br />
of its archive. When you check out a revision, it is copied to a<br />
working file where you can view or modify its contents.<br />
To check out a project member or revision in the Windows<br />
interface:<br />
1. To check out a project member, select one or more members in a<br />
Sandbox or Project window and choose Member > Check Out, or<br />
click .<br />
To check out from an archive, select a revision in the Archive<br />
window and choose Archive > Check Out, or click .<br />
<strong>The</strong> Check Out dialog box appears.<br />
<strong>User</strong> <strong>Guide</strong> 81
Getting Started With Projects, Sandboxes, and Members<br />
2. Fill in or modify the check-out options, and click OK to check out<br />
the revision or member(s). To cancel the check out without<br />
checking out any files, click Cancel to stop the check out of a<br />
single file, or Cancel All to stop all remaining check out<br />
operations.<br />
Note To be able to perform check-out operations without the Check Out<br />
dialog box appearing, deselect the Show Dialog setting on the Checkout<br />
tab of the Personal Configuation dialog box. If you do this, <strong>Source</strong><br />
<strong>Integrity</strong> will use the settings in your personal configuration, combined<br />
with default settings, when checking out files.<br />
Check-Out Options<br />
You can specify a number of options upon check out, including:<br />
Working File. <strong>The</strong> fully qualified name of the working file the<br />
revision will be checked out to.<br />
If you use the Locked (for editing) option (following), you cannot<br />
set the name and location of the working file because its existing<br />
location is used to establish a link between the archive and its<br />
working file. If a writable file with the selected file name already<br />
exists, you are asked to confirm that it should be overwritten.<br />
If a revision is checked out unlocked from an archive with a strict<br />
locking policy, <strong>Source</strong> <strong>Integrity</strong> does not allow you to check it back<br />
in as a new revision.<br />
Selection of which revision of the member to check out.<br />
Default Rev. Checks out the tip revision of the default branch,<br />
usually the head revision.<br />
82 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Checking Out a Member<br />
Member Rev. Checks out the member revision, that is, the<br />
revision shown in the Sandbox or Project window (this is the<br />
default). This option is not available if you are checking out a<br />
revision from an Archive window that is not project aware.<br />
Revision. Checks out the revision with the specified revision<br />
number.<br />
Label. Checks out the revision with the specified label.<br />
Locked (for editing). Checks out a writable working file, and<br />
ensures no one else can make changes to the revision while you<br />
have it checked out by locking it in your name. If strict locking is<br />
enabled, you must check out a revision locked if you want to<br />
make changes to it. When a revision is checked out locked, the<br />
Working File field cannot be changed.<br />
Restore Timestamp. Sets the timestamp of the working file to the<br />
date and time of the revision in the archive. Otherwise, the<br />
working file’s timestamp is set to the current date and time.<br />
Create Branch. Creates a duplicate revision (that is, creates a<br />
branch in the archive) and checks it out. Note that if Update<br />
Member is not set as well, the working file and member revision<br />
will not match.<br />
All Files. When checking out more than one member, this applies<br />
the current set of options to all subsequent check-out operations.<br />
This option is disabled if only one member is selected.<br />
Expand Keywords. Replaces keywords in the revision with literal<br />
values in the working file. This option is disabled if the revision<br />
contains binary data.<br />
Update Member. When checking out from a project or sandbox,<br />
this causes the revision you check out to become the new member<br />
revision in the project. For example, if the current project member<br />
is listed as Revision 2.3 and you check out Revision 1.7 using this<br />
option, Revision 1.7 replaces Revision 2.3 as the member of the<br />
project.<br />
To check out a member in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. Click the Sandbox view tab to see the contents of your sandbox.<br />
<strong>User</strong> <strong>Guide</strong> 83
Getting Started With Projects, Sandboxes, and Members<br />
2. Select the member(s) you want to check out, and choose Member<br />
Commands > Check Out Locked.<br />
<strong>The</strong> Web Interface locks the sandbox member in your name and<br />
copies the content of the revision into a writable working file.<br />
If the Check Out page informs you that the working file has been<br />
changed, you can click Yes to overwrite the working file, or click<br />
Show Differences to view the differences between the working<br />
file and the revision you are checking out.<br />
To check out a member in the command line interface:<br />
Use the pj co command. Its syntax is<br />
pj co [-l] [-r rev|label] [-Pprofile.pj] [file…]<br />
<strong>The</strong> -l option lets you check out and lock a revision for editing.<br />
When you check out a revision locked, <strong>Source</strong> <strong>Integrity</strong> extracts a<br />
writable copy of the revision to your working directory. While you<br />
hold a lock on a revision, no one else can check out a writable copy of<br />
it; this ensures that only one person at a time makes changes to a<br />
given revision.<br />
A revision that is checked out unlocked is copied to a read-only<br />
working file, if a strict locking policy is in effect for the archive. In<br />
addition, with a strict locking policy, <strong>Source</strong> <strong>Integrity</strong> only lets you<br />
check in a file if it was first checked out locked.<br />
When strict locking is not in effect, check-in operations are<br />
unrestricted, provided no one else has a lock on the revision.<br />
For example, the command<br />
pj co -l filesys.c<br />
checks out a writable copy of the project member filesys.c and<br />
locks it in your name. If the revision is already locked by another<br />
user, you can still check out a read-only copy with<br />
pj co filesys.c<br />
You can check out a revision by specifying its revision number or<br />
label, using the -r option to the pj co command.<br />
For example, the command<br />
pj co -rworking betting.c<br />
84 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Viewing and Editing a Member<br />
checks out a revision with the label “working” from the betting.c<br />
archive. If the revision is not the project’s member revision, the<br />
following message appears:<br />
d:\gamble\src\betting.c: checkout revision 1.1<br />
update project revision from 1.15 to 1.1? [yn](y)<br />
Whether you press y or n, the file is checked out. If you press y, the<br />
project file is changed to use this as the member revision.<br />
Viewing and Editing a Member<br />
Using <strong>Source</strong> <strong>Integrity</strong> commands, you can open a member in your<br />
default editor application (for example, Microsoft Windows Notepad<br />
or <strong>MKS</strong> Toolkit’s vi editor). Whether you can edit or just view the<br />
contents of the member depends upon whether you have read-only<br />
or read-write access to the member. You must have a member locked<br />
in your name to be able to edit it.<br />
In the Windows interface, the Member menu command that is<br />
available depends upon the type of member you have selected.<br />
Member Menu<br />
Command<br />
Selected Member of Type<br />
View Working File Archived or Non-Archived member, with a read-only<br />
working file.<br />
Edit Working File Archived or Non-Archived member, with a writable<br />
working file.<br />
Open Subproject Subproject.<br />
<strong>User</strong> <strong>Guide</strong> 85
Getting Started With Projects, Sandboxes, and Members<br />
<strong>The</strong> preceding commands behave differently depending on the type<br />
of member they act upon.<br />
Member Type Behavior<br />
Archived Opens the member’s working file.<br />
Non-Archived Opens the member file for a master project, or its<br />
sandbox copy.<br />
Subproject Opens a Project window to display the subproject’s<br />
members (Windows interface) or displays the<br />
subproject’s members in the Project view (<strong>Source</strong><br />
<strong>Integrity</strong> Web Interface).<br />
To view a revision of a member (not the working file):<br />
1. Choose Member > Open Member Archive to open the member’s<br />
archive window.<br />
2. Select the revision, and choose Archive > View Revision, or<br />
click . When you view a revision of a member, <strong>Source</strong><br />
<strong>Integrity</strong> copies the revision to a read-only temporary file and<br />
opens it for you. <strong>The</strong> temporary file is not the actual revision, but<br />
rather a read-only copy of it.<br />
To view or edit the working file:<br />
Select the member in the project or sandbox window, and choose<br />
Member > View/Edit Working File.<br />
<strong>The</strong> working file is opened in your default editor, or in the<br />
application associated with the file’s extension.<br />
To set your default editor:<br />
1. In your Personal Configuration dialog box, Preferences panel,<br />
choose either of the two Editor options:<br />
Use File Manager/Explorer File Associations: opens files in the<br />
applications associated with each file’s extension. If you<br />
choose this option, the View/Edit Working File toolbar button<br />
will be an icon that represents the application associated with<br />
the file that you have selected in the Project or Sandbox<br />
window.<br />
Editor: Enter or Browse for the editing application you would<br />
like as your default.<br />
86 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Checking In a Member<br />
Starting a<br />
Branch When<br />
Checking In a<br />
Member<br />
Checking In a Member<br />
2. When finished, click OK to accept changes, or Cancel to close the<br />
dialog box without changing any settings.<br />
To view a member in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
Select a member. From the Project or Sandbox view, choose Member<br />
Commands > View.<br />
To view a revision of a member (not the working file), select a<br />
revision in the Member view and choose View.<br />
To set the default editor in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. From the <strong>Source</strong> <strong>Integrity</strong> Web Interface home page, choose<br />
Configuration.<br />
<strong>The</strong> Configuration <strong>Guide</strong> appears, displaying the current default<br />
editor setting. When <strong>Source</strong> <strong>Integrity</strong> is first installed, it is set to<br />
use Windows Explorer file associations unless you change this<br />
setting.<br />
2. To change this setting, choose Select the default editor.<br />
<strong>The</strong> Select Default Editor page appears.<br />
3. Select the Editor setting and enter or Browse for the editor<br />
application you want to use. Click OK.<br />
When you are satisfied with the changes you have made to a member,<br />
you should check in the member to preserve those changes as a new<br />
revision in the archive. Files should be checked in on a regular basis.<br />
<strong>Source</strong> <strong>Integrity</strong> usually places new revisions at the top of the trunk,<br />
assigning them two-part revision numbers, such as 1.15. <strong>The</strong>re are<br />
times, however, when you do not want your work to be checked into<br />
the trunk. You may be pursuing a line of development that will not be<br />
included in the finished product, for instance, or you may be doing<br />
post-release maintenance while development for the next release<br />
continues on the trunk.<br />
Divergent lines of development in the same archive are managed<br />
through the use of branches. A branch is an independent revision line<br />
that uses an existing revision as its starting point. Members of a<br />
branch revision are identified by their revision numbers. Whereas<br />
<strong>User</strong> <strong>Guide</strong> 87
Getting Started With Projects, Sandboxes, and Members<br />
Assigning<br />
Revision<br />
Numbers<br />
revisions on the trunk are characterized by two-part revision<br />
numbers (for example, 1.2 or 3.5), branch revision numbers are<br />
prefixed with the number of the revision they start from. For<br />
example, if a branch revision is started from revision number 1.2, the<br />
members of that branch is numbered<br />
1.2.1.3<br />
1.2.1.2<br />
1.2.1.1<br />
and so on. <strong>The</strong> first two digits of the number identify the revision<br />
where the branch diverges from the trunk, and the last two represent<br />
a position on the branch.<br />
To start a branch during the check-in operation:<br />
1. Check out a revision (other than the tip of the trunk) locked.<br />
2. Make the desired changes to the working file.<br />
3. Check in the working file, without specifying a new revision<br />
number. By default, <strong>Source</strong> <strong>Integrity</strong> detects that this is a new<br />
branch and assigns an appropriate four-part revision number. For<br />
example, if you have checked out and locked revision 1.2, the<br />
new revision has the number 1.2.1.1 assigned to it. In the<br />
Windows interface, the revision number field is primed with the<br />
appropriate number.<br />
By default, when you check in a file, <strong>Source</strong> <strong>Integrity</strong> automatically<br />
assigns a unique revision number to the new revision. It does this by<br />
incrementing the current revision number by one. For example, if the<br />
previous revision is 1.3, the new revision is assigned number 1.4.<br />
You can choose the revision number of the changes you are checking<br />
in, so long as your revision number<br />
is greater than the last revision number (you cannot use<br />
previously “skipped” revision numbers)<br />
has no leading zeros (zeros as complete revision numbers are<br />
acceptable)<br />
starts a new branch based on an existing revision<br />
If you check in a revision using an already existing revision number,<br />
<strong>Source</strong> <strong>Integrity</strong> attempts to add one to the revision number and<br />
check it in as that revision. If that revision already exists, <strong>Source</strong><br />
<strong>Integrity</strong> then chooses the next available branch number and creates a<br />
new branch.<br />
88 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Assigning<br />
Revision<br />
Descriptions<br />
Checking In a Member<br />
For example, if you are checking in a new revision to an archive<br />
where the head revision is 1.7, the following numbers are valid:<br />
1.8 (greater than head revision)—if you check in a revision as 1.7,<br />
which already exists, <strong>Source</strong> <strong>Integrity</strong> assigns it 1.8<br />
1.10 (greater than head revision)<br />
1.72 (although misleading—none of the numbers between 7 and<br />
72 may be used afterward)<br />
2.0 is valid (zero as a revision number is valid)<br />
1.7.1.1 is valid (if it starts a new branch)<br />
<strong>The</strong> following numbers are invalid:<br />
1.3, even if there was no revision 1.3 previously (<strong>Source</strong> <strong>Integrity</strong><br />
branches the archive and assign 1.3.x.1, where x is the first<br />
available branch number)<br />
1.08 (leading 0 in last portion)<br />
02.1 (leading zero in branch number)<br />
A revision description is a string of text that becomes a permanent part<br />
of the archive’s metadata. It allows you to provide a record of the<br />
changes you made and why you made them. This can be of great<br />
value to you or other team members if it ever becomes necessary to<br />
revise or update the file.<br />
Once a new revision has been checked in, its revision description<br />
cannot be changed, although you can append new information to a<br />
revision description.<br />
To check in a member in the Windows interface:<br />
1. Select one or more files in the Sandbox or Project window and<br />
choose Member > Check In, or click .<br />
<strong>The</strong> Check In dialog box appears.<br />
<strong>User</strong> <strong>Guide</strong> 89
Getting Started With Projects, Sandboxes, and Members<br />
If you check in one or more members that are themselves<br />
subprojects, the Checkpoint dialog box appears instead (see<br />
“Checkpointing a Project” on page 136).<br />
2. Fill in or modify the check-in options (see “Check-In Options”,<br />
below), and click OK to check in the member as a new revision.<br />
To cancel the check-in operation, click Cancel.<br />
To check in a revision in the Windows interface:<br />
1. To check in an archive’s working file, display the appropriate<br />
Archive window and choose Archive > Check In, or click .<br />
<strong>The</strong> Check In dialog box appears.<br />
2. Fill in or modify the check-in options, and click OK to check in the<br />
working file as a new revision.<br />
To cancel the check-in operation, click Cancel.<br />
Check-In Options<br />
Revision Label. A unique text string that identifies the new<br />
revision. Revision labels are usually assigned during check in,<br />
but can be added later, for instance, using the Label command in<br />
the Windows interface.<br />
90 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Checking In a Member<br />
Revision Number. If you do not specify one, <strong>Source</strong> <strong>Integrity</strong><br />
provides a default, usually the next revision number available in<br />
the archive. For instance, if the file you checked out was revision<br />
3.2 and that is the highest revision number on the trunk, <strong>Source</strong><br />
<strong>Integrity</strong> defaults to revision 3.3.<br />
If you choose to override the suggested revision number, the<br />
number you supply must be higher than the head revision<br />
number (if you are checking into the trunk), or the tip revision<br />
number (if you are checking into a branch). If you try to assign an<br />
invalid number, such as 2.01 to a revision, you receive an error<br />
message.<br />
State. A one-word description of a new revision’s status. This<br />
option is necessary for tracking the promotion of the member. If<br />
promotion is turned off, the default for this value is “Exp” (for<br />
Experimental) and can be edited. If promotion is turned on, the<br />
default is the lowest promotion state, and the states cannot be<br />
edited.<br />
Author. <strong>The</strong> name of the person who made the changes to the<br />
new revision. This field may be editable depending upon your<br />
permissions. By default, this is set to your user name.<br />
Locked. Checks in the working file, then immediately locks the<br />
new revision. This allows you to update the project while<br />
retaining control of the revision. Without this option, the working<br />
file is checked in and your lock on it is removed.<br />
Check In Same. Tells <strong>Source</strong> <strong>Integrity</strong> you are intentionally<br />
checking in a file that is unchanged. In the Windows interface, if<br />
this option is not used and no changes have been made, you are<br />
prompted to confirm the check-in operation.<br />
Update Member. Makes the new revision the member revision in<br />
the project, replacing the existing member revision.<br />
Keep Work File. Checks in the file and immediately checks it out<br />
again. If this option is not used, the working file is automatically<br />
deleted when it is checked in.<br />
Replace Label. If the label you choose already exists in the<br />
archive, this option deletes the label from the revision it is<br />
currently attached to and applies it to the new revision. In the<br />
Windows interface, if this option is not used and a labeling<br />
conflict occurs, you are prompted to move the label to the new<br />
revision.<br />
<strong>User</strong> <strong>Guide</strong> 91
Getting Started With Projects, Sandboxes, and Members<br />
For more information on<br />
associating active propoals<br />
and configuring Change<br />
<strong>Integrity</strong> Connect, see<br />
“Integrated Version Control”<br />
on page 437<br />
All Files. If you are checking in more than one file, this option<br />
causes the current set of options to be applied to all subsequent<br />
check-in operations. If you are checking in only one file, this<br />
option is disabled<br />
Active CI Issue. An active issue associated with the member. This<br />
field is greyed out if Change <strong>Integrity</strong> Connect is not enabled.<br />
Revision Description. A long, free-form comment about the new<br />
revision. For example, you can enter a detailed description of<br />
what you changed, what bug in the software the changes were<br />
meant to correct, or instructions for the next person who will<br />
work on the file.<br />
To check in a member in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
Note You can not associate an issue with members in the <strong>Source</strong><br />
<strong>Integrity</strong> Web interface.<br />
Use the Check In command from the Sandbox view.<br />
1. Select the members you want to check in. Choose Locked by Me<br />
or Modified from the Selections menu.<br />
2. From the Member Commands menu, choose Check In.<br />
<strong>The</strong> Check In page appears, listing the member(s) to be checked<br />
in, and the full path of the current project or sandbox.<br />
3. To see the changes you have made before checking them into the<br />
archive, click Show Differences.<br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface displays the differences between<br />
the working file you are about to check in and the revision from<br />
which it was derived, using the Visual Difference utility.<br />
4. Enter your metadata in the fields provided.<br />
Revision Description. Text commenting on the content of, or<br />
reason for, the new revision<br />
Label. Text which can be used to identify the revision. To<br />
move an existing label from a previous revision to the current<br />
revision, select Replace Label.<br />
State. A one-word description of the new revision’s status.<br />
Author. <strong>The</strong> name of the person checking in the revision, by<br />
default your user name.<br />
92 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Checking In a Member<br />
5. Select Keep Locked After Check In to keep the revision locked<br />
after it has been checked in.<br />
6. For multiple members, select Apply to All to apply the metadata<br />
and selected options to all members being checked in.<br />
7. Click OK.<br />
To check a member into a project with the command line<br />
interface:<br />
Use the pj ci command. Its syntax is<br />
pj ci [options] [-l] filename…<br />
where options are zero or more modifying options (see the <strong>Source</strong><br />
<strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong> Reference <strong>Guide</strong> or the online man pages).<br />
By default, the pj ci command releases your lock on the member<br />
revision, allowing other users to make changes to it. However, if you<br />
want to maintain your lock (perhaps you intend to keep working on<br />
the file) you can use the -l option to check it in without releasing<br />
your lock.<br />
pj ci -l filename<br />
For example, to check in a member named nt\filesys.c, you would<br />
enter<br />
pj ci nt\filesys.c<br />
<strong>Source</strong> <strong>Integrity</strong> displays the message:<br />
d:\gamble\nt\filesys.c: checking in revision 1.1<br />
revision is now 1.2<br />
Enter log message:<br />
(Terminated with End-of-File or ‘.’ RETURN:)<br />
>><br />
This message tells you the number of the revision you had checked<br />
out (revision 1.1), and that revision number 1.2 is being assigned to<br />
the new revision. <strong>The</strong> >> prompt allows you to enter a revision<br />
description for the new revision.<br />
Enter the first line of the revision description at the >> prompt and<br />
press . Another >> prompt is displayed. Repeat these steps to<br />
enter as many description lines as you choose.<br />
When you have completed the revision description, enter a single<br />
period “.” at the >> prompt, and press .<br />
<strong>User</strong> <strong>Guide</strong> 93
Getting Started With Projects, Sandboxes, and Members<br />
Assigning<br />
Labels<br />
Assigning a<br />
State<br />
For more information on this<br />
more structured use of state<br />
settings, consult the States<br />
configuration option and the<br />
Promote and Demote SAM<br />
permissions.<br />
Assigning a<br />
Different<br />
Revision<br />
Number<br />
You can assign a label to the new revision at check-in time, using the<br />
-Nlabel option of the pj ci command for project members. To assign a<br />
multi-word label, enclose label in quotes.<br />
To check in the member filesys.c and assign the label “Test<br />
Version” to the new revision, you would enter the command<br />
pj ci -N"Test Version" filesys.c<br />
You can set a revision’s state at check in, using the -s state option to<br />
the check in command.<br />
For example, the command<br />
pj ci -s Review prog.c<br />
checks in the project member prog.c and assigns a state of “Review”<br />
to the new revision. If promotion is turned on, the specified state<br />
must be a valid state in the promotion states list.<br />
State settings can also be used to establish and enforce promotion<br />
policies at your site.<br />
Normally, <strong>Source</strong> <strong>Integrity</strong> assigns the next available revision number<br />
to the revision. If you want to assign a number that is greater than the<br />
next available one, you can use the -rrev option, where rev is your<br />
new revision number. If you want to create a branch at a particular<br />
revision, then specify a revision rev that already exists.<br />
Viewing and Editing Project and Sandbox<br />
Information<br />
<strong>The</strong> Windows and command line interfaces allow you to view, edit,<br />
or delete some important pieces of information about a project or<br />
sandbox, listed below. Those that apply only to the Windows<br />
interface are indicated.<br />
Project/Sandbox Name. <strong>The</strong> fully qualified name of the master<br />
project or the sandbox.<br />
Working Directory. By default, this is the root of the sandbox<br />
directory tree for sandboxes, or the root of the master project’s<br />
directory tree for projects.<br />
Total Members. <strong>The</strong> number of members in the project or<br />
sandbox.<br />
94 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Viewing and Editing Project and Sandbox Information<br />
Locked Members. <strong>The</strong> number of locked members in the project<br />
or sandbox (Windows only).<br />
Revision. <strong>The</strong> master project’s revision number.<br />
SAM Database. <strong>The</strong> location of the SAM database.<br />
Description. A free-form text description of the master project.<br />
This information cannot be modified from a sandbox.<br />
Attributes. <strong>The</strong> attribute settings for the master project (see<br />
“Setting Project or Sandbox Attributes” on page 97). <strong>The</strong> master<br />
project’s attributes cannot be changed in the Sandbox<br />
Information dialog box, but can be overridden by duplicate<br />
Sandbox Attributes (Windows only).<br />
In the Project Information dialog box, you can also view and<br />
delete any development paths associated with it (Windows only).<br />
Note This functionality is not available in the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface.<br />
To view or edit project or sandbox information in the Windows<br />
interface:<br />
1. With a project or sandbox window active, choose Project ><br />
Project/Sandbox Information, or click .<br />
If a master project is active, the Project Information dialog box<br />
appears.<br />
If a sandbox is active, the Sandbox Information dialog box<br />
appears.<br />
<strong>User</strong> <strong>Guide</strong> 95
Getting Started With Projects, Sandboxes, and Members<br />
2. View or modify the project or sandbox information, as required.<br />
3. In the Project Information dialog box, click Development Paths to<br />
show or hide a selectable list of different development paths that<br />
have been created from the current project. To delete a<br />
development path, select one from the list and click Delete.<br />
4. Click OK to accept any changes you have made, or click Cancel to<br />
close the dialog box without making changes.<br />
96 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Setting Project<br />
or Sandbox<br />
Attributes<br />
For more information about<br />
attributes, see the <strong>Source</strong><br />
<strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong><br />
Administrator <strong>Guide</strong>.<br />
Viewing and Editing Project and Sandbox Information<br />
Attribute statements define local variables or set options. You can set<br />
master project attributes that apply across an entire project, or<br />
sandbox attributes that apply only in your workspace, sometimes<br />
overriding project attributes. <strong>The</strong>y have one of the three following<br />
formats:<br />
variable<br />
variable=value<br />
WorkToArch variable=value<br />
For example, the WorkToArch project attribute, which directs <strong>Source</strong><br />
<strong>Integrity</strong> to the correct files, uses the following format:<br />
WorkToArch c:/test=c:/archives/test<br />
To view project and sandbox information in the command line<br />
interface:<br />
Use the pj header command, whose syntax is<br />
pj header [options]<br />
For sandboxes, the name of the sandbox file is also listed and the only<br />
variant project information included is the name of the variant (if<br />
any) used to create the sandbox.<br />
Here is an example of pj header output for a project:<br />
Directory: F:/proj_dir<br />
<strong>User</strong>: sandy<br />
SAM <strong>User</strong>: sandy<br />
SAM Database: P:\mkssi\mkssam\mkssam<br />
Author: sandy<br />
Project: F:/proj_dir/project.pj<br />
Working directory: F:/proj_dir<br />
Repository: F:/proj_dir<br />
Archive: F:/proj_dir\rcs\project.pj<br />
Project on disk: F:/proj_dir/project.pj<br />
Revision: 1.9<br />
Log file: F:/proj_dir/project.trn<br />
Number members: 24<br />
Variant Projects available:<br />
Name: german_version<br />
Revision: 1.3<br />
Project file on disk: F:/proj_dir/project.vpj/<br />
vp0000.pj<br />
Name: i18n_version<br />
Revision: 1.7<br />
<strong>User</strong> <strong>Guide</strong> 97
Getting Started With Projects, Sandboxes, and Members<br />
Project file on disk: F:/proj_dir/project.vpj/<br />
vp0001.pj<br />
Change <strong>Integrity</strong> Connect - context:<br />
Database IP Address: 1.0.3.24<br />
CI <strong>User</strong>: sandy<br />
Active CI Issue(s):<br />
Identifier: Solution_45<br />
Summary: context-sensitive help missing<br />
To edit project and sandbox information in the command line<br />
interface:<br />
Use the pj set, pj unset, and pj delvariant commands.<br />
<strong>The</strong> pj set command sets an attribute name to a value. Its syntax is<br />
pj set name=value [options]<br />
For example,<br />
pj set include=.;/myinclude;/watcom/h<br />
causes this include setting to be used when finding dependencies<br />
with finddep and mkmf. If this command is used on a sandbox, the<br />
sandbox attribute is set, not the project attribute<br />
<strong>The</strong> pj unset command drops a project attribute. Its syntax is<br />
pj unset name [options]<br />
You can only unset one name at a time. If this command is used on a<br />
sandbox, the sandbox attribute is dropped, not the project attribute.<br />
<strong>The</strong> pj delvariant command deletes a development path. Its syntax<br />
is<br />
pj delvariant [-f] [-N devpath] [options]<br />
where -f forces a subproject variant to be deleted (without this<br />
option, only variants of the main project are deleted) and -N devpath<br />
specifies the name of the development path you want to delete. If you<br />
issue this command from a variant sandbox, the -N option is not<br />
required; the variant sandbox’s development path is used.<br />
98 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Comparing the Working File to Its Member Revision<br />
Comparing the Working File to Its Member<br />
Revision<br />
After you have made changes to a member’s working file, you will<br />
usually check those changes back into the member’s archive as a new<br />
revision. But you may also decide that those changes should be<br />
discarded. Before you make this decision, you have to be able to view<br />
the changes that you will be checking in, or those that you will be<br />
discarding if you choose.<br />
If you are using the Windows interface or <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface, use the <strong>Source</strong> <strong>Integrity</strong> Visual Difference utility to view the<br />
differences between the working file and a member revision, or<br />
between any two files.<br />
To compare a working file to its member revision in the Windows<br />
interface:<br />
1. Select a member that has a modified working file (indicated by<br />
the working file delta).<br />
2. Choose Member > Differences.<br />
<strong>The</strong> Visual Difference utility launches and displays the two files<br />
side-by-side, highlighting the differences between them or<br />
informing you that there are no differences between the files.<br />
To compare a working file to its member revision in the <strong>Source</strong><br />
<strong>Integrity</strong> Web Interface:<br />
1. In the Sandbox view, select a member that has a modified<br />
working file (indicated by the working file delta).<br />
2. Choose Member Command > Differences.<br />
<strong>The</strong> Visual Difference utility launches and displays the two files<br />
side-by-side, highlighting the differences between them or<br />
informing you that there are no differences between the files.<br />
When checking in the working file, you can compare it to its member<br />
revision by clicking Show Differences in the Check In page.<br />
To compare a working file to its member revision in the<br />
command line interface:<br />
Use the pj diff command to see a text-based listing of the differences<br />
between the files.<br />
<strong>User</strong> <strong>Guide</strong> 99
Getting Started With Projects, Sandboxes, and Members<br />
Discarding Changes to Working Files<br />
If you are sure you do not want to check in the modified working file,<br />
you can discard it, update the working file with the member revision,<br />
and unlock the member.<br />
To discard changes to a member in the Windows interface:<br />
1. Select one or more members in a Sandbox or Project window that<br />
are locked in your name and choose Member > Undo Checkout.<br />
A confirmation dialog box appears, warning you that any<br />
changes to working files will be lost if you proceed.<br />
2. To proceed with the Undo Checkout for a single file, click Yes (for<br />
multiple files select Yes to All). Otherwise, click No (or No to All<br />
for multiple files).<br />
Click Cancel to abort all remaining Undo Checkout operations.<br />
To discard changes to a member in the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface:<br />
1. Click the working file delta beside the member or select the<br />
member and choose Member Commands > Revert.<br />
<strong>The</strong> Revert Member confirmation dialog box appears.<br />
2. To see the changes you will lose if you revert the member, click<br />
Show Differences to invoke the Visual Difference utility.<br />
3. Once you are done comparing the files in the Visual Difference<br />
utility, choose File > Exit to return to the Revert Working File<br />
confirmation dialog box.<br />
4. Click Yes to abandon the changes you have made since you<br />
checked out the file. Otherwise, click No to cancel the operation.<br />
To discard changes to a member in the command line interface:<br />
1. Use the pj unlock command, which unlocks the specified<br />
member. Its syntax is<br />
pj unlock member<br />
100 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Locking a Member<br />
Locking a Member<br />
2. <strong>The</strong>n use the pj refresh command to refresh the working file of<br />
the specified member, with the following syntax<br />
pj refresh -f member<br />
where -f overwrites the working file even if it is writable. If -f is<br />
not specified, writable files are not overwritten.<br />
When you want to prevent others from changing a member revision<br />
that you are working on, you can lock the member. Normally you<br />
lock a member by using an option while checking the member out of<br />
its project. Sometimes, however, you may have made changes to a<br />
working file that was not checked out in your name first. In this case,<br />
you can set a lock without overriding your changes.<br />
In both the Windows interface and the <strong>Source</strong> <strong>Integrity</strong> Web Interface,<br />
a locked member is denoted with a padlock symbol ( ), along with<br />
the locker’s name and the time the member was locked.<br />
Caution Locking a member does not affect the working file in any way.<br />
<strong>Source</strong> <strong>Integrity</strong> does not make the working file writable if it was readonly,<br />
and does not verify that it corresponds to the revision being locked.<br />
Make sure that the working file corresponds to the revision that you<br />
want to lock.<br />
To lock a member in the Windows interface:<br />
1. Select one or more members in a Sandbox or Project window.<br />
2. Choose Member > Lock or click (if added to the toolbar)<br />
A padlock symbol ( ) appears next to the revision number to<br />
inform you the member has been locked.<br />
To lock a member in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. Select one or more members in the Sandbox view.<br />
2. Choose Member Commands > Lock.<br />
A padlock symbol ( ) appears next to the revision number to<br />
inform you the member has been locked.<br />
<strong>User</strong> <strong>Guide</strong> 101
Getting Started With Projects, Sandboxes, and Members<br />
Unlocking a Member<br />
To lock a member in the command line interface:<br />
Use the pj lock command. Its syntax is<br />
pj lock [-hR] [-r rev] [options] [file…]<br />
with the following options:<br />
-h locks the head revision<br />
-r rev locks the revision rev<br />
-R recursively applies this operation to any directories specified<br />
on the command line<br />
If no files (file…) are specified, this command applies to all project<br />
files with an associated archive. <strong>The</strong> -rrev and -h options do not<br />
update the project setting for the member revision.<br />
When you no longer need the exclusive ability to change a member,<br />
you can unlock it again. This is normally done by default when you<br />
check the member into its archive. You can unlock a member without<br />
checking it in, but your changes will not be recorded if you choose to<br />
do so.<br />
Depending upon what permissions your administrator has defined,<br />
you may be able to unlock a revision that is locked by another user.<br />
Some environments will be set up to require that you send an<br />
electronic message to the person whose lock you are “breaking”. You<br />
should be cautious about breaking locks, since it can result in<br />
confusion and duplication of effort in shared working environments.<br />
To unlock in a member in the Windows interface:<br />
1. Select one or more locked members in a Sandbox or Project<br />
window.<br />
2. Choose Member > Unlock, or click (if added to the toolbar).<br />
<strong>The</strong> revision is unlocked and the padlock symbol (<br />
removed.<br />
) is<br />
To unlock a member in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. Select one or more members in the Project or Sandbox view.<br />
102 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Removing Unused Locks<br />
2. Choose Member Commands > Unlock.<br />
<strong>The</strong> revision is unlocked and the padlock symbol ( ) is removed.<br />
To unlock a member in the command line interface:<br />
Use the pj unlock command. Its syntax is<br />
pj unlock [-hR] [-r rev] [options] [file…]<br />
with the following options:<br />
-h unlocks the head revision<br />
-r rev unlocks the revision rev<br />
Removing Unused Locks<br />
-R recursively applies this operation to any directories specified<br />
on the command line<br />
If no files are specified, this command applies to all project files with<br />
an associated archive. <strong>The</strong> -rrev and -h options do not update the<br />
project setting for the member revision.<br />
If you want to remove all locks you are holding for files you have not<br />
modified in a project, you can do so in the Windows interface with<br />
the Member > Remove Unused Locks command. Invoking this<br />
command causes <strong>Source</strong> <strong>Integrity</strong> to compare all members you have<br />
locked to their working files and unlock the ones you have not<br />
changed.<br />
To remove unused locks in the Windows interface:<br />
Choose Member > Remove Unused Locks.<br />
If the Remove Unused Locks option is set in the Recursion panel of the<br />
Personal Configuration dialog box, this command recursively<br />
removes unused locks in archives of any subprojects that are<br />
members of the project (or members of members) the command is<br />
run on.<br />
<strong>User</strong> <strong>Guide</strong> 103
Getting Started With Projects, Sandboxes, and Members<br />
To remove unused locks in the command line interface:<br />
Use the pj clean command with the -u option. Use the -R option as<br />
well to apply this command recursively through subprojects.<br />
Note This command is not available in the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface.<br />
Detecting Sandbox Members Out of Sync<br />
With the Project<br />
When many users are working from sandboxes based on the same<br />
master project, it is common for the members in an individual<br />
sandbox to become out of sync with the member revisions in the<br />
master project. For example, the member revision of a particular file<br />
may be at 1.5, while you still have revision 1.2 in your sandbox.<br />
When this happens, a delta symbol ( ) appears next to the member<br />
in the Windows interface and <strong>Source</strong> <strong>Integrity</strong> Web Interface,<br />
signaling its status. In the command line interface, you can use the pj<br />
what command to display changes to files and archives.<br />
Resynchronizing Your Project or Sandbox<br />
To resynchronize members of a project or sandbox in the<br />
Windows interface:<br />
Select one or more members, and choose Member > Resynchronize.<br />
This command has no effect on working files that are identical to the<br />
member file or revision.<br />
If the Resynchronize option is set in the Recursion panel of the<br />
Personal Configuration dialog box, this command recursively<br />
resynchronizes subprojects that are members of the project (or<br />
members of members) the command is run on.<br />
104 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Resynchronizing Your Project or Sandbox<br />
To resynchronize members of a project or sandbox in the <strong>Source</strong><br />
<strong>Integrity</strong> Web Interface:<br />
Click the delta symbol, or select the member and choose the Member<br />
Commands > Resynchronize command from the Sandbox view to get<br />
the latest revision of the member.<br />
<strong>The</strong> member in your sandbox is automatically updated to the most<br />
recent revision in the member’s archive.<br />
If the working file is writable, you are asked for confirmation before it<br />
is replaced.<br />
To resynchronize members of a project or sandbox in the<br />
command line interface:<br />
Use the pj refresh command from the project or sandbox directory.<br />
Its syntax is<br />
pj refresh file…<br />
If no files are specified, then this command acts upon all members of<br />
the project. <strong>The</strong> pj refresh command compares sandbox working<br />
files with the current content of the master project members and<br />
checks out a new copy if either of the following is true:<br />
<strong>The</strong> sandbox member is read-only and it differs from the project<br />
member (<strong>Source</strong> <strong>Integrity</strong> leaves files read-only when you have<br />
no lock on them, to prevent making casual, uncontrolled<br />
changes).<br />
<strong>The</strong>re is no copy of a project member in the sandbox directory<br />
tree.<br />
<strong>The</strong> pj refresh command does not replace a writable file in the<br />
sandbox directory tree (unless you specify the -f (force) option), so<br />
your work in progress cannot be overwritten. In addition, if a file is<br />
identical to its master project counterpart, no action is taken; this<br />
ensures your next build does not have to do more work than<br />
required.<br />
<strong>User</strong> <strong>Guide</strong> 105
Getting Started With Projects, Sandboxes, and Members<br />
Freezing Members<br />
When your development team has largely finished some portion of a<br />
project and some project members are in a stable state, you can freeze<br />
individual members within a project. Freezing restricts member<br />
information from being updated, preventing these members from<br />
being changed by accident. For example, if new revisions are checked<br />
into the member’s archive, <strong>Source</strong> <strong>Integrity</strong> does not update the<br />
project’s member revision.<br />
Freezing prevents <strong>Source</strong> <strong>Integrity</strong> from changing member<br />
information in the member’s project file, but does not affect a<br />
member file itself. Revisions can still be checked out, modified, and<br />
checked in.<br />
You can change the label or state of frozen members, but not their<br />
attributes.<br />
Freezing can be used immediately before a checkpoint operation to<br />
ensure that no one changes the project or its members before the<br />
checkpoint is complete.<br />
When you open a frozen subproject member, you get the<br />
checkpointed revision, if it is an archived subproject.<br />
When you want to allow project members to be changed, you can<br />
thaw them (see “Thawing Members” on page 107).<br />
<strong>Source</strong> <strong>Integrity</strong> reports the availability of new revisions when<br />
anyone checks them into the archive. <strong>Source</strong> <strong>Integrity</strong> does not<br />
update the project to the latest revision, so an appropriate person<br />
must make the decision to lift the freeze and update the project.<br />
To freeze a member in the Windows interface:<br />
In an active Project or Sandbox window, select the archived<br />
member(s) you want to freeze and choose Member > Freeze, or<br />
click (if added to the toolbar).<br />
A snowflake symbol ( ) appears beside each selected archived<br />
member in the window.<br />
To make this command act recursively in all subprojects of the<br />
specified member, make sure the Freeze Members option is selected in<br />
the Recursion panel of the Personal Configuration dialog box.<br />
106 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Thawing Members<br />
Thawing Members<br />
To freeze a member in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
In the Project View, select the member you want to freeze and choose<br />
Member > Freeze.<br />
A snowflake symbol ( ) appears beside each selected archived<br />
member in the window.<br />
To freeze a member in the command line interface:<br />
Use the pj freeze command in the project directory. Its syntax is<br />
pj freeze [-mi] filename [-Pproject_file.pj]<br />
where -m alone causes the freeze to be applied to members, but not<br />
subprojects; -i causes the freeze to be applied recursively to<br />
subprojects; and -Pproject_file.pj specifies a project file name if your<br />
project file is not called project.pj. To recursively freeze all<br />
members of all subprojects, use -m and -i together.<br />
Use pj print to confirm the freeze.<br />
When you have decided to allow project members to evolve again,<br />
you can thaw any frozen ones. Thawing removes the restriction on<br />
changing member information in the project.<br />
To thaw a member in the Windows interface:<br />
In an active Project or Sandbox window, select the archived<br />
member(s) you want to thaw (members that have the snowflake<br />
symbol ( ) beside them) and choose Member > Thaw, or click (if<br />
added to the toolbar).<br />
<strong>The</strong> snowflake symbol beside the selected members disappears.<br />
To thaw a member in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
In the Project view, select the member you want to thaw and choose<br />
Member > Thaw.<br />
<strong>The</strong> snowflake symbol beside the selected members disappears.<br />
<strong>User</strong> <strong>Guide</strong> 107
Getting Started With Projects, Sandboxes, and Members<br />
Viewing Member Information<br />
(Windows Only)<br />
To thaw a member in the command line interface.<br />
Use the pj thaw command in the project directory. Its syntax is<br />
pj thaw [-mi] [-Pproject_file.pj] [files…]<br />
where -m alone causes the freeze to be applied to members, but not<br />
subprojects; -i causes the freeze to be applied recursively to<br />
subprojects; and -Pproject_file.pj specifies a project file name if your<br />
project file is not called project.pj. To recursively freeze all<br />
members of all subprojects, use -m and -i together.<br />
Use pj print to confirm that <strong>Source</strong> <strong>Integrity</strong> removed the freeze.<br />
Note Thawing a project does not automatically update the project file to<br />
later revisions of frozen members. Use pj update -h to do this.<br />
<strong>Source</strong> <strong>Integrity</strong> maintains a range of information on each member.<br />
Member. <strong>The</strong> fully qualified name of the member’s working file<br />
in the project.<br />
Working File. <strong>The</strong> fully qualified name of the member’s working<br />
file.<br />
Archive File. <strong>The</strong> fully qualified name of the member’s archive.<br />
Date. <strong>The</strong> timestamp of the member’s revision as stored in its<br />
archive.<br />
Author. <strong>The</strong> name of the person who created the member’s<br />
revision.<br />
Locker. If the member is locked, the name of the person who<br />
holds the lock, as well as the date and time he or she locked the<br />
member.<br />
Type. <strong>The</strong> member’s type. This may be Archived ( ), Non-<br />
Archived ( ), or Subproject ( ).<br />
Revision. <strong>The</strong> revision number of the member.<br />
State. <strong>The</strong> state assigned to the member.<br />
Label. Any labels associated with the member’s revision.<br />
108 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Viewing and<br />
Editing Member<br />
Attributes<br />
Viewing Member Information (Windows Only)<br />
Revision Description. A description of the reason for or purpose<br />
of the revision, especially useful in multi-user environments.<br />
Active CI Issue. An active issue associated with the member.<br />
Active issues appear as hyperlinks with a brief description. To<br />
view the complete issue in the Change <strong>Integrity</strong> Web Interface,<br />
click on the hyperlink.<br />
To view member information in the Windows interface:<br />
1. Select the member whose information you want to see.<br />
2. Choose Member > Member Information, or click .<br />
<strong>The</strong> Member Information dialog box appears.<br />
3. View or make changes to the member information as required.<br />
You cannot change an existing revision description from this<br />
dialog box, but you can append additional comments to it. To do<br />
so, click Advanced, select the Append Revision Description tab,<br />
and enter any supplemental information in the edit box.<br />
Within the Member Information dialog box, you can also add or<br />
remove member attributes that allow you categorize members,<br />
groups of members, or projects and then perform an operation on<br />
them as a group.<br />
For example, you could use the Select Members command to<br />
highlight only those members with the attribute “SYS=DOS” and then<br />
check them out as a group.<br />
<strong>User</strong> <strong>Guide</strong> 109
Getting Started With Projects, Sandboxes, and Members<br />
For more information on<br />
attributes, see the <strong>Source</strong><br />
<strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong><br />
Administrator <strong>Guide</strong>.<br />
Attributes can be added, deleted, or edited using the Variable and<br />
Value fields.<br />
To view or edit member attributes:<br />
1. In the Member Information dialog box, click Advanced to display<br />
the member attributes.<br />
You can add, delete, or edit attributes using the following fields:<br />
Variable. When you select a member attribute in the<br />
Attributes list, the variable portion of the attribute is<br />
displayed in this field. <strong>The</strong> variable portion of the statement<br />
names the attribute. It must start with a letter or underscore,<br />
and may be followed by up to 30 letters, digits, or<br />
underscores. You edit the variable portion of the attribute by<br />
making changes here and clicking Add to update the entry in<br />
the Attributes list. To delete the selected attribute, click Delete.<br />
Value. When you select a member attribute in the Attributes<br />
list, the value portion of the attribute is displayed in this<br />
field. <strong>The</strong> value part may contain only printable ASCII<br />
characters. You edit the value portion of the attribute by<br />
making changes here and clicking Add to update the entry in<br />
the Attributes list. To delete the selected attribute, click Delete.<br />
Attribute list. A selectable list of attributes for the current<br />
member. Attributes can be added, deleted, or edited using<br />
the Variable and Value fields. Every project member can have<br />
any number of Attribute statements which define variables<br />
for the member. Attributes have the format<br />
variable<br />
or<br />
variable=value<br />
2. When you are finished with attributes, click OK to accept the<br />
changes, or Cancel to close the dialog box without making any<br />
changes.<br />
Promoting and Demoting a Member<br />
At particular milestones, project members will be ready to move to<br />
the next stage of their development cycle (for example, from<br />
“Development” to “Testing”). As long as promotion is enabled and<br />
110 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Promoting and Demoting a Member<br />
you have the appropriate SAM permissions, you can promote a<br />
member to a predefined higher state, or demote it back to a lower<br />
state.<br />
If no state is assigned to a revision at check-in, a default value of<br />
“Exp” (for Experimental) is used.<br />
To promote a member in the Windows interface:<br />
1. Select one or more members in a Sandbox or Project window.<br />
2. Choose Member > Promote.<br />
<strong>The</strong> Promote Member dialog box appears.<br />
3. Select a new promotion state from the Promote to state dropdown<br />
list.<br />
4. Click OK to accept the new promotion state, or click Cancel to<br />
close the dialog box without changing the member’s state.<br />
If the Member > Promote command is not available, make sure the<br />
promotion feature is enabled on the Promotion tab of the Personal<br />
Configuration dialog box.<br />
If the Promote and Demote Member option is set in the Recursion<br />
panel of the Personal Configuration dialog box, this command<br />
recursively promotes the members of any subprojects that are<br />
themselves members of the project (or members of members) the<br />
command is run on.<br />
To demote a member in the Windows interface:<br />
1. Select one or more members in a Sandbox window or Project<br />
window<br />
2. Choose Member > Demote.<br />
<strong>The</strong> Demote Member dialog box appears.<br />
<strong>User</strong> <strong>Guide</strong> 111
Getting Started With Projects, Sandboxes, and Members<br />
3. Select a new promotion state from the Demote to state drop-down<br />
list.<br />
4. Click OK to accept the new promotion state, or click Cancel to<br />
close the dialog box without changing the member’s state.<br />
To promote or demote a member in the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface:<br />
Use the Promote and Demote commands from the Member view. If<br />
promotion is turned off in the <strong>Source</strong> <strong>Integrity</strong> Web Interface, a Set<br />
State command appears instead of Promote and Demote.<br />
To promote or demote a member in the command line interface:<br />
Use the pj state command. Its syntax is<br />
pj state [-hR] [-r rev] [options] state [file…]<br />
where state is the new state you would like to change to. If no files are<br />
specified, pj state changes the state of all archived project members<br />
to state, subject to any restrictions imposed by the current promotion<br />
scheme in effect.<br />
-h assigns the state to the head revision of file, not the project’s<br />
member revision<br />
-r rev assigns the state to the given rev<br />
-R recursively applies this operation to any directories specified<br />
on the command line<br />
Note <strong>The</strong> -rrev and -h options do not update the project setting for the<br />
member revision.<br />
112 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Updating to Head Rev<br />
Updating to Head Rev<br />
Within the Windows interface, you can use the Update Member option<br />
when you are checking in to ensure that the most recent revision of<br />
each member is added to the list of members in the project.<br />
If this option is not set, or if you are using the command line<br />
interface, the project list might not reflect the most current revision of<br />
each member’s archive. For instance, if someone checks in a new<br />
revision directly to a member’s archive instead of its project, the<br />
project list is not updated.<br />
For example, if the current project member is revision 2.7 of an<br />
archived file, but a newer revision (revision 2.8) has been added to<br />
the member’s archive, you can update the member to the head<br />
revision.<br />
If the default branch in a member archive is set to a branch off of the<br />
trunk, updating to head revision updates to the tip revision of the<br />
branch rather than the trunk.<br />
To update to head revision in the Windows interface:<br />
Choose Member > Update to Head Rev.<br />
To update to head revision in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
If there is a newer revision available to the project, a delta appears<br />
beside the member name in the Project view. To update the project<br />
with the newer revision, click this delta or select the member in the<br />
Project view and choose Member Commands > Update to Tip Revision.<br />
To update to head revision in the command line interface:<br />
Use the pj update command with the -h option.<br />
Note Updating to the tip revision does not affect the member’s working<br />
file. To update the working file, use the Windows interface’s Member ><br />
Resynchronize command or the <strong>Source</strong> <strong>Integrity</strong> Web Interface’s Member<br />
Commands > Resynchronize command from the Sandbox view.<br />
<strong>User</strong> <strong>Guide</strong> 113
Getting Started With Projects, Sandboxes, and Members<br />
Updating to Tip Revision<br />
When you check out a revision of a file that is not the head of the<br />
trunk, and then make changes to it and check it back in, <strong>Source</strong><br />
<strong>Integrity</strong> requires that you make a branch in the archive.<br />
For example, a project member, myfile.c, is currently at revision<br />
1.10. If you check out, revise, and check back in revision 1.8 of<br />
myfile.c, <strong>Source</strong> <strong>Integrity</strong> defaults to revision number 1.8.1.1. <strong>The</strong><br />
first digits (1.8) represent the early revision that the changes are based<br />
on. “1.8.1.1” identifies the first revision on the first branch starting at<br />
“1.8”. Later revisions become 1.8.1.2, 1.8.1.3, and 1.8.1.4.<br />
Updating to tip revision sets the member revision to the latest<br />
revision along the member’s current branch of development.<br />
To update to tip revision in the Windows interface:<br />
Choose Member > Update to Tip Rev. In the earlier example, the<br />
project member’s revision would be updated from 1.8.1.1 to 1.8.1.4.<br />
To update to tip revision in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
Select the member in the Project view and choose Member Commands<br />
> Update to Tip Revision.<br />
Scanning Your Project for Changes<br />
By default in the Windows interface, <strong>Source</strong> <strong>Integrity</strong> scans each<br />
project member to search for changes (deltas) whenever it opens a<br />
project or sandbox. This feature can be disabled to decrease the time<br />
required to open large projects or sandboxes. <strong>The</strong> <strong>Source</strong> <strong>Integrity</strong><br />
Web Interface always scans for deltas.<br />
To disable the Scan for Changes feature in the Windows<br />
interface:<br />
1. Choose Configuration > Personal and select the Preferences tab.<br />
2. Deselect the Scan Members on Open Project/Sandbox setting and<br />
click OK.<br />
114 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Refreshing Your View<br />
Refreshing Your View<br />
When this feature is disabled, <strong>Source</strong> <strong>Integrity</strong> displays a question<br />
mark in the delta column for each unscanned member upon opening<br />
a project or sandbox. As well, a message “Member not scanned for<br />
changes” appears in the status bar at the bottom of the window.<br />
To scan a project for changes manually in the Windows<br />
interface:<br />
If the Scan for Changes option has been disabled, choose Member ><br />
Scan for Changes.<br />
To scan a project for changes in the command line interface:<br />
Use the pj what command.<br />
<strong>The</strong> information in a Project, Sandbox, or Archive window can<br />
become “out of sync” with the actual condition of member data. If<br />
another user locks (or deletes) a member after you open a project, this<br />
information is not immediately reflected in your Sandbox window.<br />
To update your view of the currently active Project, Sandbox, or<br />
Archive window in the Windows interface:<br />
Choose Window > Refresh.<br />
To update your view of projects, sandboxes, and archives in the<br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
Choose one of the following commands:<br />
Project Commands > Refresh Project in the Project view<br />
Sandbox Commands > Refresh Sandbox in the Sandbox view<br />
Refresh in the Member or History view<br />
<strong>User</strong> <strong>Guide</strong> 115
Getting Started With Projects, Sandboxes, and Members<br />
Assigning Labels to Members<br />
For more information about<br />
changing member<br />
information, see “Viewing<br />
Member Information<br />
(Windows Only)” on<br />
page 108.<br />
Labels are unique text that describe and refer to a revision in an<br />
archive. Labels can be based on the product release the revision was<br />
included in, on the content of the revision, on changes made to the<br />
revision, or any other sort of information that would be useful in<br />
identifying that particular revision.<br />
Although you generally assign a label to a new revision upon check<br />
in, there may be times when you want to add an additional label or<br />
change the label assigned to a revision.<br />
To set a member’s state or label in the Windows interface:<br />
1. Select one or more archived members in a Sandbox or Project<br />
window.<br />
2. Choose Member > Label, or click (if added to the toolbar).<br />
<strong>The</strong> Label Members dialog box appears.<br />
3. Fill in or select the Label Members options.<br />
4. Click OK to accept the new label and/or state settings, or click<br />
Cancel to close the dialog box without modifying the settings.<br />
You can also use the Member Information dialog box to set the<br />
member’s label.<br />
If the Label option is set in the Recursion panel of the Personal<br />
Configuration dialog box, this command recursively adds labels to<br />
subprojects that are members of the project (or members of members)<br />
the command is run on.<br />
To set a member’s label in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
In the Member view, select the revision you want to add a label to,<br />
and select Add Label from the list of available commands.<br />
116 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Deleting a Member’s Label<br />
Deleting a Member’s Label<br />
To set a member’s label in the command line interface:<br />
Use the pj label command. Its syntax is<br />
pj label label -hR -rrev filename<br />
where -h applies the label to the head revision, -R applies the label<br />
recursively to any directories specified, and -rrev applies the label to<br />
revision rev.<br />
If no filename is specified, the label is applied to all project members<br />
with associated archives.<br />
For example, to add the label “Complete” to revision 1.6 of the<br />
filesys.c member, enter<br />
pj label Complete -r 1.6 filesys.c<br />
When the command terminates, <strong>Source</strong> <strong>Integrity</strong> displays the<br />
message<br />
d:\gamble\src\filesys.c: revision 1.6 given label<br />
Complete<br />
<strong>The</strong>re may be times when you want to delete a label from a revision.<br />
For instance, you may decide the label no longer accurately reflects<br />
that particular revision. Also, if you have assigned the same label to a<br />
number of members, you might want to remove them all with one<br />
command.<br />
To delete the label from one or more members in the Windows<br />
interface:<br />
1. Select one or more archived members in a Sandbox or Project<br />
window.<br />
2. Choose Member > Remove Label.<br />
<strong>The</strong> Remove Label dialog box appears.<br />
<strong>User</strong> <strong>Guide</strong> 117
Getting Started With Projects, Sandboxes, and Members<br />
For more information about<br />
changing member<br />
information, see “Viewing<br />
Member Information<br />
(Windows Only)” on<br />
page 108.<br />
Building a Project<br />
Calculating<br />
Dependencies<br />
3. Enter the label to remove and click OK, or click Cancel to close the<br />
dialog box without removing the label.<br />
You can also use the Member Information dialog box to delete a label.<br />
To delete a member’s label in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
In the Member view, select the revision whose label you want to<br />
remove and choose Delete Label from the list of available commands.<br />
To delete a member’s label in the command line interface:<br />
Use the !label option to the pj label command.<br />
For example, to delete the working label from the betting.c<br />
member, enter<br />
pj label !working betting.c<br />
Since each label is unique, you do not need to specify the revision<br />
number.<br />
Along with configuration management and source code control<br />
features, <strong>Source</strong> <strong>Integrity</strong> also allows you to coordinate your build<br />
procedure.<br />
In the Windows interface, you can use the Member > Dependencies<br />
and Project > Build commands to generate a list of files necessary to<br />
compile a member and run your make file.<br />
Note This functionality is not available in the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface.<br />
<strong>The</strong> first step in building a project is determining what files a given<br />
member needs before it can be compiled.<br />
In the Windows interface, the Member > Dependencies command<br />
recursively scans a project member for #include statements and<br />
generates a list of files necessary to compile the member. It searches<br />
the following types of files for #include statements:<br />
118 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
C and C++ files<br />
Pascal files<br />
Fortran files<br />
Microsoft RC files<br />
Building a Project<br />
Assembler files<br />
You can add the resulting list of files to an existing make file with the<br />
Project > Build command.<br />
To calculate a member’s dependencies:<br />
1. Select the member in a Sandbox or Project window.<br />
2. Choose Member > Dependencies.<br />
<strong>The</strong> Member Dependencies dialog box appears.<br />
3. Fill in or modify these options:<br />
Path. A list of directories to search in for files listed in the<br />
member’s #include statements. This list uses the DOS PATH<br />
format, a list of paths separated by semi-colons.<br />
Get From Compiler File. If this option is selected, the include<br />
path from the compiler file is used instead of the Path field;<br />
you also choose a Compiler File Type from the dropdown<br />
menu.<br />
File name. <strong>The</strong> path and name of the compiler file. Enter or<br />
browse for the name.<br />
<strong>User</strong> <strong>Guide</strong> 119
Getting Started With Projects, Sandboxes, and Members<br />
Using the Build<br />
Command<br />
(Windows)<br />
Exclude Path. Paths that you do not want to be searched<br />
when looking for #include files. This is useful if the include<br />
path is taken from a compiler file and you do not want to<br />
look in all the listed directories.<br />
4. To recalculate the member’s dependencies, click Recalculate.<br />
5. To check that all files in the dependency list are also members of<br />
the project and add those that are not, click Add Missing Files.<br />
6. When you are done, click OK to save the list of dependencies. To<br />
close the Member Dependencies dialog box without saving the list<br />
of dependencies, click Cancel.<br />
To calculate dependencies in the command-line interface:<br />
You use the pj finddep command. Its syntax is<br />
pj finddep [-fR] [-w dir] [options] [file…]<br />
where -f forces dependencies to be added to the project; -R<br />
recursively applies this operation to any directories specified on the<br />
command line; and -w dir uses the directory dir as the project<br />
directory.<br />
This command finds and lists the dependencies of the specified files<br />
and prompts the user to add to the project each file used that is not a<br />
member of the project. If no files are specified, pj finddep operates<br />
on all project members.<br />
If a file is found to be needed (included) and that file is not a member<br />
of the project, you will be asked if you want to add it to the project.<br />
Enter y to add a file to the project, n to ignore the file, or q to<br />
terminate. Dependencies are cached in a file with the name<br />
project.use in the sandbox or project repository directory, where<br />
project is the file name of the project file.<br />
To build a project:<br />
1. Choose Project > Build, or click .<br />
<strong>The</strong> Build Project dialog box appears.<br />
120 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Building a Project<br />
2. Fill in the Build options (see “Make Program Options”, “Make<br />
File Options”, and “Dependencies Options” on page 121).<br />
3. Click Run Make to make the project.<br />
4. When you are ready, click OK to save the Build option settings<br />
and close the dialog box.<br />
To close the Build Project dialog box without saving the option<br />
settings, click Cancel.<br />
Make Program Options<br />
Filename. <strong>The</strong> name of the Make program to run (for example,<br />
c:\bin\make.exe). Enter or browse for the name.<br />
Optional Parameters. Parameters to be passed to the Make<br />
program. If %f is specified, <strong>Source</strong> <strong>Integrity</strong> replaces it with the<br />
name of the makefile specified in the Filename field.<br />
Startup Directory. <strong>The</strong> directory the Make program is run in.<br />
Make File Options<br />
Filename. <strong>The</strong> name of the makefile. Enter or browse for it. Click<br />
View to view the makefile in your default text editor.<br />
Dependencies Options<br />
Add to Makefile. Click to add member dependencies to the<br />
makefile.<br />
<strong>User</strong> <strong>Guide</strong> 121
Getting Started With Projects, Sandboxes, and Members<br />
Using pj build<br />
Recalculate. Click to recalculate the member dependencies.<br />
For example, consider a project containing members foo.c and<br />
bar.c in which foo.c contains the line<br />
#include "rcsbase.h"<br />
If you specify that member dependencies should be added to the<br />
makefile, the following lines are added to the makefile:<br />
### <strong>Source</strong> <strong>Integrity</strong> generated dependencies<br />
follow, do not remove/change this line<br />
foo.obj : rcsbase.h<br />
This tells the Make program to rebuild foo.obj whenever<br />
rcsbase.h is newer than foo.obj.<br />
Add Missing Files. Click to check that all files in the dependency<br />
list are also members of the project. If they are not already<br />
members, the missing files are added to the project.<br />
Ignore Non-Members When Calculating. When this option is<br />
selected, files that are not members of the current project are not<br />
scanned when recalculating dependencies.<br />
For example, suppose a project contains the files foo.c and<br />
bar.c, and foo.c contains the line<br />
#include "rcsbase.h"<br />
<strong>Source</strong> <strong>Integrity</strong> normally adds rcsbase.h to the dependency list<br />
for foo.c. However, if the Ignore Non-Members When Calculating<br />
option is selected, rcsbase.h is not be added to the dependency<br />
list.<br />
Run Make. Click to run the specified Make program, using the<br />
current Build Project options.<br />
In the command line interface, you use the pj build command. Its<br />
syntax is<br />
where<br />
pj build [-i] [-Mmakefile] [-Ttemplate] [-w dir] [options]<br />
-i performs builds of included subprojects before building<br />
parent (including) project.<br />
-Mmakefile writes new makefile to file makefile. If not specified, pj<br />
build uses project or sandbox makefile=val setting; if that<br />
setting is not provided, filename makefile is used.<br />
122 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Using pj mkmf<br />
Building a Project<br />
-Ttemplate expands the makefile template by interpreting the<br />
template and writing it to new makefile. If not specified, pj<br />
build uses project or sandbox MakeTemplate=val setting; if that<br />
setting is not provided, filename make.t is used.<br />
-w dir uses directory dir as the project directory.<br />
In the command line interface, use the pj mkmf command to calculate<br />
the dependencies of project members and generate a makefile before<br />
you build your project. <strong>The</strong> generated makefile can be created from<br />
scratch, or be based on an existing makefile or template. <strong>The</strong><br />
command’s syntax is<br />
where<br />
pj mkmf [-fR] [-Mmakefile] [-Ttemplate] [-wdir] [options]<br />
[file…]<br />
-f forces pj mkmf to ignore any saved information and rebuild all<br />
dependencies before creating the new makefile.<br />
-Mmakefile updates makefile rather than generating a new<br />
makefile.<br />
-Ttemplate uses template as a template to generate a new makefile.<br />
-R recursively applies this operation to any directories specified<br />
on the command line.<br />
-wdir uses the directory dir as the project directory.<br />
file … is a list of filenames of one or more project members for<br />
which dependencies will be calculated. If file is omitted, all<br />
project members are used.<br />
If -Mmakefile is not specified, the value of the project attribute<br />
makefile is used. If neither of these is defined, the makefile is written<br />
to a file named makefile in the current directory.<br />
When the -Ttemplate option is not used to generate a makefile, a<br />
marker line is inserted in the makefile immediately before the<br />
generated dependencies. <strong>The</strong> marker takes the form<br />
### <strong>MKS</strong> SI generated dependencies follow,<br />
do not remove/change this line<br />
If pj mkmf encounters a marker line while updating a makefile, all<br />
lines after the marker are replaced with the newly calculated<br />
dependencies.<br />
<strong>User</strong> <strong>Guide</strong> 123
Getting Started With Projects, Sandboxes, and Members<br />
<strong>The</strong> Reporter Utility<br />
For information on accessing<br />
the reporting features through<br />
the command line interface,<br />
see “Creating Reports with the<br />
Command Line Interface” on<br />
page 128.<br />
About the<br />
Report<br />
Information<br />
About Graphs<br />
In the Windows interface, the <strong>Source</strong> <strong>Integrity</strong> Reporter utility<br />
analyzes projects, their members, or individual archives, and allows<br />
you to generate a variety of reports and graphs based on its findings.<br />
Reports and graphs can be printed or viewed on the screen. To use<br />
the Reporter utility, you must have a default printer installed.<br />
Note <strong>The</strong> Reporter is not available in the <strong>Source</strong> <strong>Integrity</strong> Web Interface.<br />
<strong>The</strong> Reports command (from either the Project or Archive menu)<br />
creates database tables, from which the Reporter utility generates<br />
status and activity summaries for projects (including sandboxes) and<br />
archives. <strong>The</strong> Reporter calculates a summary of the changes to a<br />
project or archive, then displays or prints the summary as text or, for<br />
some reports, as a graph. Customized reports, created using<br />
Microsoft Access, can also be produced.<br />
<strong>The</strong> Reporter’s data files (containing the results of its project or<br />
archive analysis) can be saved as text files that can be read by most<br />
database applications.<br />
This utility generates<br />
changes introduced by individual authors<br />
changes between the member revision and a revision with a<br />
particular label<br />
changes between the member revision and any other revision<br />
which members are locked, and by whom<br />
which revisions have a particular label or state<br />
project member history (including revision descriptions) by file<br />
Whenever graphs are available in the Reporter, you are given the<br />
option of displaying the report in a text version (the default) or as a<br />
graph. If you display a report as a graph, you can define how you<br />
want it to look. Using graphs, you can give reports a custom look to<br />
suit your preferences or for quick, project-specific identification.<br />
124 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Report Types<br />
<strong>The</strong> Reporter Utility<br />
<strong>The</strong> Reports command allows you to generate different types of<br />
reports based on the information <strong>Source</strong> <strong>Integrity</strong> maintains about<br />
project members and revisions in the archives. <strong>The</strong> <strong>Source</strong> <strong>Integrity</strong><br />
Reporter can generate the following report types:<br />
Sandbox, Project, and Archive Reports<br />
changes grouped by author<br />
summary of changes grouped by author<br />
list of locked revisions<br />
list of revisions associated with labels<br />
list of revisions associated with particular states<br />
Sandbox and Project Reports<br />
list of revisions newer than the member revision<br />
changes from the member revision to a revision with a particular<br />
label<br />
changes from the member revision to a particular revision<br />
number<br />
project member history<br />
Changes by Author<br />
This type of report lists changes to members or revisions grouped by<br />
the person who made them. For example, if both Fred and Ethel<br />
made changes to several members, the report would include two<br />
sections; one for Fred and one for Ethel. Each section of the report<br />
shows<br />
name of the member<br />
revision number of changed revisions<br />
date the change was made<br />
number of lines (or bytes for binary files) that were added or<br />
deleted<br />
This type of report offers two additional options.<br />
<strong>The</strong> report can be on a single, specified author, or all authors.<br />
It can be restricted to changes made before or after a specified<br />
date.<br />
<strong>User</strong> <strong>Guide</strong> 125
Getting Started With Projects, Sandboxes, and Members<br />
Summary of Changes by Author<br />
This type of report shows a brief summary of changes made by each<br />
user. Each type of project member (Text, Binary, Auto-Detect) appears<br />
in a separate section of the report, subdivided according to the person<br />
who made the changes. <strong>The</strong> information summarized includes<br />
name of the member<br />
total number of revisions changed by each person<br />
total number of lines (or bytes for binary files) that were added or<br />
deleted by each person<br />
This report type offers two additional options.<br />
<strong>The</strong> report can be on a single, specified author, or all authors.<br />
It can be restricted to changes made before or after a specified<br />
date.<br />
Locked Revisions<br />
This report lists all locked revisions in a project or archive. For each<br />
locked revision, the report lists<br />
name of the member<br />
revision number<br />
person who has it locked<br />
Revisions with Labels<br />
This report scans the archives of all project members and extracts any<br />
labels they contain. For each label it finds, the report lists<br />
name of the label<br />
name of the member’s archive<br />
revision number the label is associated with<br />
Revisions with States<br />
This report scans the archives of all project members and extracts any<br />
state settings they contain. For each state setting it finds, the report<br />
lists<br />
state setting<br />
name of the member’s archive<br />
most recent revision with which the state is associated<br />
126 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Revisions Newer Than Member Revision<br />
<strong>The</strong> Reporter Utility<br />
This report tells you which members have more recent revisions<br />
available. For example, if a member revision is revision number 1.3,<br />
but the archive contains revisions numbered 1.4, 1.5, and 1.6, this<br />
report lists the newer available revisions and information about each,<br />
including<br />
name of the member<br />
revision numbers of newer revisions in the archive<br />
date of the newer revisions<br />
revision description for each newer revision<br />
Changes From Member Revision to Label<br />
This report lists all revisions in a member’s archive between the<br />
member revision and another revision with a specified label. This<br />
report can be generated for a single member, or for all project<br />
members. For each member, the report shows<br />
name of the member<br />
revision numbers of all the revisions between the member and<br />
the labeled revision<br />
author of each revision<br />
date of each revision<br />
revision description for each revision<br />
Changes From Member Revision to Revision Number<br />
This report lists all revisions in the member’s archive between the<br />
member revision and another revision with a specified revision<br />
number. This report can be generated for a single member, or for all<br />
project members. For each member, the report shows<br />
name of the member<br />
revision numbers of all the revisions between the member<br />
revision and the selected revision number<br />
author of each revision<br />
date of each revision<br />
revision description for each revision<br />
Project Member History<br />
This report displays all the revisions of a specified project member.<br />
For each revision, it shows<br />
<strong>User</strong> <strong>Guide</strong> 127
Getting Started With Projects, Sandboxes, and Members<br />
Creating<br />
Reports with<br />
the Command<br />
Line Interface<br />
revision number<br />
revision date<br />
revision description<br />
When you choose the member to report on, you can specify that the<br />
information should be sorted according to Revision Number or<br />
Revision Date, in either ascending or descending order.<br />
<strong>The</strong> command line interface’s report command produces commadelimited<br />
text files with data from a wide range of queries to<br />
sandbox, project and archive files. Its syntax is<br />
report [options] file…<br />
where options is zero or more command-line options, and file is the<br />
name of one or more sandbox, project, and archive files (files are<br />
treated as archives, unless they have a .pj extension).<br />
To generate reports, move to the appropriate sandbox or project<br />
directory and enter the report command. <strong>The</strong> command generates a<br />
set of six information files for each file queried. By default, the<br />
basename of the files is taken from the source file (that is, the<br />
sandbox, project, or archive file being examined), and the extension<br />
indicates the type of information in the file.<br />
Extension Information<br />
.txa Archive information<br />
.txr Revision information<br />
.txp Project information<br />
.txm Member information<br />
.txs Assigned labels<br />
.txx Access information<br />
128 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Using Keywords<br />
Using Keywords<br />
In the information files, fields are separated by commas, and text<br />
within fields is delimited by double quotes. For each set of source<br />
files, the ArchId and the ProjId fields are guaranteed to be unique,<br />
so they can be used as keys for relational database operations.<br />
Note If you specify an archive file instead of a project or sandbox file,<br />
report still generates six files, although the project and member<br />
information files are empty.<br />
Keywords are placeholders that can be inserted into text-based<br />
working files. <strong>Source</strong> <strong>Integrity</strong> updates them with information about<br />
the revision or archive.<br />
To use a keyword, simply include it in a working file, surrounded by<br />
dollar signs (for example, $Date$) and check the file back into its<br />
archive.<br />
<strong>The</strong> next time you check out the revision, <strong>Source</strong> <strong>Integrity</strong> scans it for<br />
keywords and replaces them with the appropriate information, if<br />
keyword expansion is turned on.<br />
For example, if the $Date$ keyword is encountered, the date and<br />
time of the revision (assigned at check in) is added to the working file<br />
as part of the keyword. When expanded, the entry would look<br />
something like<br />
$Date: 1999/06/12 10:25:32$<br />
This method of adding or updating information in a keyword is<br />
called keyword expansion.<br />
Here’s another example. If the file main.c has the keywords<br />
$Author$ and $State$ embedded within it, checking out main.c<br />
and issuing the command<br />
returns<br />
ident main.c<br />
main.c:<br />
$author: paula_t $<br />
$state: Exp $<br />
<strong>User</strong> <strong>Guide</strong> 129
Getting Started With Projects, Sandboxes, and Members<br />
Locating<br />
Keywords<br />
In the Windows interface, keyword expansion is turned on or off with<br />
the KeywordExpand option in SAM or your Personal Configuration<br />
dialog box (Checkout tab).<br />
Note Keyword expansion applies to text files only. It is disabled for<br />
binary files.<br />
Text before and after the keyword is preserved, making them suitable<br />
for use within expressions, as above, and within comments.<br />
If keyword expansion is turned on and you are checking out a text<br />
file that contains the string<br />
$Revision$<br />
<strong>Source</strong> <strong>Integrity</strong>, when it encounters this string, automatically adds<br />
the value of the keyword $Revision$ in the format<br />
$Revision: value $<br />
where value is the appropriate value of the keyword (in this case, the<br />
revision number).<br />
For example, including the statement<br />
char revnum[] = "$Revision$";<br />
in a C source file creates a character string named revnum containing<br />
the file’s revision number. <strong>The</strong> program can then be configured to<br />
display this string when it starts up, automatically presenting the<br />
current revision of the program’s source file.<br />
Using the $Revision$ keyword to obtain the revision number of a<br />
file is one of the common applications of keywords. Following are<br />
some others.<br />
<strong>The</strong> $Header$ keyword provides a one-line summary of useful<br />
information associated with a revision. Including this<br />
information in a comment makes the information available to<br />
anyone looking at the file.<br />
<strong>The</strong> $Log$ keyword supplies the same sort of information as<br />
$Header$ plus the revision description. <strong>The</strong> $Log$ keyword<br />
provides a complete list of changes that have been made to the<br />
file over time.<br />
You can use the ident command line interface command to locate<br />
and display keywords (expanded or unexpanded) in one or more<br />
files.<br />
130 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For more information about<br />
the ident command, see the<br />
<strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong><br />
<strong>Edition</strong> Reference <strong>Guide</strong> or the<br />
online man pages.<br />
Removing<br />
Keyword Values<br />
Table of<br />
Keywords<br />
Using Keywords<br />
This command displays the name of each file that contains keywords,<br />
as well as the keywords themselves. This provides an easy way to<br />
extract identification information from source files, as well as<br />
compiled object files.<br />
In the <strong>Source</strong> <strong>Integrity</strong> Web Interface, keywords are expanded on the<br />
server before being sent to the client. <strong>The</strong>refore, path information in<br />
keywords will be server-side paths and date and time information<br />
will be server-side dates and times.<br />
In the command line interface, at check-out time, you can remove the<br />
value portion of keywords from a revision by specifying the -K<br />
option to the co command.<br />
For example, if a revision in the brochur.txt archive contains a<br />
keyword expansion<br />
$Author: fred $<br />
and it is checked out without keyword expansion, the keyword in the<br />
working file reads<br />
$Author$<br />
<strong>Source</strong> <strong>Integrity</strong> maintains several keywords that can be used in<br />
working files. <strong>The</strong> following table describes each keyword and what<br />
it expands to.<br />
Note Keywords are case-sensitive.<br />
Keyword Expands To<br />
$Author$ <strong>The</strong> author name of the user who checked in<br />
the revision.<br />
$Date$ <strong>The</strong> check in date and time of the revision<br />
(assigned at check in). <strong>The</strong> time is shown in<br />
Greenwich Mean Time (GMT/UTC).<br />
$Header$ <strong>The</strong> fully qualified file name of the archive, as<br />
well as the revision number, date and time,<br />
author, state and locker (if locked).<br />
$Id$ <strong>The</strong> same as $Header$, except that the<br />
archive’s file name is not qualified.<br />
$Locker$ <strong>The</strong> user name of the user who locked the<br />
revision (empty if not locked).<br />
<strong>User</strong> <strong>Guide</strong> 131
Getting Started With Projects, Sandboxes, and Members<br />
Keyword Expands To<br />
$Log$ <strong>The</strong> revision description supplied during check<br />
in, preceded by the archive’s file name,<br />
revision number, author and revision date.<br />
Repeated check-out operations append<br />
revision descriptions, rather than replacing<br />
existing ones.<br />
$Name$ <strong>The</strong> revision label (or labels) attached to a<br />
revision.<br />
$ProjectName$ <strong>The</strong> fully qualified name of the project of which<br />
the archive is a member.<br />
$ProjectRevision$ <strong>The</strong> revision number of the project with which<br />
the archive is related.<br />
$RCSfile$ <strong>The</strong> archive’s unqualified file name.<br />
$Revision$ <strong>The</strong> revision number.<br />
$<strong>Source</strong>$ <strong>The</strong> archive’s fully qualified file name.<br />
$State$ <strong>The</strong> revision’s state setting.<br />
132 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Managing Projects and<br />
Sandboxes<br />
5<br />
<strong>Source</strong> <strong>Integrity</strong> allows you to archive your projects just as you do<br />
your members, so you can always reproduce complete project<br />
configurations (including the files and the directory trees in which<br />
they reside) at any time in the future. This ability to replicate projects<br />
precisely is essential to successful post-release maintenance.<br />
This chapter describes how to<br />
freeze projects to prevent changes, and thaw them to allow<br />
changes<br />
checkpoint projects to provide a snapshot of their contents at<br />
particular points<br />
promote and demote projects from one state to another through a<br />
development cycle<br />
log transactions that have been performed on projects<br />
view changes from one version of a project to another<br />
restore a project to previous checkpointed version<br />
delete variant projects<br />
<strong>User</strong> <strong>Guide</strong> 133
Managing Projects and Sandboxes<br />
Freezing a Project<br />
If you decide that a project has advanced to the point where further<br />
changes may destabilize it, you can freeze the project.<br />
At the project level, freezing prevents<br />
adding, updating, or deleting any project members<br />
changes to project attributes and configuration options<br />
any changes to event triggers that are part of the project file<br />
Freezing a project extends an “implied” freeze to all the members in<br />
the project. However, members in a frozen project cannot be thawed<br />
or frozen individually. You first have to thaw the project. Because of<br />
this, when the current project is frozen, freeze and thaw member<br />
commands in the Windows interface are not available.<br />
<strong>The</strong> state of being frozen is inherited. If a frozen project contains a<br />
subproject, the subproject too is frozen and, in turn, all of its archived<br />
members.<br />
In the Windows interface and <strong>Source</strong> <strong>Integrity</strong> Web Interface, a frozen<br />
project is denoted with a snowflake symbol ( ).<br />
Note <strong>The</strong> ability to freeze or thaw projects can be controlled through<br />
SAM. <strong>The</strong>refore, administrators with responsibility for <strong>Source</strong> <strong>Integrity</strong><br />
may have restricted the use of freezing or thawing through SAM<br />
permissions. Consult the SAM documentation or the person responsible<br />
for administering SAM.<br />
To freeze a project in the Windows interface:<br />
With a Project or Sandbox window active, choose Project > Freeze<br />
Project, or click (if added to the toobar).<br />
<strong>Source</strong> <strong>Integrity</strong> freezes the project and places a snowflake symbol<br />
( ) beside each member in the Sandbox or Project window, to<br />
remind you that the project is frozen and that changes are not<br />
allowed.<br />
<strong>The</strong> word “Frozen” also appears in the window title.<br />
To make this command act recursively in all subprojects of the active<br />
project, make sure the Freeze Project option is selected in the<br />
Recursion panel of the Personal Configuration dialog box.<br />
134 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Thawing a Project<br />
Thawing a Project<br />
To freeze a project in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
In the Project view, choose Project > Freeze Project. If this project<br />
contains subprojects, you are asked whether or not you want to<br />
recurse into them.<br />
To freeze a project in the command line interface:<br />
Use the pj freezeproject command from the project directory. Its<br />
syntax is<br />
pj freezeproject [-i] [-Pprojfile.pj]<br />
where -i causes the freeze to be applied recursively to all subprojects,<br />
and -Pprojfile.pj specifies a project file name if your project file is not<br />
called project.pj.<br />
Use the pj vars or pj header commands to confirm the freeze.<br />
Note Invoking pj print reveals that all the project members have been<br />
frozen, but it does not reveal that the project itself is frozen.<br />
If you decide that a project no longer needs to be frozen, you can thaw<br />
it, thus removing the restriction on changing member information in<br />
the project.<br />
Thawing a project removes the “implied” freeze on member files,<br />
except for those that were previously frozen individually. Thawing a<br />
project also permits changes to project attributes, configuration<br />
language blocks, and event triggers in the project file.<br />
If a member or subproject of a frozen project has been previously<br />
frozen, you must thaw the project before you thaw the member or<br />
subproject.<br />
To thaw a project in the Windows interface:<br />
With a Project or Sandbox window active, choose Project > Thaw<br />
Project, or click (if added to the toolbar).<br />
<strong>Source</strong> <strong>Integrity</strong> thaws the project and removes the snowflake symbol<br />
( ) from beside each member in the Sandbox or Project window.<br />
This indicates that changes to the project are allowed once again.<br />
<strong>User</strong> <strong>Guide</strong> 135
Managing Projects and Sandboxes<br />
Checkpointing a Project<br />
<strong>The</strong> word “Frozen” also disappears from the window title.<br />
To thaw a project in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
In the Project view, choose Project > Thaw Project.<br />
<strong>Source</strong> <strong>Integrity</strong> thaws the project and removes the snowflake symbol<br />
( ) from beside each member in the Sandbox or Project window.<br />
This indicates that changes to the project are allowed once again.<br />
If the project contains subprojects, a prompt appears asking if you<br />
want to thaw subprojects as well.<br />
To thaw a project in the command line interface:<br />
Use the pj thawproject command from the project directory. Its<br />
syntax is<br />
pj thawproject [-i] [-Pprojfile.pj]<br />
Include the -P parameter with your project file name if your project<br />
file is not project.pj. Include the -i parameter to have <strong>Source</strong><br />
<strong>Integrity</strong> recursively thaw all subprojects.<br />
Use pj vars or pj header to confirm that <strong>Source</strong> <strong>Integrity</strong> has<br />
removed the project freeze.<br />
Just as you check in a source file to preserve the changes that are<br />
made to it from one revision to another, you must also be able to track<br />
the evolution of a project. In <strong>Source</strong> <strong>Integrity</strong>, this process is called<br />
checkpointing.<br />
Checkpointing saves a copy of the project file in the project archive as<br />
a revision, including the list of members along with their revision<br />
numbers and project attributes (including configuration statements<br />
and event triggers).<br />
You can use the project’s revision number to keep track of your<br />
projects. But to simplify post-release maintenance, use a label to<br />
identify significant project development milestones when you<br />
checkpoint a project.<br />
For example, if you checkpoint a project and label it with a release<br />
identifier (for example, “Release 6.2”), you be able to find and<br />
recreate that particular development state more easily.<br />
136 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Checkpointing a Project<br />
Remember that checkpointing a project affects the project file only; it<br />
does not check in every member of the project.<br />
If you are working in a sandbox, issuing a checkpoint command<br />
checkpoints the sandbox’s master project.<br />
If you want to create a variant sandbox or build sandbox, you must<br />
have a checkpointed project to start with.<br />
To checkpoint a project in the Windows interface:<br />
1. With a Project or Sandbox window active, choose Project ><br />
Checkpoint Project.<br />
If the Checkpoint Project option is set in the Recursion panel of<br />
the Personal Configuration dialog box, this command recursively<br />
checkpoints subprojects that are members of the project the<br />
command is run on.<br />
<strong>The</strong> Checkpoint dialog box appears.<br />
2. Fill in the options as you like, and click OK to create a new<br />
revision of the project. Following are the options you can set:<br />
Label. Enter a revision label (unique text that identifies the<br />
new revision) in this field. You may want to label significant<br />
checkpoints with a product release number, to aid in postrelease<br />
maintenance.<br />
Number. This field is primed with a suggested revision<br />
number for the new revision. You may accept this<br />
recommendation or enter another number of your choice. If<br />
you choose to override the suggested revision number, the<br />
<strong>User</strong> <strong>Guide</strong> 137
Managing Projects and Sandboxes<br />
number you supply must be higher than the head revision<br />
number (if you are checkpointing the main project), or the tip<br />
revision number (if you are checkpointing a variant project).<br />
State. This field holds a one-word summary describing the<br />
status of the new revision. For example, if the revision is an<br />
early version of the work, you might assign it a state of<br />
“Experimental”. When later revisions are checked in and the<br />
work is ready to be viewed by other team members, a state of<br />
“Testing” can be assigned.<br />
Initially, the State field is primed with a value of “Exp” (for<br />
Experimental), or the lowest promotion state setting, if<br />
promotion is turned on. Blank spaces or punctuation marks<br />
may not be included in the State field. This field may not be<br />
left blank.<br />
If promotion is enabled, you can choose from a list of all<br />
available promotion states.<br />
Author. This field is used to identify the person who made the<br />
changes to the new revision. By default, this box is primed<br />
with the author name defined in your configuration, but you<br />
are free to change it to any name you choose.<br />
Apply Label To All Members. This option lets you apply the<br />
label you enter to all members in the current project. <strong>The</strong><br />
label is applied recursively if the Label option is selected in<br />
the Recursion panel of the Personal Configuration dialog box.<br />
Apply State To All Members. This option lets you apply the<br />
state you choose to all members in the current project. <strong>The</strong><br />
state is applied recursively if the Promote and Demote<br />
Member option is selected in the Recursion panel of the<br />
Personal Configuration dialog box.<br />
Replace Label. If the label you choose already exists in the<br />
archive, this option tells <strong>Source</strong> <strong>Integrity</strong> to delete the label<br />
from the revision it is currently attached to and apply it to the<br />
new revision.<br />
Update Member. If you are checking in a subproject member<br />
to a project or sandbox, this option lets you update the<br />
revision number of the subproject member to that of the<br />
newly checked-in revision.<br />
All Subprojects. If you are checking in more than one<br />
subproject member, the Checkpoint dialog box appears with<br />
this option available. Selecting this option causes the current<br />
set of options to be applied to all subsequent check-in<br />
operations.<br />
138 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Checkpointing a Project<br />
To checkpoint a project in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. From the Project view, select the project file and choose the<br />
Checkpoint Project command.<br />
<strong>The</strong> Checkpoint page appears, displaying the full path of the<br />
project file to be checked in.<br />
2. Enter your metadata in the fields provided, remembering that the<br />
metadata entered is applied to the revision of the project, not its<br />
members.<br />
Revision Description. Text commenting on the content, or<br />
members, of the project revision<br />
Label. Text which can be used to identify the project revision<br />
To move an existing label from a previous revision to the<br />
current revision, select Replace Label. To attach the label<br />
entered to all member revisions in the project, select Apply<br />
Label to All Members.<br />
State. A one-word description of the new revision’s status.<br />
Author. <strong>The</strong> name of the person checkpointing the project, by<br />
default your user name.<br />
3. Click OK to checkpoint the project.<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface creates a new revision of the<br />
project in the project’s archive. If the project has subprojects, they<br />
are automatically checkpointed as well.<br />
To checkpoint a project in the command line interface:<br />
Use the pj checkpoint command. Its syntax is<br />
pj checkpoint [-Nlabel] [-sstate] [-rrev] [-t<br />
[mesg|@mesgfile]] [-i] [options]<br />
where label is a label (if it exists, it is moved up to this revision), rev<br />
specifies a revision to be checkpointed, mesg is an archive description<br />
(if this is the first time you are checkpointing a particular archive),<br />
and mesgfile is a file containing text for the archive description.<br />
<strong>User</strong> <strong>Guide</strong> 139
Managing Projects and Sandboxes<br />
Opening a Project Archive<br />
When naming a symbolic label, you should not use periods (.) in the<br />
name, since this can create ambiguous situations when labels are<br />
used to specify a revision. Labels cannot contain colons (:), square<br />
brackets ([ ]), or leading spaces. <strong>The</strong>y also may not resemble a<br />
revision number.<br />
Note <strong>MKS</strong> strongly recommends you use the -i option, which causes<br />
all subprojects to also be checkpointed.<br />
When you want to view the revision history of a project, you can<br />
open its project archive. Opening the project archive of a sandbox is<br />
the same as opening the project archive of its master project.<br />
To open a project’s archive in the Windows interface:<br />
With a Sandbox or Project window active, choose Project > Open<br />
Project Archive.<br />
<strong>The</strong> project’s archive opens and displays in an Archive window.<br />
To open a project’s archive in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
Go to the Project view and choose Project Commands > Open History<br />
View, or click History on the toolbar. This shows the checkpoint<br />
history of the project.<br />
Promoting and Demoting a Project<br />
Just as you can with a project member, you can promote or demote the<br />
project itself (change its state, in other words) as long as promotion is<br />
enabled and you have the necessary SAM permissions. This can assist<br />
in management of an entire project through a development cycle,<br />
especially if the promotion and demotion functions are restricted to<br />
key project personnel.<br />
Normally, you promote or demote a project (set its state) when you<br />
checkpoint it, but you can do so at any time.<br />
140 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Promoting and Demoting a Project<br />
If you promote or demote a sandbox, the master project is promoted<br />
or demoted. Only the project file is promoted or demoted, not the<br />
members of the project.<br />
To promote a project in the Windows interface:<br />
1. With a Sandbox window or Project window active, choose Project<br />
> Promote Project.<br />
<strong>The</strong> Promote Project dialog box appears.<br />
2. Select a new promotion state from the Promote to state dropdown<br />
list.<br />
3. Click OK to accept the new promotion state, or click Cancel to<br />
close the dialog box without changing the project’s state.<br />
If the Project > Promote Project command is not available, make sure<br />
the promotion feature is enabled on the Promotion tab of the Personal<br />
Configuration dialog box.<br />
To demote a project in the Windows interface:<br />
1. With a Sandbox window or Project window active, choose Project<br />
> Demote Project.<br />
<strong>The</strong> Demote Project dialog box appears.<br />
2. Select a new promotion state from the Demote to state drop-down<br />
list.<br />
3. Click OK to accept the new promotion state, or click Cancel to<br />
close the dialog box without changing the project’s state.<br />
<strong>User</strong> <strong>Guide</strong> 141
Managing Projects and Sandboxes<br />
To promote or demote a project in the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface:<br />
Use the Promote and Demote commands from the History view.<br />
To promote or demote a project in the command line interface:<br />
Use the rcs command as follows: with the -sstate option. Its syntax is<br />
rcs -sstate[:rev] file<br />
where state is the new state you would like to change to.<br />
Logging Project Transactions<br />
For information about logging<br />
archive transactions, see<br />
“Logging Archive<br />
Transactions” on page 193.<br />
Cleaning Up<br />
Log Files<br />
<strong>Source</strong> <strong>Integrity</strong> keeps track of the transactions it performs upon<br />
projects in a file called project.trn, where project is the name of the<br />
.pj file for your project.<br />
To view the transaction log in the Windows interface:<br />
Choose Project > View Log.<br />
Your default editor is launched with the log file open in it.<br />
<strong>The</strong> Log file has the same name as the project (.pj) file, but with a<br />
.trn extension, and is stored in the project directory.<br />
You can also open a text editor, browse to your project directory, and<br />
open the .trn file from there.<br />
<strong>The</strong> easiest way to clean up a log file is to delete the file. <strong>Source</strong><br />
<strong>Integrity</strong> automatically creates a new one the next time it records a<br />
project transaction. You can also open the log file in a text editor and<br />
delete transaction records. For instance, you could delete transaction<br />
records that are greater than a particular number of days or weeks<br />
old.<br />
142 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Viewing Changes to a Project<br />
Viewing Changes to a Project<br />
When you checkpoint a project, you are actually saving a revision of<br />
the project file itself (for example, project.pj). <strong>The</strong> project file<br />
contains information that can help you manage and understand the<br />
progress of your projects as they move through the development<br />
cycle. This information includes<br />
revision number of the current project<br />
names and locations of all project members<br />
revision numbers of all project members<br />
any project attributes<br />
member attributes<br />
project-specific event triggers<br />
As you work with the project and its members, the content of the<br />
project file changes.<br />
<strong>The</strong> revision number of the project is updated every time you<br />
checkpoint it (that is, check in the project).<br />
As you check in individual members, their revision numbers<br />
change.<br />
Members may be added or deleted.<br />
Project attributes may be added or deleted.<br />
<strong>Source</strong> <strong>Integrity</strong>, in its Windows and command line interfaces, allows<br />
you to view the changes that have occurred between two versions of<br />
the project file.<br />
Note This functionality is not available in the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface.<br />
To view changes to a project in the Windows interface:<br />
1. With a Project or Sandbox window active, choose Project > View<br />
Project Changes.<br />
<strong>The</strong> View Project Changes dialog box appears.<br />
<strong>User</strong> <strong>Guide</strong> 143
Managing Projects and Sandboxes<br />
2. Select which revisions of the project you want to compare.<br />
Compare the current version of the project with its last<br />
checkpointed revision.<br />
Compare the current version of the project with a specific<br />
revision or label.<br />
If you select this option, select the specific revision by<br />
Revision number or by Label.<br />
Compare two revisions or labels of the project.<br />
If you select this option, select the two specific revisions by<br />
Revision number or by Label.<br />
3. Click OK.<br />
If no changes to the project have occurred, a box appears to<br />
inform you. If changes have occurred, the Project Changes dialog<br />
box appears, displaying the changes that have occurred.<br />
144 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Viewing Changes to a Project<br />
4. To copy the text in the dialog box to your Windows clipboard,<br />
select the text you want to copy and press .<br />
5. When you are finished, click OK or Cancel.<br />
To view changes to a project in the command line interface:<br />
Use the pj mods command. Its syntax is<br />
pj mods [-k rev1] [-k rev2] [options]<br />
where rev1 and rev2 define the range of project revisions to be<br />
compare.<br />
<strong>The</strong>re are three ways you can compare project revisions:<br />
If you use no -k options, the most current revision of the project<br />
file is compared with the working file in the project directory. In<br />
other words, it shows all of the changes to the project file since<br />
the last time it was checkpointed.<br />
If you specify only one -k option, pj mods compares the specified<br />
revision with the current project working file.<br />
For example, the command<br />
pj mods -k 1.2<br />
compares revision 1.2 of the project file to the project file in the<br />
project directory.<br />
If you specify both -k options, the two specified revisions are<br />
compared.<br />
For example, the command<br />
pj mods -k 1.3 -k 1.5<br />
compares revision 1.3 of the current project to revision 1.5 of the<br />
same project. Its output might look something like<br />
d:\gamble\handler.c: revision changed: was 1.12,<br />
now 1.15<br />
This information tells you that when you checkpointed revision 1.3 of<br />
the project, the member named handler.c was at revision 1.12, and<br />
in project revision 1.5 the member had moved to revision 1.15.<br />
<strong>User</strong> <strong>Guide</strong> 145
Managing Projects and Sandboxes<br />
Restoring a Project’s Member List<br />
<strong>The</strong> Restore Project Member List feature restores the member list of a<br />
previously checkpointed revision of a project. This feature modifies<br />
the project’s working file on the current development path to reflect<br />
the member list of the restored project revision, allowing<br />
development in the project to proceed from that point.<br />
Note If you want to create a branch for new development from a<br />
previously checkpointed project revision, you should create a variant<br />
sandbox (see “Creating a Sandbox” on page 76).<br />
If the project file has changed since the last checkpoint, this command<br />
checkpoints the current project file before restoring the member list.<br />
If the Restore Member List option is set in the Recursion panel of the<br />
Personal Configuration dialog box, this command recursively<br />
checkpoints subprojects that are members of the project (or members<br />
of members) the command is run on.<br />
Some items cannot be restored using the Restore Project Member List<br />
feature, including:<br />
Project attributes, because they represent current development<br />
practices that are probably still in effect even after you have<br />
restored a previous version of a project. <strong>The</strong>y include<br />
<strong>Source</strong> <strong>Integrity</strong> configuration policies<br />
project mappings<br />
project build variables<br />
project-related event triggers<br />
user-defined project variables.<br />
Members that have a type of “other”, indicating that they are<br />
non-archived.<br />
Note <strong>MKS</strong> strongly recommends that you archive all members when<br />
adding them to a project.<br />
Revision locks, revision state, and revision labels.<br />
146 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Restoring a Project’s Member List<br />
To restore the project member list in the Windows interface:<br />
1. Choose Project > Restore Member List.<br />
<strong>The</strong> Restore Project Member List dialog box appears.<br />
2. Select the revision you want to restore By Revision, By Label, or<br />
By Development path.<br />
3. Optionally, enter a comment in the Description field.<br />
4. Click OK to restore the project member list, or click Cancel to<br />
close the dialog box without making changes.<br />
To restore the project member list in the command-line<br />
interface:<br />
Use the pj restore command, specifying which project to restore by<br />
its revision, label, or development path. Its syntax is<br />
pj restore -rrev | -rlabel | -Ndevpath [-i]<br />
where rev is a revision number, label is a label assigned to the project,<br />
and devpath is the project’s development path. To recursively restore<br />
the subprojects of the specified project, use the -i option.<br />
<strong>User</strong> <strong>Guide</strong> 147
Managing Projects and Sandboxes<br />
Importing Files<br />
For complete details, see the<br />
online command reference for<br />
the sccs2rcs, pvcs2rcs,<br />
and vss2rcs commands.<br />
For information on syntax of<br />
vss2rcs command, see<br />
“Importing Visual <strong>Source</strong>Safe<br />
Files” on page 150.<br />
If you are already using a revision control system (for example, SCCS,<br />
PVCS, or Visual <strong>Source</strong>Safe) and you want to move to <strong>Source</strong> <strong>Integrity</strong>,<br />
you can import your existing archives and automatically convert<br />
them to <strong>Source</strong> <strong>Integrity</strong> format.<br />
This functionality does not exist in the <strong>Source</strong> <strong>Integrity</strong> Web Interface.<br />
To import a PVCS or SCCS archive in the Windows interface:<br />
Use the File > Import Archives command.<br />
To import an archive in the command line interface:<br />
Use the pvcs2rcs (for PVCS files), sccs2rcs (for SCCS files), and<br />
vss2rcs (for Visual <strong>Source</strong>Safe) commands.<br />
<strong>The</strong> pvcs2rcs and sccs2rcs commands use the same syntax:<br />
pvcs2rcs -Fflist | file…<br />
sccs2rcs -Fflist | file…<br />
where flist is a file list containing the names of the files to import (one<br />
per line), and file is one or more files to import into <strong>Source</strong> <strong>Integrity</strong>.<br />
Note <strong>The</strong> pvcs2rcs and sccs2rcs commands do not work on files that<br />
reside on secure servers (such as one secured by the <strong>MKS</strong>SI NT Security<br />
Service or Novell NLM). To convert such files, first copy them to an<br />
unsecured file system. Perform the conversion there and copy the newly<br />
created <strong>Source</strong> <strong>Integrity</strong> archives to the secured server (and secure<br />
them).<br />
Example<br />
<strong>The</strong> command<br />
sccs2rcs sample01.txt sample02.txt sample03.txt<br />
imports the three named files, while<br />
sccs2rcs -Ffiles.lst<br />
imports all the files listed in the file files.lst.<br />
Importing files preserves virtually all the file and revision<br />
information contained in the PVCS or SCCS file formats. <strong>The</strong>re are,<br />
however, some differences in the way various revision control<br />
148 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Importing SCCS<br />
Files<br />
Importing PVCS<br />
Files<br />
Importing Files<br />
systems express specific aspects of the process. <strong>The</strong> following<br />
sections describe the way <strong>Source</strong> <strong>Integrity</strong> handles these differences,<br />
as well as other features unique to <strong>Source</strong> <strong>Integrity</strong>.<br />
<strong>Source</strong> <strong>Integrity</strong> imports SCCS files as follows:<br />
SCCS files are not deleted.<br />
<strong>The</strong> state of all revisions is set to “Exp”.<br />
On DOS systems, if the SCCS file has its working file name (m)<br />
flag set, the <strong>Source</strong> <strong>Integrity</strong> archive takes the name specified by<br />
the m flag; otherwise, it takes the name of the SCCS file, with the<br />
.s suffix (if present) removed.<br />
Note On UNIX systems, the name of the <strong>Source</strong> <strong>Integrity</strong> archive is the<br />
same as the SCCS input file, with the .s suffix removed.<br />
If the SCCS file has its default revision flag set, the default branch<br />
in the <strong>Source</strong> <strong>Integrity</strong> archive is set to the corresponding<br />
revision.<br />
If MR (Modification Request) numbers are provided with any<br />
SCCS revisions, these numbers are added to the revision<br />
descriptions of the corresponding <strong>Source</strong> <strong>Integrity</strong> revisions.<br />
Locks are not preserved. Revisions locked under SCCS are not<br />
locked when imported into <strong>Source</strong> <strong>Integrity</strong>.<br />
<strong>Source</strong> <strong>Integrity</strong> imports PVCS files as follows:<br />
PVCS files are not deleted.<br />
<strong>The</strong> state of all revisions is set to “Exp”.<br />
<strong>The</strong> sequence of revision numbers is preserved, but since PVCS<br />
revision numbers start at 1.0 and <strong>Source</strong> <strong>Integrity</strong> revision<br />
numbers start at 1.1, all components of PVCS revision numbers<br />
(except the first character) are incremented by one. For example,<br />
PVCS revision number 1.0 becomes <strong>Source</strong> <strong>Integrity</strong> revision<br />
number 1.1; 1.3.2.5 becomes 1.4.3.6, and so on.<br />
If the CHECKLOCK option is specified in the PVCS input file, strict<br />
locking is enabled by <strong>Source</strong> <strong>Integrity</strong>.<br />
If the WRITEPROTECT option is specified in the PVCS input file, the<br />
<strong>Source</strong> <strong>Integrity</strong> archive is created as a read-only file.<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> archive takes the name of the PVCS working<br />
file.<br />
<strong>User</strong> <strong>Guide</strong> 149
Managing Projects and Sandboxes<br />
Importing<br />
Visual<br />
<strong>Source</strong>Safe<br />
Files<br />
<strong>The</strong> vss2rcs command’s syntax is<br />
vss2rcs [-D] [-B branch] [-a SI_workdir] [-s VSS_path]<br />
[-f filelist] [vssfile …]<br />
<strong>The</strong> working file for the converted archive is placed in the current<br />
directory. <strong>The</strong> actual archive is placed in the directory indicated by<br />
the RCSPATH SAM configuration variable. Often, this will be<br />
SI_workdir/rcs/vssfile.<br />
Note You must have Visual <strong>Source</strong>Safe installed on the machine on<br />
which you are running the conversion, and you must be logged into<br />
Windows as a valid Visual <strong>Source</strong>Safe user.<br />
vss2rcs accepts the following options:<br />
-a SI_workdir specifies the directory in which to place the<br />
working file for the converted archive.<br />
-B branch creates the converted archive on the specified branch.<br />
-D displays debugging messages. When this option is specified,<br />
conversion is slowed down.<br />
-f filelist provides an alternate way to specify archives to be<br />
converted. <strong>The</strong> given filelist contains a list of Visual <strong>Source</strong>Safe<br />
archives to be converted along with the information on the Visual<br />
<strong>Source</strong>Safe project path and the directory for <strong>Source</strong> <strong>Integrity</strong><br />
working files which is normally specified by -s and -a options,<br />
respectively.<br />
<strong>The</strong> filelist file has the following format:<br />
A line starting with SS-SI-PROJECT followed by a space and<br />
the full path name of the Visual <strong>Source</strong>Safe project containing<br />
the archives to be converted.<br />
A line starting with SS-SI-WORKDIR followed by a space<br />
and the path name of the directory containing the <strong>Source</strong><br />
<strong>Integrity</strong> working file.<br />
Several lines, each of which specifies the name of a Visual<br />
<strong>Source</strong>Safe archive from the project specified by the SS-SI-<br />
PROJECT that you wish to convert.<br />
You can convert multiple projects with one filelist by repeating<br />
this format one or more times.<br />
-s VSS_path specifies the path name of the Visual <strong>Source</strong>Safe<br />
project that contains the archive being converted.<br />
150 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Using Existing<br />
RCS Archives<br />
Example<br />
<strong>The</strong> command<br />
vss2rcs $/proj1/proj2/file1<br />
Importing Files<br />
converts the Visual <strong>Source</strong>Safe archive file1 from the project<br />
$/proj1/proj2 and places the resulting <strong>Source</strong> <strong>Integrity</strong> working file<br />
in the current directory. <strong>The</strong> corresponding archive is placed in a<br />
location determined by the value of the RCSPATH configuration<br />
variable.<br />
Similarly,<br />
vss2rcs -s $/proj1/proj2 file1 file2<br />
converts the Visual <strong>Source</strong>Safe archives file1 and file2 and places<br />
the resulting working files in the current directory.<br />
With the -a option, you can have the <strong>Source</strong> <strong>Integrity</strong> working files<br />
created in a location other the current directory. For example,<br />
vss2rcs -a c:/temp $/proj1/file1 $/proj1/file2<br />
places the working files created from the Visual <strong>Source</strong>Safe archives<br />
$/proj1/file1 and $/proj2/file2 in the c:/temp directory.<br />
<strong>Source</strong> <strong>Integrity</strong> accepts traditional RCS archives without conversion.<br />
<strong>Source</strong> <strong>Integrity</strong> will, however, begin to add proprietary information<br />
to the archives to accommodate its specialized functionality.<br />
<strong>Source</strong> <strong>Integrity</strong> provides the configuration option VanillaRCS to<br />
allow compatibility with traditional RCS. When VanillaRCS is set in<br />
a project, or in your Personal Configuration, any new archives<br />
created will be made RCS-compatible.<br />
Note Other RCS systems, such as GNU RCS, are not able to take<br />
advantage of <strong>Source</strong> <strong>Integrity</strong> project information.<br />
<strong>User</strong> <strong>Guide</strong> 151
Managing Projects and Sandboxes<br />
Accessing Project Information With the<br />
Command Line Interface<br />
One of the features of <strong>Source</strong> <strong>Integrity</strong> is the project and member<br />
metadata (that is, information about projects and their members) it<br />
stores and maintains. At the project level, the metadata it saves or can<br />
generate includes<br />
a list of project members<br />
a record of all the changes made to project members<br />
a record of changes made to the project itself<br />
You can also use the report command to generate archive and<br />
project information in a form that can be imported and manipulated<br />
by most database programs.<br />
List of Members <strong>The</strong> pj print command can search out and display information<br />
about a project and its members. Using the -S format option, you can<br />
specify the type of information it displays.<br />
For example, the command<br />
pj print -S “%n %r %t”<br />
Changed<br />
Members<br />
displays the name, revision number, and type of all project members.<br />
In fact, the above format string does not need to be supplied, as it is<br />
the default format.<br />
Here’s a sample of output from this command<br />
p:\gamble\handler.c 1.14 archived<br />
p:\gamble\init.c 1.9 archived<br />
p:\gamble\makefile 1.10 archived<br />
p:\gamble\nt\filesys.c 1.22 archived<br />
with an entry for every member of the project. By changing the format<br />
modifier with the -S option, you can display a wide variety of project<br />
and member information.<br />
<strong>The</strong> pj what command displays the status of project members and<br />
any differences between project members and their working files. It<br />
can report if<br />
a member’s archive is missing or corrupt<br />
there is a newer revision available for a member<br />
a member is locked<br />
a member’s working file is missing or inaccessible<br />
152 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Variables and<br />
Attributes<br />
Project and<br />
Sandbox<br />
Information and<br />
System Settings<br />
Attributes<br />
a member’s working file has changed<br />
Accessing Project Information With the Command Line Interface<br />
a member’s working file is newer than its revision<br />
You can use the -T criteria option to specify the information you want<br />
to see.<br />
For example, the command<br />
pj what -T changed,touched<br />
tells you which members’ working files have been changed, and<br />
whether they are newer than the project member revision.<br />
By modifying the criteria portion of the -T option, you can generate a<br />
range of reports to help you manage and analyze the progress of your<br />
projects.<br />
You can use the pj vars command to view all variables and attributes<br />
accessible from a project or sandbox. Its syntax is:<br />
pj vars [-ceEg]<br />
where -c shows local configuration only, -e shows project<br />
configuration only, -E shows sandbox configuration only, and -g<br />
shows global configuration only.<br />
You can view current project and sandbox information and system<br />
settings with the pj header command. Its syntax is:<br />
pj header [options]<br />
where options are the standard pj options.<br />
Attributes are settings that persist between sessions of <strong>Source</strong><br />
<strong>Integrity</strong>. Depending on the attribute, they are stored in the project or<br />
the sandbox.<br />
Member Attributes<br />
Any member of a <strong>Source</strong> <strong>Integrity</strong> project can be assigned attributes,<br />
which can be used to locate and identify individual members—or<br />
groups of members—and to direct project commands to members<br />
with a particular attribute.<br />
Member attributes are set with the pj addrule command. Its syntax<br />
is<br />
pj addrule var[=value] [file…]<br />
<strong>User</strong> <strong>Guide</strong> 153
Managing Projects and Sandboxes<br />
For more information about<br />
the -v option, see the online<br />
reference for the pj command.<br />
where var is the name of an attribute, value is the value it is set to, and<br />
file is one or more project members the attribute will be assigned to. If<br />
file is omitted, the attribute is assigned to all project members.<br />
Example<br />
You might use attributes to identify the components needed to build<br />
the NT and OS/2 versions of the gamble project.<br />
You could accomplish this by creating an attribute named “SYS” for<br />
all project members and assigning appropriate values for individual<br />
members.<br />
Files that are used to build both versions of the command (for<br />
example, header and most code files) are assigned a value of<br />
“Both”.<br />
Files used only for the NT version are assigned a value of “NT”.<br />
Files used only for the OS/2 version are assigned a value of<br />
“OS2”.<br />
<strong>The</strong> easiest way to implement this for the gamble project is as follows:<br />
1. Use the pj addrule command to assign the SYS attribute to all<br />
project members, with a value of “Both”.<br />
pj addrule SYS=Both<br />
2. Run the command twice more to change the value of SYS for<br />
those members used for only one operating system<br />
pj addrule SYS=NT nt\filesys.c<br />
pj addrule SYS=OS2 os2\filesys.c<br />
Note To change a member attribute, simply run pj addrule again and<br />
assign a new value.<br />
With these attributes in place, you can use the -v option to the project<br />
commands to specify that they should operate only on members with<br />
a particular attribute, or an attribute set to a certain value.<br />
For example, to print information about all project members with the<br />
SYS attribute, enter<br />
pj print -v SYS<br />
To see the same information about only those members associated<br />
with the NT platform, you would enter<br />
pj print -v SYS=NT<br />
154 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Accessing Project Information With the Command Line Interface<br />
You remove member attributes with the pj droprule command.<br />
For example, to remove the SYS attribute from all gamble project<br />
members, enter<br />
pj droprule SYS<br />
Note Member attributes are case sensitive; “SYS” and “Sys” are<br />
interpreted as different attributes.<br />
Project Attributes<br />
You can assign attributes to projects, which then define local settings<br />
for the project as a whole.<br />
You can create and set any project attributes you choose, provided<br />
they conform to the rules of the <strong>Source</strong> <strong>Integrity</strong> configuration<br />
language.<br />
Note Some attributes are predefined and understood by <strong>Source</strong><br />
<strong>Integrity</strong>. In this capacity, they are called Policy Options, because of their<br />
special meaning and additionally their availability in SAM.<br />
<strong>Source</strong> <strong>Integrity</strong> does not permit multiple attributes with the same<br />
name. <strong>The</strong>re are a few exceptions: some configuration options can be<br />
set several times, with different values or settings. <strong>The</strong> most common<br />
example is the AutoAction option, which is set once for each event<br />
trigger to be defined.<br />
Project attributes (and policy options) are created and set with the<br />
pj set command. Its syntax is<br />
pj set var[=value]<br />
where var is the name of the attribute and value is the value assigned<br />
to it.<br />
If your settings have spaces in them, remember to use quotes. This is<br />
important for several types of settings. For example<br />
pj set my_flag<br />
pj set approved=checked_by_kz<br />
<strong>User</strong> <strong>Guide</strong> 155
Managing Projects and Sandboxes<br />
pj set “states=new changed approved final”<br />
pj set “worktoarch c:\proj=c:\rcs\proj”<br />
Note You can view the list of project attributes with the pj vars<br />
command. For a description of pj vars, see the online command<br />
reference or the <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong> Reference <strong>Guide</strong>.<br />
You can remove project attributes with pj unset. When unsetting<br />
attributes, remember to quote them if they include spaces. For<br />
example<br />
pj unset my_flag<br />
pj unset approved<br />
pj unset states<br />
pj unset “worktoarch c:\proj”<br />
Example<br />
You can specify the utility the pj build command uses to build the<br />
project by setting the reserved project option Build.<br />
pj set Build=c:\wcc\bin\make.exe<br />
To remove the Build attribute from the current project you would<br />
enter<br />
pj unset Build<br />
After setting several WorktoArch statements<br />
pj set “worktoarch c:\proj=c:\rcs\proj”<br />
pj set “worktoarch c:\other=d:\archives\other”<br />
you must specify the WorktoArch statement to delete<br />
pj unset “worktoarch c:\proj”<br />
pj unset “worktoarch c:\other”<br />
Note Project attributes are not case sensitive; “SYS” and “Sys” are<br />
interpreted as the same attributes. Member attributes, on the other hand,<br />
are case sensitive.<br />
156 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Editing Code Blocks<br />
Accessing Project Information With the Command Line Interface<br />
Before using the pj set command to create a new AutoAction<br />
statement, you may want to use the pj editblock command to create<br />
a new code block, or replace an existing one within a project or<br />
sandbox. Its syntax is<br />
pj editblock [options] [-m [“block” | [@]blockfile]]<br />
blockname<br />
where<br />
options is zero or more valid project command options.<br />
block is the text of a code block, entered on the command line.<br />
This text should be enclosed in quotes.<br />
-m[@]blockfile is a file containing the new text for the code block<br />
blockname. Use the @ sign to indicate that blockfile is a file name. If<br />
you omit the @ sign, blockfile is treated as code block text.<br />
If you omit the -m option, your default editor opens with a<br />
temporary file that is empty if your block is new, or contains the<br />
current contents of the block if it already exists. Edit the block,<br />
save the file, and exit to add it to the project.<br />
blockname is the name of the code block to add or replace.<br />
For example, the command<br />
pj editblock -m @block.txt NotifyChange<br />
replaces a code block named NotifyChange with the contents of the<br />
file named block.txt.<br />
You delete an existing code block with the pj dropblock command.<br />
For example, the command<br />
pj dropblock NotifyChange<br />
deletes a code blocked named NotifyChange from the project file.<br />
<strong>User</strong> <strong>Guide</strong> 157
Managing Projects and Sandboxes<br />
Deleting Variant Projects<br />
If a development path within a project has become obsolete, you can<br />
remove it without disturbing the main trunk or other development<br />
paths in the project. This functionality is only available in the<br />
Windows and command line interfaces.<br />
You can only perform this operation on development paths created<br />
through variant sandboxes. <strong>Source</strong> <strong>Integrity</strong> does not support<br />
removing the main trunk of a project.<br />
Caution Take care when using this command. This command removes<br />
a development path from within a master project. Doing this will<br />
invalidate and make useless the variant sandboxes of anyone else<br />
following this development path.<br />
To delete a development path in the Windows interface:<br />
1. With a Project window active, choose Project > Project<br />
Information.<br />
<strong>The</strong> Project Information dialog box appears.<br />
2. Click Development Paths to expand the dialog box to show the list<br />
of development paths.<br />
3. From the list of development paths, select one or more and click<br />
Delete.<br />
To delete a development path in the command line interface:<br />
From within the master project directory, use the pj delvariant<br />
command. Its syntax is<br />
pj delvariant -Ndevpathname<br />
where devpathname is the name of the development path you want to<br />
eliminate.<br />
You can also delete a variant sandbox from its own directory rather<br />
than the project directory. Give the command<br />
pj delvariant [-Psbxname.pj]<br />
without specifying the development path name. <strong>Source</strong> <strong>Integrity</strong><br />
removes the development path referenced by the variant sandbox.<br />
Include the -P parameter if your sandbox is not named sandbox.pj.<br />
158 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Cleaning Up Working Files<br />
For example, if you create a variant sandbox with the pj sandbox<br />
command<br />
pj sandbox -Pmyproj.pj -N mydevpath -k 1.3<br />
you can remove the development path mydevpath by issuing the<br />
command<br />
pj delvariant -N mydevpath<br />
from the master project (myproj.pj) directory, or<br />
pj delvariant<br />
from the directory of the new sandbox.<br />
Cleaning Up Working Files<br />
For a detailed description, see<br />
the online reference for the pj<br />
clean command.<br />
Note This command makes your variant sandbox invalid. It does not<br />
remove the sandbox files or copies of member files—they may still be<br />
read-only, and may therefore need to be chmod’ed or attrib’ed before<br />
you can delete them.<br />
<strong>The</strong> pj clean command compares the most recent revision of a file to<br />
its working file and deletes the working file if it has not changed<br />
since it was checked out. To clean up unused working files in an<br />
archive, use rcsclean.<br />
<strong>The</strong> syntax for pj clean is<br />
pj clean file…<br />
where file is one or more files to be examined.<br />
<strong>Source</strong> <strong>Integrity</strong> normally makes a working file writable when you<br />
have a lock on the revision it was generated from. If pj clean finds<br />
the working file is read-only, it assumes you do not have a lock on the<br />
revision, and so removes the working file if it has not changed. If you<br />
had explicitly locked the revision (using pj lock or rcs -l), pj clean<br />
does not clear this lock.<br />
Note This functionality is available only in the command line interface.<br />
<strong>User</strong> <strong>Guide</strong> 159
Managing Projects and Sandboxes<br />
Encrypting Files<br />
Automatic<br />
Encryption<br />
Explicit<br />
Encryption<br />
<strong>Source</strong> <strong>Integrity</strong> can encrypt archives to supplement security. When<br />
an archive is encrypted, <strong>Source</strong> <strong>Integrity</strong> requires you to supply a<br />
encryption key before performing any operation on the archive.<br />
Note <strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface does not support encryption. If<br />
archives are to be used by both the <strong>Source</strong> <strong>Integrity</strong> Web Interface and<br />
either <strong>Source</strong> <strong>Integrity</strong>’s Windows or command line interfaces, you<br />
should not use encryption. In this case, you can use a third-party<br />
encryption scheme. For the implications of this, see “Encryption and<br />
Other Applications” on page 162.<br />
You can automatically encrypt all newly created archives by setting<br />
the Encrypt option in SAM or a Personal Configuration file.<br />
Note Existing archives (that is, those created before the Encrypt option<br />
was set) are not affected.<br />
In the Windows interface, you can encrypt new archives when you<br />
create them by selecting the Encrypted option in the Create Archive<br />
dialog box.<br />
You can also encrypt existing archives by selecting the Encrypted<br />
option in the Archive Information dialog box.<br />
<strong>The</strong> -Z[key] option to the ci, pj ci, and rcs commands modifies an<br />
archive so all existing and/or subsequent revisions are encrypted. Its<br />
syntax is<br />
ci -Z[key] file…<br />
rcs -Z[key] file…<br />
pj ci -Z[key] file…<br />
where key is the encryption key for one or more archives named in<br />
file. If key is omitted, <strong>Source</strong> <strong>Integrity</strong> prompts you to supply an<br />
encryption key.<br />
For example, the command<br />
ci -Zpuck prog.c<br />
160 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Choosing an<br />
Encryption Key<br />
Encrypting Files<br />
checks in a new revision to prog.c and encrypts the archive, using<br />
the encryption key “puck”.<br />
Likewise, the command<br />
rcs -Zpuck prog.c<br />
encrypts prog.c using the same encryption key. Once an archive is<br />
encrypted, you are required to supply the encryption key to perform<br />
any operation that reads from or writes to the archive, such as a check<br />
in or check out.<br />
You can permanently decrypt an encrypted archive with the -z[key]<br />
option to the rcs command.<br />
For example, the command<br />
rcs -zpuck prog.c<br />
decrypts prog.c. If key is omitted, <strong>Source</strong> <strong>Integrity</strong> prompts you for<br />
the encryption key.<br />
When you run a <strong>Source</strong> <strong>Integrity</strong> command on an encrypted archive,<br />
<strong>Source</strong> <strong>Integrity</strong> asks you to provide its encryption key, which is used<br />
to encrypt and decrypt the file.<br />
<strong>The</strong> encryption key can be up to eight characters long; it may contain<br />
any alphanumeric character, but no spaces. <strong>The</strong> case of characters in<br />
an encryption key is significant.<br />
<strong>The</strong> first time you specify an encryption key you are asked to enter it<br />
twice, to ensure that the entry is correct. <strong>The</strong> two entries must be<br />
identical for the encryption key to be accepted.<br />
Here are some tips for choosing an encryption key:<br />
Choose a key that is at least six characters long.<br />
Do not use a common word or acronym.<br />
Replacing selected letters in a common word with digits<br />
discourages dictionary-based attacks.<br />
<strong>User</strong> <strong>Guide</strong> 161
Managing Projects and Sandboxes<br />
Changing the<br />
Encryption Key<br />
Working With<br />
Encryption<br />
For more information on file<br />
lists, see “File Name<br />
Arguments” on page 63.<br />
Encryption and<br />
Other<br />
Applications<br />
Mix uppercase and lowercase characters with punctuation.<br />
To make the key easier to remember, you can base it on a<br />
mnemonic phrase.<br />
Caution Do not forget your encryption key! If you forget it, the<br />
contents of the archive are as good as lost. Furthermore, there is no way<br />
to determine an archive’s encryption key, since it is not stored in the<br />
archive.<br />
You change an archive’s encryption key by decrypting the archive,<br />
then encrypting it again, using a different encryption key.<br />
Example<br />
To change the encryption key for the archive prog.c, enter the<br />
command<br />
rcs -zpuck prog.c<br />
to decrypt the archive. Next, enter the command<br />
rcs -Zfeste prog.c<br />
to encrypt the archive with the new encryption key “feste”.<br />
You can use any <strong>Source</strong> <strong>Integrity</strong> command on an encrypted archive;<br />
you must supply its encryption key, however, before you can see its<br />
contents.<br />
If you have a body of existing archives you want to encrypt, use the<br />
-Z option to the rcs command, and a file list containing the names of<br />
all the files.<br />
If you use <strong>Source</strong> <strong>Integrity</strong> with applications that support security<br />
schemes of their own, <strong>MKS</strong> recommends you use <strong>Source</strong> <strong>Integrity</strong>’s<br />
encryption feature rather than those of your applications.<br />
When you check in a file, <strong>Source</strong> <strong>Integrity</strong> determines the differences<br />
between it and the previous revision, then saves only the differences.<br />
In some cases, two revisions will differ by only a single line. If the<br />
files are checked in before encryption, <strong>Source</strong> <strong>Integrity</strong> identifies the<br />
single different line, encrypts that line, and saves only the encrypted<br />
line in the archive.<br />
162 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Encrypting Files<br />
However, if the files are encrypted by another program before check<br />
in, the differences between the file and the previous revision will be<br />
substantial, forcing <strong>Source</strong> <strong>Integrity</strong> to save all the differences and<br />
resulting in a much larger revision.<br />
<strong>User</strong> <strong>Guide</strong> 163
Managing Projects and Sandboxes<br />
164 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Managing Archives<br />
and Revisions<br />
6<br />
While sandboxes and projects allow you to manage and access<br />
project members, the contents of individual member files—and the<br />
history of changes you make to them—are saved in the archives.<br />
<strong>Source</strong> <strong>Integrity</strong> lets you save—and recreate—every stage (or<br />
revision) in the development of every file you use.<br />
When you make changes to a project member and then check it back<br />
in, your changes are automatically added to the member’s archive. If<br />
you ever need to see that version of the file again, just check out the<br />
appropriate revision, and <strong>Source</strong> <strong>Integrity</strong> rebuilds an exact copy for<br />
you. Not only can every file in a project be archived, the project itself<br />
can be archived (checkpointed), allowing you to rebuild the entire<br />
project configuration at any time.<br />
While the archive commands are as safe and easy to use as their<br />
project-oriented counterparts, they do not communicate their<br />
activities to your projects. For example, if you normally access a file<br />
through a Project window, but another developer uses the archive<br />
commands to check out the file, makes changes to it, and checks it<br />
back into the archive, the project is not automatically updated. <strong>MKS</strong><br />
therefore recommends that you usually work through projects and<br />
sandboxes.<br />
<strong>User</strong> <strong>Guide</strong> 165
Managing Archives and Revisions<br />
Opening a Project’s Archive<br />
To open a project’s archive in the Windows interface:<br />
With a Project or Sandbox window active, choose Project > Open<br />
Project Archive.<br />
<strong>The</strong> project’s archive (either the current project or the master project<br />
of the current sandbox) opens and appears in an Archive window.<br />
Opening a Member’s Archive<br />
To open a project’s archive in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
From the Project view, choose Project Commands > Open History View.<br />
To open a member’s archive in the Windows interface:<br />
1. Select an archived member in a Sandbox or Project window.<br />
2. Choose Member > Open Member Archive or press +.<br />
<strong>The</strong> member’s archive appears in an Archive window. <strong>The</strong> title of<br />
the Archive window includes the statement<br />
(from projname)<br />
after the archive file name, where projname is the file name of the<br />
sandbox or project the Open Member Archive command was<br />
invoked from. This lets you know the archive is “project aware”<br />
and will ignore the WorkToArch, ArchivePath, and WorkPath<br />
constructs when checking out to, or checking in from working<br />
files.<br />
166 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Creating Archives<br />
Creating Archives<br />
To open an archive directly without a project or sandbox in the<br />
Windows interface:<br />
1. Choose File > Open Archive, or click .<br />
<strong>The</strong> Open Archive file browser appears.<br />
2. If the archive you want to open is not in the current directory, use<br />
the Drives and Directories boxes to navigate to the proper<br />
location.<br />
3. Select one or more archives (or their corresponding working files)<br />
and press , or click OK.<br />
An Archive window appears for each file.<br />
To open a member’s archive in the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface:<br />
Select the member in the Project or Sandbox view and choose Member<br />
Commands > Open Member View.<br />
Archives are usually created when you create a project or add<br />
members to a project. However, if you need to create an archive<br />
outside the project context, you can do so. Standalone archives (ones<br />
that have no projects associated with them) can be added to projects<br />
at a later time.<br />
Note <strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Web Interface does not support standalone<br />
archives.<br />
To create an archive in the Windows interface:<br />
1. Choose File > Create Archive or click .<br />
<strong>The</strong> Create Archive file browser appears.<br />
<strong>User</strong> <strong>Guide</strong> 167
Managing Archives and Revisions<br />
2. If the file you want to bring under version control is not in the<br />
current directory, navigate to the appropriate directory.<br />
3. Select one or more files you want to create archives for, and click<br />
OK.<br />
<strong>The</strong> Create Archive dialog box appears.<br />
4. Fill in the Create Archive dialog box options as you like, and click<br />
OK to create the new archives.<br />
When creating an archive, you can set a number of options (see<br />
“Archive Settings” on page 169 and “Revision Settings” on page 169)<br />
that determine how the archives are managed, whether an initial<br />
revision should be checked in, and what revision details will be<br />
recorded.<br />
168 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For more information about<br />
SAM permissions, see the<br />
<strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong><br />
<strong>Edition</strong> Administrator <strong>Guide</strong> or<br />
ask your system<br />
administrator.<br />
Creating Archives<br />
<strong>The</strong> availability and functionality of options depends on your SAM<br />
permissions.<br />
Archive Settings<br />
Strict Locking. Selecting this option causes the new archive to use<br />
a strict-locking policy, which forces you to lock a member if you<br />
want to edit it and check it in. This option might be unavailable if<br />
a locking policy is enforced.<br />
Compressed. Selecting this option causes the archive to be saved<br />
in compressed format, which is especially useful if you are<br />
working with large files, or if disk space is at a premium. This<br />
option might be unavailable if a compression policy is enforced.<br />
Data Type. Use this option to set the type of data you will be<br />
storing in the archive. You may select one of three possible data<br />
types:<br />
Binary. A file containing unprintable characters, or lines too<br />
long to be handled by text editors.<br />
Text. A file that is always saved in a format expected by<br />
standard text editors (for example, Notepad or vi).<br />
Auto Detect. <strong>The</strong> default setting, which can be used safely<br />
with any file. <strong>Source</strong> <strong>Integrity</strong> determines the type of the file<br />
and creates an appropriate archive for it.<br />
Encrypted. Selecting this option causes <strong>Source</strong> <strong>Integrity</strong> to<br />
encrypt the archive when it creates it. This option requires an<br />
encryption password.<br />
Caution Do not forget the encryption password! Without it, data in<br />
the archive is unrecoverable. This option might be unavailable if an<br />
encryption policy is enforced.<br />
Archive Description. Enter a free-form description of the archive.<br />
You may include any information you want here.<br />
Open Archive. Selecting this option causes <strong>Source</strong> <strong>Integrity</strong> to<br />
open the new archive in the application window.<br />
Revision Settings<br />
Check In. This option checks in the selected file as the first<br />
revision in the archive. If this option is not set, an empty archive<br />
is created.<br />
<strong>User</strong> <strong>Guide</strong> 169
Managing Archives and Revisions<br />
Locked. This option creates the new archive and immediately<br />
locks the first revision, allowing you to retain control of the first<br />
revision while creating the archive. If this option is not set, the<br />
first revision is checked in unlocked.<br />
Label. Enter unique text that identifies the new revision for the<br />
first revision in the new archive. Labels can be viewed or<br />
modified later.<br />
Number. This is the revision number for the first revision of the<br />
new archive. <strong>The</strong> default is 1.1.<br />
All Files. This option applies the option settings for the current<br />
archive to all subsequent archives, if more than one archive is<br />
being created.<br />
Keep Work File. This option creates the archive, checks in the file,<br />
and immediately checks it out again. If this option is not set, the<br />
working file is deleted when the archive is created.<br />
State. A one-word flag describing the status of the new revision.<br />
Default is “Exp” (for Experimental), or the lowest promotion<br />
state setting, if promotion is turned on.<br />
Author. Identifies the person who creates the new revision. <strong>The</strong><br />
default is the author name specified in your Personal<br />
Configuration, but you can set it to another name.<br />
To create archives in the command line interface:<br />
Check in the first revision with the ci archive command; you do not<br />
have to explicitly create the archive. Its syntax is<br />
ci [options] file…<br />
where file is one or more files archives will be created for.<br />
<strong>The</strong> first time you check in a file, <strong>Source</strong> <strong>Integrity</strong><br />
determines whether it is binary (<strong>Source</strong> <strong>Integrity</strong> considers a file<br />
to be binary if it contains nulls, or lines too long to be handled by<br />
text editors)<br />
creates an archive of the appropriate format (binary or auto)<br />
adds the content of the working file as the first revision<br />
Unlike the pj ci command, the default behavior of the ci archive<br />
command is to delete the original file when it checks it in. This can be<br />
avoided by using the -l or -u options.<br />
170 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Importing Archives<br />
If you use the -l option when creating a new archive, <strong>Source</strong><br />
<strong>Integrity</strong> locks the first revision in your name and leaves a writable<br />
copy of the working file on your disk. With the -u option, the revision<br />
is not locked and a read-only copy of the working file is left.<br />
Example<br />
Importing Archives<br />
For more information, see<br />
“Importing Files” on page 148.<br />
To create a new archive for the prog.c file and retain a writable<br />
working copy of the file, enter<br />
ci -l prog.c<br />
This presents the message<br />
rcs\prog.c ><br />
<strong>The</strong> first line tells you an archive named prog.c will be created in the<br />
rcs directory of the current directory. <strong>The</strong> second line tells you the<br />
first revision will have revision number 1.1 and will be locked in your<br />
name.<br />
<strong>The</strong> rest of the message advises you can enter a description of the<br />
new archive by entering it at the >> prompt. <strong>The</strong> archive description<br />
can be of any length, and should describe the contents and purpose of<br />
the new archive.<br />
When you have entered the first line of the archive description, press<br />
. This presents another >> prompt where you can continue<br />
the description. To end the archive description, enter a single period<br />
at the >> prompt and press .<br />
If you are already using a revision control system such as SCCS or<br />
PVCS and want to move to <strong>Source</strong> <strong>Integrity</strong>, you can import your<br />
existing archives and convert them automatically to <strong>Source</strong> <strong>Integrity</strong><br />
format. Importing files preserves virtually all of the file and revision<br />
information contained in the SCCS or PVCS file format.<br />
You can also convert <strong>Source</strong> Safe archives to <strong>Source</strong> <strong>Integrity</strong> format.<br />
For more information, see the <strong>Source</strong> Safe to <strong>Source</strong> <strong>Integrity</strong><br />
conversion documentation on your CD-ROM.<br />
<strong>User</strong> <strong>Guide</strong> 171
Managing Archives and Revisions<br />
Checking Out Revisions From Archives<br />
When a revision is checked out from a sandbox or project, the<br />
location of the working file is determined at the project level. When<br />
you check out a revision directly from an archive, however, the<br />
location of the working file is calculated from the WorkToArch, or<br />
Archive Path and WorkPath settings.<br />
To check a revision out of an archive in the Windows interface:<br />
Use the Archive > Check Out command. You can specify the same<br />
check-out options that are available when you check out a member<br />
from a project (see “Checking Out a Member” on page 81).<br />
To check a revision out of an archive using the command line<br />
interface:<br />
Use the co command. Its syntax is<br />
co [options…] [-Pprojname] file…<br />
where options is zero or more modifying options (see the <strong>Source</strong><br />
<strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong> Reference <strong>Guide</strong> or the online man pages),<br />
-Pprojname is the name of the <strong>Source</strong> <strong>Integrity</strong> project file is a member<br />
of, and file is one or more files to check out. Named files may contain<br />
any level of path qualification.<br />
If the file being checked out is a member of a <strong>Source</strong> <strong>Integrity</strong> project,<br />
the -Pprojname option uses project file mapping information to locate<br />
archives. Whenever possible, use pj co when dealing with members<br />
of a project or sandbox.<br />
A revision can be checked out in one of two modes: locked or<br />
unlocked. If you intend to make changes to the revision, you should<br />
use the -l option to check it out locked; if you plan only to view or<br />
process the revision (for example, to build a software release), simply<br />
use co without the lock option.<br />
A revision that is checked out unlocked is copied to a read-only<br />
working file if a strict locking policy is in effect for the archive. In<br />
addition, with a strict locking policy, <strong>Source</strong> <strong>Integrity</strong> only lets you<br />
check in a file if it was first checked out locked.<br />
When strict locking is not in effect, check-in operations are<br />
unrestricted, provided no one else has a lock on the revision.<br />
For example, the command<br />
co prog.c<br />
172 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Checking Out<br />
by Revision<br />
Number or<br />
Label<br />
displays the message<br />
Checking Out Revisions From Archives<br />
rcs\prog.c --> prog.c<br />
revision: 1.4<br />
done<br />
<strong>The</strong> first line of the message tells you a revision was checked out of<br />
the prog.c archive (in the rcs directory of the current directory), and<br />
was copied to a working file named prog.c in the current directory.<br />
<strong>The</strong> second and third lines indicate the number of the revision that<br />
was checked out (that is, revision 1.4), and that the operation<br />
completed successfully.<br />
If you use the command<br />
co -l prog.c<br />
the second line of the message reads<br />
revision: 1.4 (locked)<br />
indicating the revision was checked out locked. When you check out<br />
a revision locked, <strong>Source</strong> <strong>Integrity</strong> copies it to an editable working<br />
file.<br />
By default, the co command checks out the head revision from an<br />
archive. <strong>The</strong> head revision is the most recent revision along the main<br />
development path of an archive. If you want to check out an earlier<br />
revision, use the -rrev option to the co command. Its syntax is<br />
co -rrev [-Pprojname] file…<br />
where rev is the revision number or label of the revision you want to<br />
check out.<br />
For example, to check out and lock the first revision in the prog.c<br />
archive, you would use the command<br />
co -r1.1 -l prog.c<br />
To check out the revision labeled “Release_1”, you would enter<br />
co -rRelease_1 -l prog.c<br />
Note If the revision number you specify is not found in the archive,<br />
<strong>Source</strong> <strong>Integrity</strong> checks out the revision whose revision number is closest<br />
to—and lower than—the number you supply.<br />
<strong>User</strong> <strong>Guide</strong> 173
Managing Archives and Revisions<br />
Checking Out<br />
by State Setting<br />
You can check out a particular revision by its state setting. You do this<br />
with the -sstate option to the co command. Its syntax is<br />
co [options] [-sstate] file<br />
where state is the state setting of a revision in the archive.<br />
Because state settings may not be unique within the archive, <strong>Source</strong><br />
<strong>Integrity</strong> scans the archive and checks out the revision closest to the<br />
default revision with this state setting.<br />
For example, to check out the most recent revision of prog.c with the<br />
state setting “proposed” you would enter<br />
co -sproposed prog.c<br />
Checking In Revisions to Archives<br />
When you are finished making changes to a working file that you<br />
checked out directly from the archive, you can archive the changed<br />
file as a new revision. If <strong>Source</strong> <strong>Integrity</strong> cannot find an archive for<br />
the file, it creates a new archive and adds the file as the first revision.<br />
To check a revision into an archive in the Windows interface:<br />
Use the Archive > Check In command. You can specify the same<br />
check-in options that are available when you check a member into a<br />
project (see “Checking In a Member” on page 87).<br />
To check a revision into an archive using the command line<br />
interface:<br />
Use the ci command. Its syntax is<br />
ci [options] [-Pprojname] file…<br />
where options is zero or more modifying options (see the <strong>Source</strong><br />
<strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong> Reference <strong>Guide</strong> or the online man pages),<br />
projname is the name of the <strong>Source</strong> <strong>Integrity</strong> project file belongs to, and<br />
file is one or more files to check in. Named files may contain any level<br />
of path qualification.<br />
If the file being checked in is a member of a <strong>Source</strong> <strong>Integrity</strong> project,<br />
the -Pprojname option updates the project in a manner similar to the<br />
pj ci command. Whenever possible, use pj ci to check in members<br />
of a project or sandbox.<br />
174 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Checking In—<br />
Setting Labels<br />
Checking In Revisions to Archives<br />
For example, to check in and lock a file named prog.c, which is also a<br />
member of a project in the current directory, you would enter<br />
ci -l -Pproject.pj prog.c<br />
This presents the message<br />
rcs\prog.c ><br />
<strong>The</strong> message reports the revision numbers of both the new revision<br />
and the previous revision.<br />
<strong>Source</strong> <strong>Integrity</strong> asks you to enter a description for the new revision.<br />
<strong>The</strong> revision description allows you to provide a record of changes as<br />
you make them and to explain why they were made.<br />
You add the revision description by entering it at the >> prompt and<br />
pressing . This presents another >> prompt. Repeat the<br />
process to enter as many lines of description as you choose.<br />
When you have completed the revision description, enter a single<br />
period at the >> prompt, and press .<br />
<strong>The</strong> -l option<br />
leaves a writable copy of the working file<br />
locks the revision in your name, so you can continue to make<br />
changes to it, but other users cannot<br />
You should use the -u option if you do not intend to edit the file<br />
immediately; this leaves a read-only copy of the file available. If<br />
neither option is used, <strong>Source</strong> <strong>Integrity</strong> checks in and immediately<br />
deletes the working file.<br />
For example, to check in prog.c and assign revision number 2.0 to<br />
the new revision, use the command<br />
ci -r2.0 prog.c<br />
You can set a label at check-in with the -N option to the ci command,<br />
or at any other time with the -N option to the rcs command.<br />
<strong>The</strong> -Nlabel option removes label from the revision it is currently<br />
attached to, and assigns it to the new revision being checked in. This<br />
operation has no other impact on the original revision.<br />
<strong>User</strong> <strong>Guide</strong> 175
Managing Archives and Revisions<br />
Checking In—<br />
State Settings<br />
For more information on this<br />
more structured use of state<br />
settings, consult the States<br />
configuration option and the<br />
Promote and Demote SAM<br />
permissions.<br />
For example, the following command reassigns the label “Revised” to<br />
the revision being checked in to prog.c archive.<br />
ci -u -NRevised prog.c<br />
To reassign a label from one existing revision to another in an archive,<br />
use the rcs command. To reassign the label “Revised” from another<br />
revision of prog.c to revision 1.1 of the same file, enter the command<br />
rcs -NRevised:1.1 prog.c<br />
At check-in time, state settings are added with the -sstate option to<br />
the ci command, where state is the state setting for the new revision.<br />
State settings can also be used to establish and enforce promotion<br />
policies at your site.<br />
For example, the command<br />
ci -sReview prog.c<br />
checks in prog.c and sets the state of the new revision to “Review”.<br />
Viewing and Editing Archive Information<br />
Just as it maintains metadata about each project member, <strong>Source</strong><br />
<strong>Integrity</strong> also maintains extra information about each archive, called<br />
archive information.<br />
In the Windows interface, you can view and edit information about<br />
an archive using the Archive > Archive Information command. Unlike<br />
most <strong>Source</strong> <strong>Integrity</strong> commands, which can be accessed from<br />
sandboxes and projects, this command is available only when an<br />
Archive window is active.<br />
To see an archive’s information:<br />
1. With an Archive window active, choose Archive > Archive<br />
Information, or click .<br />
<strong>The</strong> Archive Information dialog box appears.<br />
176 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
2. View or make changes to the archive information.<br />
Viewing and Editing Archive Information<br />
3. Click OK to save your changes, or Cancel to close the dialog box<br />
without making changes.<br />
You can view, but not change, the following archive information:<br />
Working File. <strong>The</strong> fully qualified name of the working file<br />
associated with the archive.<br />
Archive File. <strong>The</strong> fully qualified file name of the archive whose<br />
information is displayed.<br />
Labels. A listing of all revision labels in the archive and their<br />
associated revision numbers.<br />
Locks. A list of all users who have locks on revisions in the<br />
archive, the revisions they have locked, and the lock time.<br />
Projects. A list of all projects which use this archive as a member<br />
archive.<br />
You can edit the following options:<br />
Strict Locking. Selecting this option turns on strict locking for the<br />
archive.<br />
Compressed. Selecting this option causes the archive to be<br />
compressed.<br />
<strong>User</strong> <strong>Guide</strong> 177
Managing Archives and Revisions<br />
Encrypted. Selecting this option encrypts the archive. If you do<br />
so, when you click OK to leave the Archive Information dialog box,<br />
another box prompts you for an encryption password.<br />
Caution Do not forget the encryption password! Without it, data in<br />
the archive is unrecoverable.<br />
Data Type. Select the type of data stored in the archive. For a list<br />
of data types, see “Creating Archives” on page 167.<br />
Default Branch. Select the starting point of the default branch.<br />
Archive Description. Select text that describes the archive.<br />
Store By Reference. Selecting this option causes each revision to<br />
be saved to a separate file, instead of saving the entire archive to<br />
one file. This feature improves performance for archives that<br />
contain large binary files.<br />
Viewing and Editing Revision Information<br />
<strong>Source</strong> <strong>Integrity</strong> maintains detailed information for each revision in<br />
an archive. In the Windows interface, this revision information is<br />
displayed in columns in the Archive window. It can also be viewed<br />
and modified with the Revision Information command.<br />
To view and edit revision information in the Windows interface:<br />
1. Select a revision in the Archive window.<br />
2. Choose Archive > Revision Information, or click .<br />
<strong>The</strong> Revision Information dialog box appears.<br />
178 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Viewing and Editing Revision Information<br />
3. View or make changes to the archive information.<br />
4. Click OK to accept your changes, or Cancel to close the dialog box<br />
without making changes.<br />
Any changes you make are reflected in the Archive window.<br />
You can view, but not change, the following revision information:<br />
Revision. <strong>The</strong> revision number of the selected revision.<br />
Date. <strong>The</strong> revision timestamp.<br />
Author. <strong>The</strong> name of the user who checked in the revision.<br />
Locker. If the revision is locked, the name of the user who owns<br />
the lock appears here, as well as the date and time locked.<br />
You can edit the following options:<br />
State. <strong>The</strong> revision’s state appears here. You can assign a state to<br />
any revision, indicating the status of its content.<br />
Label. A list of labels assigned to the revision. When you check in<br />
a revision you have the option of assigning it a revision label.<br />
Labels allow you to describe a revision more fully than the<br />
revision number alone can do. Although revisions in the same<br />
archive cannot have identical labels, labels can be used to crossreference<br />
revisions in different archives.<br />
Revision Description. When you check in a revision, you can enter<br />
a free-form description of its purpose and function. This<br />
description can be used to provide context for the changes made<br />
to a file and is especially helpful in multi-user projects. You can<br />
append new comments onto a revision description. <strong>The</strong> date and<br />
user name are also included.<br />
<strong>User</strong> <strong>Guide</strong> 179
Managing Archives and Revisions<br />
For more information on<br />
using active issues, see<br />
“Integrated Version Control”<br />
on page 437.<br />
Viewing<br />
Revision<br />
Metadata With<br />
Archive<br />
Commands<br />
Active CI Issue. An active issue associated with the member<br />
revision. Active issues appear as hyperlinks with a brief<br />
description. To view the complete issue in the Change <strong>Integrity</strong><br />
Web interface, click on the hyperlink.<br />
You can view archive and revision metadata with the rlog command<br />
(there is an similar project command, pj rlog). Its syntax is<br />
rlog [options] file…<br />
where options is zero or more modifying arguments, and file is the<br />
name of one or more files whose metadata you want to see. <strong>The</strong> file<br />
entry may point to either working files or archives.<br />
When it is run with no options, the rlog command shows you all the<br />
archive and revision information contained in an archive.<br />
You can choose to view only archive related metadata by specifying<br />
the -t or -h options to the rlog command. <strong>Source</strong> <strong>Integrity</strong> can<br />
display the following pieces of information about each archive:<br />
name of the archive<br />
name of the associated working file<br />
revision number of the head revision<br />
number of the default branch (if defined)<br />
archive’s locking policy (strict or non-strict)<br />
names of users with locks on revisions<br />
names of users on the archive’s access list<br />
any labels assigned to revisions in the archive<br />
comment leader symbol<br />
total number of branches in the archive<br />
total number of revisions in the archive<br />
total number of branch revisions<br />
archive’s file format (text or binary)<br />
archive’s delta storage format (RCS or Reference)<br />
archive description<br />
Example<br />
For example, to see all the metadata about the prog.c archive and the<br />
revisions it contains, you would enter<br />
rlog prog.c<br />
180 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Viewing and Editing Revision Information<br />
<strong>The</strong> information displayed by this command would look something<br />
like the following (some text is wrapped):<br />
Archive file: C:/dev/prog\rcs\prog.c;<br />
Working file: C:/dev/prog/stories.txt<br />
head: 1.2<br />
branch:<br />
locks: SIUSER: 1.2; strict<br />
access list:<br />
symbolic names: Dev_1: 1.2;<br />
comment leader:<br />
total revisions: 2; branches: 0; branch revisions: 0<br />
file format: text<br />
revision storage: RCS reverse deltas<br />
project: C:/dev/prog/project.pj;<br />
description:<br />
This archive contains the routines for the product<br />
demo.<br />
--------------------------revision<br />
1.2 locked by: SIUSER;<br />
date: 1998/06/09 18:38:44; author: SIUSER; state: Exp;<br />
lines: +4 -0<br />
Added some features<br />
--------------------------revision<br />
1.1<br />
date: 1998/06/09 15:31:01; author: SIUSER; state: Exp;<br />
Initial revision<br />
--------------------------selected<br />
revisions: 2<br />
====================================================<br />
<strong>The</strong> first fourteen lines show the archive information, including the<br />
names of anyone who holds a lock on a revision, any labels in use,<br />
and the archive description.<br />
<strong>The</strong> remainder of the message shows metadata for each revision in<br />
the archive, including its timestamp, state, locker, and revision<br />
description. <strong>The</strong> information for each revision is separated by lines of<br />
dashes to make them easier to read.<br />
<strong>The</strong> last line of the rlog message shows the total number of revisions<br />
about which information was displayed (in this case, all of them).<br />
To see only the archive information for the prog.c archive, use the -t<br />
option with rlog.<br />
<strong>The</strong> -h option presents an abbreviated version of the archive<br />
information, leaving out the archive description.<br />
<strong>User</strong> <strong>Guide</strong> 181
Managing Archives and Revisions<br />
Locked<br />
Revisions<br />
<strong>The</strong> -H option restricts rlog output to information about the head<br />
revision of an archive.<br />
<strong>The</strong> -T option restricts rlog output to one line with basic information<br />
about the archive.<br />
For example, the command<br />
rlog -HT prog.c<br />
returns the message<br />
C:/dev/prog/prog.c 1.4 1995/05/29 10:46:40 SIUSER<br />
Release_1<br />
To determine which archives are currently undergoing change, you<br />
can look for those archives that contain locked revisions. This is<br />
accomplished with the -L[locker1[,locker2]] option to the rlog<br />
command.<br />
<strong>The</strong> -L option can be used alone, or modified with the names of one<br />
or more users. If it is used without user names, it presents archive and<br />
revision information for only those archives that contain locked<br />
revisions.<br />
For example, if you run the command<br />
rlog -L *<br />
rlog shows archive and revision information for every archive that<br />
contains one or more locked revisions. It produces the same long<br />
output displayed by rlog with no options.<br />
If one or more user names are specified with the -L option, rlog<br />
presents information for only those archives with revisions locked by<br />
the named users.<br />
For example<br />
rlog -Lsiuser *<br />
shows information for only those archives “Siuser” holds a lock in.<br />
Note <strong>The</strong> information returned by rlog can be abbreviated by including<br />
the -T option: rlog -TLsiuser *<br />
182 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Assigning Labels to Revisions<br />
Assigning Labels to Revisions<br />
Labels are unique text that describe and refer to a revision in an<br />
archive. Labels can be based on the product release the revision was<br />
included in, on the content of the revision, on changes made to the<br />
revision, or any other sort of information that would be useful in<br />
identifying that particular revision.<br />
Although you generally assign a label to a new revision upon check<br />
in, there may be times when you want to add an additional label, or<br />
change the label assigned to a revision.<br />
To view, add, change, or delete a revision’s label (or view or<br />
change a revision’s state) in the Windows interface:<br />
Use the Revision Information dialog box, as described in “Viewing<br />
and Editing Revision Information” on page 178.<br />
To add a label to a revision in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. Switch to the Member view for the selected member.<br />
2. Select the revision you want to add a label to, and select Add<br />
Label from the list of available commands.<br />
To delete a revision’s label in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. Switch to the Member view for the selected member.<br />
2. Select the revision with the label you want to delete, and select<br />
Delete Label from the list of available commands.<br />
To add a label to a revision in the command line interface:<br />
Use the -nlabel[:rev] option to the rcs command. Its syntax is<br />
rcs [options] [-nlabel[:rev]] [-P[projname]] file…<br />
where label is a unique revision label to assign to revision rev of file,<br />
and where rev is number of the revision label will be assigned to. If<br />
:rev is omitted, label is deleted from the archive of file.<br />
If label is already associated with another revision in the archive, rcs<br />
returns an error.<br />
For example, to add the label “Release_1” to revision 1.3 of the<br />
prog.c archive, you would enter<br />
rcs -nRelease_1:1.3 prog.c<br />
<strong>User</strong> <strong>Guide</strong> 183
Managing Archives and Revisions<br />
When the revision is updated with the new label, the rcs command<br />
displays the message<br />
done<br />
To assign a revision label to the head revision, simply specify the<br />
revision label followed by a colon (omitting the revision number).<br />
rcs -nRelease_1: prog.c<br />
To add a label that contains a space, place quotation marks around<br />
the label text.<br />
rcs -n “Release 1.x”:1.4 prog.c<br />
To delete a label from a revision in the command line interface:<br />
Use the -n option to the rcs command.<br />
For example, to delete the label “working” from the betting.c<br />
archive in the project.pj project, enter<br />
rcs -Pproject.pj -nworking betting.c<br />
Viewing and Editing the Working File or<br />
Revision<br />
When an Archive window is open in the Windows interface, you can<br />
view the contents of the working file or any revision in the list by<br />
double clicking it, or by selecting it and choosing the View Revision or<br />
View/Edit Working File command from the Archive or context menu, or<br />
from the toolbar.<br />
When the Archive window selector bar is over the working<br />
file, the View Revision command in the Archive menu changes<br />
to Edit Working File (or View Working File if it is read-only).<br />
To display a file or revision, the View Revision command launches<br />
your default editor and loads the working file or revision. <strong>The</strong> editor<br />
that gets launched depends on your Personal Configuration.<br />
Although it can be used to show the contents of any revision in an<br />
archive, this command is best used with the working file, since it<br />
provides a mechanism to open and edit the file without leaving the<br />
<strong>Source</strong> <strong>Integrity</strong> application environment.<br />
184 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Promoting and Demoting a Revision<br />
When you view a revision, <strong>Source</strong> <strong>Integrity</strong> copies the revision to a<br />
read-only temporary file and opens it for you.<br />
Note <strong>The</strong> temporary file is not the revision. If you make changes to the<br />
file and want to save it, you must give it a new file name since the<br />
original revision is read-only.<br />
To view a working file in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
Select the working file from the Sandbox view and choose Member<br />
Commands > View.<br />
To view a revision in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
Select the revision in the Member view and choose Commands > View.<br />
Promoting and Demoting a Revision<br />
If promotion is turned on, you can promote a revision to the next<br />
state of development or demote it to a lower state.<br />
In the Windows interface, if you select more than one member and<br />
promote or demote them, the state change is based on the first<br />
selected member. If the selected members are at different states from<br />
the first member, all members are brought to the new state.<br />
To promote a revision in the Windows interface:<br />
1. Select a revision in the Archive window.<br />
2. Choose Archive > Promote Revision.<br />
<strong>The</strong> Promote Revision dialog box appears.<br />
3. Select a new promotion state from the Promote to state dropdown<br />
list.<br />
<strong>User</strong> <strong>Guide</strong> 185
Managing Archives and Revisions<br />
4. Click OK to accept the new promotion state.<br />
To close the dialog box without changing the revision’s state,<br />
click Cancel.<br />
To demote a revision in the Windows interface:<br />
1. Select a revision in the Archive window.<br />
2. Choose Archive > Demote Revision.<br />
<strong>The</strong> Demote Revision dialog box appears.<br />
3. Select a new promotion state from the Demote to state drop-down<br />
list.<br />
4. Click OK to accept the new promotion state.<br />
To close the dialog box without changing the revision’s state,<br />
click Cancel.<br />
To promote or demote a revision in the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface:<br />
Select a revision from the Member view and choose Promote or<br />
Demote.<br />
To promote or demote a revision in the command line interface:<br />
Use the rcs command with the -s option. Its syntax is<br />
rcs -sstate[:rev]<br />
where rev is the revision number and state is the state. If rev is a<br />
branch number, the latest revision on that branch is assumed. If rev is<br />
omitted, the latest revision on the default branch is assumed.<br />
186 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Locking Revisions<br />
Unlocking Revisions<br />
Locking Revisions<br />
Revisions are normally locked at check-out time, but you can lock a<br />
revision without checking it out of the archive. Locking a revision<br />
ensures you alone are allowed to modify the revision.<br />
To lock a revision in the Windows interface:<br />
1. Select a revision in the Archive window.<br />
2. Choose Archive > Lock Revision.<br />
A padlock symbol ( ) appears next to the revision number to<br />
inform you the revision is locked, and your user name appears in<br />
the Locker column.<br />
To lock a revision in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
Select it in the Sandbox or Member view and choose Lock.<br />
To lock a revision in the command line interface:<br />
Use the rcs command with the -l option. Its syntax is<br />
rcs -l[rev]<br />
where rev is the revision number. If a branch is given, the latest<br />
revision on that branch is locked. If rev is omitted, the latest revision<br />
on the default branch is locked. Locking prevents overlapping<br />
changes.<br />
You can also unlock a revision without checking it back into the<br />
archive, but you will lose any changes you have made to the locked<br />
revision.<br />
If you attempt to unlock a revision that is locked by another user, a<br />
message warns you that you are about to break someone else’s lock.<br />
Breaking another user’s lock on a system that is enabled with<br />
<strong>User</strong> <strong>Guide</strong> 187
Managing Archives and Revisions<br />
Microsoft’s Messaging Application Program Interface results in a<br />
mail notification dialog box that lets you send email to the user<br />
whose lock you are breaking.<br />
Note Although you may not be prohibited from breaking some else’s<br />
lock, you should be cautious about doing so, since it can result in<br />
confusion and duplication of effort in shared working environments. For<br />
information on permissions, see “Security and Administration” on<br />
page 34.<br />
To unlock a revision in the Windows interface:<br />
1. Select a locked revision in the Archive window, one that has a<br />
padlock symbol ( ).<br />
2. Choose Archive > Unlock Revision or click .<br />
<strong>The</strong> padlock symbol and the name of the user who had the<br />
revision locked both disappear.<br />
To unlock a revision in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
Select a locked revision in the Member, Sandbox, or Project views and<br />
choose Unlock.<br />
To unlock a revision in the command line interface:<br />
Use the rcs command with the -u option. Its syntax is<br />
rcs -u[rev]<br />
where rev is the revision number. If a branch is given, the latest<br />
revision on that branch is unlocked. If rev is omitted, any revision<br />
locked by the user is unlocked. If no such revision exists, the most<br />
recent lock that has been set is removed, if there is one.<br />
188 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Deleting Revisions<br />
Deleting Revisions<br />
If you know you will not use a revision again, you can delete it.<br />
Caution Only delete a revision when you are absolutely certain you<br />
will never need it again. Once you delete a revision, it cannot be<br />
retrieved. A revision cannot be deleted if it locked or the starting point<br />
(root) of a branch. You should never delete the head revision of an<br />
archive.<br />
To delete a revision in the Windows interface:<br />
1. In the Archive window, select one or more revisions that you<br />
want to delete.<br />
2. Choose Archive > Delete Revision.<br />
A message box asks you to confirm the deletion.<br />
3. To remove the selected revision(s), click Yes or Yes to All.<br />
<strong>Source</strong> <strong>Integrity</strong> removes the revision(s) from the archive and<br />
updates the Archive window to show the revision(s) have been<br />
deleted from the archive.<br />
To remove the message box without deleting any revisions, click<br />
No or No to All.<br />
To delete a revision in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
Select the revision in the Member view and choose the Delete<br />
command.<br />
To delete a revision in the command line interface:<br />
Use -o option to the rcs command. Its syntax is<br />
rcs -o[range] file…<br />
where range specifies the revisions to be deleted, and file is one or<br />
more archives. <strong>The</strong> range modifier can take one of four forms:<br />
rev is the number of the revision to delete. For example, to delete<br />
revision 1.2 in the archive prog.c, enter<br />
rcs -o1.2 prog.c<br />
<strong>User</strong> <strong>Guide</strong> 189
Managing Archives and Revisions<br />
Comparing Revisions<br />
rev1-rev2 deletes all revisions from revision number rev1 to<br />
revision number rev2, inclusive, provided they are all on the same<br />
branch. For example<br />
rcs -o1.2-1.4 prog.c<br />
deletes revisions 1.2, 1.3 and 1.4 in the archive prog.c.<br />
rev1- deletes all revisions from rev1 to the end of the branch. If the<br />
tip revision of the branch is 1.2.1.3, the command<br />
rcs -o1.2.1.2- prog.c<br />
deletes revisions 1.2.1.2 and 1.2.1.3 in the archive prog.c.<br />
-rev2 deletes all revisions from the beginning of the branch<br />
containing rev2, up to and including revision number rev2. For<br />
example<br />
rcs -o-1.2.1.3 prog.c<br />
deletes revisions 1.2.1.1, 1.2.1.2 and 1.2.1.3 in the archive prog.c.<br />
When you are working with an evolving body of source files, you<br />
must be able to compare two files to see exactly how one differs from<br />
another. This can become necessary when you are developing on a<br />
branch or new development path, or when two people are working<br />
independently on the same problem.<br />
With <strong>Source</strong> <strong>Integrity</strong> you can compare<br />
any two text-based revisions in an archive<br />
a text-based revision and its associated working file in a sandbox,<br />
project, or archive<br />
any two text files<br />
<strong>The</strong> commands discussed in this section use the Visual Difference<br />
utility, which calculates the differences between files or revisions and<br />
displays them side by side in their own window, along with a<br />
summary of the differences between them. Using the Visual<br />
Difference utility, you can also interactively merge two files or<br />
revisions.<br />
Unlike most features of <strong>Source</strong> <strong>Integrity</strong>, the Visual Difference utility<br />
is not presented in the application window, but is a standalone<br />
Windows application that compares and merges files and revisions.<br />
190 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
To compare two revisions in the Windows interface:<br />
Comparing Revisions<br />
1. Select two revisions, or a revision and the working file from an<br />
Archive window. To select two revisions, select the first revision<br />
as usual, then hold down the key and click a second<br />
revision.<br />
2. Choose Archive > Differences > Compare, or click .<br />
<strong>The</strong> Visual Difference utility appears. Both revisions and a<br />
summary of the differences between them are shown in the<br />
Visual Difference window.<br />
To compare two revisions in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
In the Member view, select two revisions and choose Compare Two<br />
Revisions.<br />
To compare two revisions in the command line interface:<br />
Use the rcsdiff command. See the <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong><br />
<strong>Edition</strong> Reference <strong>Guide</strong> or the online command reference for the full<br />
syntax.<br />
<strong>User</strong> <strong>Guide</strong> 191
Managing Archives and Revisions<br />
Merging Revisions<br />
You can also use the Visual Difference utility to merge two revisions.<br />
To merge two revisions in the Windows interface:<br />
1. Select two revisions, or a revision and the working file from an<br />
Archive window. To select two revisions, select the first revision<br />
as usual, then hold down the key and click a second<br />
revision.<br />
2. Choose Archive > Differences > Merge, or click .<br />
<strong>The</strong> Visual Difference utility appears. Both revisions and a<br />
summary of the differences between them are shown in the<br />
Visual Difference window.<br />
To merge two revisions in the <strong>Source</strong> <strong>Integrity</strong> Web Interface:<br />
1. Switch to the Sandbox view (if you are not already there).<br />
A delta symbol appears next to the member revision in the<br />
Sandbox, signaling that the revision in your Sandbox does not<br />
match the member revision in the Project (because you checked<br />
out a previous revision and therefore made it the current revision<br />
in your Sandbox).<br />
2. Select Merge from the list of available commands.<br />
<strong>The</strong> Merge Working File dialog box appears, displaying the name<br />
of the current member, and the full path of the sandbox it is a<br />
member of.<br />
3. Confirm that you want to merge the working file with the<br />
member revision by clicking Yes in the Merge Working File dialog<br />
box.<br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface invokes the Visual Difference<br />
utility to display the differences between the two working files<br />
side-by-side.<br />
In both the Windows interface and <strong>Source</strong> <strong>Integrity</strong> Web Interface, a<br />
working file delta now appears next to the revision in the Sandbox<br />
view, signaling that the working file has changed as a result of the<br />
merge. To preserve these changes, check them in as a new revision in<br />
the member’s archive.<br />
192 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Logging Archive Transactions<br />
To merge two revisions in the command line interface:<br />
Use the rcsmerge command. See the <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong><br />
<strong>Edition</strong> Reference <strong>Guide</strong> or the online command reference for the full<br />
syntax.<br />
Logging Archive Transactions<br />
For information about logging<br />
project transactions, see<br />
“Logging Project<br />
Transactions” on page 142.<br />
<strong>Source</strong> <strong>Integrity</strong> keeps track of the transactions it performs upon<br />
archives, as long as you have a log file named in the SAM database<br />
or your personal configuration.<br />
Most sites turn it on within SAM to ensure standard logging<br />
procedures are applied site wide. By default, logging is turned off. To<br />
have it turned on site wide, contact your SAM administrator.<br />
This archive transaction log includes contains a record of all check-in<br />
and check-out (locked) operations on revisions of archives.<br />
Note This functionality is not available in the <strong>Source</strong> <strong>Integrity</strong> Web<br />
Interface.<br />
To enable logging locally in the Windows interface:<br />
1. Choose Configuration > Personal and click the Logging tab.<br />
2. Select the Enable Logging checkbox.<br />
3. Enter the name of the log file in the Filename box. <strong>The</strong> name can<br />
be fully qualified or relative to the current directory. Using a fully<br />
qualified, absolute file name ensures only one log file is created to<br />
log <strong>Source</strong> <strong>Integrity</strong> operations.<br />
4. Click OK to accept these settings, or Cancel to close the dialog box<br />
without making any changes.<br />
To enable logging locally in the command line interface:<br />
Use the pj set command as follows:<br />
pj set “logfile=filename”<br />
where filename is either fully qualified or relative to the current<br />
directory. Using a fully qualified, absolute file name ensures only one<br />
log file is created to log <strong>Source</strong> <strong>Integrity</strong> operations.<br />
<strong>User</strong> <strong>Guide</strong> 193
Managing Archives and Revisions<br />
Log File Format<br />
You can also insert the following line in your local configuration file<br />
(rcs.rc or rcs.c):<br />
logfile=filename<br />
Each archive transaction recorded in a log file occupies a single line,<br />
or record. Information within each record is divided into fields, each<br />
describing one aspect of the archive transaction.<br />
You can customize logfile records with the LogFormat configuration<br />
option in SAM or in your personal configuration.<br />
By default, archive transactions contain six fields.<br />
Field Description<br />
Field 1 <strong>The</strong> operation performed (for example, ci or co, same<br />
for command line interface, Windows interface, or<br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface).<br />
Field 2 <strong>The</strong> user’s login name.<br />
Field 3 <strong>The</strong> revision number affected by the command.<br />
Field 4 <strong>The</strong> name of the affected archive.<br />
Field 5 <strong>The</strong> current date and time in the format<br />
yyyy.mm.dd hh:mm:ss<br />
Field 6 <strong>The</strong> name of the person who holds the lock on the<br />
affected revision.<br />
This corresponds to the default LogFormat value of<br />
%C %u %r %f %D %l<br />
Typical output from this initial setting appears as<br />
ci siuser 2.4 prog.c 1999.03.12 14:21:32 siuser<br />
You can alter the LogFormat value to record different information.<br />
For example, the following LogFormat statement could be used to<br />
record the command that was executed, the archive file name and<br />
revision number involved, and the date of the revision.<br />
LogFormat=%C: %f Rev %r on %d<br />
<strong>The</strong> output from this entry would appear as<br />
ci: prog.c Rev 2.4 on 99/06/12 09:21:32<br />
194 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Cleaning Up<br />
Log Files<br />
Cleaning Up Working Files<br />
For a detailed description, see<br />
the online reference for the<br />
rcsclean command.<br />
Cleaning Up Working Files<br />
<strong>The</strong> easiest way to clean up a log file is to delete the file. <strong>Source</strong><br />
<strong>Integrity</strong> automatically creates a new one the next time it records an<br />
archive transaction. You can also open the log file in a text editor and<br />
delete transaction records. For instance, you could delete transaction<br />
records that are greater than a particular number of days or weeks<br />
old.<br />
<strong>The</strong> rcsclean command compares the most recent revision of a file<br />
to its working file and deletes the working file if it has not changed<br />
since it was checked out. To clean up unused working files in a<br />
sandbox or project, use pj clean.<br />
<strong>The</strong> syntax for rcsclean is<br />
rcsclean file…<br />
where file is one or more files to be examined.<br />
<strong>Source</strong> <strong>Integrity</strong> normally makes a working file writable when you<br />
have a lock on the revision it was generated from. If rcsclean finds<br />
the working file is read-only, it assumes you do not have a lock on the<br />
revision and so removes the working file, if it has not changed. If you<br />
had explicitly locked the revision (using pj lock or rcs -l),<br />
rcsclean will not clear this lock.<br />
Note This functionality is available only in the command line interface.<br />
<strong>User</strong> <strong>Guide</strong> 195
Managing Archives and Revisions<br />
Storing Binary Files in Reference Format<br />
If you want to store large binary files in your archives, using <strong>Source</strong><br />
<strong>Integrity</strong>’s traditional RCS archive format will result in very large<br />
archives and decreased performance. When storing binary files in<br />
archives, you should use the Reference archive format instead. With<br />
the Reference format, <strong>Source</strong> <strong>Integrity</strong> stores complete revisions<br />
instead of just deltas between revisions. It also stores each revision in<br />
a separate file; the archive itself contains only header and summary<br />
information. Archives stored in this format require more disk space,<br />
but have improved performance.<br />
To change archive formats in the Windows interface:<br />
Select the Store By Reference option in the Archive Information dialog<br />
box.<br />
To change archive formats in the command line interface:<br />
Use the rcs command to change archive formats.<br />
rcs -S RCS|Reference file<br />
196 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Using Extensions<br />
For instructions on installing<br />
extensions and a complete list<br />
of the supported host<br />
environments, see the <strong>Source</strong><br />
<strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong><br />
Administrator <strong>Guide</strong>.<br />
7<br />
<strong>Source</strong> <strong>Integrity</strong> Extensions transparently blend the <strong>Source</strong> <strong>Integrity</strong><br />
functionality into the Integrated Development Environments (IDEs)<br />
you use, allowing you to work within your favorite development<br />
environment. <strong>Source</strong> <strong>Integrity</strong> Extensions enable you to access the<br />
functionality available in the core product, right from within the host<br />
environment.<br />
This chapter explains how <strong>Source</strong> <strong>Integrity</strong> interacts with your IDEs,<br />
and gives more specific information about interacting with the<br />
following host environments:<br />
Microsoft Developer Studio 97 (Visual C++, Visual J++, Visual<br />
Basic, Visual FoxPro)<br />
Borland Delphi and 3.0 and 4.0<br />
Microsoft Windows Explorer<br />
<strong>User</strong> <strong>Guide</strong> 197
Using Extensions<br />
Introduction to <strong>Source</strong> <strong>Integrity</strong> Extensions<br />
<strong>Source</strong> <strong>Integrity</strong> Extensions provide seamless access to many<br />
features, including:<br />
Create Project<br />
Take files that form a single body of work and group them in a<br />
related project. <strong>Source</strong> <strong>Integrity</strong>’s project-oriented approach to<br />
configuration management makes it easier to control the<br />
evolution of your files.<br />
Create Sandbox<br />
A reflection of the master project, a sandbox provides a way for<br />
you to work in a personal, protected workspace without<br />
interfering with the master project. This way, changes can be<br />
made and tested before being merged into the master project.<br />
Create Variant Sandbox<br />
If you want to work with a particular revision of the project to<br />
maintain past releases of a product, you can create a variant<br />
sandbox and work without interference on your own<br />
development path.<br />
Add Members<br />
Manage files not in the IDE project. Help files, databases, and<br />
other related files can be added to the same project as your IDE<br />
files.<br />
Check In<br />
Add a new revision of the file to its archive. <strong>The</strong> new revision<br />
becomes the archive’s head revision unless you check in the file<br />
to a revision other than the head revision, in which case a new<br />
branch is created. For IDEs that have associated files such as .FRM<br />
and .FRX files in Visual Basic, or .DFM and .PAS files in Borland<br />
Delphi, <strong>Source</strong> <strong>Integrity</strong> ensures all related files are checked in<br />
and out together.<br />
Check Out<br />
Extract the contents of a revision in an archive and copy it to a<br />
working file. Any revision can be checked out by its revision<br />
number or label. After being checked out, working files are<br />
automatically reloaded in the host environment or IDE.<br />
Configuration<br />
Customize the Extensions to work the way you want them to<br />
work, right from within each host environment or IDE. For<br />
example, you can decide whether or not the Check Out command<br />
198 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> Project<br />
Window<br />
Introduction to <strong>Source</strong> <strong>Integrity</strong> Extensions<br />
automatically checks out the selected files, or if a dialog box is<br />
displayed for each file, allowing you to check out old revisions.<br />
Run <strong>Source</strong> <strong>Integrity</strong><br />
If you require functionality not available through the <strong>Source</strong><br />
<strong>Integrity</strong> extensions, open the <strong>Source</strong> <strong>Integrity</strong> application with<br />
the <strong>Source</strong> <strong>Integrity</strong> project associated with your current IDE<br />
project already loaded.<br />
Context-sensitive Help<br />
Get Help for individual controls and fields within each dialog<br />
box. You can also choose to view useful hints as your mouse<br />
pointer passes over dialog box fields and functions.<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> Project Window gives you control over the<br />
<strong>Source</strong> <strong>Integrity</strong> Project associated with your current IDE project,<br />
from within the IDE. Operations on the <strong>Source</strong> <strong>Integrity</strong> project and<br />
its members are synchronized between the <strong>Source</strong> <strong>Integrity</strong> project<br />
window and the IDE, allowing you to focus on the <strong>Source</strong> <strong>Integrity</strong><br />
project without losing touch with the related IDE project. <strong>The</strong> tool bar<br />
provides quick access to the most commonly used functions in the<br />
<strong>Source</strong> <strong>Integrity</strong> project window.<br />
If you want to hide the toolbar while you work on your IDE project,<br />
de-select Toolbar in the View menu. Simply select Show Toolbar to<br />
display the toolbar once again.<br />
<strong>The</strong> project window contains a list of members in the sandbox or<br />
project, with fields you can easily sort. <strong>Source</strong> <strong>Integrity</strong> subprojects<br />
are now supported within the extensions, allowing you to treat a<br />
<strong>Source</strong> <strong>Integrity</strong> project as a member of the current project.<br />
<strong>User</strong> <strong>Guide</strong> 199
Using Extensions<br />
Using Filters Within the Project Window<br />
As your <strong>Source</strong> <strong>Integrity</strong> projects grow, you will find it increasingly<br />
difficult to find and select the specific members you need to work<br />
with at a given time. In addition to sorting by fields, the project<br />
window offers an optional drop-down list of built-in filters that allow<br />
you to focus your view on a particular subset of project members you<br />
are currently interested in. Once you select a particular filter, only<br />
those members that meet the criteria specified by the filter are<br />
displayed.<br />
Here is a list of the built-in filters provided, and what it means to<br />
apply each of them.<br />
All Members displays all members in the current project or<br />
sandbox (the default).<br />
Modified Members displays all members that have a working file<br />
that has been modified.<br />
Out-Of-Synch members displays all members whose member<br />
revision is not currently at head revision.<br />
Locked displays all members that are currently locked.<br />
Locked By Me displays all members that are currently locked in<br />
your name.<br />
Frozen Members displays all members that are currently frozen.<br />
Subprojects displays all members that are projects themselves.<br />
Members With Label displays all members that currently have a<br />
particular label associated with them. After choosing this filter,<br />
specify the label you want to base your selection on by selecting it<br />
from the drop-down list of available labels.<br />
Members With State displays all members that are currently<br />
associated with a particular state. After choosing this filter,<br />
specify the state you want to base your selection on by selecting it<br />
from the drop-down list of available states.<br />
200 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Introduction to <strong>Source</strong> <strong>Integrity</strong> Extensions<br />
<strong>The</strong> member list provides the following information on each member:<br />
Field Description<br />
Type Project members may be one of three file types:<br />
Archived (under revision control)<br />
Non-Archived (not under revision control); nonarchived<br />
members can only be added from within<br />
the <strong>Source</strong> <strong>Integrity</strong> application<br />
Subproject<br />
If you freeze a member, a snowflake alerts you to the<br />
state of the file. <strong>The</strong> description “Frozen Member” also<br />
appears at the bottom of the window. Freezing prevents<br />
member information from being updated. Thawing<br />
removes the frozen state so changes can again be<br />
made to the project file or member information.<br />
When there is a delta symbol in a member listing, this<br />
means the member’s archive or working file has<br />
changed.<br />
This delta symbol means your working file has<br />
changed.<br />
This delta symbol means the member archive has<br />
later revisions available.<br />
A question mark in the delta field means the member<br />
has not been scanned for changes, a Configuration<br />
option in the Preferences panel. Select the member and<br />
choose Member > Scan For Changes to search for<br />
any changes to the member archive or working file, or<br />
choose Window > Refresh to scan all members of a<br />
project for changes.<br />
Member Name <strong>The</strong> full path name of the member’s working file.<br />
Locked If the member revision is locked, the name of the<br />
locker appears beside a padlock symbol.<br />
Revision <strong>The</strong> revision number associated with the member<br />
revision in your sandbox or master project.<br />
State <strong>The</strong> development state associated with the member<br />
revision.<br />
Labels Any labels assigned to the member revision.<br />
<strong>User</strong> <strong>Guide</strong> 201
Using Extensions<br />
<strong>The</strong> Information Area below the list of members displays information<br />
about a selected member. For example, if the member revision’s<br />
working file has been updated but not checked in, a message alerts<br />
you that the working file is newer than the member revision. Other<br />
information displayed includes: locker name, member frozen, and<br />
member not scanned for changes.<br />
If you want to hide this Information Area while you work on your<br />
IDE project, de-select Information Area from the View menu.<br />
Member Menu Commands<br />
<strong>The</strong> Member menu contains commands that act upon members.<br />
Member-specific functionality is also accessible using the right-click<br />
context menu. Select a member and click your right mouse button to<br />
display a pop-up menu of actions you can perform on the selected<br />
item.<br />
Note Commands that are not available in the SCC Project window are<br />
marked with the text “Not in SCC” in the margin.<br />
Not in SCC. Check In checks in all selected files to their archive, provided they<br />
are locked by you.<br />
Not in SCC. Check Out checks out all selected files. If you already have a<br />
selected file checked out, you will be asked if you want to<br />
overwrite your working copy. If you choose to do so, any changes<br />
made in your original working copy will be lost.<br />
Not in SCC. Undo Checkout unlocks a revision that was previously checked<br />
out locked (in your name), and resynchronizes it, so the working<br />
file once again reflects the member revision.<br />
Not in SCC. Resynchronize reverts selected files you have checked out to their<br />
state prior to modification and reflects the change in your IDE.<br />
Select selects all, locked, or changed members.<br />
Label adds a label to the member revision of the selected file. If<br />
multiple files are selected for this operation, the label chosen will<br />
apply to all files.<br />
Differences opens the Visual Difference utility on the selected text<br />
file. You can determine where the file has changed since check<br />
out, by displaying a side-by-side comparison of the selected file<br />
with another revision.<br />
202 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Introduction to <strong>Source</strong> <strong>Integrity</strong> Extensions<br />
Not in SCC. Unlock removes a lock you own from the member revision of a<br />
selected member without changing the member revision or<br />
working file.<br />
Scan for Changes scans selected members to search for any<br />
changes to the member archive or working file. If<br />
<strong>Source</strong> <strong>Integrity</strong> detects changes in either the member archive or<br />
working file, the appropriate delta symbol appears next to the<br />
changed member.<br />
By default, <strong>Source</strong> <strong>Integrity</strong> scans each project member to search<br />
for changes. You can disable this feature by de-selecting the Scan<br />
Members on Open Project/Sandbox option in the Preferences<br />
panel of the Personal Configuration dialog box.<br />
Upon opening a project or sandbox with this option disabled,<br />
<strong>Source</strong> <strong>Integrity</strong> displays a question mark in the delta column,<br />
and reports “Member not scanned for changes” in the<br />
Information Area at the bottom of the Project window.<br />
Choose Window > Refresh to scan all members of a project for<br />
changes.<br />
Open Member Archive opens a member’s Archive window,<br />
allowing you to view and compare all revisions.<br />
Member Information opens a dialog box that displays the project<br />
or sandbox the member is a part of, and the full path of both the<br />
working file and archive location.<br />
You may also use the Member Information dialog box to append<br />
the Revision Description associated with the revision, and add,<br />
edit, or delete labels associated with the revision.<br />
Member Report opens a window that presents information stored<br />
in the archive about the selected member. See who created a new<br />
revision, when it was created, its state, any labels assigned to the<br />
revision, the master project or sandbox it is a part of, and the full<br />
path of the archive location.<br />
Open Subproject displays the members of the selected subproject<br />
in the Project window.<br />
Promote promotes the state of the selected member revisions to a<br />
state you choose. You must define the promotion states in<br />
Personal Configuration (Promotion panel) in order to make them<br />
available in the Promote Member dialog box’s drop-down list.<br />
Your SAM administrator can also define promotion states.<br />
This command is available only when promotion is enabled in<br />
Configuration.<br />
<strong>User</strong> <strong>Guide</strong> 203
Using Extensions<br />
Demote demotes the state of the selected member revisions to a<br />
state you choose. You must define the promotion states in<br />
Configuration (Promotion panel), in order to make them available<br />
in the Demote Member dialog box’s drop-down list.<br />
This command is available only when promotion is enabled in<br />
Configuration.<br />
Freeze freezes the member in its current state to prevent changes<br />
being made to the member revision. For example, you cannot<br />
update the member revision or change the member type for a<br />
frozen member. You can still check in and check out frozen<br />
members, but the member revision in the master project or<br />
sandbox will not change.<br />
Thaw removes freezing so changes can be made to the member<br />
revision in the master project or sandbox.<br />
Not in SCC. Lock locks the member revision of selected members, without<br />
changing the member revision or working file (that is, without<br />
checking out the revision to a working file). This prevents others<br />
from modifying the file.<br />
Not in SCC. Unlock removes a lock from a revision without checking it in (and<br />
thereby creating a new revision). Since strict locking is enforced<br />
in the IDE Extensions, you can only remove a lock you own. By<br />
removing a lock on a file that is checked out and modified, you<br />
risk losing these modifications. If the file is checked out again<br />
before it is checked in, the user receives the unmodified revision.<br />
Not in SCC. Remove Unused Locks removes any locks you own from files that<br />
have not changed since you locked them. This allows you to<br />
safely free up files for other people to work on.<br />
Not in SCC. Update to Tip Rev, for all selected members, replaces the member<br />
revision with the latest revision in the branch your member<br />
revision is on.<br />
Not in SCC. Update to Head Revision, for all selected members, replaces the<br />
member revision with the latest revision from the main branch of<br />
that member’s archive.<br />
Project Menu Commands<br />
All of these commands appear in the SCC Project window.<br />
Open Project Archive opens the current project’s Archive window,<br />
allowing you to view and compare project revisions.<br />
Checkpoint Project saves the current state of your project. You can<br />
restore it later by creating a variant sandbox.<br />
204 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Introduction to <strong>Source</strong> <strong>Integrity</strong> Extensions<br />
Project Information displays the master project name, the project<br />
name, the number of members, the number of locked members, a<br />
project description, and a list of development paths.<br />
Project Report opens a window that displays information stored<br />
in the archive about the <strong>Source</strong> <strong>Integrity</strong> project.<br />
Promote Project promotes the state of the project to a state you<br />
choose.<br />
Demote Project demotes the state of the project to a state you<br />
choose.<br />
Freeze Project freezes a project in its current state. You cannot add<br />
or remove project members, or change Configuration settings for<br />
a frozen project. You can still check out and check in members of<br />
a frozen project, but the member revision in the master project or<br />
sandbox will not change.<br />
Thaw Project removes freezing so changes can be made to the<br />
project.<br />
Add Members allows you to add files to the <strong>Source</strong> <strong>Integrity</strong><br />
project.<br />
Remove Members removes the member selected in the member<br />
list from the <strong>Source</strong> <strong>Integrity</strong> project. <strong>The</strong> working file and the<br />
member archive remains, but the file is no longer treated as part<br />
of the project.<br />
Open Parent opens the parent project associated with the<br />
subproject currently selected in the Project window.<br />
Window Menu Command<br />
Refresh updates both the Project Window and any files open in<br />
your IDE with the latest information.<br />
Right-click a project member or revision to display a pop-up menu of<br />
actions you can perform on the selected item.<br />
<strong>User</strong> <strong>Guide</strong> 205
Using Extensions<br />
<strong>The</strong> Archive<br />
Window<br />
When you open an archive, <strong>Source</strong> <strong>Integrity</strong> displays information<br />
about the revisions in the archive. <strong>The</strong> Archive window contains a<br />
selectable list with entries for the working file (if one exists), and each<br />
revision in the archive.<br />
<strong>The</strong> toolbar provides quick access to the most commonly used<br />
functions in the Archive Window. If you want to hide the toolbar<br />
while you work on your IDE project, de-select Toolbar in the View<br />
menu.<br />
In the Archive window, you can view and compare revisions, as well<br />
as launch the <strong>Source</strong> <strong>Integrity</strong> application. Right-click on an archive<br />
revision in an Archive window to display a pop-up menu of actions<br />
you can perform on the selected item.<br />
206 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Introduction to <strong>Source</strong> <strong>Integrity</strong> Extensions<br />
Each entry in the list contains information about a single revision in<br />
the archive. This information is displayed in columns with the<br />
following heading:<br />
Column Description<br />
Revision Revision number.<br />
Author <strong>User</strong> who checked in the revision.<br />
Date Date and time the revision was checked in.<br />
Locked <strong>User</strong> name of the person who locked the revision.<br />
State Revision’s state setting.<br />
Labels Labels attached to the revision.<br />
<strong>The</strong> Information area below the list of revisions displays the Revision<br />
Description for the currently selected revision.<br />
If you want to hide the toolbar while you work on your IDE project,<br />
de-select Toolbar in the View menu.<br />
<strong>The</strong> first entry in the Archive Window is the archive’s working file (if<br />
one exists). <strong>The</strong> entry shows the path name of the working file.<br />
If the working file can be edited, the entry is preceded by a pencil<br />
icon ( ). If the working file is read-only, the pencil icon is crossed<br />
out in red.<br />
<strong>User</strong> <strong>Guide</strong> 207
Using Extensions<br />
Archive Menu Commands<br />
Note Commands that are not available in the SCC Archive window are<br />
marked with the text “Not in SCC” in the margin.<br />
Not in SCC. Check In checks in the selected working file to an archive,<br />
provided the revision is locked by you.<br />
Not in SCC. Check Out checks out the selected revision from its archive,<br />
provided the revision is not locked by someone else. If you<br />
already have a revision checked out, you will be asked if you<br />
want to overwrite your working copy. If you choose to do so, any<br />
changes made to your original working file will be lost.<br />
Not in SCC. Undo Check Out unlocks a revision that was previously checked<br />
out locked (in your name), and resynchronizes it, so the working<br />
file once again reflects the member revision.<br />
View Revision displays the contents of the selected revision in its<br />
associated application (for example, Notepad).<br />
Compare Revisions opens the Visual Difference utility and<br />
displays a side-by-side comparison of the selected revisions. This<br />
allows you to visually determine the differences between the two<br />
revisions. You can also compare the working file to a revision by<br />
selecting the working file and a revision.<br />
Not in SCC. Lock Revision allows you to place a lock on the selected revision,<br />
without checking it out of the archive. This prevents others from<br />
modifying the revision.<br />
Not in SCC. Unlock Revision removes a lock from a revision without checking<br />
it in to the archive (and thereby creating a new revision). Since<br />
strict locking is enforced in the IDE Extensions, you can only<br />
remove a lock that you own. By removing a lock on a revision<br />
that is checked out and modified, you risk losing these<br />
modifications. If the revision is checked out again before it is<br />
checked in, the user receives the unmodified revision.<br />
Set Default Branch opens a dialog box in which you can set the<br />
default branch to which <strong>Source</strong> <strong>Integrity</strong> will check in your files.<br />
View Menu Commands<br />
<strong>The</strong> following commands appear in the SCC window:<br />
Stay On Top causes the Archive Window to remain visible while<br />
you work on your IDE project.<br />
208 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Using the Extensions<br />
Using the Extensions<br />
Tool Bar displays the Archive Window toolbar, which provides<br />
easy access to the most commonly used archive commands.<br />
Information Area shows the area below the list of revisions, which<br />
displays information about a selected revision.<br />
Window Menu Command<br />
Refresh gets the latest archive and working file information and<br />
updates the <strong>Source</strong> <strong>Integrity</strong> Archive window.<br />
Follow these basic steps to use <strong>Source</strong> <strong>Integrity</strong>:<br />
1. Create a <strong>Source</strong> <strong>Integrity</strong> project.<br />
Add your IDE project to source control by creating a<br />
<strong>Source</strong> <strong>Integrity</strong> project using the IDE.<br />
2. Add project members.<br />
Add IDE project files to the <strong>Source</strong> <strong>Integrity</strong> project.<br />
<strong>Source</strong> <strong>Integrity</strong> automatically checks in and creates an archive<br />
for each file added.<br />
3. Check out files as you need them.<br />
<strong>Source</strong> <strong>Integrity</strong> creates a working file from the selected revision<br />
in the archive.<br />
4. Make changes to the project members from within the IDE.<br />
5. Check in modified files.<br />
This creates a new revision in the member’s archive. <strong>The</strong> new<br />
revision becomes the archive’s head revision unless you<br />
specifically check in the file to a revision other than the head<br />
revision. When you check in a file to a revision other than the<br />
head revision, a new branch is created.<br />
<strong>User</strong> <strong>Guide</strong> 209
Using Extensions<br />
Differences Between Extensions and<br />
<strong>Source</strong> <strong>Integrity</strong><br />
Creating<br />
Projects<br />
When you create a master project, you should create the project at the<br />
top level of the directory tree that contains your files. <strong>Source</strong> <strong>Integrity</strong><br />
projects work best when all project members reside in a single<br />
directory tree under the project directory.<br />
With <strong>Source</strong> <strong>Integrity</strong><br />
As you create a new project, you can also create a sandbox, add<br />
members, and create archives for both the project members and the<br />
project itself. <strong>Source</strong> <strong>Integrity</strong> wizards now lead you through the<br />
process of creating projects and sandboxes.<br />
Once you select a project location and enter the full path names of the<br />
new project and sandbox, the remainder of the Create Project dialog<br />
box is used to add members to the new project, and to create archives<br />
for both the project and its new members.<br />
With the Extensions<br />
When you create a <strong>Source</strong> <strong>Integrity</strong> project using the Extensions, the<br />
process is different. <strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> project or sandbox is<br />
automatically created in the same directory where your IDE project<br />
resides.<br />
Notice that the Create Project dialog box is different.<br />
1. Type an initial optional comment to associate with the new<br />
<strong>Source</strong> <strong>Integrity</strong> project in the area provided.<br />
2. Select one of two options for project creation:<br />
210 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Differences Between Extensions and <strong>Source</strong> <strong>Integrity</strong><br />
Master Project Only creates a new <strong>Source</strong> <strong>Integrity</strong> project and<br />
archive directory in the same directory as your IDE project.<br />
Master Project and Sandbox creates a <strong>Source</strong> <strong>Integrity</strong><br />
sandbox in your current IDE project directory, and creates a<br />
master project and archive in a directory of your choice. If<br />
you choose this option, another dialog box appears,<br />
prompting you for a Master Project Location.<br />
<strong>The</strong> Add Project Members dialog box appears after having<br />
determined the <strong>Source</strong> <strong>Integrity</strong> project’s location. It presents a<br />
list of all files in the IDE project.<br />
Note <strong>The</strong> dialog box that appears may differ slightly depending on the<br />
IDE.<br />
If there are files you do not want to place under version control, select<br />
them and click Remove. If you want to add files to the<br />
<strong>Source</strong> <strong>Integrity</strong> project that are not members of the corresponding<br />
<strong>User</strong> <strong>Guide</strong> 211
Using Extensions<br />
Creating<br />
Sandboxes<br />
IDE project, click Add to browse for and select these files. Once you<br />
have the list of files you want, click OK. All listed files are archived<br />
and added to the <strong>Source</strong> <strong>Integrity</strong> project.<br />
You can create a sandbox for a project while you are creating the<br />
project, but you can also create a sandbox later. Use the Create<br />
Sandbox command.<br />
With <strong>Source</strong> <strong>Integrity</strong><br />
<strong>Source</strong> <strong>Integrity</strong> wizards now lead you through the process of<br />
creating projects and sandboxes.<br />
With the Extensions<br />
When you create a <strong>Source</strong> <strong>Integrity</strong> sandbox using the Extensions, the<br />
process is different.<br />
Notice that the Create Sandbox dialog box is different.<br />
If you have a project open in the IDE that has an associated<br />
<strong>Source</strong> <strong>Integrity</strong> project, the Master Project Name field will contain the<br />
path to this master project. You may edit this field if you want to<br />
create a sandbox for a different project.<br />
1. In the Sandbox Location field, enter the directory path you want<br />
to place your sandbox in.<br />
Note Relative path names in the Sandbox Location field are taken in<br />
relation to the path given in the Master Project Name field.<br />
212 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Differences Between Extensions and <strong>Source</strong> <strong>Integrity</strong><br />
2. If you want to work with a particular project revision in the<br />
sandbox, enable the Create Variant Sandbox check box. When you<br />
click OK in this case, the Create Variant Sandbox dialog box<br />
appears, wherein you may select a revision by number or by<br />
label.<br />
Sometimes you must include files in directories that are not part of<br />
the master project directory tree. <strong>The</strong>se files are called out-of-tree<br />
members because they are located outside of the main directory tree.<br />
<strong>Source</strong> <strong>Integrity</strong> normally places out-of-tree members in the root<br />
directory of the sandbox (that is, the directory containing the<br />
sandbox.pj file). However, in order to preserve relative path<br />
associations, you have the option of specifying where the files in the<br />
external directory should be placed in the sandbox.<br />
When a sandbox is created from such a Master Project, the Create<br />
Sandbox Directory dialog box appears.<br />
<strong>User</strong> <strong>Guide</strong> 213
Using Extensions<br />
If you have a project open in the IDE that has an associated<br />
<strong>Source</strong> <strong>Integrity</strong> project, Master Project displays the path for this<br />
master project.<br />
Sandbox displays the name and path of the sandbox associated<br />
with the current <strong>Source</strong> <strong>Integrity</strong> project.<br />
Project Directory displays the name and path of the directory that<br />
contains out-of-tree members (ones that are not part of the project<br />
directory tree).<br />
Fill in the Create Sandbox Directory dialog box as follows:<br />
1. In the Sandbox Directory field, enter the full path where you want<br />
to put files in this directory. If the specified directory does not<br />
already exist, <strong>Source</strong> <strong>Integrity</strong> creates it for you.<br />
2. Click Create to make the new directory. If you want<br />
<strong>Source</strong> <strong>Integrity</strong> to place the out-of-tree members in the root<br />
directory of the sandbox (as it would by default), click Skip.<br />
Microsoft Visual Basic 5.0 and 6.0<br />
This section describes how to access <strong>Source</strong> <strong>Integrity</strong> through<br />
Microsoft Visual Basic 5.0 and 6.0.<br />
Once you have installed the <strong>Source</strong> <strong>Integrity</strong> 32-bit SCC Extension,<br />
opening a project in Visual Basic under source control automatically<br />
loads its archive information.<br />
Access version control functionality from within Visual Basic and 5.0<br />
and 6.0 by selecting the menu item that corresponds to the<br />
<strong>Source</strong> <strong>Integrity</strong> function you want to perform.<br />
Menu Item Function<br />
Get Gets the latest version of the selected file and<br />
puts it in your working directory.<br />
Check Out Checks out a revision of the currently active file<br />
in the Visual Basic window, either locked (for<br />
editing) or unlocked.<br />
Check In Checks in the currently active file in the Visual<br />
Basic window.<br />
214 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Creating a<br />
<strong>Source</strong> <strong>Integrity</strong><br />
Project<br />
For more on creating<br />
<strong>Source</strong> <strong>Integrity</strong> projects using<br />
the extensions, see “Using the<br />
Extensions” on page 209.<br />
Menu Item Function<br />
Microsoft Visual Basic 5.0 and 6.0<br />
Undo Check Out Replaces the selected working file with the<br />
revision that was checked out, as it appeared<br />
prior to modification.<br />
Open New <strong>MKS</strong><br />
<strong>Source</strong> <strong>Integrity</strong><br />
Project<br />
Run <strong>MKS</strong><br />
<strong>Source</strong> <strong>Integrity</strong><br />
Add Project to<br />
<strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong><br />
Creates a sandbox for the current or any other<br />
<strong>Source</strong> <strong>Integrity</strong> project.<br />
Invokes the <strong>Source</strong> <strong>Integrity</strong> application. If a<br />
project is currently loaded, this command opens<br />
the <strong>Source</strong> <strong>Integrity</strong> project window instead.<br />
Opens the Create Project dialog box to bring<br />
the current Visual Basic project under source<br />
control.<br />
Options Configures how <strong>Source</strong> <strong>Integrity</strong> will work, both<br />
within Visual Basic and by itself.<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> right-click context menu reveals the memberspecific<br />
commands that you can perform on a selected file.<br />
Even the Visual Basic Project window is enhanced with version<br />
control features and indicators. For instance, a check mark beside a<br />
file icon indicates the file is currently checked out. When a file is readonly,<br />
a small lock appears next to the file icon in the project window.<br />
To create a <strong>Source</strong> <strong>Integrity</strong> project in Visual Basic:<br />
1. Open the Visual Basic project you want to put under version<br />
control.<br />
2. Choose Tools > <strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong> > Add Project to <strong>MKS</strong><br />
<strong>Source</strong> <strong>Integrity</strong>.<br />
<strong>The</strong> Create Project dialog box appears.<br />
<strong>User</strong> <strong>Guide</strong> 215
Using Extensions<br />
Creating a<br />
Sandbox<br />
For more on creating<br />
<strong>Source</strong> <strong>Integrity</strong> sandboxes<br />
using the extensions, see<br />
“Using the Extensions” on<br />
page 209.<br />
Checking Out<br />
Files<br />
To create a sandbox in Visual Basic:<br />
Choose Tools > <strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong> > Open New <strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong><br />
Project.<br />
<strong>The</strong> Create Sandbox dialog box appears.<br />
To check out files in Visual Basic:<br />
1. Bring any file(s) you want to check out into focus in the Visual<br />
Basic environment. You may also select a file from the Visual<br />
Basic project explorer: choose Check Out from the right-click<br />
context menu and follow from Step 3.<br />
2. Choose Tools > Check Out.<br />
A list of all files that can be checked out appears.<br />
You may choose additional files to check out from this list by<br />
setting their check boxes.<br />
Selecting a .frm file automatically selects the corresponding .frx<br />
file. If you have selected Show Dialog in Configuration, the Check<br />
Out dialog box appears. Otherwise, the member revision is<br />
checked out.<br />
3. Fill in or modify options in the dialog box as you like, and click<br />
OK to check out the file. To cancel the check-out operation, click<br />
Cancel. To cancel the operation for all files, click Cancel All.<br />
A check mark beside a file icon indicates the file is currently checked<br />
out.<br />
216 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Checking In<br />
New Revisions<br />
To check in new revisions in Visual Basic:<br />
Microsoft Visual Basic 5.0 and 6.0<br />
1. Bring any file(s) you want to check in into focus in the Visual<br />
Basic environment. You may also select a file from the Visual<br />
Basic project window: choose Check In from the right-click<br />
context menu, and follow from Step 3.<br />
2. Choose Tools > Check In. A list of all files that can be checked in<br />
appears.<br />
You may choose additional files to check in from this list by<br />
setting their check boxes. Selecting a .frm file automatically<br />
selects the corresponding .frx file. If you have selected Show<br />
Dialog in Configuration, the Check In dialog box appears.<br />
Otherwise, each file is checked in with the next logical revision<br />
number and no label.<br />
3. Fill in or modify options in the dialog box as you like, and click<br />
OK to check in the file. To cancel the check-in operation, click<br />
Cancel. To cancel the operation for all files, click Cancel All.<br />
A check mark beside a file icon indicates the file is currently checked<br />
out.<br />
<strong>User</strong> <strong>Guide</strong> 217
Using Extensions<br />
<strong>The</strong> Microsoft Visual C++ 6.0 Extension<br />
This section describes how to access <strong>Source</strong> <strong>Integrity</strong> through<br />
Microsoft Visual C++, which is part of Microsoft Visual Studio.<br />
Once you have installed the <strong>Source</strong> <strong>Integrity</strong> Microsoft Visual Studio<br />
Extension, opening a project in Microsoft Visual C++ 6.0 under source<br />
control automatically loads its archive information.<br />
You can access version control functionality through the <strong>Source</strong><br />
Control sub-menu of the Project menu. Select the menu item that<br />
corresponds to the <strong>Source</strong> <strong>Integrity</strong> function you want to perform.<br />
Menu Item Function<br />
Get Latest Version Gets the latest version of the selected file and<br />
puts it in your working directory.<br />
Check Out Checks out a revision of the currently active file.<br />
Check In Checks in the currently active file.<br />
Undo Check Out Replaces the selected working file with the<br />
revision that was checked out, as it appeared<br />
prior to modification.<br />
Add to <strong>Source</strong><br />
Control<br />
Remove from <strong>Source</strong><br />
Control<br />
Adds the selected file to <strong>Source</strong> Control.<br />
Removes the currently active file from<br />
<strong>Source</strong> <strong>Integrity</strong>. Its member archive remains<br />
accessible from the <strong>Source</strong> <strong>Integrity</strong> project.<br />
Show Differences Invokes the Visual Difference utility to compare<br />
the selected working file with the member<br />
revision.<br />
<strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong><br />
Properties<br />
Configures how <strong>Source</strong> <strong>Integrity</strong> will work, both<br />
within the different IDEs and by itself.<br />
Refresh Status Updates the status and archive information of<br />
the selected file.<br />
<strong>MKS</strong> <strong>Source</strong> <strong>Integrity</strong> Invokes the <strong>Source</strong> <strong>Integrity</strong> program. If a<br />
project is currently loaded, this command opens<br />
the <strong>Source</strong> <strong>Integrity</strong> project window instead.<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> right-click context menu reveals the memberspecific<br />
commands you can perform on a selected file.<br />
218 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Creating a<br />
<strong>Source</strong> <strong>Integrity</strong><br />
Project<br />
For more on creating<br />
<strong>Source</strong> <strong>Integrity</strong> projects using<br />
the extensions, see “Using the<br />
Extensions” on page 209.<br />
Creating a<br />
Sandbox<br />
For more on creating<br />
<strong>Source</strong> <strong>Integrity</strong> sandboxes<br />
using the extensions, see<br />
“Using the Extensions” on<br />
page 209.<br />
Checking Out<br />
Files<br />
<strong>The</strong> Microsoft Visual C++ 6.0 Extension<br />
<strong>The</strong> Microsoft Visual C++ 6.0 Project Workspace window is also<br />
enhanced with version control features and indicators. For instance, a<br />
file’s icon turns gray once the file is placed under version control, and<br />
a red checkmark beside a file’s icon indicates the file is currently<br />
checked out.<br />
To create a <strong>Source</strong> <strong>Integrity</strong> project in Microsoft Visual C++ 6.0:<br />
1. Open the project you want to put under version control.<br />
(If you create a new project, you will be prompted to add it to<br />
source control upon creation.)<br />
2. Choose Project > <strong>Source</strong> Control > Add to <strong>Source</strong> Control.<br />
<strong>The</strong> Create Project dialog box appears.<br />
To create a sandbox in Microsoft Visual C++ 6.0:<br />
1. Choose File > Open Workspace.<br />
2. Click <strong>Source</strong> Control.<br />
<strong>The</strong> Create Sandbox dialog box appears.<br />
To check out files in Microsoft Visual C++ 6.0:<br />
1. Bring one or more files that you want to check out into focus in<br />
the Microsoft Visual C++ 6.0 environment.<br />
2. Choose Project > <strong>Source</strong> Control > Check Out.<br />
A list of the file(s) that you have selected appears.<br />
<strong>User</strong> <strong>Guide</strong> 219
Using Extensions<br />
Checking in<br />
New Revisions<br />
3. Once you have selected all the files you want to check out, click<br />
OK. If you have selected Show Dialog in Configuration, the Check<br />
Out dialog box appears for each file. Otherwise, the member<br />
revisions are checked out.<br />
4. Fill in or modify options in the dialog box as you wish, and click<br />
OK to check out the file. To cancel the check-out operation, click<br />
Cancel. To cancel the operation for all files, click Cancel All.<br />
To check in new revisions in Microsoft Visual C++ 6.0:<br />
1. Bring one or more files that you want to check in into focus in the<br />
Microsoft Visual C++ 6.0 environment.<br />
2. Choose Project > <strong>Source</strong> Control > Check In.<br />
A list of the file(s) that you selected appears.<br />
3. To associate a revision description with these files, enter one in<br />
the space provided. If you want to keep the files locked after<br />
checking them in, indicate so in the check box.<br />
4. Once you have selected all the files you want to check in, click<br />
OK. If you have selected Show Dialog in Configuration, the Check<br />
In dialog box appears for each file. Otherwise, each file is checked<br />
in with the next logical revision number and no label.<br />
220 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Using Microsoft<br />
Visual C++ 6.0<br />
<strong>The</strong> Microsoft Visual C++ 6.0 Extension<br />
5. Fill in or modify options in the dialog box as you like, and click<br />
OK to check in the file. To cancel the check-in operation, click<br />
Cancel. To cancel the operation for all files, click Cancel All.<br />
Each Visual C++ Project file and workspace will have its own<br />
<strong>Source</strong> <strong>Integrity</strong> project file, unless the workspace and project have<br />
the same name. In that case, both the workspace and project will be<br />
added to the same <strong>Source</strong> <strong>Integrity</strong> project, which is named after the<br />
workspace.<br />
So, you should create your workspace with a different name than the<br />
project file that it will contain. This will keep each workspace and<br />
project file separate for creating sandboxes.<br />
Creating a <strong>Source</strong> <strong>Integrity</strong> Project<br />
Create the Visual C++ workspace and the projects within it. <strong>The</strong>n,<br />
create a <strong>Source</strong> <strong>Integrity</strong> project, first for your Visual C++ projects<br />
and then for your workspace. Using the <strong>Source</strong> <strong>Integrity</strong> project<br />
window, insert the <strong>Source</strong> <strong>Integrity</strong> projects for the Visual C++<br />
projects into the <strong>Source</strong> <strong>Integrity</strong> project associated with the<br />
workspace.<br />
For example<br />
n:\master\myproject\workspace.dsw<br />
contains<br />
n:\master\myproject\myproject.dsp<br />
<strong>User</strong> <strong>Guide</strong> 221
Using Extensions<br />
Associated with these will be:<br />
n:\master\myproject\workspace.pj<br />
n:\master\myproject\myproject.pj<br />
Creating a <strong>Source</strong> <strong>Integrity</strong> Sandbox<br />
When creating a sandbox, create it from workspace.pj and recurse<br />
into the subprojects (that is, the <strong>Source</strong> <strong>Integrity</strong> projects for each<br />
Visual C++ project). All the Visual C++ projects contained within the<br />
workspace will be copied into your sandbox.<br />
If you want to work with an individual Visual C++ project, you can<br />
choose to create a sandbox of myproject.pj (that is, you do not have<br />
to create a sandbox of the entire workspace).<br />
Adding an Existing Project to <strong>Source</strong> Control<br />
When an existing project contains files that are not in subdirectories<br />
of the directory containing the Visual C++ project or workspace file,<br />
the <strong>Source</strong> <strong>Integrity</strong> project will be created at the highest level that<br />
contains all of the files in subdirectories. Visual C++ specifies this<br />
location to <strong>Source</strong> <strong>Integrity</strong>.<br />
For example<br />
n:\master\myproject\myproject.dsp<br />
contains<br />
n:\master\otherproject\include\resource.h<br />
When you add n:\master\myproject\myproject.dsp to source<br />
control, the <strong>Source</strong> <strong>Integrity</strong> project will be created as<br />
n:\master\myproject.pj since n:\master is the lowest common<br />
denominator between these files.<br />
Note You should not put a project under source control that contains<br />
files on different drives. Visual C++ cannot determine where to locate the<br />
project file and puts it in an arbitrary location.<br />
222 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> Borland Delphi Extension<br />
<strong>The</strong> Borland Delphi Extension<br />
This section describes how to access <strong>Source</strong> <strong>Integrity</strong> through<br />
Borland Delphi 3.0 and 4.0.<br />
Once you have installed the <strong>Source</strong> <strong>Integrity</strong> Delphi Extension,<br />
opening a project in Delphi under source control automatically loads<br />
its archive information.<br />
<strong>The</strong> Workgroups menu provides convenient access to the<br />
<strong>Source</strong> <strong>Integrity</strong> operations you are likely to use most frequently as a<br />
Delphi programmer. Extended functionality is accessible through the<br />
<strong>Source</strong> <strong>Integrity</strong> Project Window.<br />
To access version control functionality from within Borland Delphi,<br />
select the menu item that corresponds to the <strong>Source</strong> <strong>Integrity</strong> function<br />
you want to perform.<br />
Menu Item Function<br />
View SI Project<br />
Window<br />
Open the <strong>Source</strong> <strong>Integrity</strong> Project Window,<br />
which gives a full view of the <strong>Source</strong> <strong>Integrity</strong><br />
project associated with your current Delphi<br />
project, and advanced version control<br />
functionality.<br />
Check In Checks in the currently active Delphi form or<br />
unit.<br />
Check Out Checks out a revision of the currently active<br />
Delphi form or unit.<br />
Check In All Files Checks in all files in the <strong>Source</strong> <strong>Integrity</strong> project<br />
you currently have checked out and locked.<br />
Check Out All Files Checks out all the files in the <strong>Source</strong> <strong>Integrity</strong><br />
project that are currently checked in and<br />
unlocked.<br />
Create SI Project Opens the Create <strong>Source</strong> <strong>Integrity</strong> Project<br />
dialog box to bring the current Delphi project<br />
under source control.<br />
Add Project<br />
Members<br />
Adds files to the <strong>Source</strong> <strong>Integrity</strong> project, and<br />
creates an archive for each file.<br />
Create SI Sandbox Creates a sandbox for the current or any other<br />
<strong>Source</strong> <strong>Integrity</strong> project.<br />
<strong>User</strong> <strong>Guide</strong> 223
Using Extensions<br />
Creating a<br />
<strong>Source</strong> <strong>Integrity</strong><br />
Project<br />
For more on creating<br />
<strong>Source</strong> <strong>Integrity</strong> projects using<br />
the extensions, see “Using the<br />
Extensions” on page 209.<br />
Menu Item Function<br />
SI Configuration Configures how <strong>Source</strong> <strong>Integrity</strong> will work, both<br />
within Delphi and by itself.<br />
Run <strong>Source</strong> <strong>Integrity</strong> Invokes the <strong>Source</strong> <strong>Integrity</strong> program, with the<br />
current project loaded.<br />
<strong>The</strong> <strong>Source</strong> <strong>Integrity</strong> right-click context menu reveals the memberspecific<br />
commands you can perform on a selected file.<br />
To create a <strong>Source</strong> <strong>Integrity</strong> project in Delphi:<br />
1. Open the Delphi project you want to put under version control.<br />
2. Choose Workgroups > Create SI Project.<br />
<strong>The</strong> Create Project dialog box appears.<br />
Some Useful Tips for Creating Your <strong>Source</strong> <strong>Integrity</strong> Project<br />
You should add the following Delphi project files to your<br />
<strong>Source</strong> <strong>Integrity</strong> project: .DPR, .RES, .OPT, .DOF, .PAS, and .DFM. <strong>The</strong><br />
only file <strong>MKS</strong> recommends you do not archive is a project’s .DSK file.<br />
This file changes frequently and is usually specific to each<br />
developer's working environment.<br />
Of course, you can always put any file under version control,<br />
whether or not it is a part of the Delphi project.<br />
To add new members to a <strong>Source</strong> <strong>Integrity</strong> project, use the Add<br />
Member function in the Project Window, or choose the Add Project<br />
Members command in the Delphi Workgroups menu to add new<br />
members to a <strong>Source</strong> <strong>Integrity</strong> project.<br />
You should also archive Help documents and other related files, such<br />
as specifications and databases, with your projects. This procedure,<br />
combined with checkpointing your projects, enables you to recreate<br />
old releases of your entire project including the documentation.<br />
When you are finished, click OK. You are prompted to save the<br />
project.<br />
224 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Creating a<br />
Sandbox<br />
For more on creating<br />
<strong>Source</strong> <strong>Integrity</strong> sandboxes<br />
using the extensions, see<br />
“Using the Extensions” on<br />
page 209.<br />
Checking Out<br />
Files<br />
To create a sandbox in Delphi:<br />
Choose Workgroups > Create SI Sandbox.<br />
<strong>The</strong> Create Sandbox dialog box appears.<br />
To check out files in Delphi:<br />
<strong>The</strong> Borland Delphi Extension<br />
1. Bring the file you want to check out into focus in the Delphi<br />
environment.<br />
2. Choose Workgroups > Check Out.<br />
If this file is a form or its associated .pas file, both the .dfm and<br />
.pas files will be checked out. If you have selected Show Dialog in<br />
Configuration, the Check Out dialog box appears. Otherwise, the<br />
member revision is checked out.<br />
3. Fill in or modify options in the dialog box as you like, and click<br />
OK to check out the file. To cancel the check-out operation, click<br />
Cancel.<br />
Alternatively, you may check out a single file by selecting it in the<br />
<strong>Source</strong> <strong>Integrity</strong> Project Window, and selecting Check Out via the<br />
right-click context menu, Member menu or speed bar. This method<br />
will ignore the relationship between a Delphi Unit’s .pas and .dfm<br />
files, and only check out the selected file.<br />
<strong>User</strong> <strong>Guide</strong> 225
Using Extensions<br />
Checking Out<br />
Multiple Files<br />
Checking In<br />
New Revisions<br />
To check out multiple files in Delphi:<br />
Choose Workgroups > Check Out All Files to check out all available<br />
files in the <strong>Source</strong> <strong>Integrity</strong> project, or select the files you want to<br />
check out from the <strong>Source</strong> <strong>Integrity</strong> Project Window and select<br />
Check Out via the right-click context menu, Member menu, or speed<br />
bar.<br />
Follow the same procedure for checking out individual files and<br />
check All files in the first dialog box. No subsequent dialog boxes will<br />
appear.<br />
To check in new revisions in Delphi:<br />
1. Bring the file you want to check in into focus in the Delphi<br />
environment.<br />
2. Choose Workgroups > Check In.<br />
If this file is a form or its associated .pas file, both the .dfm and<br />
.pas files will be checked in. If you have selected Show Dialog in<br />
Configuration, the Check In dialog box appears. Otherwise, the<br />
file is checked in with the next logical revision number and no<br />
label.<br />
3. Fill in or modify options in the dialog box as you like, and click<br />
OK to check in the file. To cancel the check-in operation, click<br />
Cancel.<br />
226 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Checking In<br />
Multiple Files<br />
<strong>The</strong> Microsoft Windows Explorer Extension<br />
Alternatively, you may check in a single file by selecting it in the<br />
<strong>Source</strong> <strong>Integrity</strong> Project Window, and selecting Check In via the rightclick<br />
context menu, Member menu, or speed bar. This method will<br />
ignore the relationship between a Delphi Unit’s .pas and .dfm files,<br />
and only check in the selected file.<br />
To check in multiple files in Delphi:<br />
Choose Workgroups > Check In All Files to check in all files in the<br />
<strong>Source</strong> <strong>Integrity</strong> project that you currently have locked, or select the<br />
files you want to check in from the <strong>Source</strong> <strong>Integrity</strong> Project Window<br />
and select Check In via the right-click context menu, Member menu, or<br />
speed bar.<br />
Follow the same procedure for checking in individual files and check<br />
All files in the first dialog box. No subsequent dialog boxes will<br />
appear.<br />
<strong>The</strong> Microsoft Windows Explorer Extension<br />
This section describes how to access <strong>Source</strong> <strong>Integrity</strong> through<br />
Microsoft Windows Explorer.<br />
Once you have installed the <strong>Source</strong> <strong>Integrity</strong> Windows Explorer<br />
Extension, the File menu allows you to check in or check out files and<br />
more with a click of your mouse. Right-click a file to reveal the<br />
context menu of <strong>Source</strong> <strong>Integrity</strong> commands you can perform on the<br />
selected file.<br />
To access version control functionality from within Windows<br />
Explorer, select the menu item that corresponds to the<br />
<strong>Source</strong> <strong>Integrity</strong> function you want to perform.<br />
Menu Item Function<br />
Create Archive Places the selected files under version control,<br />
by creating an archive for each file.<br />
Check In Checks in the files you currently have selected<br />
and checked out.<br />
Check Out Checks out the files you currently have selected.<br />
Compare to Head<br />
Rev<br />
Invokes the Visual Difference utility to compare<br />
the selected working file with that member’s<br />
head revision.<br />
<strong>User</strong> <strong>Guide</strong> 227
Using Extensions<br />
Creating an<br />
Archive<br />
Menu Item Function<br />
Compare to Locked<br />
Rev<br />
Invokes the Visual Difference utility to compare<br />
the selected working file with a revision in its<br />
archive locked in your name.<br />
Compare Files When two files are selected, this command<br />
launches the Visual Difference utility with the<br />
two files displayed side-by-side in a Compare<br />
window.<br />
Archive Window Opens the Archive window, displaying<br />
information about the archive of the currently<br />
selected file.<br />
Disable Menu Disables the Windows Explorer Extensions. To<br />
enable them, choose Enable Menu.<br />
To create an archive in Windows Explorer:<br />
1. Select the files you want to place under version control, and<br />
choose <strong>Source</strong> <strong>Integrity</strong> > Create Archive from the right-click<br />
context menu.<br />
<strong>The</strong> Create Archive dialog box appears.<br />
2. If you want, enter an initial Archive Description to associate with<br />
the archive.<br />
3. Fill in or modify the available options, and click OK to create an<br />
archive for each selected file.<br />
228 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Checking Out<br />
Files<br />
Checking In<br />
New Revisions<br />
<strong>The</strong> Microsoft Windows Explorer Extension<br />
4. To cancel the create archive operation for an individual file, click<br />
Cancel. To abort the operation for all files, click Cancel All.<br />
To check out files from Windows Explorer:<br />
1. Select the files you want to check out.<br />
2. Choose <strong>Source</strong> <strong>Integrity</strong> > Check Out from the right-click context<br />
menu.<br />
3. Fill in or modify options in each dialog box as you like. To apply<br />
settings to all files, enable All files in the first dialog box. No<br />
subsequent dialog boxes will appear.<br />
4. Click OK to check out the files. To cancel the check-out operation<br />
for an individual file, click Cancel when its dialog box appears.<br />
To abort the operation for all files, click Cancel All.<br />
To check in new revisions from Windows Explorer:<br />
1. Select the files you want to check in.<br />
2. Choose <strong>Source</strong> <strong>Integrity</strong> > Check In from the right-click context<br />
menu. This option will not be available if any selected file cannot<br />
be checked in at present.<br />
<strong>User</strong> <strong>Guide</strong> 229
Using Extensions<br />
3. Fill in or modify options in each dialog box as you like. To apply<br />
settings to all files, enable All files in the first dialog box. No<br />
subsequent dialog boxes will appear.<br />
4. Click OK to check in the files. To cancel the check-in operation for<br />
an individual file, click Cancel when its dialog box appears. To<br />
abort the operation for all files, click Cancel All.<br />
230 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Building Projects With<br />
<strong>Source</strong> <strong>Integrity</strong><br />
For more information about<br />
<strong>MKS</strong> Make, see Chapter 9,<br />
“Using the <strong>MKS</strong> Make<br />
Utility”.<br />
For more information about<br />
command line interface<br />
commands, see the <strong>Source</strong><br />
<strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong><br />
Reference <strong>Guide</strong> or the online<br />
man pages.<br />
8<br />
This chapter provides information about building projects from<br />
source code under <strong>Source</strong> <strong>Integrity</strong> control.<br />
With <strong>Source</strong> <strong>Integrity</strong>’s support for the build process and<br />
configuration options, you can use it with your existing build<br />
program or <strong>MKS</strong> Make, which is included with <strong>Source</strong> <strong>Integrity</strong>.<br />
<strong>Source</strong> <strong>Integrity</strong> can:<br />
examine your source files<br />
track file dependencies and update your makefile<br />
interpret “include” statements for C, C++, FORTRAN, Pascal,<br />
and Assembler<br />
use templates that include configuration language and<br />
conditionally interpreted sections to create makefiles<br />
Note <strong>Source</strong> <strong>Integrity</strong>’s building features are not available in the <strong>Source</strong><br />
<strong>Integrity</strong> Web Interface.<br />
<strong>User</strong> <strong>Guide</strong> 231
Building Projects With <strong>Source</strong> <strong>Integrity</strong><br />
Before You Build<br />
During your project build, you should follow some guidelines. If you<br />
are building within your own sandbox, these guidelines are not as<br />
important, but they are still useful.<br />
Note If you want to create a sandbox to perform a build, you should use<br />
a build sandbox instead of a conventional one. For information about<br />
build sandboxes, see “Build Sandboxes” on page 25 and “Creating a<br />
Sandbox” on page 76.<br />
<strong>The</strong> guidelines are:<br />
Check to see whether any users have any project members<br />
locked. If a member is checked out locked, there may be work<br />
still in progress.<br />
Recursively freeze all of your members. This will prevent any<br />
changes from taking place while checkpointing. Otherwise, it is<br />
quite possible with hundreds of project members that one will<br />
change its member revision in the middle of your checkpoint<br />
operation. Remember, developers can continue to check in<br />
revisions, without modifying the member revision.<br />
Checkpoint the project to create a new revision of the project<br />
itself. Assign it a label that will allow you to identify the build.<br />
For example, from the project or sandbox directory enter<br />
pj checkpoint -N Release_1<br />
from the command line interface, or open the project in the<br />
Windows interface and choose Project > Checkpoint. This creates<br />
a new revision in the master project archive. By archiving the<br />
project, you guarantee that you will be able to duplicate the build<br />
precisely at any time in the future. This can make it easier to<br />
identify members that have changed later.<br />
Create a build sandbox workspace based on the checkpointed<br />
revision. Working in a build sandbox will allow you to compile<br />
your program, label members, and change members’ states<br />
without disrupting other developers.<br />
You can also label each member with the<br />
pj label -N Release_1<br />
command in the command line interface. In the Windows<br />
interface, you can add a label to members when you checkpoint<br />
232 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Creating a Makefile<br />
Creating a Makefile<br />
the project or select the members in the Project window and<br />
choose Member > Label. This will serve as a reference point when<br />
viewing archive information or <strong>Source</strong> <strong>Integrity</strong> reports.<br />
Thaw the master project to allow developers to continue work.<br />
Your build sandbox workspace allows you to continue the build<br />
process uninterrupted.<br />
If a high-priority bug appears in the build, a developer can make<br />
a variant sandbox and fix it there. Later, the developer can merge<br />
the changes into the head revisions to continue the main project.<br />
<strong>The</strong> pj mkmf command allows you to calculate the dependencies of<br />
project members and uses them to generate a makefile before you<br />
build your project. <strong>The</strong> makefile it generates can be created from<br />
scratch, or it can be based on an existing makefile or template.<br />
where<br />
pj mkmf [options] [-fR] [-M makefile] [-T template] [file…]<br />
-f forces pj mkmf to ignore any saved information and rebuild all<br />
dependencies before generating a makefile<br />
-R recursively applies this operation to any directories specified<br />
on the command line<br />
-M makefile updates the makefile rather than generating a new one<br />
-T template uses a template to generate a new makefile<br />
file includes the names of one or more project members<br />
dependencies will be calculated for. If omitted, all project<br />
members are used<br />
If -M makefile is omitted, the value of the policy option Makefile is<br />
used. If neither is defined, the makefile is written to a file named<br />
makefile in the current directory.<br />
If -T template is not specified, <strong>Source</strong> <strong>Integrity</strong> uses the value of the<br />
policy option MakeTemplate as a template file. If MakeTemplate is not<br />
set, <strong>Source</strong> <strong>Integrity</strong> uses a makefile called make.t (if it exists) as a<br />
template.<br />
<strong>User</strong> <strong>Guide</strong> 233
Building Projects With <strong>Source</strong> <strong>Integrity</strong><br />
Building<br />
As well, if the -T template option is not used to specify a makefile<br />
template, a marker line is inserted in the makefile immediately before<br />
the generated dependencies. <strong>The</strong> marker takes the form<br />
### <strong>MKS</strong> SI generated dependencies follow,<br />
do not remove/change this line<br />
If pj mkmf encounters a marker line while updating a makefile, all<br />
lines after the marker are replaced with the newly calculated<br />
dependencies.<br />
In the command line interface, use the pj build command to run<br />
your configuration builder program.<br />
In the Windows interface, choose Project > Build to open a dialog box<br />
you can set parameters in and run your build program.<br />
As well as setting parameters for the build process itself, you can<br />
generate makefile dependencies using <strong>Source</strong> <strong>Integrity</strong>’s built-in<br />
dependency-checking functions.<br />
To generate dependencies in your makefile, click Recalculate. If there<br />
are any problems in scanning the “include” statements, <strong>Source</strong><br />
<strong>Integrity</strong> reports them.<br />
After recalculating the dependencies, click Add to Makefile to add the<br />
new recipes to the makefile.<br />
234 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Object File<br />
Associations<br />
Building<br />
If any targets depend upon files that are not <strong>Source</strong> <strong>Integrity</strong> project<br />
members, you can quickly add the files by clicking Add Missing Files.<br />
By default, <strong>Source</strong> <strong>Integrity</strong> builds your project using <strong>MKS</strong> Make.<br />
You can specify the command that builds your product with the<br />
Build option for the project.<br />
Depending upon the platform where it runs, <strong>Source</strong> <strong>Integrity</strong> makes<br />
some default associations between source files and object files.<br />
On PC platforms, it assumes source files with the extensions<br />
.c .cpp .asm .f .for .p .pas<br />
compile to object files with the extension .obj.<br />
On UNIX systems, it assumes source files with the extensions<br />
.c .C .cpp .s .asm .p .pas .f .for<br />
compile to object files with the .o extension.<br />
In addition, on PC platforms <strong>Source</strong> <strong>Integrity</strong>’s default assumption is<br />
that files with a .rc extension generate resource (.res) files.<br />
If your project uses files or processors with different extensions, you<br />
can define your own rules with the project attribute TargetExt. Your<br />
newly defined rules will completely replace <strong>Source</strong> <strong>Integrity</strong>’s default<br />
associations. For example, to use a .xp extension for Pascal files and a<br />
.c extension for C files, you should use the following command to set<br />
TargetExt<br />
pj set TargetExt=xp-obj;c-obj<br />
Note You may need to quote arguments for your command processor.<br />
For more details, refer to the section on <strong>MKS</strong> Make in the <strong>Source</strong> <strong>Integrity</strong><br />
<strong>Professional</strong> <strong>Edition</strong> Reference <strong>Guide</strong>.<br />
<strong>User</strong> <strong>Guide</strong> 235
Building Projects With <strong>Source</strong> <strong>Integrity</strong><br />
Template Files<br />
Language<br />
Statements<br />
Conditional<br />
Expansion<br />
<strong>The</strong> most powerful and flexible way to generate makefiles is by<br />
specifying a template makefile with the -T template option to the<br />
pj mkmf command. Makefile templates are text files that may contain<br />
any number of make statements<br />
<strong>Source</strong> <strong>Integrity</strong> configuration language statements and variables<br />
the @Depends template statement<br />
the @Template statement<br />
Using these components, you can develop makefile templates for any<br />
project; you can even generate multiple makefiles from the same<br />
template by conditionalizing the expansion of template entries.<br />
<strong>Source</strong> <strong>Integrity</strong> makefile templates may contain appropriate<br />
statements from the <strong>Source</strong> <strong>Integrity</strong> configuration language.<br />
Language statements are included by prefixing them with an at sign<br />
(@) identifier, for example<br />
@set var=value<br />
@echo string<br />
Note When configuration language statements are used in a template<br />
file, the @ prefix must be the first character (excluding white space) in the<br />
line where it appears.<br />
Enter @@ (two at sign characters) in your template file to expand to a<br />
literal @ character in a generated makefile.<br />
<strong>The</strong> expansion of template entries can be made conditional with the<br />
if..elseif..endif configuration language construct. In makefile<br />
templates its syntax is<br />
@if expr<br />
statement_1<br />
statement_2<br />
[@elseif expr<br />
statement_3<br />
statement_4]<br />
@endif<br />
236 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
@Depends<br />
@Template<br />
Variables<br />
Template Files<br />
Makefile statements included in the if/elseif/endif construct are<br />
not prefixed with an @ character; the statements are only copied to the<br />
new makefile if the conditional expr resolves to true.<br />
<strong>The</strong> @Depends configuration statement is used to generate the first<br />
line of a make rule, in the format<br />
target : [dependency_file…]<br />
where dependency_file is zero or more project member file names<br />
dependencies will be calculated for. If dependency_file is omitted,<br />
dependencies are calculated for all project members.<br />
Like standard <strong>Source</strong> <strong>Integrity</strong> configuration language statements,<br />
@Depends statements must be entered as individual lines in the<br />
template file, with the @ character as the first non-white space<br />
character on the line.<br />
<strong>The</strong> statement<br />
@Template filename<br />
in a makefile template “reads in” the contents of filename as if it were<br />
part of the template.<br />
Like standard <strong>Source</strong> <strong>Integrity</strong> configuration language statements,<br />
@Template statements must be entered as individual lines in the<br />
template file, with the @ character as the first non-white space<br />
character on the line.<br />
Any <strong>Source</strong> <strong>Integrity</strong> configuration variable can be included in a<br />
template file by bracketing it with @ characters, using the form<br />
@var@<br />
where var is the name of the variable that will be expanded to its<br />
value in the generated makefile. Unlike configuration language<br />
statements, variable references may be included anywhere in a<br />
makefile, not just at the beginning of a line.<br />
In addition to standard configuration variables, templates may also<br />
include special template variables that expand to lists of file names<br />
(based on recognizable file extensions from <strong>Source</strong> <strong>Integrity</strong>’s default<br />
list, or your definition of TargetExt) when the makefile is generated.<br />
<strong>User</strong> <strong>Guide</strong> 237
Building Projects With <strong>Source</strong> <strong>Integrity</strong><br />
<strong>The</strong> following table lists special template variables:<br />
Reserved Word Expands To<br />
@<strong>Source</strong>s@ A list of project members with source file<br />
extensions. If any member is included by another<br />
member, it is added to @Headers@ rather than this<br />
list. When used from a sandbox environment, file<br />
names use sandbox file mapping conventions.<br />
@Headers@ A list of header files. Header files are project<br />
members that are included by a source file.<br />
@Objects@ A list of object files that will be generated by the<br />
makefile. File names in the list are based on<br />
@<strong>Source</strong>s@ with the appropriate object file<br />
extension added. Files included by any other<br />
source file are not included in this list. File names in<br />
this list contain no path qualification.<br />
@ProjectFiles@ A list of project members. When used from a<br />
sandbox environment, names in the list use<br />
sandbox file-mapping conventions.<br />
Template variables are expanded like any other configuration<br />
variable. However, if a name in the list causes the list to exceed 70<br />
characters, the list is printed across multiple lines using the following<br />
algorithm:<br />
1. No portion of the file name that causes a line to exceed column 70<br />
is printed on the current line.<br />
2. <strong>The</strong> current line is terminated with a backslash (\).<br />
3. A new line is begun, starting with three blank spaces and the<br />
offending file name.<br />
4. Steps 1 to 3 are repeated until the complete list has been printed.<br />
Files that are included by any other file are not added to @Objects@<br />
list. This ensures that inappropriate targets are not generated by your<br />
make utility.<br />
Example<br />
Consider the source file control.asm, with a line<br />
include defines.asm<br />
238 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Examples<br />
<strong>The</strong> Build<br />
Process<br />
<strong>Source</strong> <strong>Integrity</strong> does the following:<br />
Examples<br />
adds the source file control.asm to the @<strong>Source</strong>s@ list, but does<br />
not add defines.obj to the @Objects@ list, since it is included<br />
by control.asm; instead, defines.asm appears in the<br />
@Headers@ list<br />
adds control.obj to the @Objects@ list, if it is not included by<br />
any other source file; the make utility can then apply its rules to<br />
create control.obj from control.asm and defines.asm<br />
If you have a project containing the classic “Hello, world!” program<br />
#include <br />
main(){<br />
printf(“Hello, world!\n”);<br />
}<br />
you can set up the project so you can build it using <strong>MKS</strong> Make:<br />
1. Set the include variable to tell <strong>Source</strong> <strong>Integrity</strong> where to look for<br />
included files (c:\wcc\include):<br />
pj set include=c:\wcc\include<br />
This list can contain more than one directory, separated by<br />
semicolons. If more than one directory is specified, the include<br />
path must be enclosed in quotes:<br />
pj set include=”c:\wcc\include;g:\project\include”<br />
2. Create a makefile that contains the recipe to build the target. In<br />
this example, the trivial header file dependency is left out:<br />
hello.exe: hello.obj<br />
cc -o hello.exe hello.obj<br />
3. Add the dependencies to the makefile using pj mkmf. (For<br />
instance, hello.obj depends upon a file called fin_func.h.<br />
<strong>The</strong>se lines are added to the makefile (the first line has been<br />
folded to fit on the page):<br />
### <strong>MKS</strong> SI generated dependencies follow,<br />
do not remove/change this line<br />
hello.obj : c:\wcc\include\fin_func.h<br />
<strong>User</strong> <strong>Guide</strong> 239
Building Projects With <strong>Source</strong> <strong>Integrity</strong><br />
Templates and<br />
Configuration<br />
Language<br />
Templates and<br />
Variable<br />
Expansion<br />
4. You could also add those included files as members of the project<br />
with the pj finddep command:<br />
c:\usr\work\hello.c depends on:<br />
c:\wcc\include\fin_func.h<br />
Add ‘c:\wcc\include\fin_func.h’ to project?<br />
[ynq](y):<br />
To add the file, press .<br />
This procedure only needs to be done once for each project, although<br />
the makefile will have to be updated (with pj mkmf) if new members<br />
are added to the project. You should also<br />
add the makefile as a member of the project<br />
put the makefile under revision control<br />
To build the project, simply give the command pj build.<br />
If SYSTEM is defined in the environment as “nt”<br />
@@<br />
@set OS=$getenv(SYSTEM)<br />
@OS@<br />
TEXT@OS@TEXT<br />
Line one expands to a literal @ character.<br />
Line two sets a variable named OS to “nt” but does not produce<br />
any output in the makefile.<br />
Line three produces a line in the expanded makefile containing<br />
the value of the variable OS (in this example, “nt”).<br />
Line four produces a line in the makefile containing the text<br />
TEXTntTEXT<br />
If a template named base.t contains the following lines<br />
@set version=1<br />
@set system=$getenv(SYSTEM)<br />
# Generated @SYSTEM@ makefile, Version @version@<br />
OBJ=@Objects@<br />
target.exe: $(OBJ)<br />
bcc -o $@@ $(OBJ)<br />
@Depends<br />
and the environment variable SYSTEM is set to “nt”, running the<br />
command<br />
pj mkmf -T base.t -M makefile<br />
240 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
creates a new makefile with the contents<br />
# Generated nt makefile, Version 1<br />
OBJ=control.obj<br />
target.exe: $(OBJ)<br />
bcc -o $@ $(OBJ)<br />
control.obj: control.asm defines.asm<br />
Examples<br />
<strong>User</strong> <strong>Guide</strong> 241
Building Projects With <strong>Source</strong> <strong>Integrity</strong><br />
242 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Using the <strong>MKS</strong> Make<br />
Utility<br />
9<br />
<strong>MKS</strong> Make offers developers, project managers and authors an<br />
efficient way to automate the production and maintenance of any<br />
project, large or small. Whenever you make changes to an element of<br />
a development project, <strong>MKS</strong> Make automatically re-compiles all<br />
related files and no others, saving valuable time and eliminating<br />
errors.<br />
For example, suppose you build a program from several separate<br />
object modules, each depending upon its own source file. If you<br />
change a source file, <strong>MKS</strong> Make automatically determines which<br />
object modules are out of date (that is, older than the corresponding<br />
source files), recompiles the changed source files, and links the<br />
component object modules to produce an updated version of the<br />
program.<br />
In large, complex projects, where a change to one file may necessitate<br />
changes in many others, it is easy to lose track. <strong>MKS</strong> Make eliminates<br />
the worry of manually keeping your project up to date. Just give it a<br />
list of interdependent files and a description of how to rebuild each,<br />
and <strong>MKS</strong> Make takes care of the rest.<br />
<strong>User</strong> <strong>Guide</strong> 243
Using the <strong>MKS</strong> Make Utility<br />
Compatibility Issues<br />
For details on these features,<br />
see the man page for the make<br />
command.<br />
Getting the<br />
Right Make<br />
<strong>The</strong> Make utility originated under the UNIX operating system.<br />
<strong>MKS</strong> Make tracks the POSIX standard. POSIX is an evolving family of<br />
standards that describe a wide variety of operating system<br />
components (ranging from shell and utility interfaces to system<br />
administration). While POSIX has been influenced heavily by UNIX,<br />
it is not UNIX (indeed many UNIX-based systems do not conform to<br />
the POSIX standard). POSIX is important because it encourages crossplatform<br />
compatibility. With your version of <strong>MKS</strong> Make, you can<br />
create portable makefiles that work on operating systems<br />
manufactured by IBM, Hewlett Packard, DEC, and Microsoft, or any<br />
others that follow the POSIX standard.<br />
<strong>MKS</strong> Make also conforms with UNIX versions to the greatest extent<br />
possible, and makefiles that work with a UNIX make have the same<br />
behavior when used with <strong>MKS</strong> Make. <strong>MKS</strong> Make also has many<br />
additional, useful features that are extensions to the POSIX<br />
guidelines.<br />
Most C compilers come with their own version of make. <strong>The</strong>re are<br />
many reasons to believe <strong>MKS</strong> Make is superior to these other<br />
versions. For the time being, be aware that your system may already<br />
have a version of make from some other source. If you run a make<br />
command and it does not behave the way our documentation says,<br />
you might be running one of the other versions.<br />
If you are using the <strong>MKS</strong> KornShell, part of <strong>MKS</strong> Toolkit, you can<br />
find out which version of make you are running by using the which<br />
command, as in the example<br />
which make<br />
<strong>The</strong> reply should look like the following for each operating system:<br />
$ROOTDIR/mksos2/make.exe on OS/2<br />
$ROOTDIR/mksnt/make.exe on Microsoft Windows NT and<br />
Windows 95<br />
Since $ROOTDIR represents the contents of the ROOTDIR environment<br />
variable, $ROOTDIR actually appears as ROOTDIR’s value. If you are<br />
not running <strong>MKS</strong> Make and you want to do so, simply change your<br />
search order to include the directory with <strong>MKS</strong> Make before the<br />
directory containing another make executable.<br />
244 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Search Order<br />
For more information about<br />
search order, see the<br />
documentation for your<br />
operating system.<br />
Changing Your<br />
Search Order<br />
See your operating system<br />
documentation for more<br />
information on changing your<br />
path search order.<br />
Compatibility Issues<br />
Whenever you use a program, the system must locate a file<br />
containing the program you want to run. It does this using the PATH<br />
search order.<br />
You can install <strong>MKS</strong> Make into any directory in your path, or change<br />
your search order to accommodate a new directory for <strong>MKS</strong> Make.<br />
To display your search order under command.com or cmd.exe, use the<br />
command<br />
path<br />
If you are working in the <strong>MKS</strong> KornShell (sh.exe), use<br />
print -r $PATH<br />
which displays a list of directory names separated by semicolons.<br />
When you issue a make command, the command interpreter searches<br />
for a make program in each of these directories, in the order they<br />
appear.<br />
<strong>MKS</strong> Make is usually installed under<br />
the $ROOTDIR/mksos2 directory on OS/2 systems<br />
the $ROOTDIR/mksnt directory on Windows 95 and Windows NT<br />
systems<br />
If the command interpreter finds one of the other make programs<br />
before it finds <strong>MKS</strong> Make, it runs that one instead.<br />
If you find out that the system is running one of the other make<br />
programs, there are two ways to fix the problem. First, you can<br />
explicitly tell your command interpreter to run the correct version of<br />
make by specifying the appropriate path to the program. For example,<br />
you can type one of the following commands with the rest of the make<br />
command line:<br />
c:\mksos2\make on OS/2<br />
c:\mksnt\make on Windows NT and Windows 95<br />
A second (and better) solution is to change your search order. On<br />
OS /2 systems, you change your search order by changing your<br />
initial configuration files or the value of PATH. On Windows NT and<br />
Windows 95 systems, you change your search order by changing<br />
your initial configuration files, changing the user registry database<br />
(on NT only), or changing the value of the PATH (PATH under NT’s<br />
cmd.exe) environment variable.<br />
<strong>User</strong> <strong>Guide</strong> 245
Using the <strong>MKS</strong> Make Utility<br />
Getting Started With <strong>MKS</strong> Make<br />
Dependency of<br />
Files<br />
To use <strong>MKS</strong> Make, you require a makefile. A makefile contains a list of<br />
rules. Rules describe the dependencies among files that you want<br />
<strong>MKS</strong> Make to maintain. A rule may also specify the commands—or<br />
recipes—for rebuilding files when required.<br />
You create makefiles as simple text files, so you can use your favorite<br />
text editor or word processor to create and edit them. You must make<br />
certain you save the files without any embedded word processor<br />
formatting characters (such as changes in font); <strong>MKS</strong> Make cannot<br />
interpret these special characters.<br />
You must also ensure the editor you use does not translate the <br />
control character into a group of spaces (make signals the beginning<br />
of recipe lines with the character). Most editors allow you to<br />
turn off the translation feature or insert a literal <br />
character.<br />
When you run the make program, it processes the makefile, checking<br />
each rule for files you have recently modified. If make finds such a<br />
file, it may also discover a dependent file that has not been rebuilt<br />
since your modifications to the first file. If this is the case, make<br />
proceeds to process the recipe associated with the dependent file‘s<br />
particular rule.<br />
<strong>The</strong> word dependency implies that a file may depend upon another<br />
file or files for some reason. <strong>MKS</strong> Make refers to files that depend on<br />
others as targets. It refers to the files a target depends on as<br />
prerequisites. <strong>The</strong> same file can be a prerequisite, and later a target, in<br />
the same makefile. If you modify a prerequisite file, make discovers it<br />
needs to rebuild its associated target file. If you remove a target file,<br />
make takes the steps necessary to recreate it.<br />
When a file that is a prerequisite for a target is modified, or recently<br />
changed, that file’s target is considered to be out of date with respect<br />
to that prerequisite.<br />
<strong>The</strong> makefile describes the dependency relationships of targets and<br />
prerequisites. Each rule identifies a target file, and specifies the<br />
target’s prerequisite file(s). <strong>The</strong> rules’ recipes describe any actions<br />
<strong>MKS</strong> Make must take if it discovers an out-of-date target.<br />
246 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Makefiles<br />
Getting Started With <strong>MKS</strong> Make<br />
At this point, an example may help explain these concepts. This<br />
example is purposefully larger than necessary and somewhat limited.<br />
Later in this chapter, you can learn how to make your makefiles more<br />
useful and compact. <strong>The</strong> contents of a sample makefile for a small<br />
program, using the Borland C++ compiler are:<br />
program.exe : main.obj func.obj<br />
bcc -eprogram.exe -ml main.obj func.obj<br />
main.obj: main.c<br />
bcc -c -ml main.c<br />
func.obj: func.c<br />
bcc -c -ml func.c<br />
If you want the same makefile using the Microsoft C/C++ compiler,<br />
you might write<br />
program.exe : main.obj func.obj<br />
cl -AL main.obj func.obj -o program.exe<br />
main.obj: main.c<br />
cl -c -AL main.c<br />
func.obj: func.c<br />
cl -c -AL func.c<br />
For the Watcom C/C++ compiler, it might look like<br />
program.exe : main.obj func.obj<br />
wcl -ml -fe=program.exe main.obj func.obj<br />
main.obj: main.c<br />
wcc -c -ml main.c<br />
func.obj: func.c<br />
wcc -c -ml func.c<br />
With all three compilers, the form of the makefile is similar. For the<br />
sake of convenience, this chapter looks at the Borland C++ example<br />
more closely, but what follows applies to all versions equally.<br />
<strong>The</strong> makefile consists of three rules. <strong>The</strong> first rule in the Borland<br />
example looked like<br />
program.exe : main.obj func.obj<br />
bcc -eprogram.exe -ml main.obj func.obj<br />
<strong>The</strong> first line in this rule states that the file program.exe depends<br />
upon the two .obj files that follow the colon. If any or all of the .obj<br />
files have changed since the last time program.exe was made,<br />
<strong>MKS</strong> Make attempts to remake it. It does this using the recipe on the<br />
next line. This recipe consists of the Borland C bcc command that<br />
links program.exe from the two object files.<br />
<strong>User</strong> <strong>Guide</strong> 247
Using the <strong>MKS</strong> Make Utility<br />
Writing a Rule<br />
For more information about<br />
special targets that are not<br />
files, see “Special Macros” on<br />
page 271.<br />
However, before <strong>MKS</strong> Make remakes program.exe, it checks to see if<br />
any of the .obj files need remaking. To do this, it checks the other<br />
rules in the makefile to determine the dependencies of the .obj files.<br />
If any of the .obj files need remaking (because their associated .c<br />
files have been changed), <strong>MKS</strong> Make remakes the .obj files first<br />
using the bcc command. It then makes program.exe.<br />
<strong>MKS</strong> Make updates each target file (the program.exe file, and all the<br />
.obj files) by executing the recipe that follows the appropriate file.<br />
<strong>The</strong> previous example showed a collection of simple rules. All of the<br />
rules follow a consistent format:<br />
target target… : prerequisite prerequisite…<br />
recipe<br />
<strong>MKS</strong> Make accepts rules with much more complex formats, but this<br />
example uses just this simple form.<br />
<strong>The</strong> term target usually refers to a file made from other files. Each rule<br />
may have several targets. <strong>MKS</strong> Make also recognizes a number of<br />
special targets that are not files.<br />
<strong>The</strong> prerequisites consist of a list of files (each rule may also have<br />
more than one prerequisite). <strong>The</strong> targets depend directly or indirectly<br />
on these files; if any of the files change, the targets require remaking.<br />
<strong>The</strong> prerequisite list appears on the same line as the targets, separated<br />
from the targets by the colon rule operator.<br />
Consider the following example:<br />
func1.obj func2.obj : includes.h<br />
bcc -c -ml func1.c<br />
bcc -c -ml func2.c<br />
<strong>The</strong> rule in the example describes a dependency between a header file<br />
(the prerequisite) and the object files that use it (the targets). If you<br />
change the prerequisite file includes.h, you must update both target<br />
files, func1.obj and func2.obj. Notice that you do not need to<br />
express the dependency between the header file and the source files,<br />
as the contents of the object files depend, in turn, upon the source<br />
files.<br />
<strong>The</strong> recipe consists of one or more commands <strong>MKS</strong> Make uses to<br />
remake the target(s) when necessary. <strong>The</strong> recipe usually begins on the<br />
line following the target and prerequisite list. A recipe can consist of<br />
248 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Getting Started With <strong>MKS</strong> Make<br />
any number of lines. Each and every line in the recipe must begin<br />
with a character. A line that does not begin with a <br />
signals the start of a new rule.<br />
Note A common cause of syntax errors results from makefiles with<br />
leading blank characters at the beginning recipe lines.<br />
In the interests of efficiency, <strong>MKS</strong> Make executes most recipe lines<br />
itself. However, a recipe line may contain a character special to your<br />
command interpreter or shell (for example, the > and < redirection<br />
symbols). In these cases, <strong>MKS</strong> Make calls the command interpreter or<br />
shell to execute the line, so the special characters are handled<br />
properly.<br />
File Names Containing a Colon<br />
Occasionally, the names of target files may contain a colon.<br />
a:file<br />
Usually, <strong>MKS</strong> Make interprets a colon as a rule operator—the mark<br />
separating the target names from the prerequisite list. To avoid<br />
confusion, use quotes to enclose any file name that contains a colon:<br />
"a:program.exe" : "a:main.obj" func1.obj…<br />
recipe<br />
Usually, however, you specify all file names relative to the current<br />
directory, so you do not need to include a drive specifier (or colon).<br />
White Space<br />
White space consists of one or more blanks or characters.<br />
White space separates the names of items in a target or prerequisite<br />
list. You can also surround the colon between the target list and the<br />
prerequisite list with white space; however, you do not have to.<br />
You can also insert blank lines wherever you want in a makefile. make<br />
ignores blank lines when it reads the makefile.<br />
<strong>User</strong> <strong>Guide</strong> 249
Using the <strong>MKS</strong> Make Utility<br />
Comments<br />
More About<br />
Rules<br />
Continuation Lines<br />
Using a backslash character (\) as the last character of a line indicates<br />
the line is not finished—that it continues on to the next line of the file.<br />
<strong>The</strong> first two lines in the following example have the same meaning<br />
as the third:<br />
target list : \<br />
prerequisite list<br />
target list : prerequisite list<br />
You might find this useful if the length of a list makes it impossible to<br />
fit everything on one line. You can do this several times. A single line<br />
can be broken into any number of continuation lines.<br />
Note Always use a backslash to continue a line, whether you use the<br />
<strong>MKS</strong> KornShell, command.com, or cmd.exe.<br />
A makefile can contain comments. A comment begins with a sharp<br />
character (#), and extends to the end of the line. Consider the<br />
following example:<br />
# This is a comment line<br />
target : prerequisite #This is another comment<br />
recipe # One more comment<br />
<strong>MKS</strong> Make ignores all comments.<br />
So far, this chapter has given a simple description of what rules in a<br />
makefile look like. All rules use the following general format (for a<br />
complete description, see the man page for the make command).<br />
targets [attr] oprtr [prereqs] [;recipe]{ recipe}<br />
targets A list of one or more files.<br />
attr A list, possibly empty, of attributes to apply to the targets. For<br />
more information, see “Controlling <strong>MKS</strong> Make” on page 265.<br />
oprtr A rule operator, separating the targets from the associated<br />
prerequisites. Usually this is a colon, but <strong>MKS</strong> Make supports a<br />
number of other rule operators for specific purposes. For more<br />
information, see the online command reference for the make<br />
command.<br />
250 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Missing Rules<br />
Getting Started With <strong>MKS</strong> Make<br />
prereqs Zero or more file names the specified targets depend on.<br />
recipe May appear on the same line as the prerequisites, following<br />
them, and separated by a semicolon. If such a recipe exists,<br />
<strong>MKS</strong> Make uses it as the first in a list of recipe lines defining a<br />
method for remaking target. Additional recipe lines may follow<br />
the first line of the rule. Each additional recipe line must begin<br />
with a character.<br />
If <strong>MKS</strong> Make cannot find a rule for a particular target, it displays this<br />
message on the standard error stream:<br />
Make: Don’t know how to make target<br />
If it cannot find a rule for a particular prerequisite and the file named<br />
by that prerequisite does not already exist, the same message is<br />
displayed.<br />
More About Recipes<br />
Recipes are lists of lines used by <strong>MKS</strong> Make to rebuild the target(s)<br />
listed in the associated rule. A rule may have zero or more recipe<br />
lines. Comments and empty lines are ignored when recipes are read.<br />
When <strong>MKS</strong> Make is reading recipes and encounters a line that does<br />
not begin with a character, it assumes the previous rule has<br />
finished and a new one has begun.<br />
Command Prefixes<br />
You can begin any recipe line with a command prefix immediately<br />
following the character. <strong>MKS</strong> Make supports the following<br />
three command prefixes:<br />
- (dash) Ignore non-zero exit values when executing this recipe<br />
line. Use this when you want to use a command in a recipe<br />
that may not return a proper (zero) exit value when it<br />
succeeds.<br />
@ (at sign) Inhibits the echoing of a recipe line to the standard output<br />
prior to its execution. Use this if a recipe line sends<br />
messages to standard output, and you do not want to<br />
clutter the output stream.<br />
+ (plus sign) Forces execution of the recipe line, even if the -n, -q, or -<br />
t options are specified on the command line.<br />
<strong>User</strong> <strong>Guide</strong> 251
Using the <strong>MKS</strong> Make Utility<br />
For more information, see the<br />
man page for the make<br />
command.<br />
Running <strong>MKS</strong> Make<br />
Specifying<br />
Targets on the<br />
Command Line<br />
Using a<br />
Different<br />
Makefile<br />
You can use more than one command prefix with a recipe line,<br />
provided they are grouped together, immediately following the<br />
character. You may put the prefixes for a recipe in any order,<br />
for example:<br />
-@ echo "rebuilding foo"<br />
To run <strong>MKS</strong> Make, enter<br />
make<br />
at the command line. By default, <strong>MKS</strong> Make expects to find your<br />
makefile in the current directory with the name makefile or<br />
Makefile. Once it finds your makefile, <strong>MKS</strong> Make checks to see if the<br />
first target has become out of date with respect to its prerequisites. As<br />
part of this process, it first looks to see if the prerequisites themselves<br />
require remaking. <strong>MKS</strong> Make rebuilds all the files it needs to<br />
properly rebuild the first target.<br />
Often, you might find it useful to put an artificial rule at the<br />
beginning of your makefile, naming all the targets you remake most<br />
frequently.<br />
herring : prerq1 prerq2…<br />
<strong>The</strong> target file in the example (named herring) does not exist, but<br />
when <strong>MKS</strong> Make tries to rebuild it, it automatically checks each one<br />
of its prerequisites to determine whether they require rebuilding.<br />
If you specify the names of specific targets on the command line,<br />
<strong>MKS</strong> Make attempts to remake only the targets you specify. Again, it<br />
first attempts to rebuild any prerequisites (associated with your<br />
specified targets) that have become out of date with respect to any<br />
files they depend on.<br />
In the following example, make rebuilds the given object files, should<br />
they require it.<br />
make func1.obj func2.obj<br />
If you give your makefile a name other than makefile, or place it in a<br />
separate directory, you usually have to specify its name. You do this<br />
with the -f option, for example:<br />
make -f foo.mk<br />
252 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> Command<br />
Line<br />
You can combine options to make, as in the example<br />
make -f foo.mk func1.obj func2.obj<br />
Running <strong>MKS</strong> Make<br />
<strong>The</strong> previous sections gave you a glimpse of <strong>MKS</strong> Make’s versatility.<br />
You can specify a number of options and items on the command line<br />
to modify its behavior. In general, your command lines should<br />
conform to the format<br />
make [options] [macro definitions] [target…]<br />
You can specify a number of options on the command line. Options<br />
take the form of a single letter, prefixed with a dash. <strong>MKS</strong> Make<br />
distinguishes between uppercase and lowercase on the command<br />
lines, so it would treat the -e option and the -E option differently.<br />
If you want to specify several options on the same command line, you<br />
can bundle them together following a single dash. For example<br />
make -n -u<br />
make -nu<br />
are considered identical.<br />
Some options require an additional argument, as you saw previously<br />
with the -f option. You can bundle one of these options with others<br />
on the command line; however, it must appear last in the bundle, to<br />
allow for its argument. <strong>The</strong>se lines are considered identical:<br />
make -nuf foo.bar<br />
make -n -u -f foo.bar<br />
You may also append an argument directly to an option, although<br />
this syntax is now obsolete<br />
make -nuffoo.bar<br />
<strong>The</strong> following table briefly explains some of the most common<br />
command-line options. For the complete list of options, see the man<br />
page for the make command.<br />
<strong>User</strong> <strong>Guide</strong> 253
Using the <strong>MKS</strong> Make Utility<br />
For more information on the<br />
-D option, see the man page<br />
for the make command. For<br />
more information on macros,<br />
see “Using Macros” on<br />
page 256.<br />
How Make<br />
Finds Its<br />
Makefile<br />
Option Description<br />
-f file Uses file as the makefile. If you specify a dash in place of file,<br />
<strong>MKS</strong> Make reads the makefile from standard input. In other<br />
words, it expects you to type in the makefile from the keyboard,<br />
or redirect it from a file.<br />
-k Makes all independent targets, even if an error occurs.<br />
Ordinarily, processing stops after a command in a recipe<br />
produces an error. Specifying -k forces <strong>MKS</strong> Make to continue<br />
making other targets, provided they are unrelated to the one<br />
associated with the error.<br />
-n Displays all the commands needed to update the chosen<br />
targets, but does not execute them. Use this to check that your<br />
makefile does exactly what you expect it to do, without actually<br />
affecting any of your files.<br />
-u Rebuilds all the targets whether their prerequisites have<br />
changed or not. Use this to guarantee that everything gets<br />
rebuilt at the same time, whether needed or not.<br />
Any macro definitions you specify on the command line have the<br />
same form as macro definitions in a makefile, and supersede<br />
definitions in the makefile or default rules file. You can place macro<br />
definitions anywhere on the command line, even after the names of<br />
targets.<br />
You can also define macros on the command line with the -D option.<br />
This option forces <strong>MKS</strong> Make to use these macro definitions before<br />
reading any makefile.<br />
When you run <strong>MKS</strong> Make, it uses information from a number of<br />
different sources. <strong>The</strong> following subsections describe each source of<br />
information in the order used by make.<br />
254 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For more information on the<br />
control macros, see<br />
“Controlling <strong>MKS</strong> Make” on<br />
page 265.<br />
Built-in Rules<br />
Running <strong>MKS</strong> Make<br />
<strong>MKS</strong> Make contains a number of built-in rules. <strong>The</strong>se rules may<br />
evolve somewhat from release to release. You cannot change them<br />
yourself. You can display the built-in rules for your version of make,<br />
with the -V option.<br />
Note <strong>The</strong> POSIX standard refers to default rules as built-in rules. <strong>MKS</strong><br />
uses the term built-in to emphasize the difference between the provided<br />
rules that you cannot configure (built-in) and those that you can<br />
(default).<br />
Default Rules<br />
Default rules are specified in the standard startup file. By default,<br />
<strong>MKS</strong> Make looks for a file called $ROOTDIR/etc/startup.mk, to use<br />
as its startup file. You can specify a different name for the startup file<br />
by setting a value for the MAKESTARTUP environment variable, or by<br />
giving the MAKESTARTUP control macro a value on the command line<br />
as an argument to the -D option.<br />
You can edit the contents of the startup file with a normal text editor.<br />
When you install <strong>MKS</strong> Make, a startup file is provided for you in<br />
$ROOTDIR/etc/startup.mk. You should not customize this file until<br />
you are familiar with <strong>MKS</strong> Make and know how to modify its<br />
behavior. If you delete this file or put incorrect material into it,<br />
<strong>MKS</strong> Make does not work as documented.<br />
Local Default Rules<br />
<strong>The</strong> last line of the default startup file prompts <strong>MKS</strong> Make to include<br />
a file called startup.mk in the current directory. If this file exists,<br />
<strong>MKS</strong> Make reads it next. Once you are more familiar with<br />
<strong>MKS</strong> Make, you may want to create different local default rules files<br />
for different projects.<br />
Makefile<br />
Lastly, under the direction of its built-in rules, <strong>MKS</strong> Make looks for a<br />
file called makefile in the current directory. If no such file exists, it<br />
looks for a file called Makefile in the current directory. If it cannot<br />
find either file, it displays a message and stops.<br />
You can specify a makefile with a different name, or in a different<br />
directory, by using the -f option, as previously described.<br />
<strong>User</strong> <strong>Guide</strong> 255
Using the <strong>MKS</strong> Make Utility<br />
Using Macros<br />
Suppose you use <strong>MKS</strong> Make to maintain a C program that you are<br />
compiling. Most compilers let you compile programs in accordance<br />
with several memory models. <strong>The</strong> Borland C++ compiler, for<br />
example, provides this ability with the -ms, -mc, -mm, -ml, and -mf<br />
options. Other compilers have similar options.<br />
You need to compile all the program modules with the same memory<br />
model options, so you could write your makefile like the one in<br />
following example for the Borland C++ compiler.<br />
module1.obj : module1.c<br />
bcc -ms -c module1.c<br />
module2.obj : module2.c<br />
bcc -ms -c module2.c<br />
# And so on<br />
<strong>The</strong>se commands all use the small memory model. <strong>The</strong>y also make<br />
use of the -c option, which compiles the source code without linking<br />
it.<br />
Now suppose your program grows to the point that the small<br />
memory model is no longer appropriate. You would need to go back<br />
to your makefile and change all the -ms references into one of the<br />
larger models. This task is time-consuming and error-prone. You may<br />
easily miss one of the recipes that require changing, or make a typing<br />
mistake while you are editing the file.<br />
Macros help solve this problem. A macro is a symbol that represents a<br />
string of text. When <strong>MKS</strong> Make encounters a macro in your makefile,<br />
it replaces the macro symbol with its predefined value (the text<br />
string). This process of replacement is called expansion. You can define<br />
a macro at the top of your makefile, by using a line with the format<br />
macro_name = text_string<br />
Later on in your makefile, you can use this macro to replace its text<br />
string equivalent. To force <strong>MKS</strong> Make to expand the value of a macro,<br />
you surround it with a dollar sign and either parentheses or braces.<br />
or<br />
$(macro_name)<br />
${macro_name}<br />
256 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Using Macros<br />
Refer back to the previous memory model example. You can use<br />
macros to represent explicit references to the memory model, the<br />
compiler name, and so on.<br />
CC = bcc<br />
CFLAGS = -ms<br />
O = .obj<br />
module1$(O) : module1.c<br />
$(CC) -c $(CFLAGS) module1.c<br />
module2$(O) : module2.c<br />
$(CC) -c $(CFLAGS) module2.c<br />
# And so on<br />
You create a macro in the first line named CC, and assign it the<br />
command name that invokes your compiler.<br />
On the second line, you create the macro CFLAGS, and assign it the<br />
options you want your compiler to use.<br />
On the third line is an example of a common practice used with<br />
<strong>MKS</strong> Make—the assignment of your system’s object file extension to<br />
the O macro (the letter O, not zero). This macro is useful for helping to<br />
ensure the portability of your makefiles across platforms. Object files<br />
typically employ .obj as the object file extension on PCs. On POSIX<br />
and UNIX platforms, object files typically use .o as the object file<br />
extension. Notice that our definition of the O macro includes the dot<br />
as well as the extension name. We do this so the makefile can work on<br />
platforms that do not use an extension for object files at all (and thus,<br />
have no dot in object file names).<br />
This convention is also used for the A and E macros, which expand to<br />
the archive library and executable file extensions, respectively. <strong>The</strong><br />
examples in this chapter use these macros; the default rules file<br />
provided when you installed <strong>MKS</strong> Make defines values appropriate<br />
to your system.<br />
Now, when you run <strong>MKS</strong> Make with this makefile, it expands all the<br />
occurrences of $(CC) and $(CFLAGS), replacing the macro references<br />
with the strings you have defined at the top of the file.<br />
To change the options you pass to the compiler, you only have to<br />
make a single change—the value assigned to the CFLAGS macro at the<br />
top of the makefile. You can even switch to a different compiler by<br />
changing the value of CC to indicate the command name for the new<br />
compiler. Adding the new options you need to pass to your new<br />
compiler is easy; you have just learned how to do that. You do not<br />
ever have to touch the rules in the body of the makefile; you only<br />
need to change the macro assignments at the top.<br />
<strong>User</strong> <strong>Guide</strong> 257
Using the <strong>MKS</strong> Make Utility<br />
Macro Naming<br />
Conventions<br />
Notice that, in the example, the -c option is in the body of the<br />
makefile. You may want some options to take effect all the time and<br />
not change every time the values of your macros change. Be careful<br />
with this practice, though; if you specify values for your macros that<br />
are incompatible with the options you have left in the main body of<br />
your makefile, you may run into problems.<br />
You can use any sequence of standard alphanumeric characters in a<br />
macro name, although the name cannot begin with a digit. You can<br />
also use underscores. You should use uppercase letters in macro<br />
names, as it makes them easy to identify.<br />
Actually, you can use nearly any printable characters in macro names,<br />
except any of the following:<br />
: ; $ { } =<br />
However, your makefiles are much more readable if you use only<br />
uppercase letters, numbers, and the underscore in your macro names.<br />
Since you can nest macro names inside one another (see “Nesting<br />
Macros in other Macros” on page 259), take care when using the<br />
dollar sign in macro values. You must type two dollar signs in<br />
sequence to represent a literal dollar sign when the macro is<br />
expanded. <strong>The</strong> following example shows a macro called DOLLAR,<br />
holding the string for a dollar sign:<br />
DOLLAR = $$<br />
When <strong>MKS</strong> Make expands the DOLLAR macro, it replaces the macro<br />
with a single dollar sign.<br />
You can assign an empty (NULL) string to a macro (<strong>MKS</strong> Make<br />
predefines NULL). You might find this useful with macros that you<br />
only want to use in certain cases. To assign a null value to a macro,<br />
simply leave the right side of the assignment blank.<br />
MY_BLANK_MACRO =<br />
Note that <strong>MKS</strong> Make ignores white space (blanks and tabs) in the<br />
string after the equal sign. To include white space as part of your<br />
macro string, enclose it in double quotes.<br />
Finally, if you create a macro with a single-letter name, <strong>MKS</strong> Make<br />
lets you omit the parenthesis in references to the macro. Thus, if you<br />
use the conventional E macro to hold the your executable file<br />
extension string, you can place $E in the makefile and <strong>MKS</strong> Make<br />
expands this to E’s contents. <strong>The</strong> rest of the examples in this manual<br />
employ this convention.<br />
258 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Defining<br />
Macros on the<br />
Command Line<br />
For more information on the<br />
-D option, see the online<br />
command reference for the<br />
make command.<br />
Nesting Macros<br />
in other Macros<br />
Using Macros<br />
You can define (or redefine) macros anywhere on the make command<br />
line. In the following example, the user defines a macro specifying<br />
the directory containing object modules:<br />
make DIROBJ=/usr/project/obj program.exe<br />
If you define a macro on the command line, the value cannot be<br />
changed by macro definitions in makefiles that are read by the<br />
command. However, you can force <strong>MKS</strong> Make to handle the<br />
command-line macro before reading the makefile with the -D option;<br />
if you use this option to define a macro on the command line, any<br />
definitions made in the makefile overwrite it.<br />
If your command-line macro needs to have white space in it, you<br />
need to surround the entire definition in quotes.<br />
make "FILES= a.c b.c c.c" target1 target2<br />
Note <strong>MKS</strong> Make ignores any leading or trailing white space around the<br />
macro definition, so it treats " FILES = foo bar " and "FILES=foo<br />
bar" as equivalent.<br />
Any macro’s value can contain another macro reference. When<br />
<strong>MKS</strong> Make expands a macro and detects another macro reference in<br />
the replacement string, it automatically expands that reference as<br />
well, for example:<br />
PROJECT = myProj<br />
SRCDIR = $(PROJECT)/src<br />
When make expands the SRCDIR, it notices that another macro string<br />
has appeared, and expands the second macro as well.<br />
/usr/lindsay/$(SRCDIR)<br />
expands first to<br />
/usr/lindsay/$(PROJECT)/src<br />
and expands again to<br />
/usr/lindsay/myProj/src<br />
<strong>User</strong> <strong>Guide</strong> 259
Using the <strong>MKS</strong> Make Utility<br />
For a more useful example, suppose you maintain one set of header<br />
files, but each person working with those header files has their own<br />
directories containing source and object files. You can still have one<br />
makefile to trace the dependency between a header file and each<br />
person’s source files.<br />
# these macros contain the appropriate directories<br />
SRCDIR = $(HOME)/project/src<br />
OBJDIR = $(HOME)/project/obj<br />
HDRDIR = /usr/main/hdr<br />
# makefile rules follow<br />
$(OBJDIR)/module$O : $(HDRDIR)/includes.h<br />
# compile the out of date object file<br />
# from its source<br />
$(CC) -c $(CFLAGS) $(SRCDIR)/module.c<br />
To use this makefile, you would need to specify a command-line<br />
value for HOME on the command line, using the -D option (to assign<br />
the command-line value to HOME before reading the makefile and<br />
performing any macro expansion).<br />
For any value of HOME, you can see that the makefile defines macros<br />
for all the appropriate directories. If HOME is /usr/main, when<br />
<strong>MKS</strong> Make expands the $(SRCDIR) and $(OBJDIR), it also expands<br />
the $(HOME) macro. $(SRCDIR) eventually expands to<br />
/usr/main/project/src<br />
If Lindsay wanted to use the makefile, the following command<br />
would perform the appropriate expansion:<br />
make -DHOME=/usr/lindsay module.obj<br />
or, if Lindsay has exported $HOME in the environment<br />
make -DHOME=$HOME module.obj<br />
Notice that you must name the target explicitly on the command line;<br />
you can not use the O macro. You may define macros on the<br />
command line, but you cannot pass them as part of a target’s name.<br />
You may only use the values assigned to macros within the makefile<br />
itself.<br />
Note If you define a macro on the command line with the -D option,<br />
you may include these macros as components of target names on the<br />
command line. For more information on the -D option, see the man page<br />
for the make command.<br />
260 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For more information on<br />
special target directives (and<br />
.IMPORT in particular), see<br />
“Controlling <strong>MKS</strong> Make” on<br />
page 265, and the online<br />
reference for the make<br />
command.<br />
Modifying<br />
Macro<br />
Expansions<br />
Using Macros<br />
Also notice that Lindsay provided a specific value for HOME on the<br />
command line. To avoid this requirement, you could import a value<br />
for a macro from the environment, with the .IMPORT special target<br />
directive in the makefile.<br />
.IMPORT: HOME<br />
RCDIR = $(HOME)/project/src<br />
and so on…<br />
Note Using .IMPORT this way is not strictly necessary, as <strong>MKS</strong> Make<br />
imports variables from the environment by default.<br />
You can modify the way <strong>MKS</strong> Make expands macros by adding a<br />
colon followed by one or more macro modifiers after the macro<br />
name:<br />
$(macro_name:modifier_list:modifier_list:…)<br />
Each modifier_list consists of one or more characters that tell<br />
<strong>MKS</strong> Make to expand the macro in a specific way. <strong>MKS</strong> Make applies<br />
each macro modifier in the modifier_list from right to left.<br />
For example, if you have a macro called FILE that represents the full<br />
path name of a file, you can use $(FILE:d) to select only the directory<br />
portion of the path name:<br />
FILE = /usr/lindsay/program.c<br />
$(FILE:d)<br />
expands to<br />
/usr/lindsay<br />
You can use uppercase or lowercase letters for macro modifiers; so<br />
both $(FILE:d) and $(FILE:D) would produce /usr/lindsay in the<br />
previous example.<br />
<strong>User</strong> <strong>Guide</strong> 261
Using the <strong>MKS</strong> Make Utility<br />
<strong>The</strong> following table describes some of the modifiers you can use.<br />
Modifier Description<br />
b Use the base file name, without suffix, of a macro string path<br />
name.<br />
d Use the directory portion of a path name. This modifier gives a<br />
dot for path names that do not have explicit directories.<br />
f Use the full file name portion, with suffix, of a path name.<br />
l Convert all characters in the macro string to lowercase.<br />
s Perform string substitution. For more information, see “String<br />
Substitution” on page 262.<br />
t Expand the macro into tokens. For more information, see<br />
“Tokenization” on page 263.<br />
u Convert all characters in the macro string to uppercase.<br />
^ Add a prefix string to each token in the macro string. For more<br />
information, see “Prefix and Suffix Modifiers” on page 264.<br />
+ Append a suffix string to each token in the macro string. For<br />
more information, see “Prefix and Suffix Modifiers” on<br />
page 264.<br />
String Substitution<br />
<strong>The</strong> substitution modifier differs slightly from standard modifiers.<br />
Use the substitution modifier to search for all occurrences of a<br />
substring in the macro string and replace them with another<br />
substring. <strong>The</strong> format of the substitution modifier is:<br />
:s/string/replace/<br />
Using the macro definition for FILE from the previous section.<br />
$(FILE:s/lindsay/dale/)<br />
expands to<br />
/usr/dale/program.c<br />
You can apply the substitution modifiers with other modifiers, and<br />
<strong>MKS</strong> Make applies the modifiers in order from left to right. For<br />
example<br />
$(FILE:s/lindsay/dale/:d)<br />
262 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
expands to<br />
/usr/dale<br />
Using Macros<br />
You can use any printing character in place of the slash to delimit the<br />
pattern and replacement substrings, as long as you use it consistently<br />
within the command. For example<br />
$(FILE:s~lindsay~dale~:d)<br />
expands to<br />
/usr/dale<br />
For compatibility with UNIX System V make, <strong>MKS</strong> Make also<br />
supports the suffix replacement modifier. This modifier, when used<br />
according to the following example, replaces any occurrences of<br />
old_suffix with new_suffix.<br />
$(macro_name:old_suffix=new_suffix)<br />
Notice that the string replacement only applies to file suffixes.<br />
Consider the example<br />
FILE = /usr/lindsay/src/parse.y<br />
$(FILE:.y=.c)<br />
expands to<br />
/usr/lindsay/src/parse.c<br />
Tokenization<br />
<strong>MKS</strong> Make interprets any sequence of non-white space characters as<br />
a token. <strong>The</strong> format of the tokenization modifier is<br />
$(macro:t"string")<br />
<strong>The</strong> construct expands the given macro, inserting string between<br />
tokens. This process is called tokenization. Consider the example<br />
LIST = a b c<br />
$(LIST:t"+")<br />
expands to<br />
a+b+c<br />
Notice that <strong>MKS</strong> Make places the + between each pair of tokens, but<br />
not after the last one.<br />
<strong>User</strong> <strong>Guide</strong> 263
Using the <strong>MKS</strong> Make Utility<br />
You can use a number of special escape sequences in the separator<br />
string. <strong>The</strong> following table describes each one’s effect.<br />
Escape<br />
Sequence<br />
Effect<br />
\" "<br />
\\ \<br />
In this example, using the previous definition of LIST<br />
$(LIST:t"+\n")<br />
expands to<br />
a+<br />
b+<br />
c<br />
Prefix and Suffix Modifiers<br />
You use prefix and suffix modifiers to add a string to the beginning or<br />
end of each space separated token in the macro string, according to<br />
the form<br />
$(macro_name:^"prefix_string")<br />
$(macro_name:+"suffix_string")<br />
In an example using the TEST macro<br />
TEST = main func1 func2<br />
$(TEST:^"/src/")<br />
expands to<br />
\a Alert (bell sound)<br />
\b Backspace<br />
\f Formfeed<br />
\n Newline<br />
\r Carriage Return<br />
\t Horizontal Tab<br />
\v Vertical Tab<br />
\nnn Octal Character nnn<br />
/src/main /src/func1 /src/func2<br />
264 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
and<br />
$(TEST:+".c")<br />
expands to<br />
main.c func1.c func2.c<br />
Controlling <strong>MKS</strong> Make<br />
If the prefix and suffix strings themselves consist of a list of tokens<br />
separated by blanks, the resulting expansion provides the cross<br />
product of both lists. Consider the following example using a<br />
different value for the TEST macro.<br />
TEST = a b c<br />
$(TEST:^"1 2 3")<br />
expands to<br />
and<br />
1a 1b 1c 2a 2b 2c 3a 3b 3c<br />
$(TEST:+"1 2 3")<br />
expands to<br />
a1 b1 c1 a2 b2 c2 a3 b3 c3<br />
If you combine these two references<br />
$(TEST:^"1 2 3":+"1 2 3")<br />
expands to<br />
Controlling <strong>MKS</strong> Make<br />
For a complete technical<br />
description, see the man page<br />
for the make command.<br />
Attributes<br />
1a1 1b1 1c1 2a1 2b1 2c1 3a1 3b1 3c1<br />
1a2 1b2 1c2 2a2 2b2 2c2 3a2 3b2 3c2<br />
1a3 1b3 1c3 2a3 2b3 2c3 3a3 3b3 3c3<br />
This chapter has covered a few ways to control the way <strong>MKS</strong> Make<br />
proceeds when rebuilding a file. To really control its behavior, you<br />
need to understand how to use attributes, special targets, and special<br />
macros.<br />
This section introduces you to these concepts and describes some<br />
commonly used examples.<br />
Attributes represent qualities that you can attach to targets. When<br />
make updates a target, it triggers any attributes associated with that<br />
target.<br />
<strong>User</strong> <strong>Guide</strong> 265
Using the <strong>MKS</strong> Make Utility<br />
You can assign attributes to a single target, a group of targets, or to all<br />
targets in a makefile. You can use several forms when including<br />
attributes in your makefiles. Both of the following examples assign<br />
the attributes specified in attribute_list to each of the targets.<br />
targets attribute_list : prerequisites<br />
attribute_list : targets<br />
You can also write a rule with an attribute_list on the left side, and<br />
with no targets on the right side.<br />
attribute_list :<br />
This applies all attributes in the list to every target in the makefile.<br />
Traditional versions of make may let you do this with .IGNORE<br />
attribute, but not with any other attribute.<br />
<strong>The</strong> following table describes a number of commonly used attributes.<br />
For a complete list, see the man page for the make command.<br />
Attribute Description<br />
.EPILOG Inserts shell epilog code when executing a group recipe<br />
associated with any target having this attribute set.<br />
.IGNORE Ignores any errors encountered when trying to make a<br />
target.<br />
.PRECIOUS Does not remove this target under any circumstances. Any<br />
automatically inferred prerequisite inherits this attribute. By<br />
default, <strong>MKS</strong> Make removes intermediate targets that did<br />
not exist before it began execution.<br />
.PROLOG Inserts shell prolog code when executing a group recipe<br />
associated with any target having this attribute set.<br />
266 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Special Target<br />
Directives<br />
Attribute Description<br />
Controlling <strong>MKS</strong> Make<br />
.SETDIR Changes current working directory to pathname when<br />
making associated targets. You use this attribute with the<br />
following syntax:<br />
.SETDIR=pathname<br />
If pathname contains any colons, you must quote the entire<br />
attribute string, not just the path name.<br />
While .SETDIR might be necessary to work with primitive<br />
commands that do not understand directories, you may<br />
find it awkward and troublesome. You should use<br />
the.SOURCE special target directive described in the next<br />
section, “Special Target Directives”.<br />
.SILENT Does not echo the recipe line, and does not issue any<br />
warnings when making a target with this attribute. This is<br />
equivalent to placing the @ command prefix before every<br />
recipe line in the rule.<br />
You can use any attribute with any target (including some special<br />
targets). If you specify an attribute that cannot be used with a<br />
particular special target, <strong>MKS</strong> Make issues a warning and ignores the<br />
attribute. Some combinations serve no useful purpose (for example,<br />
.INCLUDE with .PRECIOUS). You might find other combinations quite<br />
useful.<br />
Special target directives, or simply special targets, appear in the<br />
target position of rules, but are not really targets. <strong>The</strong>y act as<br />
keywords that provide directives to control they way <strong>MKS</strong> Make<br />
functions. A rule with a special target may not have any other targets<br />
(normal or special); however, you can assign attributes to special<br />
targets. Some combinations serve no purpose, but others are useful<br />
(for example, combining the .IGNORE attribute with the .INCLUDE<br />
special target, as shown in the previous section).<br />
<strong>User</strong> <strong>Guide</strong> 267
Using the <strong>MKS</strong> Make Utility<br />
<strong>The</strong> following table describes a number of commonly used special<br />
target directives. For a complete list, see the man page for the make<br />
command.<br />
Target<br />
Description<br />
Directive<br />
.EXPORT Treats all the prerequisites associated with this target<br />
as macro names. <strong>MKS</strong> Make then exports these<br />
macros and their values to the environment as<br />
environment variables, at the point in the makefile<br />
where it reads the rule. <strong>The</strong> following example builds a<br />
source directory macro from the HOME macro, and then<br />
exports that value to the user’s environment.<br />
SRCDIR=$HOME/project/src<br />
.EXPORT : SRCDIR<br />
# exports SRCDIR to the environment<br />
<strong>MKS</strong> Make ignores any attributes associated with this<br />
target. It exports the specified value to the environment<br />
when it reads the rule, but does not execute any<br />
commands until it finishes reading the entire makefile.<br />
This means that if you .EXPORT a value more than<br />
once in a makefile, only the last value affects executed<br />
commands.<br />
.IMPORT Make searches in the environment for prerequisite<br />
names specified for this target and defines them as<br />
macros with their value taken from the environment. If<br />
the prerequisite .EVERYTHING is given, make reads in<br />
the entire environment.<br />
268 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Target<br />
Directive<br />
Description<br />
Controlling <strong>MKS</strong> Make<br />
.INCLUDE Process one or more additional makefiles, as if their<br />
contents had been inserted at this point. <strong>MKS</strong> Make<br />
behaves as if the contents of the additional makefile<br />
were inserted after the line where it finds this special<br />
target. You specify these extra makefiles as<br />
prerequisites to the .INCLUDE special target. If the<br />
prerequisite list contains more than one file, they are<br />
read from left to right. <strong>The</strong> following example tells<br />
<strong>MKS</strong> Make to look for an additional set of default rules<br />
in the users personal project directory:<br />
.INCLUDE : $HOME/project/startup.mk<br />
make uses the following rules to search for extra<br />
makefiles:<br />
If a relative file name is enclosed in quotes, or is not<br />
enclosed with angle brackets (< and >), look in the<br />
current directory. If the file is not present, look in each<br />
directory specified by the .INCLUDEDIRS special<br />
target.<br />
If a relative name is enclosed with angle brackets<br />
(< and >), search only in the directories specified by<br />
the .INCLUDEDIRS special target.<br />
If an absolute path name is given, look for that file<br />
and ignore the list associated with the<br />
.INCLUDEDIRS special target. An absolute path<br />
name could be any one of<br />
./foo.c<br />
/foo.c<br />
/src/foo.c<br />
c:/foo.c<br />
c:/src/foo.c<br />
If <strong>MKS</strong> Make cannot find a file, it normally issues an<br />
error message and terminates; however, if you have<br />
associated the .IGNORE attribute with this special<br />
target, it just ignores the missing file error. <strong>The</strong><br />
.IGNORE attribute is the only one that serves a<br />
meaningful purpose when associated with<br />
.INCLUDE.<br />
For compatibility with <strong>MKS</strong> Make on UNIX System V,<br />
the following two lines produce equivalent results.<br />
include file #at beginning of a line<br />
.INCLUDE: file<br />
<strong>User</strong> <strong>Guide</strong> 269
Using the <strong>MKS</strong> Make Utility<br />
Target<br />
Directive<br />
Description<br />
.INCLUDEDIRS Specifies a list of prerequisites that define the<br />
directories to search when trying to include a makefile<br />
with the .INCLUDE special target. <strong>The</strong> following<br />
example looks for .INCLUDE files in a central admin<br />
directory, then in a central source directory, then in a<br />
personal source directory.<br />
.INCLUDEDIRS : /etc /rd/src $HOME/project<br />
.POSIX Process the makefile as specified in the POSIX.2<br />
standard. If present, this special target must appear on<br />
the first non-comment line in the makefile. This target<br />
may have no associated prerequisites or recipes. Use<br />
this when you need to ensure your makefiles’ portability<br />
to any other POSIX-based platform.<br />
Using this special target has the following effects.<br />
Causes <strong>MKS</strong> Make to always use a separate<br />
instance of the shell to execute each recipe line,<br />
instead of trying to run the commands directly.<br />
Disables any brace expansion, and ignores any<br />
instance of the .BRACEEXPAND special target. For<br />
more information about the deprecated<br />
.BRACEEXPAND special target, see the man page for<br />
the make command.<br />
Disables metarule inferencing.<br />
Disables conditionals.<br />
Disables the use of dynamic prerequisites.<br />
Disables the use of group recipes.<br />
Restricts library prerequisites to explicitly named<br />
members. For more information, see the description<br />
of the .NOAUTODEPEND special target in the online<br />
reference for the make command.<br />
Checks only the archive when checking the time<br />
stamp on a library module; it does not check for an<br />
object file.<br />
Prevents make from checking for the string $(MAKE)<br />
when you specify the -n option on the command line.<br />
270 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Special Macros<br />
Target<br />
Directive<br />
Description<br />
Controlling <strong>MKS</strong> Make<br />
.SOURCE Check the list of directories, defined by the associated<br />
prerequisite list, when trying to locate a target file<br />
name. <strong>The</strong> following example checks a user’s personal<br />
source directory first, and then a central one.<br />
.SOURCE : $HOME/project/src /rd/src<br />
For more information, see “How Make Finds Files” on<br />
page 277.<br />
.SOURCE.x When trying to locate a file with a name ending in the<br />
suffix .x, search first in the list of directories defined by<br />
the associated prerequisite list. <strong>The</strong> following example<br />
directs make to look in two different sets of directories<br />
for source and object file targets.<br />
.SOURCE$O : $HOME/project/object /rd/object<br />
.SOURCE.c : $HOME/project/src /rd/src<br />
.SUFFIXES When inferring a rule using suffix rules, the list of valid<br />
suffixes is defined by this target’s associated<br />
prerequisite list. If you specify the special target more<br />
than once, <strong>MKS</strong> Make adds each list of suffixes to a<br />
single list, in the order they appear. <strong>The</strong> following<br />
example specifies four valid suffixes for use with suffix<br />
rules.<br />
.SUFFIXES : y .c $O $E<br />
To clear the list, specify this special target with an<br />
empty prerequisite list. <strong>The</strong> .SUFFIXES special target<br />
has no effect on metarule inferencing.<br />
For additional information, see “Suffix Rules” on<br />
page 286.<br />
Special macros usually behave like macros, except they can hold<br />
special kinds of information. <strong>MKS</strong> Make supports two kinds of<br />
special macros; control macros and runtime macros.<br />
Control macros control <strong>MKS</strong> Make’s behavior. A control macro<br />
having the same function as an attribute, also has the same name.<br />
<strong>MKS</strong> Make defines the runtime macros during the process of making<br />
targets. Runtime macros usually only serve a useful purpose within<br />
recipes; they can expand to contain the name of prerequisites or<br />
targets within recipes. Dynamic prerequisite macros (a special type of<br />
<strong>User</strong> <strong>Guide</strong> 271
Using the <strong>MKS</strong> Make Utility<br />
runtime macro), however, serve a useful function when used in<br />
prerequisite lists; they can refer to the associated target’s name (in<br />
full, or in part).<br />
Control Macros<br />
<strong>MKS</strong> Make groups control macros into two sets: string-valued macros<br />
and attribute macros.<br />
<strong>MKS</strong> Make automatically creates internally defined macros. For<br />
example, you can use $(PWD) to expand to the name of the present<br />
working directory.<br />
<strong>The</strong> following table describes some of the most useful string valued<br />
macros. For a complete list, see the online command reference for the<br />
make command.<br />
Macro Description<br />
DIRSEPSTR Defined internally, provides the characters that you can<br />
use to separate components in a path name.<br />
On UNIX and POSIX systems, this macro simply contains<br />
the slash character (/).<br />
On Windows 95/NT, and OS/2 systems, the startup.mk<br />
file redefines DIRSEPSTR, according to the value you<br />
specify for your SHELL environment variable. If the SHELL<br />
variable is undefined, and COMSPEC is set, then the startup<br />
file redefines DIRSEPSTR to contain a backslash, a<br />
forward slash, and a colon (\/:). If you run <strong>MKS</strong> Make<br />
with -r (so startup.mk is not read), or if SHELL is<br />
defined, or if both SHELL and COMSPEC are undefined,<br />
then the DIRSEPSTR special macro contains a string<br />
consisting of forward slash, a backslash, and a colon (/<br />
\:). If <strong>MKS</strong> Make finds it necessary to make a path name,<br />
it uses the first character of DIRSEPSTR to separate path<br />
name components.<br />
NULL Defined internally, expands to an empty string. Use this for<br />
comparisons in conditional expressions, and in<br />
constructing metarules without ambiguity.<br />
For more information, see “Using Inference Rules” on<br />
page 281.<br />
OS Defined internally, expands to the name of the operating<br />
system.<br />
OSVERSION Defined internally, expands to a string giving the major<br />
version of your current operating system.<br />
272 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For more information, see<br />
“Attributes” on page 265.<br />
Macro Description<br />
Attribute Macros<br />
Controlling <strong>MKS</strong> Make<br />
OSRELEASE Defined internally, expands to a string giving the release<br />
number of your current operating system.<br />
<strong>The</strong> attribute macros let you turn global attributes on and off. You use<br />
the macros by assigning them a value. If you assign a NULL value to<br />
the macro, make turns off the associated attribute. If you assign a non-<br />
NULL value to the macro, <strong>MKS</strong> Make turns on the associated<br />
attribute and gives all targets that attribute.<br />
<strong>The</strong> following macros correspond to attributes of the same name:<br />
.EPILOG<br />
.PRECIOUS<br />
.PROLOG<br />
.SILENT<br />
PWD Defined internally, expands to the full path name of the<br />
present working directory (that is, the directory that<br />
<strong>MKS</strong> Make considers the current directory).<br />
SHELL Set by the default rules and may be changed by you,<br />
expands to the full path to the executable image used as<br />
the shell (command interpreter) when processing singleline<br />
recipes. You must define this macro if you use recipes<br />
that require execution by a shell.<br />
<strong>The</strong> default rules assign a value to this macro by<br />
inspecting the value of the SHELL environment variable. If<br />
this variable has no value, <strong>MKS</strong> Make gives it the value of<br />
the COMSPEC environment variable.<br />
SWITCHAR Defined internally, expands to the switch character<br />
currently used to mark command-line options.<br />
<strong>User</strong> <strong>Guide</strong> 273
Using the <strong>MKS</strong> Make Utility<br />
Runtime Macros<br />
<strong>MKS</strong> Make expands runtime macros when it carries out the recipes<br />
that contain them. Except for dynamic prerequisite macros, runtime<br />
macros do not produce useful values if placed outside recipes. <strong>The</strong><br />
following table describes the expansions for the runtime macros.<br />
Macro Description<br />
$@ <strong>The</strong> full name of the target, when building a normal target.<br />
When building a library, it expands to the name of the archive<br />
library (for example, if you specify the target as<br />
mylib(member), $@ expands to mylib).<br />
$% Also the full name of the target, when building a normal target.<br />
When building a library, it expands to the name of the archive<br />
member. With a target of mylib(member), $% expands to<br />
member.<br />
$* <strong>The</strong> target name, with no suffix. This macro produces the same<br />
value as $(%:db).<br />
$> <strong>The</strong> name of the library, if the current target is a library member.<br />
With a target of mylib(member), $> produces the string<br />
mylib.<br />
$^ <strong>The</strong> list of prerequisites given in the current rule (that is, the rule<br />
associated with the recipe that <strong>MKS</strong> Make is executing).<br />
$& <strong>The</strong> list of all prerequisites in all rules that apply to the current<br />
target. In :: rules, $& produces the same strings as $^.<br />
$? <strong>The</strong> list of all prerequisites in all rules associated with the<br />
current target, which are newer than that target or which need<br />
to be created. However, in double colon rules (rules with the ::<br />
rule operator) this macro produces the same string as the $<<br />
macro.<br />
$< Similar to $?, except it produces only those prerequisites that<br />
prompt the execution of the current rule (not all changed<br />
prerequisites associated with a single target). In normal rules,<br />
the expansions contains the list of all changed prerequisites in<br />
the current rule. In inference rules, however, it always contains<br />
the single prerequisite of the executing rule. In rules using the<br />
:! operator, this macro produces the current changed<br />
prerequisite. For more information on rule operators, see the<br />
man page for the make command.<br />
$$ Produces a single dollar sign ($).<br />
274 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For more information on<br />
using libraries, see “Making<br />
Libraries” on page 293.<br />
Examples<br />
Controlling <strong>MKS</strong> Make<br />
<strong>The</strong> following examples help make the use of runtime macros a little<br />
more clear. This first example begins with a simple pair of rules (to<br />
ensure the portability of this example across platforms, it uses the<br />
predefined macro, O, to represent the suffix string your system uses<br />
for object files).<br />
a$O : a.c<br />
a$O : b.h c.h<br />
recipe for making a’s object file<br />
Assuming that a.c and c.h have recently changed, and that b.h has<br />
not changed since the last time you built a$O, when <strong>MKS</strong> Make<br />
executes the recipe for making a$O, the runtime macros expand to the<br />
following values:<br />
$@ a$O<br />
$% a$O<br />
$* a<br />
Note that <strong>MKS</strong> Make would further expand the $@ macro’s<br />
expansion, to produce the value for the O macro.<br />
Next, here is an example of a library target.<br />
mylib$A(mem1$O) :<br />
recipe<br />
When <strong>MKS</strong> Make rebuilds mylib$A, the appropriate runtime macros<br />
would produce the following values:<br />
<strong>User</strong> <strong>Guide</strong> 275<br />
$><br />
$^ b.h c.h<br />
$& a.c b.h<br />
c.h<br />
$? a.c c.h<br />
$< c.h<br />
$@ mylib$A<br />
$% mem1$O<br />
$* mem1
Using the <strong>MKS</strong> Make Utility<br />
For more information on<br />
dynamic prerequisites, see the<br />
man page for the make<br />
command.<br />
Dynamic Prerequisite Macros<br />
You can use a number of the runtime macros to create dynamic<br />
prerequisites. When <strong>MKS</strong> Make encounters dynamic prerequisite<br />
macros in the prerequisite list of a rule, it expands them when it<br />
attempts to update the target. Only a few runtime macros produce<br />
meaningful results when you use them as dynamic prerequisite<br />
macros.<br />
To construct a dynamic prerequisite macro, you place an additional<br />
dollar sign in front of the runtime macro reference. <strong>The</strong> following<br />
table explains the use of two runtime macros as dynamic prerequisite<br />
macros.<br />
Macro Description<br />
$$@ Expands to the target name. If the target is a library, it produces<br />
the name of the archive library. For example, with the macro<br />
project : $$@.c<br />
when <strong>MKS</strong> Make attempts to rebuild the object file, it expands<br />
the $$@ dynamic prerequisite to produce the name of the target,<br />
in this case project. You can make this example more useful<br />
when you modify the value of $$@<br />
project$O : $$(@:b).c<br />
This time, you modify the $$@ macro’s value to select the<br />
basename of the object file (and still produce project). <strong>The</strong> next<br />
example shows a practical use for this macro.<br />
file1 file2 : $$@.c<br />
$(CC) -c $(CFLAGS) $@.c<br />
You can see that, by using the $$@ dynamic prerequisite macro<br />
in conjunction with the $@ runtime macro, you can compact two<br />
rules into one general one. Without the runtime macros, you<br />
would need a separate rule for each of the two files.<br />
$$* Produces the name of the target, but without the suffix. <strong>The</strong><br />
following two rules contain identical prerequisites.<br />
project$O : $$(@:b).c<br />
project$O : $$*.c<br />
You can also use the symbols $$% and $$> to create useful dynamic<br />
prerequisites.<br />
276 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
How Make<br />
Finds Files<br />
Controlling <strong>MKS</strong> Make<br />
Makefiles often specify target names in the shortest manner possible,<br />
relative to the directory that contains the target files. <strong>MKS</strong> Make<br />
possesses sophisticated techniques to search for the file that<br />
corresponds to a target name in a makefile.<br />
Assume that <strong>MKS</strong> Make tries to locate a target with a name in the<br />
format pathname.ext, where .ext is the suffix and pathname is the stem<br />
portion (that is, that part which contains the path and the file name).<br />
When given an relative path name, <strong>MKS</strong> Make uses the following<br />
rules to find the file.<br />
1. Look for pathname.ext relative to the current directory, and use it,<br />
if found.<br />
2. Otherwise, if the .SOURCE.ext special target is defined, search<br />
each directory given in its list of prerequisites for pathname.ext. If<br />
.ext is a NULL suffix (that is, pathname.ext is simply pathname)<br />
use .SOURCE.NULL instead. If found, use that file.<br />
3. If .SOURCE is defined, search each directory in its prerequisite list<br />
for pathname.ext. If found, use that file.<br />
4. If still not found and the target is a member of a library, try to find<br />
the target in that library. This same set of rules is used to bind a<br />
file to the library target at an earlier stage of the makefile<br />
processing.<br />
5. If still not found, the search fails. <strong>MKS</strong> Make returns the original<br />
name pathname.ext.<br />
If at any point the search succeeds, <strong>MKS</strong> Make replaces the name of<br />
the target with the file name it finds, and refers to it by that name<br />
internally.<br />
<strong>The</strong>re is potential here for a lot of search operations. <strong>The</strong> trick is to<br />
define .SOURCE.x special targets with short search lists and leave<br />
.SOURCE undefined, or as short as possible. Initially, <strong>MKS</strong> Make<br />
simply defines .SOURCE as<br />
.SOURCE : .NULL<br />
In this context, .NULL in the prerequisite list prompts <strong>MKS</strong> Make to<br />
search the current directory by default.<br />
<strong>The</strong> search algorithm has the following useful side effect. When<br />
<strong>MKS</strong> Make searches for a target that is a member of a library, it first<br />
searches for the target as an ordinary file. When a number of library<br />
members require updating, you may find it most efficient to compile<br />
<strong>User</strong> <strong>Guide</strong> 277
Using the <strong>MKS</strong> Make Utility<br />
all of them first and to update the library at the end in a single<br />
operation. If one of the members does not compile and <strong>MKS</strong> Make<br />
stops, you can fix the error and run it again.<br />
<strong>MKS</strong> Make does not remake any of the targets it has already<br />
generated object files for, as long as their prerequisite files remain<br />
unchanged.<br />
If the target is a library member, <strong>MKS</strong> Make begins its search for the<br />
target in that library. If it finds the target, it searches for the member<br />
using the search rules. Thus, <strong>MKS</strong> Make first binds library entry<br />
point specifications to a member file, and then checks that member<br />
file to see if it has changed.<br />
If you specify the .SOURCE or .SOURCE.x targets more than once,<br />
<strong>MKS</strong> Make appends all the prerequisites to one list. However, you<br />
can clear the list of prerequisites by specifying the target with a null<br />
prerequisite list. In addition, you can use <strong>MKS</strong> Make’s :- rule<br />
operator to clear a previously set list of path names. Thus, the<br />
following two examples are equivalent.<br />
.SOURCE :<br />
.SOURCE : /usr/fred /usr/gerry<br />
# these two lines are equivalent to the next one<br />
.SOURCE :- /usr/fred /usr/gerry<br />
More generally, the processing of the .SOURCE special targets is<br />
identical to the processing of the .SUFFIXES special targets.<br />
Example: Directory Navigation Within a Makefile<br />
Sometimes you might want to have a recipe run while the directory is<br />
set to something else other than the current directory. <strong>The</strong> .SETDIR<br />
attribute tells make to change the current directory for the duration of<br />
the recipe with the attribute set. Here’s an example:<br />
all: subdir two<br />
echo not in subdir<br />
pwd<br />
# Remember to clean up afterwards by<br />
# removing subdir.<br />
subdir:<br />
mkdir subdir<br />
# Note: We can’t put "subdir" as a prerequisite<br />
# for "two" because subdir has to exist before<br />
# anything to do with "two" is processed.<br />
two .SETDIR=subdir:<br />
echo in subdir<br />
pwd<br />
278 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Controlling <strong>MKS</strong> Make<br />
Note that .SETDIR does not work with metarules. <strong>The</strong> previous<br />
example is written to work with the <strong>MKS</strong> Toolkit. If you do not have<br />
the <strong>MKS</strong> Toolkit installed, then change pwd to cd to display the<br />
current directory.<br />
Example: Including External Makefiles<br />
Make has facilities for including other makefiles into the current<br />
makefile. Normally, make looks in the current directory for these files.<br />
<strong>The</strong> special targets, .INCLUDEDIRS and .INCLUDE, can be used to<br />
inform make to look elsewhere for these files.<br />
<strong>The</strong> following example relates back to the following three makefiles,<br />
two of which are located in the subdirectories 1 and 2.<br />
<strong>The</strong> main makefile:<br />
all: one two<br />
.INCLUDEDIRS: 1<br />
.INCLUDE: <br />
.INCLUDE: 2/2.mak<br />
Makefile 1/1.mak:<br />
one:<br />
echo one<br />
Makefile 2/2.mak:<br />
two:<br />
echo two<br />
<strong>The</strong> “.INCLUDEDIRS” line in makefile tells make where it should look<br />
for makefiles not found in the current directory. In effect,<br />
subdirectory 1 becomes part of the search path for makefiles. <strong>The</strong><br />
“.INCLUDE: ” line in makefile asks make to find the file<br />
1.mak; the “” indicates to make that it should not look in the current<br />
directory for 1.mak but it should look elsewhere in the .INCLUDEDIRS<br />
list of directories. 1.mak is found in the subdirectory 1 so make<br />
includes it. <strong>The</strong> “.INCLUDE: 2/2.mak” line asks make to include the<br />
file 2/2.mak.<br />
After the .INCLUDE’s are replaced by the appropriate files, the<br />
effective makefile would look like this:<br />
all: one two<br />
.INCLUDEDIRS: 1<br />
one:<br />
echo one<br />
two:<br />
echo two<br />
<strong>User</strong> <strong>Guide</strong> 279
Using the <strong>MKS</strong> Make Utility<br />
Another method of indicating which files should be used as<br />
makefiles is to use the .MAKEFILES special target in the startup.mk<br />
file. Consider<br />
.MAKEFILES: $(PWD:f).mk<br />
This tells make to look in the current directory for the makefile, with<br />
the name of the makefile the same as the current directory name (that<br />
is if in src/make, look for make.mk). Adding dependencies using<br />
.MAKEFILES does not override the standard makefile lookup<br />
behavior; it just adds new file names for make to consider as<br />
makefiles. By default, make looks for the file makefile. On UNIX<br />
versions, make also looks for Makefile.<br />
Example: Creating Prologs and Epilogs<br />
With make, you can formulate recipes so that certain processes always<br />
happen before a recipe is run, or after the recipe has completed. This<br />
capability is controlled with the .PROLOG and .EPILOG attributes, and<br />
with the .GROUPPROLOG and .GROUPEPILOG special targets. Consider<br />
the makefile<br />
all: GroupWithProlog GroupWithEpilog<br />
GroupWithBoth NonGroupRecipe<br />
GroupWithProlog .PROLOG .SILENT:<br />
[<br />
echo In prolog group recipe<br />
echo<br />
]<br />
GroupWithEpilog .EPILOG .SILENT:<br />
[<br />
echo In epilog group recipe<br />
]<br />
GroupWithBoth .PROLOG .EPILOG .SILENT:<br />
[<br />
echo In prolog/epilog group recipe<br />
]<br />
.GROUPPROLOG:<br />
echo Running prolog<br />
.GROUPEPILOG:<br />
echo Running epilog<br />
echo<br />
NonGroupRecipe .PROLOG .EPILOG .SILENT:<br />
echo In non group recipe with .PROLOG and .EPILOG<br />
attributes set<br />
280 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Using Inference Rules<br />
For more information, see<br />
“Suffix Rules” on page 286.<br />
Using Inference Rules<br />
<strong>The</strong> .GROUPPROLOG special target defines a special recipe that gets run<br />
before a group recipe runs. Only those group recipes that have the<br />
.PROLOG attribute are so affected; all others behave normally.<br />
Similarly, the .GROUPEPILOG special target defines a special recipe<br />
that gets run after a group recipe runs, again, only for those group<br />
recipes with the .EPILOG attribute.<br />
In the previous example, the targets GroupWithProlog and<br />
GroupWithBoth have the .GROUPPROLOG recipe executed before their<br />
recipes run. <strong>The</strong> targets GroupWithEpilog and GroupWithBoth have<br />
the .GROUPEPILOG recipe executed after their recipes run.<br />
<strong>The</strong> regular recipe NonGroupRecipe has neither special recipe run,<br />
even considering that it has the .PROLOG and .EPILOG attributes.<br />
Prologs and epilogs only apply to group recipes.<br />
Macros present one means for making your makefiles more general.<br />
<strong>MKS</strong> Make has another feature that can help you construct truly<br />
generic makefiles—inference rules. When you make an inference, you<br />
associate a target with a prerequisite by matching specific files<br />
against general patterns and determining whether the target needs<br />
rebuilding.<br />
Inference rules can help you build makefiles to handle general cases.<br />
You can create a single makefile that can check any object file and<br />
rebuild it from its associated source file if it is out of date. <strong>MKS</strong> Make<br />
provides two different kinds of inference rules.<br />
Metarules employ a form similar to normal rules; however, they<br />
describe general methods, not specific procedures.<br />
Other versions of make may not recognize the new metarule format<br />
presented here; instead they use a less general form of inference rules<br />
called suffix rules. For compatibility, <strong>MKS</strong> Make still supports suffix<br />
rules.<br />
When you run <strong>MKS</strong> Make, it searches through the makefile using the<br />
following rules, attempting to find a recipe to rebuild a target. Once a<br />
step succeeds, it skips the subsequent steps.<br />
1. Search all the explicit rules in the makefile for one that matches<br />
the target.<br />
2. Check to see if an appropriate metarule matches the target.<br />
<strong>User</strong> <strong>Guide</strong> 281
Using the <strong>MKS</strong> Make Utility<br />
For more information on how<br />
to use the .DEFAULT special<br />
target, see the man page for<br />
the make command.<br />
Metarules<br />
3. Check to see it an appropriate suffix rule matches the target.<br />
4. Check to see if you have defined the .DEFAULT special target. You<br />
can use this special target to specify a recipe that <strong>MKS</strong> Make<br />
should use when no other rule would apply to a target.<br />
If you have not defined the .DEFAULT special target, and no other rule<br />
matches the target, <strong>MKS</strong> Make displays an error and stops.<br />
A metarule states that targets with names that match a pattern depend<br />
upon prerequisites with names that match a pattern. You may specify<br />
either pattern in the rule.<br />
Every metarule has a standard format. <strong>MKS</strong> Make treats any rule<br />
with a % symbol in the target as a metarule.<br />
target_pref %target_suffix : prereq_prefix%prereq_suffix<br />
recipes<br />
You can omit any of the prefix and suffix strings. If the % symbol<br />
appears in the prerequisite, it stands for whatever string matched the<br />
% symbol in the target.<br />
Note To include more than one prerequisite entry, you should use the :|<br />
rule operator instead of the single colon operator. For more information<br />
on this rule operator, see the man page for the make command.<br />
For example, consider the metarule that matches object file targets<br />
with their source file prerequisites.<br />
%$O : %.c<br />
$(CC) -c $(CFLAGS) $<<br />
<strong>The</strong> target in the metarule represents any file with an object file<br />
extension; in other words, any object file. <strong>The</strong> percent symbol<br />
represents the base name of the target; the O macro expands, as usual,<br />
to your system’s object file extension.<br />
<strong>The</strong> prerequisite represents the source file corresponding to the<br />
target. <strong>MKS</strong> Make determines the appropriate source file by looking<br />
for a file with the same base name as the target, coupled with the .c<br />
source file extension.<br />
<strong>The</strong> recipe for this rule contains the command to compile the single<br />
prerequisite that matches the target (note the use of the $< special<br />
macro here). <strong>MKS</strong> Make expands this macro to provide the single<br />
inferred prerequisite, that is, the single prerequisite it was able to<br />
match to the target file.<br />
282 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Here is another example, this time of a makefile employing<br />
metarules.<br />
Using Inference Rules<br />
FILES = main myFunc<br />
# notice the use of the $E macro representing<br />
# the executable file extension<br />
program$E : $(FILES:+$O)<br />
$(CC) $(CFLAGS) -e$@ $&<br />
%$O : %.c<br />
$(CC) -c $(CFLAGS) $<<br />
When <strong>MKS</strong> Make attempts to rebuild program$E (here the<br />
predefined E macro represents the executable file extension for your<br />
system), it checks the two specified object files to see if they, in turn,<br />
require rebuilding.<br />
<strong>MKS</strong> Make notes that these files end in the object file extension for<br />
your system, by expanding the O macro. Since these files lack a<br />
particular rule that names them as targets, <strong>MKS</strong> Make subsequently<br />
checks for any matching metarule. <strong>The</strong> metarule (the second rule in<br />
the makefile) does match the object file names, so it is used to rebuild<br />
the object files.<br />
Employing the metarule, <strong>MKS</strong> Make looks for the object files’<br />
matching source files (which end in a .c extension), and runs them<br />
through the compiler.<br />
Note the lack of specific reference to any object file in this makefile.<br />
<strong>MKS</strong> Make infers the appropriate object files by expanding<br />
$(FILES:+$O), and uses the metarule to match object files with their<br />
associated source.<br />
Here is another example, one that demonstrates the use of another<br />
common metarule.<br />
% .PRECIOUS : rcs/%$V<br />
-co -q $<<br />
<strong>The</strong> metarule states that any target (file) depends upon a prerequisite<br />
(an associated archive file) located in an rcs subdirectory. <strong>MKS</strong> Make<br />
matches any archive file to its associated working file. <strong>The</strong> recipe line<br />
uses the $< runtime macro to represent the prerequisite matching the<br />
target. Notice that it uses the dash command prefix. <strong>MKS</strong> Make<br />
ignores the failure of the check out (co) command (as it should, for<br />
example, if a revision of the file has already been checked out).<br />
Also, notice that it uses a macro called V to represent the possible<br />
archive file extension for the archive file. On UNIX-based systems,<br />
archive files usually end with a ,v extension. On PC-based systems,<br />
<strong>User</strong> <strong>Guide</strong> 283
Using the <strong>MKS</strong> Make Utility<br />
For more information on<br />
attributes, see the man page<br />
for the make command.<br />
archive files may have names identical to their associated working<br />
files (that is, V would have a null value). <strong>Source</strong> <strong>Integrity</strong> allows you<br />
to change your archive file names; thus you can change the V macro<br />
to match the extension you chose for archive files.<br />
A metarule may specify an attribute for a target. <strong>The</strong> previous<br />
example assigned the .PRECIOUS attribute to the target. Any attribute<br />
specified in a metarule gets inherited by any target that matches that<br />
metarule.<br />
If <strong>MKS</strong> Make attempts to make a target that has an attribute, it first<br />
checks for a metarule that applies to the target and specifies the given<br />
attribute. If no such metarule exists, it looks for a metarule that does<br />
not specify the attribute. This lets you specify different metarules for<br />
targets with different attributes. <strong>MKS</strong> Make performs this test for all<br />
attributes except .SILENT, .IGNORE, and .SYMBOL.<br />
Using the :| Rule Operator with Metarules<br />
<strong>MKS</strong> Make supports a rule operator for use specially in metarules<br />
that have more than one entry in the prerequisite list. This operator<br />
allows you to write one metarule as a short form for a number of<br />
similar metarules. <strong>The</strong> :| rule operator prompts <strong>MKS</strong> Make to treat<br />
each inferred match in the prerequisite list as an independent<br />
metarule.<br />
To understand this more clearly, take another look at the previous<br />
example. It included a metarule that would allow you to check out<br />
any working file from its associated archive. What if you maintain<br />
different archive locations for different kinds of working files? You<br />
store some files in local archive subdirectories and some more general<br />
files in a central archive tree.<br />
You would be tempted to compose two metarules to handle the two<br />
particular cases separately, but the following simple example does<br />
the trick.<br />
% .PRECIOUS :| rcs/%$V /archive/%$V<br />
-co -q $<<br />
When <strong>MKS</strong> Make encounters the :| operator, it handles each<br />
prerequisite in the list independently, applying the same recipe to<br />
each prerequisite in turn. Thus, the previous example is identical to<br />
these two rules.<br />
% .PRECIOUS : rcs/%$V<br />
-co -q $<<br />
% .PRECIOUS : /archive/%$V<br />
-co -q $<<br />
284 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Using Inference Rules<br />
When <strong>MKS</strong> Make uses these rules, it first checks to see if an archive<br />
associated with the working file exists in the rcs subdirectory. If no<br />
archive exists there, it attempts to infer a match with an archive file in<br />
a central directory.<br />
Transitive Closure<br />
With metarules, <strong>MKS</strong> Make can draw a chain of inferences across files<br />
that may not exist, resulting in the eventual creation of a target. This<br />
process is called transitive closure of inferences. Consider the<br />
following example of two metarules:<br />
%$E : %$O<br />
recipe one<br />
%$O : %.c<br />
recipe two<br />
When you use <strong>MKS</strong> Make to rebuild an executable called foo$E, it<br />
uses the first metarule to look for the object file, foo$O. If this file does<br />
not exist, and it cannot find an explicit rule that describes the way to<br />
create the necessary object file, <strong>MKS</strong> Make finds the second metarule,<br />
which describes the general procedure for rebuilding an object file.<br />
<strong>MKS</strong> Make considers each metarule only once when performing<br />
transitive closure, to avoid an endless loop. If it did not do this,<br />
certain rules would create problems. For example<br />
% : %.c<br />
recipe<br />
If you used this metarule, when using <strong>MKS</strong> Make with the target foo,<br />
it would first look for the file foo.c. If it could not find this file, it<br />
would then look for foo.c.c, and so on. Because <strong>MKS</strong> Make uses<br />
each metarule only once, it avoids the endless loop.<br />
<strong>MKS</strong> Make computes transitive closure once for each metarule, the<br />
first time the pattern matches a target. As metarules match,<br />
<strong>MKS</strong> Make joins the recipes together, in order leading backwards to<br />
the first metarule.<br />
Thus, using the previous example of two metarules, transitive closure<br />
produced the following rule, when foo.exe matched the first<br />
metarule (the one for executables).<br />
%$E : %.c<br />
recipe two<br />
recipe one<br />
<strong>User</strong> <strong>Guide</strong> 285
Using the <strong>MKS</strong> Make Utility<br />
For more information on this<br />
process, see the man page for<br />
the make command.<br />
Suffix Rules<br />
If the object file for the executable does not exist, transitive closure<br />
allows <strong>MKS</strong> Make to infer that it needs to first build the required<br />
object file from source, using this newly generated rule.<br />
When <strong>MKS</strong> Make finishes the computation for the rule head, it marks<br />
that rule head as transitive closure completed. Since it adds all<br />
possible new rules to the rule set the first time it performs the<br />
computation, <strong>MKS</strong> Make will not compute transitive closure again;<br />
nothing new can be added to the rule set.<br />
To understand this process best, you might want to experiment on<br />
small makefiles, using the -v option to the make command. This<br />
displays the behavior in detail: which rules it searches, when it<br />
computes transitive closure, and which rules it adds to the set.<br />
<strong>MKS</strong> Make follows a particular order when attempting to make<br />
inferences.<br />
An older portable form of inference rules, suffix rules use the format<br />
# typical suffix rule<br />
.suf1.suf2:<br />
recipe<br />
<strong>MKS</strong> Make matches the suffixes against the suffix of a target when it<br />
cannot locate an explicit rule for that target. However, suffix rules are<br />
not as powerful or as intuitive as metarules.<br />
For example, to express the dependence of object files upon source<br />
files, you would need a suffix rule that looked like<br />
.c$O:<br />
$(CC) -c $(CFLAGS) $<<br />
Compare this with the equivalent metarule.<br />
# normal rule<br />
file$O : file.c<br />
$(CC) -c $(CFLAGS) file.c<br />
# metarule<br />
%$O : %.c<br />
$(CC) -c $(CFLAGS) $<<br />
You can see that the construction of the suffix rule seems backwards.<br />
By itself, this gives a good reason to avoid suffix rules; you will find<br />
makefiles with suffix rules much more difficult to read.<br />
286 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Using Inference Rules<br />
You can also construct suffix rules with only one suffix. <strong>The</strong>se match<br />
any file ending in that suffix and provide a recipe for making a target<br />
with no suffix from a prerequisite with a given suffix.<br />
# single suffix rule<br />
.c :<br />
$(CC) -o$@ $(CFLAGS) $<<br />
For a suffix rule to work, you must list the component suffixes in the<br />
prerequisite list of the .SUFFIXES special target. To turn off suffix<br />
rules, simply use the special target with a null prerequisite list.<br />
.SUFFIXES:<br />
This clears the prerequisites of any previously declared .SUFFIXES<br />
special targets, and prevents make from using any suffix rules when<br />
inferring matches. You determine the order in which <strong>MKS</strong> Make uses<br />
suffix rules by the order of the prerequisites associated with the<br />
.SUFFIXES special target.<br />
<strong>The</strong> following list describes how <strong>MKS</strong> Make handles suffix rules with<br />
targets that have suffixes in their names.<br />
Extract the suffix from the target.<br />
Check the .SUFFIXES special target’s prerequisite list; if the suffix<br />
does not appear in the list, quit searching.<br />
If the suffix does appear in the list, look for a double suffix rule<br />
that matches the target suffix.<br />
If one exists, extract the base name of the target, add on the<br />
second suffix, and look for a file with the resulting name. If such a<br />
file exists, use the recipe from that double suffix rule to rebuild<br />
the target. If no such file exists, look for another double suffix rule<br />
that matches the target suffix.<br />
If <strong>MKS</strong> Make cannot find a double suffix rule to construct the<br />
name of an existing file with the new suffix, the inference fails.<br />
<strong>The</strong> following list describes how <strong>MKS</strong> Make handles suffix rules with<br />
targets that have no suffix in their name.<br />
Check the single suffix rules in the order specified by the<br />
.SUFFIXES special target.<br />
For each single suffix rule, add the suffix to the target name, and<br />
check to see if a file exists with the resulting name. If such a file<br />
exists, use that recipe to rebuild the target.<br />
If <strong>MKS</strong> Make cannot find a single suffix rule to construct the<br />
name of an existing file, the inference fails.<br />
<strong>User</strong> <strong>Guide</strong> 287
Using the <strong>MKS</strong> Make Utility<br />
Try some experiments on small makefiles, using make with the -v<br />
option, to see suffix rules work.<br />
More About Executing Recipes<br />
Regular<br />
Recipes<br />
Note Because <strong>MKS</strong> Make searches met-rules first, you should specify<br />
the -r option on the command line to disable the default met-rules when<br />
experimenting with suffix rules.<br />
To update a target, <strong>MKS</strong> Make expands and executes a recipe. <strong>The</strong><br />
expansion process replaces all macros and text diversions within the<br />
recipe, then either executes the commands directly, or passes them to<br />
a shell or command interpreter, depending on the occurrence of shell<br />
metacharacters in the recipe.<br />
When <strong>MKS</strong> Make calls a regular recipe, it executes each line of the<br />
recipe separately. This means that the effect of some commands may<br />
not carry over from one recipe line to the next.<br />
For example, a change directory request (cd) in a recipe line changes<br />
the current directory only for that recipe line. <strong>The</strong> next recipe line<br />
reverts to the previous current directory.<br />
<strong>The</strong> value of the control macro SHELLMETAS determines whether<br />
<strong>MKS</strong> Make uses a shell to execute a command. If it finds any<br />
character in SHELLMETAS in the expanded recipe line, it passes the<br />
command to the shell for execution; otherwise, it executes the<br />
command directly.<br />
Note If the makefile contains the .POSIX special target, <strong>MKS</strong> Make<br />
always uses the shell to execute recipe lines.<br />
To force the use of a shell, you can add characters from SHELLMETAS to<br />
the recipe line, as in the example<br />
rule 1<br />
# the next lines contains shell metacharacters<br />
command_one > file_one<br />
command_two | command_three<br />
…<br />
288 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Built-In<br />
Commands<br />
Group Recipes<br />
More About Executing Recipes<br />
<strong>The</strong> value of the control macro SHELL specifies the shell used for<br />
execution. <strong>The</strong> value of the control macro SHELLFLAGS provides the<br />
options that passed to that shell. <strong>The</strong> SWITCHAR control macro gives<br />
the character used to mark the beginning of the flags.<br />
<strong>The</strong>refore, the command to run the expanded recipe line is<br />
$(SHELL) $(SWITCHAR)$(SHELLFLAGS) expanded_recipe_line<br />
Normally, just before <strong>MKS</strong> Make invokes a recipe line, it writes the<br />
line to the standard output. If you have set the .SILENT attribute for<br />
the current target or recipe line (using the @ command prefix), the line<br />
is not echoed to the standard output.<br />
Since command.com and cmd.exe incorporate some frequently used<br />
commands as built in commands (for example, del, dir, and type),<br />
you cannot execute these commands directly from makefiles. You<br />
can, however, call the command interpreter to execute the instruction.<br />
<strong>The</strong> following example demonstrates how to delete a file called<br />
myfile.txt on Windows 95/98:<br />
command $(SWITCHAR)c del myfile.txt<br />
This invokes a command interpreter (as determined by the value of<br />
the COMSPEC macro) with the c option prefaced by the value of the<br />
SWITCHAR control macro, and passes it the del command with an<br />
appropriate argument (that is, the name of the file you want to<br />
delete).<br />
On OS/2 or NT systems, you would use<br />
cmd /c del myFile.txt<br />
<strong>MKS</strong> Make can also handle bundles of commands, or group recipes, by<br />
passing them to the appropriate command interpreter (shell) as a<br />
single unit. Traditional versions of make do not offer this feature.<br />
A group recipe begins with an opening bracket ([) in the first<br />
non-white space position of a line, and ends with a closing bracket (])<br />
in the last non-white space position of a line. Group recipes do not<br />
need a character as the first characters on a line.<br />
When <strong>MKS</strong> Make determines that the associated target requires<br />
rebuilding, it passes the entire group recipe in a block to the shell.<br />
<strong>User</strong> <strong>Guide</strong> 289
Using the <strong>MKS</strong> Make Utility<br />
Control Macros<br />
Used With<br />
Group Recipes<br />
A typical group recipe might involve special command constructs,<br />
like the looping constructs of the <strong>MKS</strong> KornShell. <strong>The</strong> following<br />
example creates a loop that use the fmt command to format each file<br />
in a directory, appending the formatted material to the book file:<br />
book : chap1.tr chap2.tr chap3.tr<br />
[<br />
>book<br />
for chapFile in $^<br />
do<br />
fmt -j -l 66 $$chapFile >>book<br />
done<br />
]<br />
<strong>MKS</strong> Make expands the group recipe before passing it to the shell.<br />
Thus, you need to place an extra dollar sign in front of the chapFile<br />
variable, to prevent <strong>MKS</strong> Make from attempting to expand the<br />
variable before it passes the line to the shell for execution.<br />
You can assign command prefixes to entire group recipes by placing<br />
the command prefix immediately after the initial bracket. <strong>The</strong><br />
command prefix then applies to the group recipe exactly as it would<br />
for a single recipe line.<br />
When <strong>MKS</strong> Make processes a group recipe, it writes the recipe to a<br />
temporary file. You specify an appropriate suffix for the temporary<br />
file with the value of the GROUPSUFFIX control macro. <strong>The</strong> command<br />
interpreter that handles the group recipe must recognize the suffix<br />
you specify with the GROUPSUFFIX control macro.<br />
If you use command.com, you must specify the .bat suffix. If you use<br />
cmd.exe, specify .cmd (although NT also accepts the .bat suffix). If<br />
you use the <strong>MKS</strong> KornShell, specify .ksh.<br />
You specify the shell <strong>MKS</strong> Make passes the group recipe to by<br />
defining a value for the GROUPSHELL macro. <strong>The</strong> value of the<br />
GROUPFLAGS macro determines the flags that are passed to the<br />
appropriate shell, along with the group recipe.<br />
If you have associated the .PROLOG attribute with the target of the<br />
rule containing the group recipe, <strong>MKS</strong> Make prepends the recipe<br />
associated with the .GROUPPROLOG special target to the front of the<br />
group recipe before passing it to the appropriate shell.<br />
290 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Text Diversions<br />
More About Executing Recipes<br />
If the group recipe’s target has the .EPILOG attribute, <strong>MKS</strong> Make<br />
appends the recipe associated with the .GROUPEPILOG special target<br />
to the end of the group recipe before passing it to the shell. You can<br />
use these two procedures to append a common header or trailer to<br />
group recipes.<br />
<strong>MKS</strong> Make echoes group recipes to standard output just like<br />
standard recipes, unless you use the .SILENT attribute with the<br />
associated target or the @ command prefix.<br />
<strong>MKS</strong> Make allows you to directly create files from within a recipe.<br />
This feature is an extension to traditional versions of make. <strong>The</strong><br />
following example shows the format of a text diversion:<br />
<br />
<strong>The</strong> specified text can be anything—several lines long if desired.<br />
When <strong>MKS</strong> Make encounters this construct, it creates a temporary<br />
file with a unique name, expands any macros in the text, and copies<br />
the text to the temporary file. It then executes the recipe with the<br />
name of the temporary file inserted in place of the diversion. When<br />
<strong>MKS</strong> Make finishes processing, it removes all the temporary files.<br />
Note Use the -v option to the make command to show the names of<br />
these temporary files and leave them around to be examined.<br />
<strong>MKS</strong> Make places temporary files in the $ROOTDIR/tmp directory<br />
unless you have specified a value for the TMPDIR environment<br />
variable, in which case, it places all temporary files in $TMPDIR.<br />
All macro references found in the text are expanded in the normal<br />
way; references in the temporary file are replaced by their associated<br />
strings. <strong>MKS</strong> Make copies all newline characters as they appear in the<br />
diversion.<br />
Normally, <strong>MKS</strong> Make does not copy white space at the beginning of<br />
lines into the temporary file. However, if you put a backslash at the<br />
front of a white space character, it copies all the white space in that<br />
line to the temporary file.<br />
For example,<br />
<br />
<strong>User</strong> <strong>Guide</strong> 291
Using the <strong>MKS</strong> Make Utility<br />
As a simple example of text diversion, suppose you redefine the<br />
value of the MAKESTARTUP macro on the command line to point to<br />
your personal startup file (/usr/lindsay/startup.mk). Next, you<br />
write a recipe line like<br />
copy startup.msg<br />
<strong>MKS</strong> Make creates a temporary file containing the text<br />
using /usr/lindsay/startup.mk as make startup file<br />
Since white space is stripped from the beginning of the second line,<br />
the contents of the temporary file end at the newline character that<br />
terminates the first line.<br />
<strong>MKS</strong> Make gives this temporary file a unique name. Suppose it uses<br />
the name temp.txt. <strong>The</strong> original recipe line is changed to<br />
copy temp.txt startup.msg<br />
When finished, startup.msg holds the contents of the temporary file.<br />
Here is a more useful example.<br />
OBJECTS=program$O module1$O module2$O<br />
program$E: $(OBJECTS)<br />
link @<br />
<strong>The</strong> tokenizing expression<br />
$(OBJECTS:t"+\n")<br />
adds a + and a newline after each token in the OBJECTS macro.<br />
Remember the runtime macro $@ stands for the name of the target<br />
being made. As a result, the temporary file created from the text<br />
diversion has the following contents (with all the macros expanded,<br />
of course).<br />
program$O+<br />
module1$O+<br />
module2$O<br />
program$E/noignorecase<br />
$(LDLIBS)<br />
<strong>The</strong> link command can easily handle an input file like this. Here’s<br />
the recipe line after <strong>MKS</strong> Make processes the text diversion.<br />
link @tempfile<br />
292 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Making Libraries<br />
Making Libraries<br />
All the <strong>MKS</strong> utilities can handle command lines of at least 8192<br />
characters in length.<br />
If you need to use non-<strong>MKS</strong> utilities, text diversions can help you<br />
pass input to a utility such as a linker, while respecting the commandline<br />
length restriction, as in this example:<br />
program$E : $(OBJECTS)<br />
bcc -eprogram$E @<br />
This example builds program$E from a lengthy list of object files,<br />
using the Borland C++ compiler.<br />
A library is a file containing a collection of object files and a symbol<br />
table. You can explicitly signal <strong>MKS</strong> Make that a target is a library, by<br />
giving the target the .LIBRARY attribute; however, you do not need to<br />
do this.<br />
You can construct rules to handle libraries simply by writing rules in<br />
the following format:<br />
program_name : library_name(member)<br />
library_name :<br />
recipe<br />
<strong>MKS</strong> Make can automatically determine that the target library_name<br />
is a library. In other rules it interprets member as a prerequisite of the<br />
library target. <strong>MKS</strong> Make internally associates the library name with<br />
the prerequisites. This lets the file searching mechanism look for the<br />
member in an appropriate library if it cannot be found as an object<br />
file.<br />
Note If you specify either the .POSIX or .NOAUTODEPEND special target,<br />
<strong>MKS</strong> Make does not check for an object file; it always looks in the library<br />
archive.<br />
Using these features, you can write rules like<br />
program$E : mylib$A(mem1$O)<br />
recipe for making program<br />
mylib$A :<br />
recipe for making library<br />
mem1$O : mem1.c<br />
recipe provided by built-in rules<br />
<strong>User</strong> <strong>Guide</strong> 293
Using the <strong>MKS</strong> Make Utility<br />
Metarules for<br />
Library Support<br />
For further information, see<br />
the man page for the ar<br />
command.<br />
Note that <strong>MKS</strong> Make startup rules give the A macro and the<br />
LIBSUFFIX macro the appropriate file extension for library files on<br />
your system. On UNIX and Xenix systems this would be .a; under<br />
command.com and cmd.exe, this would be .lib.<br />
If any target or prerequisite has the following format, <strong>MKS</strong> Make<br />
assumes that entry is a member of a library called name:<br />
name((entry))<br />
<strong>MKS</strong> Make then searches the library for the entry, determining the<br />
modification time of the member that defines entry, and the name of<br />
the member file. This name then replaces entry, and <strong>MKS</strong> Make uses it<br />
to make the member file.<br />
<strong>The</strong> startup file defines several macros and metarules useful for<br />
manipulating libraries. A gives the standard suffix for a library, and O<br />
gives the standard suffix for an object file.<br />
<strong>The</strong> AR macro specifies the librarian program. By default, the macro<br />
contains the ar program provided with <strong>MKS</strong> Make, and ARFLAGS<br />
contains the string -ruv. <strong>The</strong>se flags cause ar to update the library<br />
with all the specified members that have changed since the library<br />
was last updated.<br />
<strong>The</strong> startup file contains the metarule<br />
%$A .LIBRARY .PRECIOUS :<br />
$(AR) $(ARFLAGS) $@ $?<br />
With this metarule, you need not directly use the ar command in<br />
your makefile. <strong>MKS</strong> Make automatically rebuilds a library with the<br />
appropriate suffix when any of the prerequisite object modules have<br />
changed. As an example of the effect of this metarule, consider the<br />
rule<br />
lib$A .LIBRARY : mod1$O mod2$O mod3$O<br />
<strong>MKS</strong> Make gives the .LIBRARY attribute to the lib$A target, so the<br />
metarule applies. Using the command.com or cmd.exe command<br />
interpreters, the following command remakes the library from the<br />
appropriate object modules:<br />
make lib.lib<br />
On UNIX and POSIX compliant systems, libraries have the .a suffix,<br />
so the following command is equivalent:<br />
make lib.a<br />
294 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For more information on the<br />
+= symbol, see the man page<br />
for the make command.<br />
Suffix Rules for<br />
Library Support<br />
Making Libraries<br />
<strong>The</strong> startup file contains a metarule that <strong>MKS</strong> Make uses to rebuild<br />
executable files from object files. This metarule adds the value of the<br />
macro LDLIBS as a list of libraries you want make to link with the<br />
object files. If you have several programs, all of which depend on the<br />
same library, you can add the name of your library to the definition of<br />
LDLIBS and automatically get it linked when using the metarule.<br />
For example, assume the startup file specifies the following metarule<br />
for your compiler:<br />
%$E : %$O<br />
$(LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)<br />
You can add the following lines to your makefile:<br />
LDLIBS += mylib$A<br />
program$E : mylib$A<br />
<strong>The</strong> first line appends mylib$A to the current definition of LDLIBS.<br />
<strong>The</strong> second line handles the program you want to build using this<br />
library (you could have any number of different program file targets<br />
with the same prerequisite). Because you have not specified a recipe,<br />
<strong>MKS</strong> Make uses the metarule from the startup file to relink the<br />
programs.<br />
Thus, when you want make to rebuild the program file target,<br />
<strong>MKS</strong> Make remakes the library file mylib$A if required, and then<br />
relinks the executable from the object file with the libraries specified<br />
in LDLIBS.<br />
Suffix rules also have a feature that supports archive library<br />
handling. If you specify a suffix rule with the following form, the rule<br />
matches any target having the .LIBRARY attribute set, regardless of<br />
the target’s actual suffix.<br />
.suf.a:<br />
recipe<br />
For example, if mem.obj exists and your makefile contains the rules<br />
.SUFFIXES: .a .obj<br />
.obj.a :<br />
@echo adding $< to library $@<br />
the command<br />
make -r "mylib(mem)"<br />
<strong>User</strong> <strong>Guide</strong> 295
Using the <strong>MKS</strong> Make Utility<br />
causes <strong>MKS</strong> Make to print<br />
adding mem.obj to library mylib<br />
Compatibility Considerations<br />
Conditionals<br />
Note <strong>The</strong> -r option keeps the rules in the startup.mk file from<br />
interfering with the command in this example.<br />
<strong>MKS</strong> Make attempts to remain compatible with versions of the make<br />
utility found on UNIX and POSIX compliant systems, while meeting<br />
the needs of different environments such as Windows 95/98,<br />
Windows NT, and OS/2.<br />
This section examines ways in which <strong>MKS</strong> Make differs from<br />
traditional versions of make. It also discusses techniques to write<br />
makefiles that work on UNIX, Windows 95/98, Windows NT, and<br />
OS/2 systems.<br />
Conditionals let you selectively include or exclude parts of a makefile.<br />
This lets you write rules that have different formats for different<br />
systems. Note that traditional implementations of make do not<br />
recognize conditionals. Conditionals are extensions to the POSIX<br />
standard.<br />
You construct conditionals with the following format:<br />
.IF expression1<br />
input1<br />
{.ELSIF expression2<br />
input2}<br />
[.ELSE<br />
input3]<br />
.END<br />
You may have any number of .ELSIF expressions, but only one<br />
.ELSE expression.<br />
When <strong>MKS</strong> Make encounters a conditional construct, it begins by<br />
evaluating expression1 (associated with the .IF). If the value of<br />
expression1 is true, <strong>MKS</strong> Make processes the first input block (input1)<br />
and ignores all subsequent input blocks until the .END.<br />
296 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Compatibility Considerations<br />
If the value of expression1 is false, <strong>MKS</strong> Make ignores the first input<br />
block and tests expression2 (associated with the .ELSIF). If expression2<br />
is true, the second input block (input2) is processed, and all<br />
subsequent input blocks until the .END are ignored.<br />
If the value of expression2 is false, <strong>MKS</strong> Make ignores the first two<br />
input blocks and automatically process the third input block<br />
(associated with the .ELSE).<br />
When <strong>MKS</strong> Make evaluates expressions, it accepts an expression with<br />
one of the following forms:<br />
text<br />
text1 == text2<br />
text1 != text2<br />
<strong>The</strong> first entry is false if text is null; otherwise, it is true. <strong>The</strong> value of<br />
the second entry is true if text1 and text2 are equal. <strong>The</strong> last entry<br />
resolves to true if text1 and text2 are not equal.<br />
<strong>The</strong> .IF, .ELSE, .ELSIF, and .END keywords must begin in the first<br />
column of an input line (that is, with no leading white space).<br />
Although you may be used to indenting material inside IF/ELSE<br />
constructs, you must not use s to indent text inside conditional<br />
blocks (except for recipe lines, which are always indented with a<br />
).<br />
Text in a conditional block should have the same form that you<br />
would use outside the block. You may omit the .ELSE and .ELSIF<br />
conditional operators. This would produce a conditional block that<br />
<strong>MKS</strong> Make would process if the .IF expression were true, and<br />
completely ignore if that expression were false.<br />
This example shows the concept behind the O macro.<br />
.IF $(OS) == NT<br />
O = .obj<br />
.ELSE<br />
O = .o<br />
.END<br />
This begins by checking the predefined value of the OS macro that<br />
identifies your operating system. If the macro expands to NT,<br />
<strong>MKS</strong> Make assigns the value .obj to the O macro; otherwise, the<br />
macro receives the value .o.<br />
<strong>User</strong> <strong>Guide</strong> 297
Using the <strong>MKS</strong> Make Utility<br />
Other Makes<br />
You can use conditionals to prepare a makefile that runs on<br />
Windows 95, Windows NT, OS/2, and UNIX systems. You may find<br />
it simplest to check the value of the macro OS (defined in the built in<br />
rules). You can then use conditionals like<br />
.IF $(OS) == NT<br />
# NT style input<br />
.ELSE<br />
# UNIX style input<br />
.END<br />
With care, you can produce a makefile that works under more than<br />
one operating system.<br />
.IF $(OS) == NT<br />
E=.exe #suffix for executable programs<br />
O=.obj #suffix for object files<br />
S=.asm #suffix for assembler source<br />
A=.lib #suffix for libraries<br />
F=.for #suffix for fortran source<br />
V= #suffix for <strong>Source</strong> <strong>Integrity</strong> archives<br />
.ELSE<br />
E=<br />
O=.o<br />
S=.s<br />
A=.a<br />
F=.f<br />
V=,v<br />
.END<br />
LIBSUFFIX=$A<br />
<strong>The</strong>se macro definitions specify suffixes used on UNIX systems. You<br />
can then use a suffix macro like<br />
%$O : %.c<br />
$(CC) $(CFLAGS) $^<br />
It expands to .o on UNIX and POSIX compliant systems.<br />
Note <strong>The</strong> default startup rules for <strong>MKS</strong> Make already provide most of<br />
these definitions with values appropriate to your system.<br />
Several other versions of the make utility exist for Windows 95/98,<br />
Windows NT, and OS/2. <strong>The</strong> following sections examine some<br />
popular make utilities and how they differ from <strong>MKS</strong> Make.<br />
298 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Borland Make<br />
Compatibility Considerations<br />
<strong>The</strong> Borland C++ packages from Inprise Corporation comes with<br />
their own version of make. Here are some of the ways in which the<br />
Borland Make differs from <strong>MKS</strong> Make:<br />
Borland Make does not support the general metarule format of<br />
inference rules, only the suffix rule format.<br />
Borland Make does not support multiple command processors<br />
(for example, the <strong>MKS</strong> KornShell); it uses only the native<br />
command processor.<br />
Borland Make does not have general macro modifiers (such as :d<br />
and :f).<br />
<strong>The</strong> directives of Borland Make take the form !word, where word<br />
is the directive name. <strong>The</strong> set of directives includes conditionals,<br />
include facilities (similar to .INCLUDE), and a facility for<br />
undefining macros. No other directives are supported. <strong>The</strong><br />
format of these facilities is not compatible with any UNIX or<br />
POSIX compliant version of make.<br />
Borland Make has no facilities for handling libraries or <strong>Source</strong><br />
<strong>Integrity</strong> files. It does not have group recipes or special rule<br />
operators, and lacks most of the special macros and special<br />
targets supported by <strong>MKS</strong> Make.<br />
Borland Make lets you specify a number and compare it to the<br />
return status of a command in a recipe line. If the return status<br />
exceeds this number, Borland Make stops the make process,<br />
saying that an error was detected.<br />
<strong>MKS</strong> Make lets you use the minus sign to ignore errors entirely. To<br />
compare a specific exit value, use the <strong>MKS</strong> KornShell as your SHELL<br />
and write a group recipe like<br />
[<br />
]<br />
command to be tested<br />
if [ $? != 5 ]<br />
echo "diagnostic"<br />
exit 1<br />
fi<br />
exit 0<br />
If you have a makefile for Borland Make that you want to convert for<br />
use with <strong>MKS</strong> Make, you need to change all the directives from the<br />
!word format into the <strong>MKS</strong> Make equivalent.<br />
<strong>User</strong> <strong>Guide</strong> 299
Using the <strong>MKS</strong> Make Utility<br />
Microsoft Make<br />
<strong>The</strong> Microsoft C++ package also comes with its own version of make.<br />
Here are some of the differences between Microsoft Make and<br />
<strong>MKS</strong> Make:<br />
Microsoft Make does not support the general metarule format of<br />
inference rules; it only supports the suffix rule format.<br />
Microsoft Make does not support multiple command<br />
interpreters; it uses only the native command processor.<br />
Microsoft Make has no facilities for handling libraries or <strong>Source</strong><br />
<strong>Integrity</strong> archives. It does not have group recipes, and lacks most<br />
of the special macros and special targets supported by<br />
<strong>MKS</strong> Make.<br />
<strong>The</strong> set of special macros recognized by Microsoft Make is much<br />
smaller. It uses $** to represent the same thing as the $& runtime<br />
macro in <strong>MKS</strong> Make (that is, the complete list of prerequisites for<br />
the current target).<br />
Because Microsoft Make operates at such a simple level, any makefile<br />
that works with Microsoft Make works with <strong>MKS</strong> Make by simply<br />
changing the $** symbols to $& runtime macros.<br />
Note Naturally, you must use the <strong>MKS</strong> Make command-line options<br />
instead of those for Microsoft Make.<br />
BSD UNIX Make<br />
<strong>The</strong> following is a list of the notable differences between <strong>MKS</strong> Make<br />
and the 4.2/4.3 BSD UNIX make:<br />
BSD UNIX make supports file name generation for prerequisite<br />
names. Thus, if a directory contains a.h, b.h, and c.h, BSD UNIX<br />
make performs the following expansion:<br />
target: *.h<br />
expands to<br />
target: a.h b.h c.h<br />
<strong>MKS</strong> Make does not support this type of file name expansion.<br />
300 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Compatibility Considerations<br />
Unlike BSD UNIX make, touching library members causes<br />
<strong>MKS</strong> Make to search the library for the member name and to<br />
update the time stamp if the member is found (see the<br />
description of the -t option in the online reference for the make<br />
command).<br />
<strong>MKS</strong> Make does not support the BSD UNIX VPATH variable. A<br />
similar and more powerful facility is provided through the<br />
.SOURCE special target.<br />
System V MAKE<br />
<strong>The</strong> following special features have been implemented to make<br />
<strong>MKS</strong> Make more compatible with System V make:<br />
You can use the word include at the start of a line instead of the<br />
.INCLUDE special target that is normally understood by<br />
<strong>MKS</strong> Make.<br />
<strong>MKS</strong> Make supports the macro modifier expression<br />
$(macro:str=sub) for suffix changes.<br />
When defining special targets for the suffix rules, the special<br />
target .X is equivalent to .X.NULL.<br />
<strong>MKS</strong> Make supports both the<br />
lib(member)<br />
and<br />
lib((entry))<br />
library handling features of System V make.<br />
<strong>The</strong> built in rules contain the following definitions for System V<br />
make compatibility:<br />
@B = $(@:b)<br />
@D = $(@:d)<br />
@F = $(@:f)<br />
?B = $(?:b)<br />
?D = $(?:d)<br />
?F = $(?:f)<br />
*B = $(*:b)<br />
*D = $(*:d)<br />
*F = $(*:f)<br />
Using the <strong>MKS</strong> Make Utility<br />
Using the Generic CC Interface<br />
For a description of the<br />
command-line format, see the<br />
man page for the cc<br />
command.<br />
Compilation<br />
Configuration<br />
Files<br />
<strong>The</strong> command-line syntax of different C compilers varies widely.<br />
Under Windows 95/98, Windows NT, and OS/2, some compilers use<br />
a dash to mark options, others a slash, while some accept both<br />
characters. In addition, each compiler usually requires that<br />
command-line arguments be specified in a different order. On UNIX<br />
and POSIX compliant systems, there is a greater degree of uniformity,<br />
but there are still differences from one system to the next.<br />
Because of this diversity, it is difficult to write makefiles that apply to<br />
several compilers and/or systems. <strong>The</strong> following example is typical,<br />
but even this format is not universal. In particular, the -c argument<br />
may not have the same meaning to different compilers or may not be<br />
allowed in the position shown.<br />
$(CC) -c $(CFLAGS) files<br />
You can find similar differences in the various available linkers and<br />
library editors. <strong>The</strong>ir command lines may have different formats and<br />
different sets of options.<br />
To make it easier for you to write universal makefiles, <strong>MKS</strong> Make<br />
comes with a generic interface to the C compilers and linkers on the<br />
systems where <strong>MKS</strong> Make is available. <strong>The</strong> interface is called cc.<br />
However, this interface is not the default; you must edit your default<br />
rules file to call cc. Programmers developing software on several<br />
machines find cc useful; you may never need it if you do not intend<br />
to port your makefiles to other machines.<br />
You always call cc with the same command-line format, regardless of<br />
the compiler you want to invoke. You specify command-line<br />
arguments in a universal format. It is then up to cc to rearrange and<br />
convert these arguments (if necessary) to the form required by your<br />
chosen compiler or linker and to invoke the compiler/linker as<br />
necessary.<br />
<strong>The</strong> cc command employs a compilation configuration file. <strong>The</strong><br />
configuration file instructs cc on how to convert generic commandline<br />
arguments into the format required by a specific compiler or<br />
linker.<br />
<strong>MKS</strong> Make comes with appropriate compilation configuration files<br />
for the popular C compilers and linkers on your system. <strong>The</strong><br />
installation procedure takes care of setting up the configuration files.<br />
Under Windows 95/98, Windows NT, and OS/2, <strong>MKS</strong> Make stores<br />
the configuration file for cc in $ROOTDIR/etc/compiler.ccg. On<br />
302 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Using CC<br />
Generic<br />
Command-line<br />
Format<br />
Using the Generic CC Interface<br />
UNIX-based systems, the configuration file is /etc/compiler.ccg.<br />
Alternatively, you can set the CCG environment variable to point to<br />
another configuration file.<br />
<strong>The</strong> online reference for cc provides information on writing your<br />
own configuration files, if you want to use an unsupported compiler<br />
or linker. Certainly, the best way to start is copy and modify one of<br />
the provided configuration files.<br />
<strong>The</strong> cc command is installed in the same directory as the make<br />
command. If this directory is in your search rules, you can call the<br />
command by using the name cc.<br />
<strong>The</strong> supplied default rules file defines the CC macro to refer to your<br />
favorite C compiler. For example, if you use the Borland C compiler,<br />
it would contain<br />
CC = bcc<br />
LD = bcc<br />
To use CC, you would edit your default rules file to<br />
CC = cc<br />
LD = cc<br />
From this point on $(CC) and $(LD) invoke cc instead of your<br />
chosen compiler or linker. Since the installation process sets up<br />
appropriate configuration files, cc converts its generic command line<br />
to the format required by your chosen compiler and linker before<br />
invoking that compiler or linker.<br />
<strong>The</strong> cc command uses the following generic command-line format<br />
for compilation:<br />
cc -c [options] file…<br />
where each option begins with a dash.<br />
For example, the recommended way of selecting compiler memory<br />
models is with the -mmodel option. If you are using Microsoft C<br />
version 6.0 and want a large model program, you enter<br />
cc -c -ml file<br />
instead of using the /AL option. You could still use the /AL option, but<br />
your makefile would not be portable.<br />
<strong>The</strong> files specified on the command line are the C source files you<br />
want compiled. cc invokes your chosen compiler to compile each<br />
source file.<br />
<strong>User</strong> <strong>Guide</strong> 303
Using the <strong>MKS</strong> Make Utility<br />
Examples of<br />
Use<br />
Problem Solving<br />
Without a<br />
Makefile<br />
As source files are compiled, cc strips the name of the source file of<br />
its .c suffix and adds an appropriate suffix for object files. If you do<br />
not specify the -c (compile-only) option, cc subsequently passes all<br />
these files—as well as any other object and library files named on the<br />
command line—to your linker.<br />
You specify the output executable with the option<br />
-o executable<br />
To use cc for linking, use the following generic command-line<br />
format:<br />
cc [options] -o executable_file object_file…<br />
Here is an excerpt from a startup file that uses the generic cc<br />
interface.<br />
CC = cc<br />
LD = cc<br />
%$E : %$O<br />
$(LD) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(LDLIB)<br />
%$O : %.c<br />
$(CC) -c $(CFLAGS) $^<br />
<strong>The</strong> metarules describe how to link an executable file from object files<br />
and how to compile an object file from a source file. <strong>The</strong> commandline<br />
format is independent of the compiler and/or linker being used.<br />
You can use the CFLAGS macro to give options that are specific to your<br />
chosen compiler. <strong>The</strong> LDFLAGS macro gives options that are specific to<br />
your chosen linker.<br />
This section gives additional examples of using <strong>MKS</strong> Make.<br />
Assume the file prog.c contains the C source code that should be<br />
compiled to make prog.exe. No makefile is necessary; simply type<br />
make prog.exe<br />
<strong>MKS</strong> Make does everything using default rules, which specify how a<br />
.exe can be built from a .c file.<br />
304 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Simple Makefile<br />
Separate Object<br />
Directory<br />
Problem Solving<br />
Assume a program is built from the C source code in the files a.c,<br />
b.c, and c.c. Two of these files #include definitions from hdr.h, as<br />
shown.<br />
MOD = a b c<br />
OBJ = $(MOD:+"$O")<br />
program$E : $(OBJ)<br />
$(LD) $(LDFLAGS) -o $@ $<<br />
a$O b$O : hdr.h<br />
<strong>MKS</strong> Make uses the default rules to create the individual object files<br />
and links them into the final program.<br />
Assume the same situation as the previous, except that object and<br />
executable files are kept in a separate directory named objdir. This<br />
example assumes your C compiler has a -ndirectory flag to place the<br />
object file into a specific directory.<br />
<strong>The</strong>re are two ways to handle this with <strong>MKS</strong> Make, either with<br />
.SOURCE special targets or with .SETDIR attributes. Using .SOURCE,<br />
you set up your makefile as<br />
MOD = a b c<br />
OBJ = $(MOD:+"$O")<br />
OBJDIR=objdir<br />
.SOURCE$O :- $(OBJDIR)<br />
.SOURCE$E :- $(OBJDIR)<br />
CFLAGS += -n$(OBJDIR)<br />
program$E : $(OBJ)<br />
$(LD) $(LDFLAGS) -o $@ $^<br />
a$O b$O : hdr.h<br />
<strong>User</strong>s of a file server probably want to explore these possibilities, as<br />
they allow sources to be kept on a networked disk, while object and<br />
executables are built on a (usually faster) local disk.<br />
To do the same using .SETDIR, you give the appropriate files<br />
.SETDIR attributes telling make where the files appear. Note that,<br />
even though the source files are in the current directory, a .SETDIR<br />
<strong>User</strong> <strong>Guide</strong> 305
Using the <strong>MKS</strong> Make Utility<br />
<strong>MKS</strong> Make and<br />
<strong>Source</strong> <strong>Integrity</strong><br />
Using a Library<br />
attribute is required for them as well. However, since <strong>MKS</strong> Make now<br />
changes to the objdir directory before compiling, it no longer<br />
requires the -ndirectory option.<br />
MOD = a b c<br />
OBJ = $(MOD:+"$0")<br />
OBJDIR=objdir<br />
".SETDIR=$(OBJDIR)" : program$E $(OBJ)<br />
".SETDIR=$(PWD)" : $(MOD:+".c") hdr.h<br />
program$E : $(OBJ)<br />
$(LD) $(LDFLAGS) -o $@ $<<br />
a$O b$O : hdr.h<br />
<strong>MKS</strong> Make requires the quotes in the .SETDIR setting, if a device<br />
name with a colon may appear in the directory name.<br />
Note Normally, after <strong>MKS</strong> Make has run the recipe for a target, it marks<br />
the target as made, and does not remake it, even if another target<br />
depends upon it. When you use the .SETDIR attribute, <strong>MKS</strong> Make<br />
switches to the newly specified directory every time it encounters the<br />
attribute and retests all of the target’s prerequisites. <strong>The</strong> result is that it<br />
does much more work when you use .SETDIR than when you use<br />
.SOURCE.<br />
For the previous examples, assume the source code is contained in<br />
<strong>Source</strong> <strong>Integrity</strong> archives. <strong>The</strong> same makefile applies; the default<br />
rules in the startup file instructs make to check out missing source<br />
files as required.<br />
Going back to the simple example with the source files a.c, b.c, and<br />
c.c, assume a new file named program.c is required, and you keep<br />
the other objects in an object library. In this case, program.exe<br />
depends upon the library and the file program.obj.<br />
<strong>The</strong> following example uses the macro A to stand for the library<br />
suffix:<br />
MOD = a b c<br />
OBJ = $(MOD:+"$O")<br />
program$E: program$O mylib$A<br />
$(LD) $(LDFLAGS) -o $@ $<<br />
mylib$A : $(OBJ)<br />
a$O b$O : hdr.h<br />
306 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Recursive<br />
Makes<br />
For more information on this<br />
option, see the man page for<br />
the make command.<br />
Clean-up<br />
Problem Solving<br />
When building a large complex project, you can use multiple<br />
directories for separate components of the project. Within each<br />
directory, you use a makefile to control the building of that<br />
component of the project. At the top level, you can use a single<br />
makefile, which simply invokes the subdirectory makefiles in turn,<br />
ensuring the entire project is up to date.<br />
Assume a project has the subpackages system and commands, each<br />
stored in a subdirectory of a master directory. Within each system and<br />
commands directories, you keep a makefile to rebuild that<br />
subpackage. To ensure the project is up to date, you must ensure the<br />
subpackages are up to date; you can easily do this with a makefile in<br />
the following format, stored in master:<br />
all:<br />
$(MAKE) -c system<br />
$(MAKE) -c commands<br />
<strong>The</strong> -c option forces <strong>MKS</strong> Make to switch into the specified directory<br />
when it starts up.<br />
<strong>The</strong> macro MAKE is defined to contain the current setting of<br />
MAKEFLAGS. <strong>MKS</strong> Make has a feature whereby if the macro MAKE is<br />
used in a recipe line, then that line is executed, even if the -n option<br />
was passed to <strong>MKS</strong> Make. This ensures the command<br />
make -n<br />
which sets MAKEFLAGS to -n, recursively runs <strong>MKS</strong> Make in the<br />
subdirectories named. <strong>The</strong> only limits to this sort of recursive<br />
processing is the available memory on your machine.<br />
Some software creates work or backup files that do not need to be<br />
kept. Assume the current directory contains such files, identified by<br />
the suffixes $O and .bak. To clean out these files, add the following<br />
lines to a makefile:<br />
clean :<br />
-rm -f *.bak *$O<br />
<strong>The</strong> command<br />
make clean<br />
then gets rid of the files.<br />
<strong>User</strong> <strong>Guide</strong> 307
Using the <strong>MKS</strong> Make Utility<br />
Back-up<br />
Default Rules<br />
Assume a makefile defines a macro named SRC giving the base name<br />
of the C source files that make up a program. Also assume from time<br />
to time, you want to back up all recently changed copies to a<br />
directory named savedir. Add the following to the makefile:<br />
backup : $(SRC:+".c") makefile<br />
cp $? savedir<br />
touch backup<br />
With this rule, you can do a backup with the command<br />
make backup<br />
<strong>The</strong> target backup is a file you create the first time you perform the<br />
backup. Each time you perform it, the touch command sets the<br />
change date of backup to the correct time. In this way, the next time<br />
you run the command, <strong>MKS</strong> Make only saves files newer than<br />
backup.<br />
You can use a similar approach to get printouts of source files that<br />
have been changed.<br />
printchk : $(SRC:+".c")<br />
echo printing $?<br />
PRINT $?<br />
touch printchk<br />
Note that PRINT appears in uppercase above. This avoids a conflict<br />
with the lowercase print command built into the <strong>MKS</strong> KornShell.<br />
<strong>The</strong> startup file contains a good example of most of the popular<br />
features of <strong>MKS</strong> Make. Spend some time looking at this file to get a<br />
better understanding of how various things work. Use the -v flag to<br />
get trace information of what <strong>MKS</strong> Make is doing at each stage.<br />
308 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Miscellaneous Details<br />
Miscellaneous Details<br />
<strong>The</strong> maximum length of a single line in a makefile is 16384 characters.<br />
If you use the <strong>MKS</strong> KornShell, you can write commands with up to<br />
8192 characters when using make.exe.<br />
You can only nest included makefiles up to a depth of 10. In other<br />
words, if a makefile uses the .INCLUDE special target to include<br />
another makefile (which includes another makefile, and so on), you<br />
are allowed a maximum of 10 nested includes.<br />
<strong>MKS</strong> Make also allows nesting of conditional expressions up to a<br />
limit of 25 nested expressions, as in<br />
.IF<br />
.IF<br />
…<br />
.END<br />
.END<br />
up to a limit of 25 nested expressions.<br />
<strong>User</strong> <strong>Guide</strong> 309
Using the <strong>MKS</strong> Make Utility<br />
310 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Starting a Change<br />
<strong>Integrity</strong> Session<br />
10<br />
This chapter provides an overview of Change <strong>Integrity</strong> concepts; the<br />
basic tasks necessary to start, configure, and close a Change <strong>Integrity</strong><br />
session; and an overview of the Change <strong>Integrity</strong> interfaces.<br />
Specifically, this chapter provides details on:<br />
Change <strong>Integrity</strong> concepts<br />
logging in to Change <strong>Integrity</strong><br />
the Change <strong>Integrity</strong> graphic user interface<br />
the Change <strong>Integrity</strong> Web interface<br />
setting session preferences<br />
configuring email notification<br />
logging out<br />
closing a session<br />
<strong>User</strong> <strong>Guide</strong> 311
Starting a Change <strong>Integrity</strong> Session<br />
Change <strong>Integrity</strong> Concepts<br />
Issues<br />
Workflow<br />
<strong>User</strong><br />
This section provides you with a brief orientation to important<br />
Change <strong>Integrity</strong> concepts.<br />
Change <strong>Integrity</strong> uses issues to track changes in the software<br />
development cycle. For example, your administrator can configure<br />
Change <strong>Integrity</strong> in a way that a problem issue may be associated with<br />
a solution issue for easy tracking and monitoring of both issues. Each<br />
issue has an audit trail, which may be used to evaluate internal<br />
processes for the effectiveness of the problem resolution process. In<br />
effect, issues track all aspects of any engineering endeavor.<br />
Issue types capture and track a specific change request, defect,<br />
problem, solution, or task. For example, one issue type could record<br />
bugs and deficiencies in design. Another issue type could be used to<br />
request design changes that fix problems, or propose enhancements<br />
or new functionality for your product. Similarly, an issue type could<br />
be created that assigns work tasks that address problems, or prepare<br />
and implement solutions.<br />
Administrators create and define specific issue types; however, <strong>MKS</strong><br />
provides three solution templates with built in issue types.<br />
Specific issue types can be linked to one another as references to a<br />
specific issue. For example, an issue type that tracks problems could<br />
be linked to an issue type that provides solutions. Similarly, an issue<br />
type that sets out tasks could be linked to an issue type that tracks<br />
problems.<br />
Administrators define issue relationships.<br />
Each issue follows workflow, the process established by your<br />
administrator to capture and track information during your software<br />
development cycle. Each issue type can have its own set of states to<br />
advance through the development cycle. For example, a change<br />
request may go through the following states: submitted, work<br />
started, tested, reviewed, closed. Issues and their current states<br />
provide change management information necessary to support<br />
business decisions.<br />
A user is anyone who needs to work with Change <strong>Integrity</strong> issues.<br />
<strong>User</strong>s are assigned user permissions to them by the administrator.<br />
<strong>User</strong>s are also assigned to groups that have specific Change <strong>Integrity</strong><br />
group permissions assigned to them by the administrator.<br />
312 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Group<br />
Projects<br />
Query<br />
Reports<br />
Charts<br />
Change <strong>Integrity</strong> Concepts<br />
A group consists of one or more users who need to work with Change<br />
<strong>Integrity</strong> issues.<br />
Your administrator decides who does what. In setting up the project,<br />
the administrator assigns permissions to different groups for gaining<br />
access to certain areas within Change <strong>Integrity</strong>, and then puts each<br />
user into a group.<br />
For example, some groups may be designated for submitting and<br />
editing problems only, while the submitting of work tasks may be<br />
restricted to a group of managers.<br />
With that in mind, you should be aware that not all users will be able<br />
to use all of the functionality of Change <strong>Integrity</strong>. If you find you<br />
cannot do something that you think you should be able to do, then<br />
contact your administrator.<br />
Projects are labels that help you sort and organize issues in a<br />
hierarchical structure. For example, your administrator might<br />
organize projects according to:<br />
the modular structure of a software application<br />
the information architecture of a Web site<br />
group responsibilities within a department<br />
A query is a request to select and list the issue types that meet specific<br />
selection criteria. <strong>The</strong> selection criterion is a logical expression of<br />
specific values, or ranges of values, of the standard and custom fields<br />
of the issue type.<br />
Reports are summaries of the data in your project. Reports are based<br />
on the standard and custom fields of issue types. Reports can be<br />
customized to include images, fonts, hyperlinks, and can be saved as<br />
HTML files for viewing on the Web.<br />
Charts are graphs that present trends over time or distributions of the<br />
data in your project. Charts are based on the standard and custom<br />
fields of issue types. Trend charts may be displayed as line graphs.<br />
Distribution charts may be displayed as pie graphs or bar graphs.<br />
<strong>User</strong> <strong>Guide</strong> 313
Starting a Change <strong>Integrity</strong> Session<br />
Before You Start a Change <strong>Integrity</strong> Session<br />
Before you start a Change <strong>Integrity</strong> session, ensure you have the<br />
following:<br />
a copy of the Change <strong>Integrity</strong> client installed locally on your<br />
computer<br />
a Web browser, such as Netscape Navigator or Microsoft Internet<br />
Explorer, to use the Change <strong>Integrity</strong> Web interface<br />
the name of the Change <strong>Integrity</strong> server and port number you<br />
want to connect to<br />
your Change <strong>Integrity</strong> user name and password<br />
Starting a Change <strong>Integrity</strong> Session<br />
Logging In<br />
For both the Change <strong>Integrity</strong> graphic user interface and Web<br />
interface, you must log in to a database on a Change <strong>Integrity</strong> server<br />
before you can perform any Change <strong>Integrity</strong> operations.<br />
To log in using the graphic user interface:<br />
When you start the Change <strong>Integrity</strong> client for the first time, the <strong>MKS</strong><br />
Change <strong>Integrity</strong> login dialog box appears, prompting you for your<br />
login information.<br />
314 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Starting a Change <strong>Integrity</strong> Session<br />
1. In the Server field, enter the name of the server you want to<br />
connect to, for example, localhost, or the numerical IP address,<br />
for example, 1.234.53.<br />
Note Do not use back slashes (\) in the server name, for example,<br />
\\localhost.<br />
2. In the Port field, enter the server’s port number, for example,<br />
7001.<br />
3. In the Name field, enter your user name, for example, gmiller.<br />
<strong>User</strong> names must be a minimum of one character.<br />
4. In the Password field, enter your password, for example,<br />
docsteam. Passwords must be a minimum of eight characters.<br />
5. To save your password for every time you log in, select the<br />
Remember My Password checkbox.<br />
Note <strong>User</strong> names and passwords are assigned by your administrator—<br />
you should contact your administrator for the correct entries.<br />
6. To accept the log in information, click OK. To close the <strong>MKS</strong><br />
Change <strong>Integrity</strong> login dialog box, click Cancel.<br />
Change <strong>Integrity</strong> validates your login information, then the<br />
Change <strong>Integrity</strong> graphic user interface appears.<br />
To log in using the Web interface:<br />
1. Start your Web browser, such as Netscape Navigator or Microsoft<br />
Internet Explorer.<br />
2. Browse to the location of the Change <strong>Integrity</strong> home page. Your<br />
administrator can provide you with its location.<br />
A typical URL of the Change <strong>Integrity</strong> home page may be of the<br />
form:<br />
http://server_name:port_#/<br />
<strong>User</strong> <strong>Guide</strong> 315
Starting a Change <strong>Integrity</strong> Session<br />
<strong>The</strong> Change <strong>Integrity</strong> home page appears.<br />
3. Click Change <strong>Integrity</strong>.<br />
A browser password dialog box appears, prompting you for your<br />
Change <strong>Integrity</strong> user name and password.<br />
4. In the <strong>User</strong> Name field, enter your user name, for example,<br />
gmiller. <strong>User</strong> names must be a minimum of one character.<br />
5. In the Password field, enter your password, for example,<br />
docsteam. Passwords must be a minimum of eight characters.<br />
6. To accept the log in information, click OK. To close the login<br />
dialog box, click Cancel.<br />
316 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> Change <strong>Integrity</strong> Graphic <strong>User</strong> Interface<br />
Change <strong>Integrity</strong> validates your login information, then the<br />
Change <strong>Integrity</strong> Web interface appears.<br />
<strong>The</strong> Change <strong>Integrity</strong> Graphic <strong>User</strong> Interface<br />
<strong>The</strong> Application<br />
Window<br />
Title Bar<br />
Menu Bar<br />
Toolbar<br />
Query Bar<br />
Query Builder<br />
Query Results<br />
Context Menu<br />
Issue Details<br />
Status Bar<br />
<strong>The</strong> application window contains a number of common features<br />
explained in this section.<br />
Many of the features in the application window can be customized.<br />
For more information, see “Setting Session Preferences” on page 321.<br />
Menu Bar<br />
<strong>The</strong> menu bar is located directly below the title bar and contains<br />
available pull-down menus. When you first start Change <strong>Integrity</strong> as<br />
a user, there are seven menus in the menu-bar: Session, Query,<br />
Results, Issue, Reports, Charts, and Help.<br />
Note <strong>The</strong> Administration menu is only available to Change <strong>Integrity</strong><br />
administrators.<br />
<strong>User</strong> <strong>Guide</strong> 317
Starting a Change <strong>Integrity</strong> Session<br />
Toolbar<br />
Immediately below the menu bar is a toolbar that provides easy<br />
access to the most commonly used Change <strong>Integrity</strong> commands.<br />
Query Bar<br />
Below the toolbar is the Query Bar that provides easy access to saved<br />
queries. is a default query that queries for all issue types<br />
assigned to the current logged in user. If the user does not have any<br />
saved queries, this default query appears the first time a new user<br />
logs in. If another Change <strong>Integrity</strong> user creates a shared saved query,<br />
the shared saved query appears in the Query Bar instead of .<br />
Context Menu<br />
Change <strong>Integrity</strong> supports standard context menus. Selecting and<br />
right-clicking<br />
the Query Builder<br />
the Query Bar<br />
columns in the Query Results<br />
issues in the Query Results<br />
displays a menu of actions you can perform.<br />
Status Bar<br />
<strong>The</strong> status bar displays the number of issues visible in the Query<br />
Results, your user name, and the name and port number of the server<br />
you are connected to. You can hide or show the status bar.<br />
Query Builder<br />
When you first launch Change <strong>Integrity</strong>, the Query Builder appears<br />
on the far-left side of the application window, below the Query Bar.<br />
<strong>The</strong> Query Builder provides filters that allow you to focus your<br />
queries of specific issue types. <strong>The</strong> Type filter box is always present.<br />
Additional filters can be selected by right-clicking the Query Builder<br />
and choosing a filter from the context menu.<br />
Query Results<br />
<strong>The</strong> Query Results appear on the far-right side of the application<br />
window below the Query Bar. When you run a query, the results are<br />
displayed in the Query Results. You can choose specific display<br />
options, and double-click an issue to display specific issue<br />
information in the Issue Details.<br />
318 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Issue Details<br />
<strong>The</strong> Change <strong>Integrity</strong> Graphic <strong>User</strong> Interface<br />
<strong>The</strong> Issue Details displays specific information about a selected issue.<br />
<strong>The</strong> top of the Issue Details shows the issue type, ID, who created the<br />
issue and when, and who last modified the issue and when.<br />
<strong>The</strong> Issue Details contains five tabbed panels:<br />
<strong>The</strong> Fields panel displays a summary of the issue, the issue’s<br />
state, who the issue is assigned to, the group the issue is assigned<br />
to, the project the issue is assigned to, and custom field<br />
information.<br />
<strong>The</strong> History panel displays a read-only log of all state changes to<br />
the issue.<br />
<strong>The</strong> Attachments panel displays a list of attached files.<br />
<strong>The</strong> Relationships panel displays a list of related issues.<br />
<strong>The</strong> Change Package panel displays files that are affected by an<br />
issue type. For example, a solution’s change package might<br />
include files that are required to change in order to satisfy a<br />
problem.<br />
<strong>User</strong> <strong>Guide</strong> 319
Starting a Change <strong>Integrity</strong> Session<br />
<strong>The</strong> Change <strong>Integrity</strong> Web Interface<br />
Query Toolbar<br />
Status<br />
Toolbar<br />
Content Page<br />
<strong>The</strong> Change <strong>Integrity</strong> Web interface contains a number of common<br />
features explained in this section.<br />
Note Your administrator can customize the appearance of the Change<br />
<strong>Integrity</strong> Web interface, for example, toolbar buttons, and background<br />
colors.<br />
Toolbar<br />
In the left frame is a toolbar that provides easy access to the most<br />
commonly used Change <strong>Integrity</strong> commands: submitting issues,<br />
viewing charts, viewing reports, logging out, choosing query display<br />
options, and viewing the Change <strong>Integrity</strong> Web interface online help.<br />
Query Toolbar<br />
In the top frame is the Query toolbar that allows you to perform<br />
query functions: creating, saving, running, viewing, editing, and<br />
deleting queries.<br />
320 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Setting Session Preferences<br />
My Inbox is a default saved query that queries for all issue types<br />
assigned to the current logged in user. If the user does not have any<br />
saved queries, this default query appears the first time a new user<br />
logs in. If another Change <strong>Integrity</strong> user creates a shared saved query,<br />
the shared saved query appears in the Saved Queries drop-down<br />
menu instead of My Inbox.<br />
Content Page<br />
Whenever you perform a Change <strong>Integrity</strong> operation from the<br />
toolbar or Query toolbar, command options and results are displayed<br />
in the right frame, for example, query results.<br />
Status<br />
Setting Session Preferences<br />
<strong>The</strong> status of a Change <strong>Integrity</strong> session is displayed in two areas:<br />
the browser’s address bar displays the server name and port<br />
number that you are connected to<br />
the left frame displays your user name under the <strong>MKS</strong> logo<br />
Session preferences allow you to customize your Change <strong>Integrity</strong><br />
client session and configure email notification.<br />
To set session preferences in the graphic user interface:<br />
1. Choose Session > Preferences.<br />
<strong>User</strong> <strong>Guide</strong> 321
Starting a Change <strong>Integrity</strong> Session<br />
For more information about<br />
running queries, see “Running<br />
Queries” on page 359.<br />
<strong>The</strong> Preferences dialog box appears.<br />
2. To automatically connect to a database on a Change <strong>Integrity</strong><br />
server when you launch the Change <strong>Integrity</strong> client, select the<br />
Automatic Connect checkbox.<br />
With this option selected, you do not have to enter your host<br />
information, user name, and password every time you log in.<br />
3. To save your password for every time you log in, select the<br />
Remember My Password checkbox.<br />
This option is also available from the <strong>MKS</strong> Change <strong>Integrity</strong> login<br />
dialog box.<br />
4. To run a query only when you choose Query > Run, select the<br />
Query Only on Demand checkbox.<br />
If you do not select this checkbox, Change <strong>Integrity</strong> runs a query<br />
as you specify query filters.<br />
To set layout preferences:<br />
1. Click the Layout tab.<br />
<strong>The</strong> Layout panel appears.<br />
322 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Email<br />
Notification<br />
2. Set up your layout as follows:<br />
Setting Session Preferences<br />
To display the Query Bar, select the Show Query Bar checkbox<br />
under Query Bar.<br />
To choose a position for the Query Bar, select the Horizontal or<br />
Vertical radio button.<br />
To display the Query Builder, select the Show Query Builder<br />
checkbox under Query Builder.<br />
To choose a position for the Query Builder, select the Align<br />
Left or Align Right radio button.<br />
To choose a position for the Issue Details, select the Above<br />
Query Results or Below Query Results radio button.<br />
To show the status bar, select the Show Status Bar checkbox.<br />
Any Change <strong>Integrity</strong> user can be notified via email whenever a new<br />
issue is submitted, or issue information changes. This is useful for<br />
users who need to review and approve state changes on new<br />
submissions or existing issues, and users who need to work on issues<br />
assigned to them. Notifications also keep users informed of project<br />
progress.<br />
You configure Change <strong>Integrity</strong> to send you email notification by<br />
creating rules. Rules are made up of conditions, which are logical<br />
expressions of specific issue field changes that you want to be<br />
notified about. For example, you could create a simple rule<br />
containing one condition that sends you email every time a new<br />
<strong>User</strong> <strong>Guide</strong> 323
Starting a Change <strong>Integrity</strong> Session<br />
problem assigned to you is submitted. Similarly, you could create a<br />
complex rule containing two conditions that send you email every<br />
time a new problem assigned to you is submitted, and when existing<br />
problems become assigned to you. Rules can contain as many<br />
conditions as you want.<br />
To set email notification preferences:<br />
1. Click the Notifications tab.<br />
<strong>The</strong> Notifications panel appears.<br />
2. In the Address field, enter your email address, for example,<br />
omille@mks.com.<br />
3. If certain conditions are met, nodes specify if email notification<br />
will be sent. Choose a node option by clicking a button:<br />
And specifies that all of the conditions specified must be true<br />
for an email notification to be sent. For example, if an issue’s<br />
assigned group = documentation and the project =<br />
editor, then an email notification is sent.<br />
Or specifies that one or more of the conditions must be true in<br />
order for an email notification to be sent. For example, if an<br />
issue’s state = submitted, but the priority does not =<br />
high, an email notification is sent.<br />
Swap replaces the selected node with the opposite node. For<br />
example, swapping an Or node replaces it with an And node.<br />
Remove deletes the selected node.<br />
324 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Setting Session Preferences<br />
Tip You do not need to use the And and Or nodes if your rule contains<br />
only one condition.<br />
4. Under Condition, choose a field to be notified about from the Field<br />
drop-down menu, for example, Assigned <strong>User</strong>.<br />
You can select from two types of fields: prime fields and non-prime<br />
fields. A prime field, indicated by a prime symbol ( ), specifies a<br />
new value. A non-prime field specifies an existing value.<br />
5. From the Operator drop-down menu, choose an operator. <strong>The</strong><br />
available operators are:<br />
= equal to<br />
not equal to<br />
> greater than<br />
>= greater than or equal to<br />
Starting a Change <strong>Integrity</strong> Session<br />
8. To accept the changes, click OK. To discard any changes, click<br />
Cancel.<br />
Once you create a rule, you receive email notification whenever an<br />
issue matches the conditions specified in your rule, for example,<br />
whenever an issue becomes assigned to you.<br />
326 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Saving Session<br />
Preferences<br />
Setting Session Preferences<br />
<strong>The</strong> email displays the issue type; ID; summary; who edited the issue<br />
and when; a hyperlink, that when clicked opens the issue in the<br />
Change <strong>Integrity</strong> Web interface; modified fields; and comments.<br />
To set toolbar preferences:<br />
1. Click the Toolbars tab.<br />
<strong>The</strong> Toolbar panel appears.<br />
2. Choose an option by selecting a radio button:<br />
Show Only Images displays only images on toolbar buttons.<br />
Show Images and Text displays images and text on toolbar<br />
buttons.<br />
Show Images and Selective Text displays images and text on<br />
some of the toolbar buttons.<br />
Show Only Text displays only text on toolbar buttons.<br />
To save session preferences:<br />
To accept the session preferences, click OK. To discard any changes to<br />
the session preferences, click Cancel<br />
<strong>User</strong> <strong>Guide</strong> 327
Starting a Change <strong>Integrity</strong> Session<br />
Ending a Change <strong>Integrity</strong> Session<br />
Logging Out<br />
Closing a<br />
Session<br />
You can log out of Change <strong>Integrity</strong> and log in as another user, or<br />
allow another user to log in.<br />
To log out using the graphic user interface:<br />
Choose Session > Logout.<br />
<strong>The</strong> <strong>MKS</strong> Change <strong>Integrity</strong> login dialog box appears.<br />
To log in again, see “Logging In” on page 314.<br />
To log out using the Web interface:<br />
Click .<br />
<strong>The</strong> Change <strong>Integrity</strong> home page appears.<br />
To log in again, see “Logging In” on page 314.<br />
Closing a Change <strong>Integrity</strong> session shuts down the client and<br />
disconnects from the server.<br />
To close a session using the graphic user interface:<br />
Choose Session > Exit.<br />
<strong>The</strong> Change <strong>Integrity</strong> client shuts down and disconnects from the<br />
server.<br />
328 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
To close a session using the Web interface:<br />
1. Click .<br />
<strong>The</strong> Change <strong>Integrity</strong> home page appears.<br />
2. Close the browser window.<br />
Ending a Change <strong>Integrity</strong> Session<br />
<strong>The</strong> Change <strong>Integrity</strong> client shuts down and disconnects from the<br />
server.<br />
<strong>User</strong> <strong>Guide</strong> 329
Starting a Change <strong>Integrity</strong> Session<br />
330 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Submitting Issues<br />
11<br />
This chapter describes how to submit issues in the Change <strong>Integrity</strong><br />
graphic user interface and Web interface.<br />
<strong>The</strong> chapter covers:<br />
submitting an issue<br />
adding attachments to an issue<br />
linking an issue with a submitted issue<br />
<strong>User</strong> <strong>Guide</strong> 331
Submitting Issues<br />
Submitting an Issue<br />
To submit an issue in the graphic user interface:<br />
1. Choose Issue > New, or click .<br />
2. Select an issue type.<br />
Note <strong>The</strong> list of available issue types may vary depending on the issue<br />
types your administrator created. Problems, solutions, and tasks are<br />
issue types provided with Change <strong>Integrity</strong>.<br />
<strong>The</strong> Submit New dialog box appears.<br />
3. Enter the issue data in the fields provided.<br />
In the Summary field, enter a brief summary of the issue, up<br />
to 100 alpha-numeric characters.<br />
In the State drop-down menu, choose a state for the issue, for<br />
example, Submitted. Your administrator defines states.<br />
332 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Submitting an Issue<br />
In the Assigned <strong>User</strong> drop-down menu, assign a user to the<br />
issue. Your administrator defines users.<br />
Note Assigning an issue to a user does not automatically assign the<br />
issue to the user’s assigned group. You must select the user’s assigned<br />
group from the Assigned Group drop-down menu.<br />
In the Assigned Group drop-down menu, assign a group to<br />
the issue, for example, development. Your administrator<br />
defines groups.<br />
In the Project drop-down menu, assign the issue to a specific<br />
project. Your administrator defines projects.<br />
Your administrator defines custom fields, for example, Fix<br />
Progress. Custom fields can be either text fields or dropdown<br />
menus.<br />
4. If you do not know the information required for a specific field,<br />
click the field.<br />
A icon appears to the left of the field.<br />
5. Click the icon or press F2.<br />
unspecified appears in the field.<br />
6. To edit the field, click the field and enter text or choose a menu<br />
item.<br />
7. To submit the issue, click OK. To close the Submit New dialog box<br />
without saving any changes, click Cancel.<br />
<strong>The</strong> issue is submitted and appears in the Query Results for the<br />
specified project.<br />
<strong>User</strong> <strong>Guide</strong> 333
Submitting Issues<br />
To submit an issue in the Web interface:<br />
1. Under Submit, click an issue type button, for<br />
example, .<br />
Note Your administrator defines issue types. Problems, solutions, and<br />
tasks are example issue types provided with Change <strong>Integrity</strong>.<br />
<strong>The</strong> Submit Issue page appears.<br />
2. Enter the issue data in the fields provided.<br />
In the Summary field, enter a brief summary of the issue, up<br />
to 100 alpha-numeric characters.<br />
In the State drop-down menu, choose a state for the issue, for<br />
example, Submitted. Your administrator defines states.<br />
In the Assigned <strong>User</strong> drop-down menu, assign a user to the<br />
issue. Your administrator defines users.<br />
Note Assigning an issue to a user does not automatically assign the<br />
issue to the user’s assigned group. You must select the user’s assigned<br />
group from the Assigned Group drop-down menu.<br />
In the Assigned Group drop-down menu, assign a group to<br />
the issue, for example, development. Your administrator<br />
defines groups.<br />
334 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Relating an<br />
Issue With a<br />
Submitted Issue<br />
For information on opening<br />
the Submit New dialog box,<br />
see “Submitting an Issue” on<br />
page 332.<br />
Submitting an Issue<br />
In the Project drop-down menu, assign the issue to a specific<br />
project. Your administrator defines projects.<br />
Your administrator defines custom fields, for example, Fix<br />
Progress. Custom fields can be either text fields or dropdown<br />
menus.<br />
Note In date fields, use the format mm/dd/yyyy.<br />
3. If you do not know the required information for a specific field,<br />
select the field’s checkbox. (Unspecified) will appear in the field<br />
after it is submitted.<br />
4. To submit the issue, click . To make changes, click the<br />
browser’s Back button.<br />
<strong>The</strong> issue is submitted and appears in the Issue Details page.<br />
Issues can be related to one another as references. For example, an<br />
issue type that tracks problems could be linked to an issue type that<br />
provides solutions. Similarly, an issue type that sets out tasks could<br />
be linked to an issue type that tracks problems.<br />
Note Your administrator defines issue types and issue type<br />
relationships.<br />
To relate an issue with a submitted issue in the graphic user<br />
interface:<br />
1. With the Submit New dialog box open, click the Relationships tab.<br />
<strong>The</strong> Relationships panel appears.<br />
<strong>User</strong> <strong>Guide</strong> 335
Submitting Issues<br />
2. Click .<br />
<strong>The</strong> Add Linked Issue dialog box appears.<br />
3. Enter the issue’s ID, for example, 67.<br />
4. Click OK.<br />
<strong>The</strong> issue appears in the Relationships list.<br />
336 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Submitting an Issue<br />
5. Repeat for all issues you want to associate with the issue you are<br />
submitting.<br />
To relate an issue with a submitted issue in the Web interface:<br />
1. With the Submit Issue page open, click the Relationships tab.<br />
<strong>The</strong> Relationships panel appears.<br />
2. Enter the issue’s ID, for example, 43.<br />
3. Click Add Relationship.<br />
<strong>User</strong> <strong>Guide</strong> 337
Submitting Issues<br />
<strong>The</strong> issue appears in the Relationships list.<br />
4. Repeat for all issues you want to associate with the issue you are<br />
submitting.<br />
Removing a Related Issue<br />
To remove a related issue in the graphic user interface:<br />
1. With the Submit New dialog box open, click the Relationships tab.<br />
<strong>The</strong> Relationships panel appears.<br />
2. Select the issue from the Relationships list.<br />
3. Click .<br />
<strong>The</strong> issue is removed from the Relationships list.<br />
338 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
To remove a related issue in the Web interface:<br />
Submitting an Issue<br />
1. With the Submit Issue page open, click the Relationships tab.<br />
<strong>The</strong> Relationships panel appears.<br />
2. Select the related issue’s checkbox from the Relationships list.<br />
3. Click Remove Selected.<br />
<strong>The</strong> issue is removed from the Relationships list.<br />
Opening a Related Issue<br />
You can view complete information about an issue related to a<br />
submitted issue.<br />
To open a related issue in the graphic user interface:<br />
See “Selecting Issues to View” on page 367.<br />
To open a related issue in the Web interface:<br />
1. Submit the issue, as explained in “Submitting an Issue” on page<br />
332.<br />
<strong>The</strong> Issue Details page appears.<br />
2. Click the Relationships tab.<br />
<strong>User</strong> <strong>Guide</strong> 339
Submitting Issues<br />
Adding Attachments to an Issue<br />
For information on opening<br />
the Submit New dialog box,<br />
see “Submitting an Issue” on<br />
page 332.<br />
<strong>The</strong> Relationships panel appears.<br />
3. Click the issue’s ID from the Relationships list.<br />
<strong>The</strong> issue opens in the Issue Details page.<br />
Change <strong>Integrity</strong> allows you to attach copies of a file to an issue so<br />
other users may view them.<br />
To add an attachment to an issue in the graphic user interface:<br />
1. With the Submit New dialog box open, click the Attachments tab.<br />
<strong>The</strong> Attachments panel appears.<br />
340 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
2. Click .<br />
<strong>The</strong> Add Attachments dialog box appears<br />
3. Browse to a specific file on your local drive.<br />
4. Click Open.<br />
Submitting an Issue<br />
<strong>User</strong> <strong>Guide</strong> 341
Submitting Issues<br />
<strong>The</strong> selected file is added to the Attachments list.<br />
5. Repeat for all files you want to attach to the issue.<br />
To add an attachment to an issue in the Web interface:<br />
1. With the Submit Issue page open, click the Attachments tab.<br />
<strong>The</strong> Attachments panel appears.<br />
2. Click Browse.<br />
<strong>The</strong> Choose file dialog box appears.<br />
3. Browse to a specific file on your local drive.<br />
4. Click Open.<br />
<strong>The</strong> file appears in the Filename field.<br />
5. Click Add Attachment.<br />
342 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>The</strong> selected file is added to the Attachments list.<br />
6. Repeat for all files you want to attach to the issue.<br />
Removing an Attachment<br />
To remove an attachment in the graphic user interface:<br />
Submitting an Issue<br />
1. With the Submit New dialog box open, click the Attachments tab.<br />
<strong>The</strong> Attachments panel appears.<br />
2. Select the attachment from the Attachments list.<br />
3. Click .<br />
<strong>The</strong> attachment is removed from the Attachments list.<br />
<strong>User</strong> <strong>Guide</strong> 343
Submitting Issues<br />
To remove an attachment in the Web interface:<br />
1. With the Submit Issue page open, click the Attachments tab.<br />
<strong>The</strong> Attachments panel appears.<br />
2. Select the attachment’s checkbox from the Attachments list.<br />
3. Click Remove Selected Attachments.<br />
<strong>The</strong> attachment is removed from the Attachments list.<br />
Opening an Attachment<br />
To open an attachment in the graphic user interface:<br />
1. With the Submit New dialog box open, click the Attachments tab.<br />
<strong>The</strong> Attachments panel appears.<br />
2. Select the attachment from the Attachments list.<br />
344 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
3. Click .<br />
<strong>The</strong> attachment opens in its associated application.<br />
Submitting an Issue<br />
To open an attachment in the Web interface:<br />
1. Submit the issue, as explained in “Submitting an Issue” on page<br />
332.<br />
<strong>The</strong> Issue Details page appears.<br />
2. Click the Attachments tab.<br />
<strong>User</strong> <strong>Guide</strong> 345
Submitting Issues<br />
3. Click the file name from the Attachments list.<br />
<strong>The</strong> attachment opens in a new browser window.<br />
Saving an Attachment<br />
You can save attachments to your local drive for later viewing.<br />
To save an attachment in the graphic user interface:<br />
1. With the Submit New dialog box open, click the Attachments tab.<br />
<strong>The</strong> Attachments panel appears.<br />
2. Select the attachment from the Attachments list.<br />
3. Click .<br />
<strong>The</strong> Save Attachments dialog box appears.<br />
4. Browse to the location on your local drive where you want to<br />
save the attachment.<br />
5. Click Save As.<br />
To save an attachment in the Web interface:<br />
1. Submit the issue, as explained in “Submitting an Issue” on page<br />
332.<br />
<strong>The</strong> Issue Details page appears.<br />
346 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
2. Click the Attachments tab.<br />
3. <strong>The</strong> Attachments panel appears.<br />
Submitting an Issue<br />
4. Click the file name from the Attachments list.<br />
<strong>The</strong> attachment opens in a new browser window.<br />
5. Choose File > Save As.<br />
A standard Save dialog box appears.<br />
6. Browse to the location on your local drive where you want to<br />
save the attachment.<br />
7. Click Save As.<br />
<strong>User</strong> <strong>Guide</strong> 347
Submitting Issues<br />
348 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Queries<br />
12<br />
You can define and store any number of queries using Change<br />
<strong>Integrity</strong>. A query is basically a request to select and list the issue<br />
types that meet specific selection criteria. <strong>The</strong> selection criterion is a<br />
logical expression of specific values, or ranges of values, of the<br />
standard and custom fields of the issue.<br />
<strong>The</strong> queries you define are stored on the Change <strong>Integrity</strong> client, but<br />
they may be run by other users if the saved query is shared.<br />
Queries are created in the Query Builder and can be saved for future<br />
use.<br />
This chapter explains how to:<br />
create a new query<br />
create saved queries<br />
run queries<br />
<strong>User</strong> <strong>Guide</strong> 349
Queries<br />
Creating a New Query<br />
To create a new query in the graphic user interface:<br />
1. From the drop-down menu in the Type filter box, choose an issue<br />
type to query by selecting an issue type checkbox. Not selecting<br />
an issue type checkbox means that the query is not restricted to<br />
any issue types. You can select multiple issue types.<br />
Note Your administrator defines issue types.<br />
2. Right-click the Query Builder and select filters specific to your<br />
query from the context menu:<br />
Tip To insert all filters, right-click the Query Builder and choose Insert<br />
All from the context menu. To hide a specific filter, right-click the filter<br />
box and choose Hide from the context menu. To hide all filters, right-click<br />
the Query Builder and choose Hide All from the context menu.<br />
ID queries by issue ID. From the operator drop-down menu,<br />
choose an operator. In the ID field, enter the issue ID, or click<br />
or to select an issue ID.<br />
350 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Creating a New Query<br />
Created By queries by the user who created the issue. From<br />
the user drop-down menu, select a user checkbox. Your<br />
administrator defines users.<br />
Created Date queries by the date the issue was created. From<br />
the From drop-down menu, select the date you want the<br />
query to begin with by choosing a date from the calendar.<br />
From the To drop-down menu, select the date you want the<br />
query to end with by choosing a date from the calendar.<br />
Note <strong>The</strong> To field in all date queries is mutually exclusive. For example,<br />
if you wanted to view all issues created up to March 25, 2000, you would<br />
enter March 26, 2000 in the To field.<br />
Modified By queries by the user who last modified the issue.<br />
From the user drop-down menu, select a user checkbox. Your<br />
administrator defines users.<br />
Modified Date queries by the date the issue was last modified.<br />
From the From drop-down menu, select the date you want<br />
the query to begin with by choosing a date from the calendar.<br />
From the To drop-down menu, select the date you want the<br />
query to end with by choosing a date from the calendar.<br />
Summary queries by words in the issue’s summary. In the<br />
summary field, enter a word or phrase to search for up to 100<br />
characters. All text field queries are case-sensitive.<br />
Assigned <strong>User</strong> queries by the user who is assigned to the<br />
issue. From the user drop-down menu, select a user<br />
checkbox. Your administrator defines users.<br />
Assigned Group queries by the group assigned to the issue.<br />
From the group drop-down menu, select a group checkbox.<br />
Your administrator defines groups.<br />
Project queries by project. Choose a project. Your<br />
administrator defines projects.<br />
Note To choose multiple projects, select a project while holding down<br />
the Ctrl or Shift keys, then select additional projects. You can open and<br />
close project folders by double-clicking them or using the and<br />
icons.<br />
<strong>User</strong> <strong>Guide</strong> 351
Queries<br />
State queries by the issue’s state. From the issue drop-down<br />
menu, select a state checkbox. Your administrator defines<br />
states.<br />
Custom fields, such as Description, can be either drop-down<br />
menus or text fields. Your administrator defines custom<br />
fields. Text field queries are case-sensitive.<br />
Tip To close an open filter box you do not want to use, click .<br />
3. For the filters you have selected, select the filter checkboxes ( ).<br />
To create a new query in the Web interface:<br />
Note To create a query in the Web interface, you must save it.<br />
1. Click .<br />
<strong>The</strong> Query Details page appears.<br />
2. In the Name field, enter a name for the query.<br />
3. To share the query with other Change <strong>Integrity</strong> users, select the<br />
Shared checkbox.<br />
4. In the Description field, enter a description of the query.<br />
5. Under Types, select issue types to query for by selecting issue<br />
type checkboxes. Not selecting an issue type checkbox means<br />
that the query is not restricted to any issue types. Your<br />
administrator defines issue types.<br />
352 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Creating a New Query<br />
6. Choose a field to query for by selecting a field from the Fields<br />
drop-down menu.<br />
7. Click Add.<br />
<strong>The</strong> field appears below the Fields drop-down menu.<br />
8. To remove the field, click Remove.<br />
<strong>The</strong> field is removed.<br />
9. Repeat for as many fields as you want to add to the query.<br />
10. In the available fields under the Fields drop-down menu, select<br />
values to query for. Note the following:<br />
To select multiple values in a drop-down menu, select a value<br />
in a field while holding down Ctrl or Shift, then select<br />
additional values.<br />
You can enter up to 100 characters in text fields.<br />
Text field queries are case-sensitive.<br />
Use the format mm/dd/yyyy in date fields.<br />
11. To save the query, click .<br />
<strong>The</strong> results of the query appears in the Query Results page.<br />
<strong>User</strong> <strong>Guide</strong> 353
Queries<br />
Creating Saved Queries<br />
To create a saved query in the graphic user interface:<br />
Note For information on creating a saved query in the Web interface,<br />
see “Creating a New Query” on page 350.<br />
1. Choose Query > New.<br />
<strong>The</strong> New Query dialog box appears.<br />
Tip You can also access the Query menu by right-clicking the Query Bar.<br />
2. In the Name field, enter a name for the new query.<br />
3. To allow all Change <strong>Integrity</strong> users access to the query, select the<br />
Shared checkbox.<br />
4. Choose an image option for your saved query by selecting a radio<br />
button:<br />
Use default image uses the default image for the saved<br />
query’s icon.<br />
354 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Creating Saved Queries<br />
Use custom image to select a custom image for the saved<br />
query’s icon. Click Select and browse to an image file.<br />
No Image is specified for the saved query’s icon.<br />
Note Images must be GIF or JPEG format, and no larger than 16 by 24<br />
pixels.<br />
5. Click the Description tab.<br />
<strong>The</strong> Description panel appears.<br />
6. In the Description field, enter a description of the saved query.<br />
7. Click OK. To discard the new query, click Cancel.<br />
<strong>The</strong> new query appears in the Query Bar.<br />
8. Click the saved query from the Query Bar.<br />
9. Create a query in the Query Builder, as described in “Creating a<br />
New Query” on page 350.<br />
<strong>User</strong> <strong>Guide</strong> 355
Queries<br />
Reverting a Saved Query<br />
Deleting a Saved Query<br />
10. Choose Query > Save.<br />
<strong>The</strong> query is saved.<br />
While making changes to a saved query, you can undo the changes<br />
and revert to the original saved query.<br />
Note Reverting a saved query only works if a save has not been done.<br />
To revert a saved query (graphic user interface only):<br />
Choose Query > Revert, or right-click the query and choose Revert<br />
from the context menu.<br />
<strong>The</strong> query reverts back to its original state.<br />
Eventually, you may want to delete saved queries that you no longer<br />
use, or if you have too many to manage.<br />
Note Shared queries can only be deleted by the owner. In the graphic<br />
user interface, the Save, Revert, and Delete menu items in the Query<br />
menu are greyed out. In the Web interface, a dialog appears, informing<br />
you can not delete the query.<br />
To delete a saved query in the graphic user interface:<br />
1. Select the query you want to delete from the Query Bar.<br />
<strong>The</strong> Query Results appear.<br />
2. Choose Query > Delete, or right-click the query and choose Delete<br />
from the context menu.<br />
Change <strong>Integrity</strong> asks you to confirm that you want to delete the<br />
query.<br />
3. To delete the query, click Yes. To cancel the operation, click No.<br />
356 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
To delete a saved query in the Web interface:<br />
Note Shared queries can only be deleted by the owner.<br />
Creating Saved Queries<br />
1. Select the query from the Saved Queries drop-down menu.<br />
<strong>The</strong> Query Results page appears.<br />
2. Click .<br />
Change <strong>Integrity</strong> asks you to confirm that you want to delete the<br />
query.<br />
3. To delete the query, click Yes. To cancel the operation, click No.<br />
Viewing and Editing Saved Query Properties<br />
To view and edit saved query properties in the graphic user<br />
interface:<br />
Note Share queries can only be edited by the owner. <strong>The</strong> edit options<br />
will be greyed out.<br />
1. Select the query from the Query Bar.<br />
<strong>The</strong> Query Results appear.<br />
2. Choose Query > Properties, or right-click the query and choose<br />
Properties from the context menu.<br />
<strong>User</strong> <strong>Guide</strong> 357
Queries<br />
<strong>The</strong> Edit Query dialog box appears.<br />
3. Edit the query properties, if desired.<br />
4. Click OK to save any changes made to the query. Click Cancel to<br />
discard any changes made to the query.<br />
To view and edit saved query properties in the Web interface:<br />
1. Select a saved query from the Saved Query drop-down menu.<br />
<strong>The</strong> Query Results page appears.<br />
2. Click .<br />
<strong>The</strong> Query Details page appears.<br />
358 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Running Queries<br />
3. Make changes to the query as needed.<br />
Running Queries<br />
4. To save any changes made, click . To discard any changes<br />
made, click the browser’s Back button.<br />
If you made changes to the saved query, the results of the query<br />
appear in Query Results page.<br />
To run a new query in the graphic user interface:<br />
1. Create a query in the Query Builder.<br />
2. Choose Query > Run.<br />
Note Choosing Query > Run only works if Query Only on Demand is<br />
selected in the Preferences dialog box. For more information, see<br />
“Setting Session Preferences” on page 321.<br />
<strong>The</strong> results of your query appear in the Query Results.<br />
<strong>User</strong> <strong>Guide</strong> 359
Queries<br />
To run a query in the Web interface, see “Creating a New Query” on<br />
page 350.<br />
To run a saved query in the graphic user interface:<br />
Click a saved query from the Query Bar, or right-click the query and<br />
choose Run from the context menu.<br />
<strong>The</strong> results of your query appear in the Query Results.<br />
To run a saved query in the Web interface:<br />
Choose a saved query from the Saved Query drop-down menu.<br />
<strong>The</strong> results of your query appear in the Query Results page.<br />
360 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Refreshing Queries<br />
Running Queries<br />
After you run a query, you may want to run it again to see if any<br />
changes have been made to the issues included in the query<br />
Note Queries automatically refresh in the graphic user interface.<br />
To refresh a query (Web interface only):<br />
Click .<br />
<strong>The</strong> results of the query appear in the Query Results page.<br />
<strong>User</strong> <strong>Guide</strong> 361
Queries<br />
362 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Viewing and Editing<br />
Issues<br />
13<br />
When you run a query, you are able to see query results, select<br />
individual issues for further viewing, and edit issues, depending on<br />
the permissions given to you by your administrator.<br />
This chapter explains how to:<br />
view query results<br />
view issue information<br />
edit issue information<br />
edit multiple issues<br />
print issue information<br />
save issue information<br />
<strong>User</strong> <strong>Guide</strong> 363
Viewing and Editing Issues<br />
Viewing Query Results<br />
For information on creating<br />
and running queries, see<br />
“Queries” on page 349.<br />
After you run a query, the results appear in the Query Results. You<br />
can view the issues in a number of ways, such as sorting by a specific<br />
field, or in ascending or descending order. In addition, there are<br />
many common list actions you can perform for viewing and sorting<br />
issues.<br />
To view specific columns in the graphic user interface:<br />
1. Choose Results > Columns, or right-click a column title and<br />
choose Columns from the context menu.<br />
<strong>The</strong> Columns dialog box appears.<br />
2. To add or remove a column from the Query Results, select a<br />
column and click the add ( ) or remove ( ) buttons.<br />
Note Your administrator sets the fields you can select in the Columns<br />
dialog box.<br />
3. To reorder the columns, select a column and click the move up<br />
( ) or move down ( ) buttons.<br />
4. To specify a column’s pixel width, select a column and enter a<br />
value up to 1000 pixels in the pixel width box.<br />
5. To accept the changes, click OK. To discard any changes made,<br />
click Cancel.<br />
364 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Viewing Query Results<br />
If any changes were made in the Columns dialog box, the issues<br />
are re-organized in the Query Results.<br />
Common List Actions<br />
<strong>The</strong> following actions are common to all lists in the graphic user<br />
interface:<br />
To see additional details, scroll the data grid lists horizontally<br />
and vertically.<br />
<strong>The</strong> list is unsorted by default. To sort the list by a specific<br />
column, click any column’s title once—the sort sequence is<br />
displayed in the column’s title by an arrow.<br />
You can re-arrange columns by clicking a column’s title and<br />
dragging it to a new position.<br />
You can also expand or shrink any column by selecting the<br />
vertical dividing bar between two fields on the column title line,<br />
and then dragging it left or right.<br />
Choosing Results > Sort By allows you to select several sort<br />
options:<br />
Sort Ascending sorts the selected column title in ascending<br />
order.<br />
Sort Descending sorts the selected column in descending<br />
order.<br />
You can sort query results by the fields available in the Sort<br />
By drop-down menu. <strong>The</strong> available fields are set in the<br />
Columns dialog box.<br />
Right-clicking a column title allows you to choose several options<br />
from a context menu:<br />
Hide hides the selected column title from view.<br />
Sort allows you to sort the column title in Ascending or<br />
Descending order.<br />
Columns brings up the Columns dialog box so you can set<br />
view options in the Query Results, as explained earlier.<br />
<strong>User</strong> <strong>Guide</strong> 365
Viewing and Editing Issues<br />
You can show custom fields in the Query Results by selecting<br />
a custom field from the context menu. Your administrator<br />
defines custom fields.<br />
To view specific columns in the Web interface:<br />
1. Click .<br />
<strong>The</strong> Columns page appears.<br />
2. Choose the fields you want to view by selecting field checkboxes.<br />
Note Your administrator sets the fields you can select in the Columns<br />
page.<br />
3. To accept the changes made, click Apply. To discard any changes<br />
made, click Reset.<br />
366 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Selecting Issues to View<br />
If any changes were made in the Columns page, the issues are reorganized<br />
in the Query Results page.<br />
Common List Actions<br />
Selecting Issues to View<br />
<strong>The</strong> following actions are common to all lists in the Web interface:<br />
To see additional details, scroll the data grid lists horizontally<br />
and vertically.<br />
<strong>The</strong> list is unsorted by default. To sort the list by a specific<br />
column, click any column’s title once—the sort sequence is<br />
displayed in the column’s title by an arrow.<br />
To view issue details in the graphic user interface:<br />
Select an issue to open by double-clicking the appropriate line in the<br />
Query Results, generated either by listing all issues, or as a result of a<br />
specific issue type query.<br />
<strong>User</strong> <strong>Guide</strong> 367
Viewing and Editing Issues<br />
<strong>The</strong> issue opens in the Issue Details.<br />
<strong>The</strong> top of the Issue Details shows the issue type, ID, who created the<br />
issue and when, and who last modified the issue and when.<br />
To view specific information about the issue, click a tab:<br />
<strong>The</strong> Fields panel displays a summary of the issue, the issue’s<br />
state, who the issue is assigned to, the group the issue is assigned<br />
to, the project the issue is assigned to, a description of the issue,<br />
and custom field information.<br />
<strong>The</strong> History panel displays a read-only log of all state changes to<br />
the issue.<br />
<strong>The</strong> Attachments panel displays a list of attached files.<br />
To open an attachment, see “Opening an Attachment” on page<br />
344.<br />
To save an attachment, see “Saving an Attachment” on page 346.<br />
<strong>The</strong> Relationships panel displays a list of related issues.<br />
To open a related issue, select it from the Attachments list, then<br />
click .<br />
<strong>The</strong> issue opens in the Issue Details.<br />
368 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For more information on<br />
change packages, see<br />
“Integrated Version Control”<br />
on page 437.<br />
Selecting Issues to View<br />
<strong>The</strong> Change Package panel displays a list of files that are affected<br />
by an issue type. For example, a solution’s change package might<br />
include files that are required to change in order to satisfy a<br />
problem.<br />
Tip To resize the Issue Details, point to the divider between the Issue<br />
Details and the Query Results until you get a double arrow, and then<br />
drag the divider up or down.<br />
To select an issue by ID in the graphic user interface:<br />
With issues in the Query Results, click the and buttons at the<br />
top of the Issue Details to move up and down through the list of<br />
issues by ID. You can also type in the issue ID in the ID field.<br />
<strong>The</strong> issue appears in the Issue Details.<br />
<strong>User</strong> <strong>Guide</strong> 369
Viewing and Editing Issues<br />
To view issue details in the Web interface:<br />
Select an issue to view by clicking an issue value, for example, an ID<br />
or user name.<br />
<strong>The</strong> issue opens in the Issue Details page.<br />
<strong>The</strong> top of the Issue Details page shows the issue type, ID, who<br />
created the issue and when, and who last modified the issue and<br />
when.<br />
To view specific information about the issue, click a tab:<br />
<strong>The</strong> Fields panel displays a summary of the issue, the issue’s<br />
state, who the issue is assigned to, the group the issue is assigned<br />
to, the project the issue is assigned to, a description of the issue,<br />
and custom field information.<br />
<strong>The</strong> History panel displays a read-only log of all state changes to<br />
the issue.<br />
<strong>The</strong> Attachments panel displays attached files.<br />
370 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For more information on<br />
change packages, see<br />
“Integrated Version Control”<br />
on page 437.<br />
Printing Issues<br />
Selecting Issues to View<br />
To open an attachment, see “Opening an Attachment” on page<br />
344.<br />
To save an attachment, see “Saving an Attachment” on page 346.<br />
<strong>The</strong> Relationships panel displays related issues.<br />
To open a related issue, see “Opening a Related Issue” on page<br />
339.<br />
<strong>The</strong> Change Package panel displays files that are affected by an<br />
issue type. For example, a solution’s change package might<br />
include files that are required to change in order to satisfy a<br />
problem.<br />
To print an issue in the graphic user interface:<br />
1. Select an issue from the Query Results.<br />
Tip You can select multiple issues to print by selecting an issue, then<br />
while holding down Ctrl or Shift, select additional issues.<br />
2. To print one issue, choose Issue > Print, or right-click and choose<br />
Print from the context menu.<br />
To print multiple issues, choose Issue > Batch > Print, or rightclick<br />
and choose Print from the context menu.<br />
A Print Issues window appears.<br />
<strong>User</strong> <strong>Guide</strong> 371
Viewing and Editing Issues<br />
Note Multiple issues appear in the same Print Issues window.<br />
3. Click Print.<br />
A standard Print dialog box appears.<br />
4. Select the print options you want.<br />
5. Click OK.<br />
372 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Saving Issues<br />
To print an issue in the Web interface:<br />
Selecting Issues to View<br />
1. To print one issue, run a query and open the issue.<br />
To print multiple issues, run a query and select the checkboxes of<br />
the issues that you want to print.<br />
2. Click .<br />
A Print Issues window appears.<br />
Note Multiple issues appear in the same Print Issues window.<br />
3. Choose File > Print.<br />
A standard Print dialog box appears.<br />
4. Select the print options you want.<br />
5. Click OK.<br />
To save an issue in the graphic user interface:<br />
1. Select an issue from the Query Results.<br />
<strong>User</strong> <strong>Guide</strong> 373
Viewing and Editing Issues<br />
Tip You can select multiple issues to save by selecting an issue, then<br />
while holding down Ctrl or Shift, select additional issues.<br />
2. To save one issue, choose Issue > Print, or right-click and choose<br />
Print from the context menu.<br />
To save multiple issues, choose Issue > Batch > Print, or right-click<br />
and choose Print from the context menu.<br />
A Print Issues window appears.<br />
Note Multiple issues appear in the same Print Issues window.<br />
3. Click Save.<br />
A standard Save dialog box appears.<br />
374 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Selecting Issues to View<br />
4. Browse to the location on your local drive where you want to<br />
save the issue.<br />
Note You can only save the issue(s) as an HTML file.<br />
5. Click OK.<br />
To save an issue in the Web interface:<br />
1. To save one issue, run a query and open the issue.<br />
To save multiple issues, run a query and select the checkboxes of<br />
the issues that you want to print.<br />
2. Click .<br />
A Print Issues window appears.<br />
Note Multiple issues appear in the same Print Issues window.<br />
3. Choose File > Save As.<br />
A standard Save dialog box appears.<br />
<strong>User</strong> <strong>Guide</strong> 375
Viewing and Editing Issues<br />
Editing Issues<br />
4. Browse to the location on your local drive where you want to<br />
save the issue.<br />
Note You can only save the issue(s) as an HTML file.<br />
5. Click OK.<br />
Besides making submissions, you can perform other common tasks<br />
as a user of Change <strong>Integrity</strong>, including editing issues. As described<br />
in the previous chapter, each user may list and select issues. In<br />
addition to reviewing the corresponding information, you can edit<br />
and update these issues, depending entirely upon the permissions<br />
assigned to you by your administrator.<br />
Someone on your project team might assign an issue to you, making<br />
you responsible to perform some action. Or you might be responsible<br />
for reviewing all new submissions and assigning them.<br />
To edit an issue in the graphic user interface:<br />
1. Open the issue you want to edit, as described in “Selecting Issues<br />
to View” on page 367.<br />
2. Choose Issue > Edit, or click .<br />
<strong>The</strong> fields become editable.<br />
3. Edit the issue as needed.<br />
376 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Batch Editing<br />
Editing Issues<br />
4. When you are finished making changes to the issue, choose Issue<br />
> Save, or click .<br />
To discard any changes made to the issue, choose Issue > Cancel,<br />
or click .<br />
<strong>The</strong> issue is updated.<br />
To edit an issue in the Web interface:<br />
1. Open the issue you want to edit, as described in “Selecting Issues<br />
to View” on page 367.<br />
2. Click .<br />
<strong>The</strong> fields become editable.<br />
3. Edit the issue as needed.<br />
4. When you are finished making changes to the issue, click<br />
. To discard any changes made to the issue,<br />
click .<br />
<strong>The</strong> issue is updated.<br />
Batch editing allows you to edit the standard and custom fields of<br />
multiple issues at once. For example, you could change the state of<br />
multiple problems from Submitted to Fixed.<br />
In the graphic user interface, you can add related issues and<br />
attachments to multiple issues.<br />
Note Your administrator defines which issue types and custom fields<br />
you can batch edit.<br />
<strong>User</strong> <strong>Guide</strong> 377
Viewing and Editing Issues<br />
To edit a field in multiple issues in the graphic user interface:<br />
Note <strong>The</strong> field you want to edit must exist for all selected issues.<br />
1. Run a query, as explained in “Running Queries” on page 359.<br />
<strong>The</strong> Query Results appears.<br />
2. Choose the issues you want to edit by selecting an issue, then<br />
while holding down Ctrl or Shift, select more issues.<br />
3. Choose Issue > Batch > Edit, or right-click and choose Edit from<br />
the context menu.<br />
4. Choose a standard field to edit. Your administrator defines<br />
custom fields you can edit. <strong>The</strong> available standard fields are:<br />
Summary<br />
Assigned <strong>User</strong><br />
Assigned Group<br />
State<br />
Project<br />
An Edit Issues dialog box appears.<br />
5. Click unspecified or press F2.<br />
A drop-down menu or text field appears.<br />
378 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Editing Issues<br />
6. Select a value from the drop-down menu, or enter text in the text<br />
field, up to 100 characters.<br />
7. If you do not know the information required for a specific field,<br />
click the field.<br />
A appears to the left of the field.<br />
8. Click or press F2.<br />
unspecified appears in the field.<br />
9. To edit the field, click the field and enter text, or choose a menu<br />
item.<br />
10. To accept the changes to the field, click OK. To discard any<br />
changes made, click Cancel.<br />
If any changes were made, the changed issues appear in the<br />
Query Results.<br />
To add attachments to multiple issues (graphic user interface<br />
only):<br />
Note Your administrator defines which issue types you can add<br />
attachments to.<br />
1. Run a query, as explained in “Running Queries” on page 359.<br />
<strong>The</strong> Query Results appears.<br />
2. Choose the issues you want to edit by selecting an issue, then<br />
while holding down Ctrl or Shift, select more issues.<br />
<strong>User</strong> <strong>Guide</strong> 379
Viewing and Editing Issues<br />
3. Choose Issue > Batch > Add Attachment, or right-click and choose<br />
Add Attachment from the context menu.<br />
<strong>The</strong> Add Attachment dialog box appears.<br />
4. Browse to a specific file on your local drive.<br />
5. Click Open.<br />
<strong>The</strong> selected file is added to the issues.<br />
To add related issues to multiple issues (graphic user interface<br />
only):<br />
1. Run a query, as explained in “Running Queries” on page 359.<br />
<strong>The</strong> Query Results appears.<br />
2. Choose the issues you want to edit by selecting an issue, then<br />
while holding down Ctrl or Shift, select more issues.<br />
3. Choose Issue > Batch > Relationship, or right-click and choose<br />
Add Relationship from the context menu.<br />
<strong>The</strong> Add Linked Issue dialog box appears.<br />
380 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
4. Enter the issue ID, for example, 34.<br />
Editing Issues<br />
5. To accept the changes, click OK. To discard any changes made,<br />
click Cancel.<br />
<strong>The</strong> linked issue is added to the issues.<br />
To edit a field in multiple issues in the Web interface:<br />
1. Run a query, as explained in “Running Queries” on page 359.<br />
<strong>The</strong> Query Results page appears.<br />
2. Select the checkboxes of the issues you want to edit.<br />
3. Click .<br />
Note You may have to scroll down to the end of the Query Results to<br />
see the button.<br />
<strong>The</strong> Select Field to Edit page appears.<br />
<strong>User</strong> <strong>Guide</strong> 381
Viewing and Editing Issues<br />
4. Choose a field to edit from the Field drop-down menu, for<br />
example, State.<br />
Note You can only edit one field per batch edit.<br />
5. Click Select new value.<br />
<strong>The</strong> Edit Field page appears.<br />
6. From the New Value drop-down menu or text field, choose or<br />
enter a new value.<br />
7. In the Comment field, enter a comment, for example, the reason<br />
for changing the field value.<br />
8. Click Save Batch Edit.<br />
<strong>The</strong> issues are updated in the Query Results page.<br />
382 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Editing Issues<br />
<strong>User</strong> <strong>Guide</strong> 383
Viewing and Editing Issues<br />
384 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Reports<br />
14<br />
Change <strong>Integrity</strong> allows you to create, edit, and generate various<br />
reports on the data in your projects. Reports can be printed,<br />
displayed on screen, or exported as an HTML file for viewing on the<br />
Web.<br />
This chapter explains how to:<br />
create, edit, and generate reports<br />
save and print reports<br />
<strong>User</strong> <strong>Guide</strong> 385
Reports<br />
Change <strong>Integrity</strong> Reports<br />
Creating Reports<br />
Using Change <strong>Integrity</strong>, you can create, edit, and generate your own<br />
reports. Reports can be based on new queries or saved queries.<br />
Change <strong>Integrity</strong> comes with three example reports: tabular reports,<br />
breakdown by project reports, and problem summary reports.<br />
To create a new report (graphic user interface only):<br />
1. Choose Reports > Customize, or click .<br />
<strong>The</strong> Reports dialog box appears.<br />
2. Click New.<br />
<strong>The</strong> New Report dialog box appears.<br />
386 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Change <strong>Integrity</strong> Reports<br />
3. In the Name field, enter a name for the report. This is the name of<br />
the report as it appears in the Reports menu. A report name is<br />
mandatory.<br />
4. To allow other Change <strong>Integrity</strong> users access to the report, select<br />
the Shared checkbox.<br />
Creating a Report Template<br />
Report templates allow you to specify the appearance of reports and<br />
what data they will include. Once you create a report template, you<br />
can generate the report to view in Change <strong>Integrity</strong>. You can also<br />
import the report to a Web site for others to view.<br />
Report templates are created using HTML (hyper-text markup<br />
language) and special tags for Change <strong>Integrity</strong> objects, such as fields<br />
and issue types. Because reports in Change <strong>Integrity</strong> are written in<br />
HTML, you can create simple text reports or elaborate reports with<br />
graphics, special fonts, background colors, and hyperlinks.<br />
Before you create a report template, carefully consider what data you<br />
want the report to show and how you want the data to appear. Use<br />
HTML table tags to organize the report data and use other tags, such<br />
as headings, bolding, and images, to add style.<br />
<strong>User</strong> <strong>Guide</strong> 387
Reports<br />
<strong>The</strong> following example shows how to create a report that displays<br />
submitted problems for individual projects. <strong>The</strong> data includes each<br />
project’s name, the problem’s ID, who the problem is assigned to, the<br />
problem’s priority, state, and when the problem was created.<br />
To specify a report template:<br />
1. Click the Template tab, if it is not selected already.<br />
<strong>The</strong> Template panel appears.<br />
2. After the tag, start a new line and insert tags to specify<br />
font size, heading size, color, and a title. For example:<br />
<br />
<br />
Issue Summary grouped by Project<br />
<br />
<br />
3. Start a new line and insert a table tag that specifies the border and<br />
width of the table. <strong>The</strong> table organizes the data into columns. For<br />
example:<br />
<br />
388 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Change <strong>Integrity</strong> Reports<br />
4. Insert report tags to specify what data you want the report to<br />
include. Use table row tags to organize field data. <strong>The</strong> following<br />
table shows the available report tags and what they do.<br />
Insert Report Tag... To...<br />
Display the value of a specific<br />
field, such as State.<br />
Possible values for<br />
FIELD_NAME: ID, Created Date,<br />
Created By, Modified Date,<br />
Modified By, Assigned <strong>User</strong>,<br />
Assigned Group, State, Project,<br />
Summary, and Type. <strong>The</strong> name<br />
of custom fields are defined by<br />
your administrator.<br />
Field names are case-sensitive<br />
because you can create two<br />
fields with the same name, but<br />
varying case.<br />
You can not use the < (less than)<br />
symbol in field tags, otherwise,<br />
the values for fields after the <<br />
symbol do not appear in the<br />
report.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Loop all occurrences of the value<br />
for the field specified in<br />
, for<br />
example, the report displays all<br />
problems that have a state of<br />
submitted.<br />
Group the data for a specific<br />
field, for example, the report<br />
displays submitted problems, the<br />
ID, and summary for each project<br />
in the Change <strong>Integrity</strong> database.<br />
<strong>User</strong> <strong>Guide</strong> 389
Reports<br />
For example:<br />
<br />
<br />
Project: <br />
<br />
<br />
.<br />
Title<br />
ID<br />
Assigned <strong>User</strong><br />
Priority<br />
State<br />
Created<br />
<br />
<br />
<br />
.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Tip Right-clicking the Template field allows you to choose basic editing<br />
commands from the context menu: Undo, Cut, Copy, Paste, Delete, and<br />
Select All.<br />
390 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
For information on using<br />
filters in queries, see “Creating<br />
a New Query” on page 350.<br />
Change <strong>Integrity</strong> Reports<br />
5. Start a new line and insert an ending table tag to close the table,<br />
for example:<br />
<br />
Restricting the Report With a Query<br />
When you create a report, you filter your data according to the issue<br />
type(s) you want to match, such as all problems in the database. You<br />
can further restrict the report by filtering specific fields, such as all<br />
problems that are of a certain priority and assigned to a particular<br />
user.<br />
To specify query filters for the report:<br />
1. Click the Query tab.<br />
<strong>The</strong> Query panel appears.<br />
2. From the Type drop-down menu, select an issue type to create a<br />
report for by selecting an issue type checkbox.<br />
3. To add filters to your query, choose filters from the Additional<br />
Constraints list.<br />
To create a report from a saved query:<br />
1. Click the Query tab.<br />
<strong>User</strong> <strong>Guide</strong> 391
Reports<br />
2. Click Copy Saved Query.<br />
<strong>The</strong> Copy Saved Query dialog box appears.<br />
3. Choose a saved query from the drop-down menu.<br />
4. To accept the operation, click OK. To cancel the operation, click<br />
Cancel.<br />
To add a description of the report:<br />
1. Click the Description tab.<br />
<strong>The</strong> Description panel appears.<br />
2. In the Description field, enter a description of the report.<br />
To save the custom report:<br />
1. To save the custom report, click OK. To cancel the operation, click<br />
Cancel.<br />
392 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Editing Reports<br />
<strong>The</strong> report is saved and appears in the Reports list.<br />
2. To close the Reports dialog box, click OK.<br />
To edit a report (graphic user interface only):<br />
Change <strong>Integrity</strong> Reports<br />
Note Shared reports can only be edited by the owner. <strong>The</strong> Edit button is<br />
greyed out.<br />
1. Choose Reports > Customize, or click .<br />
<strong>The</strong> Reports dialog box appears.<br />
<strong>User</strong> <strong>Guide</strong> 393
Reports<br />
2. Choose a report from the Reports list.<br />
3. Click Edit.<br />
<strong>The</strong> Edit Report dialog box appears.<br />
4. Edit the report options as desired.<br />
394 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Running Reports<br />
Change <strong>Integrity</strong> Reports<br />
5. To save your changes, click OK. To discard any changes made,<br />
click Cancel.<br />
6. To close the Reports dialog box, click OK.<br />
To run a report in the graphic user interface:<br />
1. Click , or choose Reports > Customize.<br />
<strong>The</strong> Reports dialog box appears.<br />
2. Select a report from the Reports list.<br />
3. Click Run.<br />
Tip You can also run a report by choosing Reports, then selecting a<br />
saved report from the Reports menu.<br />
<strong>User</strong> <strong>Guide</strong> 395
Reports<br />
<strong>The</strong> report appears in a Report window.<br />
To run a report in the Web interface:<br />
1. Click .<br />
<strong>The</strong> Reports List page appears.<br />
2. Click a report from the Reports list.<br />
<strong>The</strong> report appears in a reports page.<br />
396 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Deleting Reports<br />
To delete a report (graphic user interface only):<br />
Change <strong>Integrity</strong> Reports<br />
Note Shared reports can only be deleted by the owner. <strong>The</strong> Delete<br />
button is greyed out.<br />
1. Choose Reports > Customize, or click .<br />
<strong>User</strong> <strong>Guide</strong> 397
Reports<br />
Copying Reports<br />
<strong>The</strong> Reports dialog box appears.<br />
2. Select a report from the Reports list and click Delete.<br />
Change <strong>Integrity</strong> asks you to confirm that you want to delete the<br />
selected custom report.<br />
3. To confirm the operation, click Yes. To cancel the operation, click<br />
No.<br />
To copy a custom report (graphic user interface only):<br />
1. Choose Reports > Customize, or click .<br />
<strong>The</strong> Reports dialog box appears.<br />
2. Select the report you want to copy from the Reports list.<br />
398 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
3. Click Copy.<br />
<strong>The</strong> Copy Report dialog box appears.<br />
4. Rename the report and make changes as required.<br />
Change <strong>Integrity</strong> Reports<br />
5. To save your changes, click OK. To discard any changes made,<br />
click Cancel.<br />
<strong>User</strong> <strong>Guide</strong> 399
Reports<br />
Saving and Printing Reports<br />
Saving Reports<br />
When you select the type of report you want to generate, the report<br />
appears in a Report window that allows you to save and print the<br />
report.<br />
To save a report in the graphic user interface:<br />
1. Run the report, as described in “Running Reports” on page 395.<br />
<strong>The</strong> reports appears in a Report window.<br />
2. Click Save.<br />
3. Browse to the location on your local drive where you want to<br />
save the report.<br />
Note You can only save the report as an HTML file.<br />
4. Click OK.<br />
400 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Printing Reports<br />
To save a report in the Web interface:<br />
Saving and Printing Reports<br />
1. Run the report, as described in “Running Reports” on page 395.<br />
<strong>The</strong> report appears in the Reports page.<br />
2. Click File > Save As.<br />
A standard browser Save dialog box appears.<br />
3. Browse to the location on your local drive where you want to<br />
save the report.<br />
Note You can only save the report as an HTML file.<br />
4. Click Save.<br />
To print a report in the graphic user interface:<br />
1. Run the report, as described in “Running Reports” on page 395.<br />
<strong>User</strong> <strong>Guide</strong> 401
Reports<br />
<strong>The</strong> reports appears in a Report window.<br />
2. Click Print.<br />
A standard Print dialog box appears.<br />
3. Select the print options you want.<br />
4. Click OK.<br />
To print a report in the Web interface:<br />
1. Run the report, as described in “Running Reports” on page 395.<br />
<strong>The</strong> report appears in the Reports page.<br />
402 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
2. Choose File > Print.<br />
A standard browser Print dialog box appears.<br />
3. Select the print options you want.<br />
4. Click OK.<br />
Saving and Printing Reports<br />
<strong>User</strong> <strong>Guide</strong> 403
Reports<br />
404 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Charts<br />
15<br />
Change <strong>Integrity</strong> allows you to create, edit, and generate<br />
distribution and trend charts on the data in your projects. Charts can<br />
be printed, displayed on screen, or exported as an image file for use<br />
in other applications.<br />
This chapter explains how to:<br />
create, edit, and generate distribution charts<br />
create, edit, and generate trend charts<br />
save and print charts<br />
<strong>User</strong> <strong>Guide</strong> 405
Charts<br />
Change <strong>Integrity</strong> Charts<br />
Charts are graphs that present trends over time, or distributions of the<br />
data in your project. Charts are based on the standard and custom<br />
fields of issue types. Distribution charts may be displayed as pie<br />
graphs or bar graphs. Trend charts may be displayed as line graphs.<br />
<strong>The</strong> graphs can be customized to include titles, legends, point<br />
markers, pie values or percentages, three-dimensional bar graphs,<br />
and three-dimensional pie graphs. <strong>The</strong> color, perspective, shading,<br />
backdrop, three-dimensional effects, fonts, and all other plot<br />
attributes of the graph can also be customized to produce photoquality<br />
presentation graphs.<br />
You can define and store any number of custom charts using Change<br />
<strong>Integrity</strong>. Charts can report on all data in your project, or you can<br />
specify selection criteria to restrict the data to analyze. <strong>The</strong> selection<br />
criteria is a logical expression of specific values, or ranges of values,<br />
of the standard and custom fields of issue types. Charts are unique<br />
for each project because each project may have different custom<br />
fields.<br />
<strong>The</strong> custom charts you define are stored in the Change <strong>Integrity</strong><br />
database and may be run by any user if the chart is shared. Also, any<br />
user may view and edit the chart for any project he or she has<br />
visibility into.<br />
A distribution chart shows the distribution of all values of a specified<br />
standard or custom choice field for issue types. Selection criteria can<br />
be attached to the report to limit the records chosen for analysis. For<br />
example, you can generate a pie graph of the distribution of<br />
submitted problems by specific users.<br />
A trend chart is based on the submit date and shows the trend of issue<br />
types that have a specific field value, over a specified time period.<br />
For example, you may want to see the number of problems submitted<br />
over the last 10 months that have a state of fixed, plotted on a<br />
monthly basis.<br />
406 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Creating Distribution Charts<br />
Change <strong>Integrity</strong> Charts<br />
To create a distribution chart (graphic user interface only):<br />
1. Choose Charts > Customize, or click .<br />
<strong>The</strong> Charts dialog box appears.<br />
2. Click New.<br />
<strong>The</strong> Chart Type dialog box appears.<br />
3. Select Distribution from the drop-down menu.<br />
4. Click OK.<br />
<strong>User</strong> <strong>Guide</strong> 407
Charts<br />
<strong>The</strong> New Distribution Chart dialog box appears.<br />
5. In the Name field, enter a name for the distribution chart. This is<br />
the name of the chart as it appears in the Charts menu. A chart<br />
name is mandatory.<br />
6. To allow other Change <strong>Integrity</strong> users access to the chart, select<br />
the Shared checkbox.<br />
7. In the Title field, enter a title for the distribution chart. This is the<br />
title as it appears on the chart. A title is optional.<br />
8. To choose a font for the title, click Font, then select a font and size<br />
from the Select Font dialog box.<br />
9. In the Description field, enter a description of the distribution<br />
chart. This is optional.<br />
10. To show the description on the chart, select the Show description<br />
checkbox.<br />
11. To choose a font for the description, click Font, then select a font<br />
and size from the Select Font dialog box.<br />
12. In the Footnote field, enter a footnote for the trend chart. A<br />
footnote is optional.<br />
408 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Change <strong>Integrity</strong> Charts<br />
13. To choose a font for the footnote, click Font, then select a font and<br />
size from the Select Font dialog box.<br />
To specify the fields:<br />
1. Click the Fields tab.<br />
<strong>The</strong> Fields panel appears.<br />
2. From the Field drop-down menu, choose a field to base the<br />
distribution chart on, such as State.<br />
3. From the Grouping drop-down menu, choose a corresponding<br />
value, such as Project, or none.<br />
Note You can not create distribution charts using non-absolute values,<br />
such as text-based and interger-based fields. For example, Summary and<br />
Build are not selectable from the Field and Grouping drop-down menus.<br />
<strong>User</strong> <strong>Guide</strong> 409
Charts<br />
For information on using<br />
filters in queries, see “Creating<br />
a New Query” on page 350.<br />
Restricting the Chart With a Query<br />
When you create a distribution chart, you filter your data according<br />
to the issue type(s) you want to match, such as all problems in the<br />
database. You can further restrict the chart by filtering specific fields,<br />
such as all problems that are of a certain priority and assigned to a<br />
particular user.<br />
To specify query filters for the chart:<br />
1. Click the Query tab.<br />
<strong>The</strong> Query panel appears.<br />
2. From the Type drop-down menu, select an issue type to create a<br />
chart for by selecting an issue type checkbox.<br />
3. To add filters to your query, choose filters from the Additional<br />
Constraints list.<br />
To create a distribution chart from a saved query:<br />
1. Click Copy Saved Query.<br />
<strong>The</strong> Copy Saved Query dialog box appears.<br />
410 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
2. Choose a saved query from the drop-down menu.<br />
Change <strong>Integrity</strong> Charts<br />
3. To accept the operation, click OK. To cancel the operation, click<br />
Cancel.<br />
To specify a graph:<br />
1. Click the Graph tab.<br />
<strong>The</strong> Graph panel appears.<br />
2. Under Graph Type, choose a graph type by clicking a graph type<br />
button:<br />
vertical bar graph<br />
vertical stacked bar graph<br />
horizontal bar graph<br />
horizontal stacked bar graph<br />
pie graph<br />
<strong>User</strong> <strong>Guide</strong> 411
Charts<br />
3. To create a 3D chart, select the 3D Chart checkbox.<br />
4. To specify the outline color of the graph bars, click Edit in the<br />
Outline Color field, then select a color from the Select Color dialog<br />
box.<br />
5. To specify the background color of the chart, click Edit in the<br />
Background Color field, then select a color from the Select Color<br />
dialog box.<br />
6. Under Data Labels, choose an option:<br />
None does not show any values for the data labels.<br />
Show Values shows values for the data labels.<br />
To specify the chart’s data colors:<br />
1. Click the Colors tab.<br />
<strong>The</strong> Colors panel appears.<br />
2. Choose a data color option:<br />
To allow Change <strong>Integrity</strong> to select data colors automatically,<br />
select the Automatic radio button.<br />
To customize the data colors, select the Custom radio button,<br />
then proceed to step 3.<br />
412 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
3. Click Add.<br />
<strong>The</strong> Select Color dialog box appears.<br />
4. Choose a color from the palette.<br />
5. Click OK.<br />
Change <strong>Integrity</strong> Charts<br />
<strong>User</strong> <strong>Guide</strong> 413
Charts<br />
<strong>The</strong> data series appears in the Data Colors list.<br />
6. To edit the color of an existing data series, select it from the list,<br />
and click Edit, then select a color from the Select Color dialog box.<br />
7. To remove an existing data series, select it from the list, and click<br />
Remove.<br />
8. Repeat for each data series in the chart.<br />
To specify the chart’s axes:<br />
Note If you chose a pie graph, the Axes tab is grayed out.<br />
1. Click the Axes tab.<br />
<strong>The</strong> Axes panel appears.<br />
414 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Change <strong>Integrity</strong> Charts<br />
2. From the Label Rotation drop-down menu for the Horizontal Axis,<br />
choose a location for the horizontal axis labels. <strong>The</strong> available<br />
locations are:<br />
Horizontal<br />
Vertical (90 degrees)<br />
Vertical (270 degrees)<br />
3. From the Orientation drop-down menu for the Horizontal Axis,<br />
choose a position for the horizontal axis. <strong>The</strong> available positions<br />
are:<br />
Right<br />
Left<br />
4. To show gridlines on the horizontal axis, select the Show Gridlines<br />
checkbox.<br />
5. To show the title for the horizontal axis, select the Horizontal Axis’<br />
Show Title checkbox.<br />
6. From the Label Rotation drop-down menu for the Vertical Axis,<br />
choose a location for the vertical axis labels. <strong>The</strong> available<br />
locations are:<br />
Horizontal<br />
Vertical (90 degrees)<br />
<strong>User</strong> <strong>Guide</strong> 415
Charts<br />
Vertical (270 degrees)<br />
7. From the Orientation drop-down menu for the Vertical Axis,<br />
choose a position for the vertical axis. <strong>The</strong> available positions are:<br />
Up<br />
Down<br />
8. To show gridlines on the vertical axis, select the Show Gridlines<br />
checkbox.<br />
9. To show the title for the vertical axis, select the Vertical Axis’ Show<br />
Title checkbox.<br />
To specify the legend:<br />
1. Click the Legend tab.<br />
<strong>The</strong> Legend panel appears.<br />
2. To show the legend, select the Show Legend checkbox.<br />
3. In the Title field, enter a title for the chart legend. A title is<br />
optional.<br />
4. In the Number of Columns field, enter the number of columns for<br />
the legend, or click or .<br />
416 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Creating Trend Charts<br />
Change <strong>Integrity</strong> Charts<br />
5. In the Position field, choose a position for the legend on the chart<br />
from the drop-down menu. <strong>The</strong> available positions:<br />
Right<br />
Left<br />
Top<br />
Bottom<br />
6. To choose a background color for the legend, click Edit, then<br />
select a color from the Select Color dialog box.<br />
To save the distribution chart:<br />
1. To save the chart, click OK. To cancel the operation, click Cancel.<br />
<strong>The</strong> distribution chart appears in the Charts list, indicated by a<br />
distribution chart icon.<br />
2. To close the Charts dialog box, click OK.<br />
To define a trend chart (graphic user interface only):<br />
1. Choose Charts > Customize, or click .<br />
<strong>User</strong> <strong>Guide</strong> 417
Charts<br />
<strong>The</strong> Charts dialog box appears.<br />
2. Click New.<br />
<strong>The</strong> Chart Type dialog box appears.<br />
3. Select Trend from the drop-down menu.<br />
4. Click OK.<br />
<strong>The</strong> New Trend Chart dialog box appears.<br />
418 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Change <strong>Integrity</strong> Charts<br />
5. In the Name field, enter a name for the trend chart. This is the<br />
name of the chart as it will appear in the Charts menu. A chart<br />
name is mandatory.<br />
6. To share the chart with other Change <strong>Integrity</strong> users, select the<br />
Shared checkbox.<br />
7. In the Title field, enter a title for the trend chart. This is the title as<br />
it appears on the chart. A title is optional.<br />
8. To choose a font for the title, click Font, then select a font and size<br />
from the Select Font dialog box.<br />
9. In the Description field, enter a description of the trend chart. A<br />
description is optional.<br />
10. To show the description on the chart, click the Show Description<br />
checkbox.<br />
11. To choose a font for the description, click Font, then select a font<br />
and size from the Select Font dialog box.<br />
12. In the Footnote field, enter a footnote for the trend chart. A<br />
footnote is optional.<br />
13. To choose a font for the footnote, click Font, then select a font and<br />
size from the Select Font dialog box.<br />
<strong>User</strong> <strong>Guide</strong> 419
Charts<br />
Restricting the Chart by Fields<br />
When you create a trend chart, you filter your data by specific time<br />
intervals, dates, and fields. For example, you might want your trend<br />
chart to show the number of submitted problems each day from<br />
March 1, 2000 to April 15, 2000.<br />
To filter trend chart data:<br />
1. Click the Fields tab.<br />
<strong>The</strong> Fields panel appears.<br />
2. From the Type drop-down menu, choose an interval for each<br />
point on the graph, such as Day. <strong>The</strong> available intervals are:<br />
Hour<br />
Day<br />
Week<br />
Month<br />
Quarter<br />
Year<br />
3. From the Start drop-down menu, choose a starting date from the<br />
calendar, for example, Feb. 15, 2000. <strong>The</strong> default is the current<br />
system date.<br />
420 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Change <strong>Integrity</strong> Charts<br />
4. From the End drop-down menu, choose an ending date from the<br />
calendar, for example, March 21, 2000. <strong>The</strong> default is the current<br />
system date.<br />
5. From the Field drop-down menu, choose a field to monitor, such<br />
as Type.<br />
Note You can not create trend charts using non-absolute values, such as<br />
text-based and interger-based fields. For example, Summary and Build<br />
are not selectable from the Field drop-down menu.<br />
To specify a graph:<br />
1. Click the Graph tab.<br />
<strong>The</strong> Graph panel appears.<br />
2. To specify the background color of the chart, click Edit in the<br />
Background Color field, then select a color from the Select Color<br />
dialog box.<br />
3. Under Data Labels, choose an option:<br />
None does not show any values for the graph.<br />
Show values shows values for the graph.<br />
<strong>User</strong> <strong>Guide</strong> 421
Charts<br />
To specify data colors in the chart:<br />
1. Click the Colors tab.<br />
<strong>The</strong> Colors panel appears.<br />
2. Choose a data color option:<br />
To allow Change <strong>Integrity</strong> to select data colors automatically,<br />
select the Automatic radio button.<br />
To customize the data colors, select the Custom radio button,<br />
then proceed to step 3.<br />
3. Click Add.<br />
<strong>The</strong> Select Color dialog box appears.<br />
422 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
4. Choose a color from the palette.<br />
5. Click OK.<br />
<strong>The</strong> data series appears in the Data Colors list.<br />
Change <strong>Integrity</strong> Charts<br />
6. To edit the color of an existing data series, select it from the list,<br />
and click Edit, then select a color from the Select Color dialog box.<br />
<strong>User</strong> <strong>Guide</strong> 423
Charts<br />
7. To remove an existing data series, select it from the list, and click<br />
Remove.<br />
8. Repeat for each data series in the chart.<br />
To specify the chart’s axes:<br />
1. Click the Axes tab.<br />
<strong>The</strong> Axes panel appears.<br />
2. From the Label Rotation drop-down menu for the Horizontal Axis,<br />
choose a location for the horizontal axis labels. <strong>The</strong> available<br />
locations are:<br />
Horizontal<br />
Vertical (90 degrees)<br />
Vertical (270 degrees)<br />
3. From the Orientation drop-down menu for the Horizontal Axis,<br />
choose a position for the horizontal axis. <strong>The</strong> available positions<br />
are:<br />
Right<br />
Left<br />
4. To show gridlines on the horizontal axis, select the Show Gridlines<br />
checkbox.<br />
424 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Change <strong>Integrity</strong> Charts<br />
5. To show the title for the horizontal axis, select the Horizontal Axis’<br />
Show Title checkbox.<br />
6. From the Label Rotation drop-down menu for the Vertical Axis,<br />
choose a location for the vertical axis labels. <strong>The</strong> available<br />
locations are:<br />
Horizontal<br />
Vertical (90 degrees)<br />
Vertical (270 degrees)<br />
7. From the Orientation drop-down menu for the Vertical Axis,<br />
choose a position for the vertical axis. <strong>The</strong> available positions are:<br />
Up<br />
Down<br />
8. To show gridlines on the vertical axis, select the Show Gridlines<br />
checkbox.<br />
9. To show the title for the vertical axis, select the Vertical Axis’ Show<br />
Title checkbox.<br />
To specify the legend:<br />
1. Click the Legend tab.<br />
<strong>The</strong> Legend panel appears.<br />
2. To show the legend, select the Show Legend checkbox.<br />
<strong>User</strong> <strong>Guide</strong> 425
Charts<br />
3. In the Title field, enter a title for the chart legend. A title is<br />
optional.<br />
4. In the Number of Columns field, enter the number of columns for<br />
the legend, or click or .<br />
5. In the Position field, choose a position for the legend on the chart<br />
from the drop-down menu. <strong>The</strong> available positions are:<br />
Right<br />
Left<br />
Top<br />
Bottom<br />
6. To choose a background color for the legend, click Edit, then<br />
select a color from the Select Color dialog box.<br />
To save the trend chart:<br />
1. To save the chart, click OK. To cancel the operation, click Cancel.<br />
<strong>The</strong> trend chart appears in the Charts list, indicated by a trend<br />
chart icon.<br />
2. To close the Charts dialog box, click OK.<br />
426 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Editing Existing Charts<br />
To edit an existing chart (graphic user interface only):<br />
Change <strong>Integrity</strong> Charts<br />
Note Shared charts can only be deleted by the owner. <strong>The</strong> Edit button is<br />
greyed out.<br />
1. Choose Charts > Customize, or click .<br />
<strong>The</strong> Charts dialog box appears.<br />
2. Select a chart to edit from the Charts list.<br />
3. Click Edit.<br />
<strong>User</strong> <strong>Guide</strong> 427
Charts<br />
Running Charts<br />
<strong>The</strong> Edit Chart dialog box appears.<br />
4. Edit the chart options as desired.<br />
5. To save the chart, click OK. To discard any changes, click Cancel.<br />
6. To close the Charts dialog box, click OK.<br />
To run a chart in the graphic user interface:<br />
1. Choose Charts, or click .<br />
Note Trend charts that include a long time span, for example, a year,<br />
and a small step, for example, an hour, may take a long time to generate.<br />
<strong>The</strong> Charts dialog box appears.<br />
428 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
2. Select a chart from the Charts list.<br />
3. Click Run.<br />
<strong>The</strong> chart appears in a Chart View window.<br />
Change <strong>Integrity</strong> Charts<br />
<strong>User</strong> <strong>Guide</strong> 429
Charts<br />
Tip You can change the view of the chart data by clicking the graph and<br />
dragging it in any direction. Hovering your cursor over a graph unit<br />
displays a value tooltip.<br />
To run a chart in the Web interface:<br />
1. Click .<br />
<strong>The</strong> Charts List page appears.<br />
2. Click a chart from the Charts list.<br />
<strong>The</strong> chart appears in a charts page.<br />
Note <strong>The</strong> Change <strong>Integrity</strong> Web interface does not support chart view<br />
options.<br />
430 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Deleting Charts<br />
To delete a chart (graphic user interface only):<br />
Change <strong>Integrity</strong> Charts<br />
Note Shared charts can only be deleted by the owner. <strong>The</strong> Delete button<br />
is greyed out.<br />
1. Choose Charts > Customize, or click .<br />
<strong>The</strong> Charts dialog box appears.<br />
2. Select a chart from the Charts list.<br />
3. Click Delete.<br />
Change <strong>Integrity</strong> asks you to confirm that you want to delete the<br />
selected chart.<br />
4. To confirm the operation, click Yes. To cancel the operation, click<br />
No.<br />
<strong>User</strong> <strong>Guide</strong> 431
Charts<br />
Copying Charts<br />
To copy a chart (graphic user interface only):<br />
1. Select the chart you want to copy from the Charts list.<br />
2. Click Copy.<br />
<strong>The</strong> Copy dialog box appears.<br />
432 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Saving and Printing Charts<br />
3. Rename the chart and make changes as required.<br />
Saving and Printing Charts<br />
When you select the type of chart you want to generate, the chart<br />
appears in a Chart window so you can save and print the chart.<br />
<strong>User</strong> <strong>Guide</strong> 433
Charts<br />
Saving Charts<br />
Printing Charts<br />
To save a chart (graphic user interface only):<br />
1. Click Save.<br />
A Save dialog box appears.<br />
2. Browse to the location on your local drive where you want to<br />
save the chart.<br />
Note You can only save the chart as a JPEG image.<br />
3. Click OK.<br />
To print a chart in the graphic user interface:<br />
1. Click Print.<br />
434 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
A standard Print dialog box appears.<br />
2. Select the print options you want.<br />
3. Click OK.<br />
To print a chart in the Web interface:<br />
1. Choose File > Print.<br />
A standard browser Print dialog box appears.<br />
2. Select the print options you want.<br />
3. Click OK<br />
Saving and Printing Charts<br />
<strong>User</strong> <strong>Guide</strong> 435
Charts<br />
436 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Integrated Version<br />
Control<br />
16<br />
As part of the integration with <strong>Source</strong> <strong>Integrity</strong>, you can associate<br />
project members with an issue, effectively adding the project<br />
members as part of a change package.<br />
A change package allows you to specify groups of files that are<br />
affected by an issue type, for example, a solution’s change package<br />
might contain files that need to be changed in order to satisfy a<br />
problem.<br />
Administrators define what issue types can use change packages and<br />
configure <strong>Source</strong> <strong>Integrity</strong> to allow files to be checked in or checked<br />
out only if they are associated with an issue.<br />
This chapter provides details on:<br />
configuring Change <strong>Integrity</strong> Connect<br />
associating active issue types with project members<br />
viewing change packages in Change <strong>Integrity</strong><br />
<strong>User</strong> <strong>Guide</strong> 437
Integrated Version Control<br />
Configuring Change <strong>Integrity</strong> Connect<br />
To configure Change <strong>Integrity</strong> Connect (Windows interface<br />
only):<br />
1. With the <strong>Source</strong> <strong>Integrity</strong> Windows interface open, choose<br />
Configuration > Change <strong>Integrity</strong> Connect.<br />
<strong>The</strong> Change <strong>Integrity</strong> Connect - Configuration dialog box appears.<br />
Note If the configuration has already been defined by your<br />
administrator in SAM, then the dialog is filled with the pre-defined<br />
values.<br />
2. To activate Change <strong>Integrity</strong> Connect, select the Enable Change<br />
<strong>Integrity</strong> Connect checkbox.<br />
All fields and buttons become active.<br />
438 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Configuring Change <strong>Integrity</strong> Connect<br />
3. In the <strong>Integrity</strong> Server field, enter the name of the server you want<br />
to connect to, for example, localhost, or the numerical IP<br />
address, for example, 1.234.53.<br />
Note Do not use back slashes (\) in the server name, for example,<br />
\\localhost.<br />
4. In the CI <strong>User</strong> Name field, enter your Change <strong>Integrity</strong> user name.<br />
Your <strong>Source</strong> <strong>Integrity</strong> <strong>User</strong> Name appears by default. <strong>The</strong> SAM<br />
policy option AllowCIMultipleRoles must be set in order to change<br />
this field.<br />
5. As an option, you can choose to track locked and unlocked<br />
project members in <strong>Source</strong> <strong>Integrity</strong> by selecting the Track Locks<br />
checkbox. This field may be set and enforced by your<br />
administrator in SAM with the TrackLocks policy option.<br />
6. As an option, you can choose to add tracking labels to project<br />
members in <strong>Source</strong> <strong>Integrity</strong> by checking the Add Tracking Labels<br />
check-box. This field may be set and enforced by your<br />
administrator in SAM with the AddTrackingLabel policy option.<br />
7. To view active issues, click Refresh. <strong>The</strong> Current Set of Active CI<br />
Issues section displays information about active issues.<br />
Note You can only view active issues assigned to you.<br />
Default Issue displays the selected default issue. To make an<br />
issue your default issue, select an issue from the active issues<br />
list, then click Make Default.<br />
Selected Issue displays the selected issue in the list of active<br />
issues.<br />
Summary displays a brief summary about the issue.<br />
<strong>User</strong> <strong>Guide</strong> 439
Integrated Version Control<br />
Active issues are displayed in the active issue list below the<br />
Default Issue field.<br />
Note Your administrator defines which issue types can include change<br />
packages.<br />
8. To set no default issue, select None from the active issues list. This<br />
option does not appear if Enforce Mandatory Tracking is set in the<br />
Change <strong>Integrity</strong> Connect policy statement in SAM.<br />
9. When you have finished configuring the Change <strong>Integrity</strong><br />
Connect options, choose an option by clicking a button:<br />
OK saves the current configuration options.<br />
Cancel closes the configuration dialog box without saving<br />
any changes.<br />
Launch CIWI connects to the Change <strong>Integrity</strong> Web interface<br />
and displays complete information about the issue.<br />
<strong>The</strong> Change <strong>Integrity</strong> Web interface opens, displaying the<br />
issue.<br />
440 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Associating Active Issues With Project<br />
Members<br />
Associating Active Issues With Project Members<br />
Once you have configured Change <strong>Integrity</strong> Connect, you can<br />
associate active issues with project members, effectively adding the<br />
project members as part of a change package.<br />
To associate an active issue with a project member (Windows<br />
interface only):<br />
1. In the <strong>Source</strong> <strong>Integrity</strong> Windows interface, check out one or more<br />
files in the Sandbox or Project window. If you are tracking locks,<br />
then these files are associated with the default issue.<br />
2. Select one or more files in the Sandbox or Project window.<br />
3. Choose Member > Check In.<br />
<strong>User</strong> <strong>Guide</strong> 441
Integrated Version Control<br />
<strong>The</strong> Check In dialog box appears.<br />
Viewing Change Packages<br />
4. Choose an issue from the Active CI Issue drop-down list.<br />
5. Add additional metadata if needed, such as a revision<br />
description.<br />
6. Click OK.<br />
If you select more than one file to check in, you can either<br />
associate them all with the same issue, by selecting the All Files<br />
checkbox, or associate each file with a different issue.<br />
Once you associate project members with an issue, Change <strong>Integrity</strong><br />
adds the members as part of the issue’s change package. You can<br />
view change packages in the Change <strong>Integrity</strong> graphic user interface<br />
and Web interface.<br />
To view a change package in the graphic user interface:<br />
1. Open the issue, as described in “Selecting Issues to View” on<br />
page 367.<br />
<strong>The</strong> issue opens in the Issue Details.<br />
442 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
2. Click the Change Package tab.<br />
<strong>The</strong> Change Package panel appears.<br />
Viewing Change Packages<br />
<strong>The</strong> Change Package panel displays the project the member belongs<br />
to, member name, revision number, author name, lock status,<br />
revision date, and revision description.<br />
To view a change package in the Web interface:<br />
1. Open the issue, as described in “Selecting Issues to View” on<br />
page 367.<br />
<strong>The</strong> issue opens in the Issue Details page.<br />
<strong>User</strong> <strong>Guide</strong> 443
Integrated Version Control<br />
2. Click the Change Package tab.<br />
<strong>The</strong> Change Package panel appears.<br />
<strong>The</strong> Change Package panel displays the project the member belongs<br />
to, member name, revision number, author name, lock status,<br />
revision date, and revision description.<br />
444 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
A P P E N D I X<br />
Glossary<br />
<strong>Source</strong> <strong>Integrity</strong> Terms<br />
archived (project<br />
member)<br />
A<br />
archive A file containing the most recent version of a document and a record<br />
of all the changes made to it since it was put under revision control.<br />
From the information contained in the record of changes,<br />
<strong>Source</strong> <strong>Integrity</strong> can reconstruct any previous version of the file.<br />
<strong>The</strong> archive is sometimes referred to as the RCS file, for historical<br />
reasons.<br />
<strong>The</strong> data of an archived project member is held in a revision of a<br />
<strong>Source</strong> <strong>Integrity</strong> archive. <strong>The</strong> actual project member is, therefore, the<br />
revision in the archive, not the archive itself.<br />
archive description A set of general comments that describes the purpose of an archive.<br />
You are asked to enter an archive description when an archive is<br />
created. <strong>The</strong> text of the archive description can be viewed with the<br />
Archive Information command.<br />
archive directory <strong>The</strong> default location where <strong>Source</strong> <strong>Integrity</strong> looks for archives when<br />
checking in working files. <strong>The</strong> archive directory is specified with the<br />
Configuration > Personal command (Directories panel).<br />
archive file See archive.<br />
archive information In addition to an archive’s contents, <strong>Source</strong> <strong>Integrity</strong> also maintains<br />
detailed information about each archive, including:<br />
a list of revision labels used in the archive<br />
a list of users who have locks on revisions in the archive<br />
the starting point of the default branch revision<br />
the type of data stored in the archive (that is, text or binary)<br />
whether the archive is compressed<br />
<strong>User</strong> <strong>Guide</strong> 445
Appendix A: Glossary<br />
whether the archive is encrypted<br />
whether a strict-locking policy is applied to the archive<br />
a description of the archive (supplied by the user when the<br />
archive was created)<br />
archive log <strong>The</strong> file where archive transactions are recorded when logging is<br />
turned on. <strong>The</strong> name and location of the log file is specified with the<br />
Configuration > Personal command (Logging panel). If it exists, the log<br />
file contains a record of each check-in and check-out (locked)<br />
operation performed on the archive.<br />
archive path <strong>The</strong> default location where <strong>Source</strong> <strong>Integrity</strong> looks for archives when<br />
checking in files, if no appropriate WorkToArch statement is defined.<br />
<strong>The</strong> archive path is specified with the Configuration > Personal<br />
command (Directories panel).<br />
archive transaction Any check-in or check-out (locked) action that is performed on an<br />
archive. If logging is turned on, archive transactions are recorded in<br />
the log file.<br />
Archive window A window that allows you to view the contents of an archive, and<br />
information about the archive and the revisions it contains.<br />
author Usually, this is the name of the user who checked in a revision,<br />
although any name can be used. On systems that use a login<br />
procedure, this is typically the user’s login name. If the system does<br />
not use login names, <strong>Source</strong> <strong>Integrity</strong> uses the name specified with<br />
the Configuration > Personal command (Preferences panel).<br />
author name <strong>The</strong> name <strong>Source</strong> <strong>Integrity</strong> knows you by. Your author name is<br />
defined with the Configuration > Personal command (Preferences<br />
panel). It is used to prime the Author field during check-in.<br />
binary file A file containing unprintable characters, or lines too long to be<br />
handled by text editors.<br />
branch A secondary revision path that diverges from the main line of<br />
development (or trunk) in an archive. A branch is created by<br />
checking in a file to a revision other than the head revision. This most<br />
recent revision of a branch is called the tip revision.<br />
Changes made on a branch can be merged back into the trunk with<br />
the Visual Difference utility’s Merge feature.<br />
446 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>Source</strong> <strong>Integrity</strong> Terms<br />
check in An operation that adds a new revision of a file to an archive. <strong>The</strong> new<br />
revision becomes the archive’s head revision unless you specifically<br />
check in the file to a revision other than the head revision. When a file<br />
is checked in to a revision other than the head revision or a branch tip<br />
revision, a new branch is created.<br />
check out An operation that extracts the contents of a revision in an archive and<br />
copies it to a working file. You can check out any revision by<br />
specifying either its revision number or label.<br />
checkpoint An operation that creates an archive for your project file and checks it<br />
in. When you checkpoint a project, you save all the information<br />
needed to recreate the project completely at any time in the future.<br />
<strong>The</strong> saved information includes the directory tree and the list of<br />
members with their revision numbers.<br />
compare window A window in which two text-based files or revisions are displayed for<br />
comparison, along with a summary of the differences between them.<br />
configuration file A file containing detailed descriptions of where archive and working<br />
files are stored, locking policies, and other tailoring options.<br />
Configuration files are referenced by <strong>Source</strong> <strong>Integrity</strong> each time the<br />
program is started and are updated with the Configuration command.<br />
data types <strong>The</strong> data preserved in <strong>Source</strong> <strong>Integrity</strong> archives can be one of three<br />
types:<br />
Binary<br />
A file containing unprintable characters, or lines too long to be<br />
handled by text editors.<br />
Text<br />
This is the file format expected by DOS and Windows text file<br />
editors. When a file of type “Text” is checked out,<br />
<strong>Source</strong> <strong>Integrity</strong> adds a carriage return at the end of each line.<br />
Unspecified<br />
This is the file format expected by most UNIX and other non-<br />
DOS text file editors. When a file of type “Unspecified” is<br />
checked out, <strong>Source</strong> <strong>Integrity</strong> does not add a carriage return<br />
character to the end of each line.<br />
date <strong>The</strong> date and time when a revision was checked in.<br />
<strong>User</strong> <strong>Guide</strong> 447
Appendix A: Glossary<br />
default branch <strong>The</strong> branch <strong>Source</strong> <strong>Integrity</strong> tries to check in files to. <strong>The</strong> default<br />
branch is set with the Archive Information command. If unspecified,<br />
files are checked in to the trunk.<br />
default editor <strong>The</strong> editor used by the View Revision and View/Edit Working File<br />
commands to display a working file or revision. It is also used to<br />
view the log file. <strong>The</strong> default editor is defined with the Configuration<br />
> Personal command (Directories panel).<br />
deltas <strong>The</strong> differences (stored in an archive) between one revision and its<br />
immediate ancestor. An archive contains one complete version of the<br />
working file and all the deltas needed to reconstruct any revision.<br />
demotion <strong>The</strong> process of changing a revision’s promotion state setting from a<br />
higher to a lower level. When promotion is turned on, the range of<br />
state settings that can be applied to revisions in an archive is defined<br />
by the Configuration > Personal command (Promotion panel).<br />
enforce An attribute that can be applied in SAM to protect file options from<br />
being overridden by your personal configuration settings.<br />
freeze (a member) To place a member in a state that prevents changes being made to the<br />
member information that resides in the project file. For example, you<br />
cannot update the member revision or change the member type for a<br />
frozen member. <strong>The</strong> opposite of thaw.<br />
freeze (a project) To place a project in a state that prevents changes being made to the<br />
information in the project file. For example, you cannot perform<br />
operations such as adding or deleting members, changing<br />
configuration blocks, or setting variables on a frozen project. <strong>The</strong><br />
opposite of thaw.<br />
global configuration<br />
file<br />
folder A term used in Microsoft Windows and NT to replace directory.<br />
frozen <strong>The</strong> state a project or member (archived) exists in after you perform a<br />
freeze action upon it.<br />
A file containing default information about where archives and<br />
working files are stored, locking policies and other tailoring options.<br />
Global Configuration File settings cannot be set with the<br />
Configuration command.<br />
head revision <strong>The</strong> most recent revision on the main path of development (the trunk)<br />
in an archive.<br />
448 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>Source</strong> <strong>Integrity</strong> Terms<br />
keyword A special variable construct (for example, $Date$, $Author$,<br />
$State$) used to represent textual information in a working file.<br />
Keywords can be expanded (that is, replaced with their literal values)<br />
when a revision is checked out.<br />
keyword expansion <strong>The</strong> process of automatically adding or updating information to a<br />
keyword reference when a revision is checked out or viewed.<br />
non-archived (project<br />
member)<br />
label See revision label.<br />
lock A <strong>Source</strong> <strong>Integrity</strong> feature that prevents more than one user from<br />
simultaneously making changes to the same revision. When a<br />
revision is locked, no one other than the locker can check in changes<br />
to that revision. A revision can be locked when it is checked in,<br />
checked out, or with the Lock Revision command.<br />
locker <strong>The</strong> person who has a revision locked.<br />
log file <strong>The</strong> file where archive transactions are recorded when logging is<br />
turned on. <strong>The</strong> name and location of the log file is specified with the<br />
Configuration > Personal command (Logging panel). If it exists, the log<br />
file contains a record of each check-in and check-out (locked)<br />
operation performed on the archive.<br />
metadata Information about a revision or archive, as opposed to the information<br />
that is part of the object. For example, a revision’s Revision<br />
Description is information about the revision, while the text of the<br />
revision is part of the revision itself.<br />
Personal<br />
Configuration File<br />
A project member whose content is held in a single file that is not<br />
under <strong>Source</strong> <strong>Integrity</strong> revision control.<br />
A file containing user-specific information about where archive and<br />
working files are stored, locking policies, and other tailoring options.<br />
Personal Configuration File values are set with the Configuration<br />
command.<br />
<strong>The</strong> Personal Configuration File is called mksrcs.rc and is located in<br />
the directory where Windows is installed.<br />
project A group of files that, taken together, forms a single body of work.<br />
Projects are presented in Project Windows, which list the members of<br />
the project and provide access to them.<br />
project directory <strong>The</strong> root of the directory tree where project member files reside.<br />
<strong>User</strong> <strong>Guide</strong> 449
Appendix A: Glossary<br />
project log A file that contains a record of all project transactions (for example,<br />
check in, check out, and add member) since the last time the project<br />
was checked in. It is viewed with the Project > View Log command.<br />
project member Any file that is included in a project. Project members may include:<br />
archived files<br />
non-archived files<br />
other <strong>Source</strong> <strong>Integrity</strong> projects (see subproject)<br />
Project members are displayed in a Project window.<br />
Project view In the <strong>Source</strong> <strong>Integrity</strong> Web Interface, a page that displays all the<br />
members of a single project.<br />
Project window In the Windows interface version, a window displayed in the<br />
<strong>Source</strong> <strong>Integrity</strong> application window that contains all the members of<br />
a single project.<br />
promotion <strong>The</strong> process of managing data as it moves through a structured<br />
development cycle. Any project (whether it is software development,<br />
document production, or any other type of data management) goes<br />
through recognizable phases: from inception, through development,<br />
testing, quality assurance, and completion.<br />
Using promotion, you can define the phases (or states) of your<br />
development cycle and track and manage the progress of each file as<br />
it moves through the process.<br />
promotion state A state setting defined with the Configuration > Personal command<br />
(Promotion panel). When promotion is turned on, only the defined<br />
promotion state settings may be used.<br />
revision A version of a file under revision control. Revisions are held in an<br />
archive and may be stored as the complete content of the file (in the<br />
case of the head revision) or a record of the changes that must be<br />
applied to rebuild a specific version of the file.<br />
A new revision is produced each time a working file is checked into<br />
its archive.<br />
revision description Free-form comments describing a revision. <strong>The</strong> revision description<br />
can contain anything from a detailed description of changes, to<br />
instructions for the next person who will work on the file.<br />
450 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
<strong>Source</strong> <strong>Integrity</strong> Terms<br />
<strong>The</strong> revision description (sometimes referred to the log message) is<br />
attached to a new revision at check-in time, and may be viewed and<br />
appended with the Revision Information command. In the Windows<br />
interface version, the Revision Description is also displayed in the<br />
bottom panel of the Archive window.<br />
revision label Text that describes and refers to revisions in an archive. When a file is<br />
checked in, you are given the option of assigning it a revision label.<br />
Revisions in an archive can be displayed and selected either by<br />
revision number or revision label.<br />
Revision labels can be added, appended, or deleted with the Revision<br />
Information command.<br />
revision number A unique number used to identify a revision in an archive. Revisions<br />
on the trunk are numbered as two-part decimals (that is, 1.1, 1.2, 1.3,<br />
…). Revisions on a branch are numbered by adding two-part<br />
decimals to the number of the revision they branch from.<br />
For example, if a branch is started from revision 1.3, its members<br />
would be numbered<br />
1.3.1.3<br />
1.3.1.2<br />
1.3.1.1<br />
and so on.<br />
sandbox A mirror image of a <strong>Source</strong> <strong>Integrity</strong> project. Although it looks and<br />
acts like the project it mirrors, it is actually a collection of pointers to<br />
its real-life counterparts in the master project.<br />
Sandboxes provide a way for developers to work on projects in a<br />
personal, protected workspace, without immediately impacting the<br />
condition of the project or disrupting the work patterns of other<br />
project developers.<br />
With sandboxes, each user creates a personal workspace for a project<br />
where changes can be made and tested before being merged back into<br />
the master project. A <strong>Source</strong> <strong>Integrity</strong> sandbox consists of a sandbox<br />
file and the directory it resides in.<br />
Sandbox view In the <strong>Source</strong> <strong>Integrity</strong> Web Interface, a page that displays all the<br />
members of a single project.<br />
Sandbox window In the Windows interface version, a window displayed in the<br />
<strong>Source</strong> <strong>Integrity</strong> application window that contains all the members of<br />
a single sandbox.<br />
<strong>User</strong> <strong>Guide</strong> 451
Appendix A: Glossary<br />
state Free-form text used to classify the condition of a revision in an<br />
archive. For example, a document could initially have a state of<br />
“Draft”. As work progresses it might be changed to “Review” and<br />
eventually “Complete”. If no state is assigned to a revision, a default<br />
value of “Exp” (for Experimental) is used.<br />
<strong>The</strong> state of a revision is assigned at check-in time. If promotion is<br />
turned on, only the predefined promotion states may be used.<br />
strict locking When strict locking is enabled for an archive, revisions must be<br />
checked out locked if they are to be checked back into the archive as a<br />
new revision. Revisions checked out unlocked are copied into readonly<br />
files and may not be checked into the archive until a lock has<br />
been obtained.<br />
When strict locking is not enabled, revisions may be checked out<br />
unlocked, edited, and checked back in.<br />
subproject A member type applied to a sandbox or project member that is itself a<br />
<strong>Source</strong> <strong>Integrity</strong> project.<br />
tip revision <strong>The</strong> most recent revision on a branch of an archive.<br />
thaw To remove the frozen state of a project or member so that changes can<br />
again be made to the project file or member information. <strong>The</strong><br />
opposite of freeze.<br />
trunk <strong>The</strong> primary line of a file’s change history in an archive. <strong>The</strong> first<br />
member of the trunk is always the original file checked into the<br />
archive. <strong>The</strong> most recently checked in member of the trunk is referred<br />
to as the head revision.<br />
type (project member) Project members may be one of following types of files:<br />
archived (files under <strong>Source</strong> <strong>Integrity</strong> revision control)<br />
non-Archived (files not under <strong>Source</strong> <strong>Integrity</strong> revision control)<br />
subproject (another <strong>Source</strong> <strong>Integrity</strong> project)<br />
user name <strong>The</strong> name <strong>Source</strong> <strong>Integrity</strong> knows you by. <strong>User</strong> name is defined using<br />
the Configuration > Personal command (Preferences panel). By<br />
default, user name is used as the author during check-in.<br />
variant sandbox A sandbox that is created from a previous project checkpoint rather<br />
than the current (or head) revision of a project. You create a variant<br />
sandbox when you want to branch to a variant development path. It<br />
is akin to creating a branch archive.<br />
452 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Visual Difference<br />
window<br />
<strong>Source</strong> <strong>Integrity</strong> Terms<br />
<strong>The</strong> main window of the Visual Difference utility used by the<br />
Compare Files, Compare Revisions, and Differences commands to<br />
display the differences between text-based files or revisions.<br />
working directory <strong>The</strong> complete path to the root of the work tree (that is, the directory or<br />
hierarchy of directories where working files are stored and changes<br />
are made to them). Each sandbox or project has its own working<br />
directory.<br />
See sandbox directory; project directory.<br />
working file A file that contains a working copy of a checked-out revision. <strong>User</strong>s<br />
edit and change the working file, not the revision itself. Changes to<br />
the working file are added to the archive (as a new revision) when the<br />
working file is checked in.<br />
work tree <strong>The</strong> directory or hierarchy of directories where working files are<br />
stored and changes are made to them.<br />
<strong>User</strong> <strong>Guide</strong> 453
Appendix A: Glossary<br />
Change <strong>Integrity</strong> Terms<br />
administrator <strong>The</strong> administrator installs the Change <strong>Integrity</strong> database on a<br />
network, defines and customizes issue types and workflow, and<br />
creates additional user accounts, allowing users to access the<br />
program.<br />
attached files Change <strong>Integrity</strong> allows you to attach copies of files to an issue, so<br />
that other users may view them.<br />
change package A change package allows you to specify groups of files that are<br />
affected by an issue type, for example, a solution’s change package<br />
might contain files that need to be changed in order to satisfy a<br />
problem.<br />
charts Charts are graphs that present trends over time, or distributions of the<br />
data in your project. Charts are based on the standard and custom<br />
fields of issue types. Trend charts may be displayed as line graphs.<br />
Distribution charts may be displayed as pie graphs or bar graphs.<br />
database A database is the container of Change <strong>Integrity</strong> projects, and may<br />
contain any number of Change <strong>Integrity</strong> projects. You can easily<br />
access multiple databases from Change <strong>Integrity</strong>, but only one at a<br />
time.<br />
group A group consists of one or more users who need to work with<br />
Change <strong>Integrity</strong> issues.<br />
issues Issues track changes in the software development cycle. For example,<br />
your administrator can configure Change <strong>Integrity</strong> in a way that a<br />
problem issue may be associated with a solution issue for easy tracking<br />
and monitoring of both issues. Each issue has an audit trail, which<br />
may be used to evaluate internal processes for the effectiveness of the<br />
problem resolution process. In effect, issues track all aspects of any<br />
engineering endeavor.<br />
issue types Issue types capture and track a specific change request, defect,<br />
problem, solution, or task.<br />
project Projects are labels that help you sort and organize issues in a<br />
hierarchical structure.<br />
454 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Change <strong>Integrity</strong> Terms<br />
query A query is a request to select and list the issue types that meet specific<br />
selection criteria. <strong>The</strong> selection criterion is a logical expression of<br />
specific values, or ranges of values, of the standard and custom fields<br />
of the issue type. Queries are unique for each project because each<br />
issue type may have different custom fields.<br />
reports Reports are summaries of the data in your project. Reports are based<br />
on the standard and custom fields of issue types. Reports can be<br />
customized to include images, fonts, hyperlinks, and can be saved as<br />
HTML files for viewing on the Web.<br />
states Issue types can each have their own set of states to advance through.<br />
<strong>The</strong>y can also follow a state model defined by the project<br />
administrator, giving greater control over who has access to a specific<br />
issue type at a given time, as well as who has responsibility for<br />
approving the advancement of the state.<br />
user A user is anyone who needs to work with Change <strong>Integrity</strong> issues.<br />
<strong>User</strong>s are assigned user permissions to them by the administrator.<br />
<strong>User</strong>s are also assigned to groups that have specific Change <strong>Integrity</strong><br />
group permissions assigned to them by the administrator.<br />
workflow Each issue follows workflow, the process established by your<br />
administrator to capture and track information during your software<br />
development cycle. Each issue type can have its own set of states to<br />
advance through the development cycle. For example, a change<br />
request may go through the following states: submitted, work<br />
started, tested, reviewed, closed. Issues and their current states<br />
provide change management information necessary to support<br />
business decisions.<br />
<strong>User</strong> <strong>Guide</strong> 455
Appendix A: Glossary<br />
456 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Index<br />
-, 251<br />
$, 274<br />
$$, 274<br />
$$*, 276<br />
$$@, 276<br />
$%, 274<br />
$&, 274<br />
$*, 274<br />
$>, 274<br />
$?, 274<br />
$@, 274<br />
$^, 274<br />
+, 251<br />
.DEFAULT, 282<br />
.ELSE, 296<br />
.ELSIF, 297<br />
.END, 297<br />
.EPILOG, 266, 273, 280<br />
.EXPORT, 268, 268<br />
.GROUPEPILOG, 280<br />
.GROUPPROLOG, 280, 290<br />
.IGNORE, 266, 284<br />
.IMPORT, 261<br />
.INCLUDE, 269, 279<br />
.INCLUDEDIRS, 270, 279<br />
.LIBRARY, 293, 295<br />
.NOAUTODEPEND, 293<br />
.POSIX, 270, 288, 293<br />
.PRECIOUS, 266, 273<br />
.PROLOG, 266, 273, 280, 290<br />
.SETDIR, 267, 305, 305<br />
.SILENT, 267, 273, 284, 291<br />
.SOURCE, 271, 277, 305, 306<br />
.SOURCE.x, 271<br />
.SUFFIXES, 287, 287<br />
.SYMBOL, 284<br />
@, 251<br />
@Depends configuration statement, 237<br />
@Template configuration statement, 237<br />
A<br />
accessing metadata, 152<br />
activating an issue, 438<br />
active issue, 92<br />
Add Label<br />
Web interface command, 116, 183<br />
Add Members<br />
Windows interface command, 72<br />
adding<br />
attachments<br />
batch edit, 379<br />
labels, 116<br />
members to a project, 72<br />
related issues<br />
batch edit, 380<br />
administrator<br />
described, 454<br />
All Files option, 92<br />
application window<br />
graphic user interface, 317<br />
archive<br />
branches, 17<br />
checking in revisions, 174<br />
checking out revisions, 172<br />
commands, 61<br />
creating, 167<br />
automatically or interactively, 67<br />
using Microsoft Windows Explorer, 228<br />
defined, 10, 13<br />
deltas, 16<br />
described, 445<br />
editing information, 176<br />
file format<br />
<strong>User</strong> <strong>Guide</strong> 457
Index<br />
text or binary, 170<br />
importing, 171<br />
existing RCS archives using CLI, 151<br />
in configuration management, 10<br />
information<br />
using CLI, 152<br />
library extensions, 257<br />
managing, 165–196<br />
settings, 169<br />
structure, 14<br />
trunks, 17<br />
viewing archive information, 176<br />
archive<br />
overview, 13<br />
archive description<br />
described, 445<br />
archive directory<br />
described, 445<br />
archive file<br />
described, 445<br />
Archive Information<br />
Windows interface command, 176<br />
archive information<br />
described, 445<br />
archive log<br />
described, 446<br />
archive path<br />
described, 446<br />
archive transaction<br />
described, 446<br />
Archive window<br />
described, 446<br />
archived (project member)<br />
described, 445<br />
archived member type, 86<br />
ARFLAGS, 294<br />
Associating, 441<br />
associating<br />
active issues with project members, 441<br />
at-sign in Make, 251<br />
attached files<br />
described, 454<br />
attachments<br />
adding to an issue, 340<br />
opening, 344<br />
removing, 343<br />
saving, 346<br />
attributes, 32, 265–267<br />
in Make, 250<br />
member, 153<br />
removing using CLI, 155<br />
setting using CLI, 153<br />
project, 97, 155<br />
assigning using CLI, 155<br />
removing using CLI, 156<br />
sandbox, 97<br />
author<br />
described, 446<br />
Author keyword, 131<br />
author name<br />
described, 446<br />
Author option, 91<br />
automatic encryption, 160<br />
B<br />
backslash, 250, 291<br />
back-up, 308<br />
batch editing, 377<br />
adding attachments, 379<br />
adding related issues, 380<br />
fields, 378<br />
bcc, 247<br />
before starting<br />
Change <strong>Integrity</strong>, 314<br />
binary files, 17<br />
described, 446<br />
storing in Reference format, 196<br />
blank characters, 249<br />
Borland C++, 247, 256, 299<br />
Borland Delphi 1.0, 2.0, &3.0, 197<br />
Borland Delphi extension, 223<br />
checking in, 226<br />
multiple files, 227<br />
checking out, 225<br />
multiple files, 226<br />
creating<br />
<strong>Source</strong> <strong>Integrity</strong> project, 224<br />
<strong>Source</strong> <strong>Integrity</strong> sandbox, 225<br />
Borland Make, 299<br />
branch, 17<br />
default, 20<br />
defined, 11<br />
described, 446<br />
in configuration management, 11<br />
level, 19<br />
458 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
number, 19<br />
root revision, 17<br />
specifying, 19, 19<br />
starting, 18<br />
starting during check-in, 87<br />
branch revision<br />
defined, 87<br />
revision numbers, 87, 87<br />
browser plugin for <strong>Source</strong> <strong>Integrity</strong> Web Interface,<br />
48, 50<br />
BSD UNIX Make, 300<br />
Build<br />
Windows interface command, 119<br />
building, 234<br />
conditional expansion, 236<br />
language statements, 236<br />
object file associations, 235<br />
preparation, 232<br />
projects, 118<br />
template files, 236<br />
variables, 237<br />
built-in commands in Make, 289<br />
built-in rules in Make, 255<br />
C<br />
CC, 257, 302–304<br />
cc, 302, 303<br />
CFLAGS, 257, 304<br />
Change <strong>Integrity</strong><br />
before starting, 314<br />
concepts, 312<br />
graphic user interface, 317<br />
Web interface, 320<br />
Change <strong>Integrity</strong> Connect<br />
add tracking labels, 439<br />
Change <strong>Integrity</strong> Server, 439<br />
Change <strong>Integrity</strong> user name, 439<br />
configuration, 438<br />
configuring, 438<br />
default issue, 439<br />
enable Change <strong>Integrity</strong> Connect, 438<br />
issue summary, 439<br />
launch Change <strong>Integrity</strong> Web interface, 440<br />
refresh, 439<br />
selected issue, 439<br />
track locks and unlocks, 439<br />
change package<br />
described, 454<br />
viewing, 442<br />
changing<br />
search order in Make, 245<br />
charts, 406<br />
copying, 432<br />
deleting, 431<br />
described, 313, 454<br />
distribution, 406<br />
editing, 427<br />
printing, 434<br />
running, 428<br />
saving, 434<br />
trend, 406<br />
Check In<br />
Web interface command, 92<br />
Windows interface command, 89<br />
working file, 174<br />
check in<br />
described, 447<br />
Check In Same option, 91<br />
Check Out<br />
Windows interface command, 81<br />
check out<br />
described, 447<br />
keywords, 129<br />
Check Out Locked<br />
Web interface command, 84<br />
checking in<br />
active issue, 92<br />
members, 87<br />
multiple files<br />
using Borland Delphi, 227<br />
using Borland Delphi, 226<br />
using Microsoft Developer Studio, 220<br />
using Microsoft Visual Basic, 217<br />
using Microsoft Windows Explorer, 229<br />
what happens, 15, 15<br />
Windows interface options<br />
All Files, 92<br />
Author, 91<br />
Check In Same, 91<br />
Keep Work File, 91<br />
Locked, 91<br />
Replace Label, 91<br />
Revision Description, 92<br />
Revision Label, 90<br />
Revision Number, 91<br />
<strong>User</strong> <strong>Guide</strong> 459
Index<br />
State, 91<br />
Update Member, 91<br />
checking out<br />
by revision, 173<br />
by state setting, 174<br />
locked<br />
using CLI, 172<br />
multiple files<br />
using Borland Delphi, 226<br />
revision number, 173<br />
state settings, 174<br />
unlocked<br />
using CLI, 172<br />
using Borland Delphi, 225<br />
using Microsoft Developer Studio, 219<br />
using Microsoft Visual Basic, 216<br />
using Microsoft Windows Explorer, 229<br />
Windows interface options<br />
All Files, 83<br />
Expand Keywords, 83<br />
Locked (for editing), 83<br />
name of working file, 82<br />
Restore Timestamp, 83<br />
Update Member, 83<br />
which revision, 82<br />
checkpoint<br />
described, 447<br />
Checkpoint Project<br />
Web interface command, 139<br />
Windows interface command, 137<br />
checkpointing projects, 20, 136<br />
ci CLI command, 170<br />
cleaning up<br />
makefiles, 307<br />
working files, 159, 195<br />
CLI commands, 68–128, 136–158, 170–196<br />
pj build, 234<br />
pj mkmf, 233<br />
closing a session, 328<br />
cmd.exe, 250, 289<br />
cnvrnt72, 28<br />
co CLI command, 172<br />
code blocks<br />
editing using CLI, 157<br />
command prefixes<br />
Make, 251<br />
command.com, 250, 289<br />
commands<br />
bcc, 247<br />
cc, 303, 303<br />
CLI<br />
ci, 170<br />
co, 172<br />
delvariant, 158<br />
pj add, 74<br />
pj addrule, 153<br />
pj build, 156<br />
pj checkpoint, 80, 139<br />
pj ci, 93<br />
pj clean, 159, 195<br />
pj co, 84<br />
pj create, 68<br />
pj dropblock, 157<br />
pj droprule, 155<br />
pj editblock, 157<br />
pj freeze, 107<br />
pj freezeproject, 135<br />
pj header, 153<br />
pj label, 117<br />
pj mods, 145, 153<br />
pj print, 152<br />
pj refresh, 105<br />
pj sandbox, 79, 159<br />
pj set, 157<br />
pj thaw, 108, 174<br />
pj thawproject, 136<br />
pj unset, 156<br />
pj what, 152<br />
pvcs2rcs, 148<br />
rcs, 183, 189, 191, 193, 196<br />
rcsclean, 195<br />
report, 128, 152<br />
rlog, 180<br />
sccs2rcs, 148<br />
ident, 130<br />
link, 292<br />
make, 252<br />
syntax<br />
line length, 62<br />
naming files, 63<br />
path separator, 62<br />
wildcard expansion, 62<br />
touch, 308<br />
Web interface<br />
Add Label, 116, 183<br />
Check In, 92<br />
460 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Check Out Locked, 84<br />
Checkpoint Project, 139<br />
Create Sandbox, 78<br />
Delete, 189<br />
Delete Label, 118, 183<br />
Differences, 99<br />
Drop, 75<br />
History > Demote, 142<br />
History > Promote, 142<br />
Lock, 101<br />
Member > Demote, 112<br />
Member > Promote, 112<br />
Member Commands > Add, 73<br />
Member Commands > View, 185<br />
Merge, 192<br />
Open History View, 140, 166<br />
Open Member View, 167<br />
Open Project, 70<br />
Open Sandbox, 71<br />
Promote, 186<br />
Refresh, 115<br />
Refresh Project, 115<br />
Refresh Sandbox, 115<br />
Register Project, 69<br />
Register Sandbox, 69<br />
Resynchronize, 105, 113<br />
Unlock, 103<br />
Update to Tip Revision, 113, 114<br />
View, 87<br />
which, 244<br />
Windows interface<br />
Add Members, 72<br />
Archive Information, 176<br />
Build, 119<br />
Check In, 89<br />
Check Out, 81<br />
Checkpoint Project, 137<br />
Configuration > Personal, 114<br />
Create Sandbox, 76<br />
Delete Revision, 189<br />
Demote, 186<br />
Demote Revision, 186<br />
Differences, 99<br />
Edit Working File, 85<br />
Freeze, 106<br />
Freeze Project, 134<br />
Lock, 101<br />
Member > Demote, 111<br />
Member > Promote, 111<br />
Member Information, 109<br />
Open Member Archive, 86, 166<br />
Open Project Archive, 140, 166<br />
Open Project/Sandbox, 70<br />
Open Subproject, 85<br />
Project/Sandbox Information, 95<br />
Promote Revision, 185<br />
Refresh, 115<br />
Remove Members, 75<br />
Remove Unused Locks, 103<br />
Reports, 124<br />
Resynchronize, 104, 113<br />
Revision Information, 178<br />
Scan for Changes, 115<br />
Thaw, 107<br />
Thaw Project, 135<br />
Undo Checkout, 100<br />
Unlock, 102<br />
Update to Head Rev, 113<br />
Update to Tip Rev, 114<br />
View Log, 142<br />
View Revision, 86, 184<br />
View Working File, 85<br />
View/Edit Working File, 184<br />
comments in Make, 250<br />
common list actions, 365, 367<br />
compare window<br />
described, 447<br />
comparing<br />
files, 190<br />
revisions, 190<br />
working file to member revision, 99<br />
compatibility in Make, 244, 296<br />
compilation configuration files in Make, 302<br />
concepts<br />
Change <strong>Integrity</strong>, 312<br />
conditional expansion, 236<br />
conditionals in Make, 296<br />
Configuration > Personal<br />
Windows interface command, 114<br />
configuration file<br />
described, 447<br />
configuration management<br />
concepts, 10<br />
introduction, 6<br />
configuration statements<br />
@Depends, 237<br />
<strong>User</strong> <strong>Guide</strong> 461
Index<br />
@Template, 237<br />
configuring<br />
Change <strong>Integrity</strong> Connect, 438<br />
content page<br />
Web interface, 321<br />
context menu<br />
graphic user interface, 318<br />
continuation lines in Make, 250<br />
control macros<br />
in Make, 272–273<br />
used with group recipes, 290<br />
copying<br />
charts, 432<br />
reports, 398<br />
Create Sandbox<br />
Web interface command, 78<br />
Windows interface command, 76<br />
wizard, 76<br />
creating<br />
archives, 167<br />
distribution charts, 407<br />
makefiles, 233<br />
projects<br />
in <strong>Source</strong> <strong>Integrity</strong> Web Interface, 68<br />
reports, 386<br />
sandboxes, 76<br />
saved queries, 354<br />
trend charts, 417<br />
D<br />
dash in Make, 251<br />
data types<br />
described, 447<br />
database<br />
described, 454<br />
date<br />
described, 447<br />
Date keyword, 131<br />
DEFAULT, 282<br />
default branch, 20<br />
described, 448<br />
default editor<br />
described, 448<br />
default rules in Make, 255<br />
default startup rules for Make, 298<br />
defining<br />
Make macros on the CLI, 259<br />
Delete<br />
Web interface command, 189<br />
Delete Label<br />
Web interface command, 118, 183<br />
Delete Revision<br />
Windows interface command, 189<br />
deleting<br />
charts, 431<br />
files, 170<br />
labels, 116<br />
queries, 356<br />
reports, 397<br />
revisions, 189<br />
variant sandboxes<br />
using CLI, 158<br />
deltas<br />
archives, 16<br />
described, 448<br />
storing changes only, 16, 17<br />
storing entire file by reference, 17<br />
delvariant CLI command, 158<br />
Demote<br />
Windows interface command, 186<br />
Demote Revision<br />
Windows interface command, 186<br />
demoting<br />
members, 110<br />
projects, 140<br />
revisions, 185<br />
demotion<br />
described, 448<br />
dependencies, 118<br />
dependency of files in Make, 246<br />
descriptions<br />
reports, 392<br />
development cycle, 36<br />
development objects<br />
defined, 12<br />
development paths<br />
and variant sandboxes, 24<br />
development, managing, 36<br />
Differences<br />
Web interface command, 99<br />
Windows interface command, 99<br />
directories<br />
master, 307<br />
mksnt, 244<br />
mksos2, 244<br />
462 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
DIRSEPSTR, 272<br />
distribution charts, 406<br />
creating, 407<br />
creating from a saved query, 410<br />
saving, 417<br />
specifying a graph, 411<br />
specifying a legend, 416<br />
specifying axes, 414<br />
specifying colors, 412<br />
specifying fields, 409<br />
specifying query filters, 410<br />
specifying text, 408<br />
Drop<br />
Web interface command, 75<br />
dynamic prerequisite macros, 276<br />
E<br />
Edit Working File<br />
Windows interface command, 85<br />
editing<br />
archive information, 176<br />
charts, 427<br />
code blocks using CLI, 157<br />
issues, 376<br />
members, 85<br />
multiple issues, 377<br />
project information, 94<br />
reports, 393<br />
revision information, 178<br />
revisions, 184<br />
sandbox information, 94<br />
saved query properties, 357<br />
working file, 184<br />
ELSE, 296<br />
ELSIF, 297<br />
encrypting files<br />
using CLI, 160<br />
encryption<br />
automatic, 160<br />
changing encryption key, 162<br />
choosing encryption key, 161<br />
explicit, 160, 161<br />
using CLI, 160<br />
with other applications, 162<br />
working with, 162<br />
END, 297<br />
enforce<br />
described, 448<br />
environment variables<br />
MAKESTARTUP, 255<br />
PROJECT, 62<br />
ROOTPROJECT, 62<br />
EPILOG, 266, 280<br />
examples<br />
.EPILOG, 280<br />
.GROUPEPILOG, 280<br />
.GROUPPROLOG, 280<br />
.INCLUDE, 279<br />
.INCLUDEDIRS, 279<br />
.PROLOG, 280<br />
.SETDIR, 267<br />
cc, 303, 304<br />
cleaning up makefiles, 307<br />
conditionals in Make, 296<br />
continuation lines in Make, 250<br />
defining Make macros on the CLI, 259<br />
finding files in Make, 278<br />
group recipes in Make, 290<br />
macro expansion in Make, 256<br />
macro naming conventions in Make, 258<br />
make, 253<br />
makefile, 256<br />
makefiles, 247<br />
making libraries in Make, 293<br />
prefix and suffix modifiers, 264<br />
printchk, 308<br />
recipes in Make, 292<br />
running Make without a makefile, 304<br />
run-time macros in Make, 275<br />
simple makefile, 305<br />
specifying targets on the CLI in Make, 252<br />
string substitution, 262–263<br />
suffix rules in Make, 286<br />
tokenization, 263<br />
using a library, 306<br />
using a separate object directory in Make, 305<br />
using different makefile, 252<br />
writing rules in Make, 248<br />
executable file extensions, 257<br />
expansion, 256<br />
wildcard, 62<br />
explicit encryption, 160<br />
EXPORT, 268<br />
expressions in Make, 297<br />
extensions<br />
<strong>User</strong> <strong>Guide</strong> 463
Index<br />
archive window, 206<br />
Borland Delphi, 223<br />
creating projects, 210<br />
creating sandboxes, 212<br />
difference between extensions and <strong>Source</strong> <strong>Integrity</strong>,<br />
210<br />
features, 198<br />
Microsoft Developer Studio 97, 218<br />
Microsoft Visual Basic, 214<br />
Microsoft Windows Explorer, 227<br />
project window, 199<br />
using, 209<br />
F<br />
fields<br />
batch editing, 378<br />
file names containing a colon in Make, 249<br />
files<br />
.bat, 290<br />
.obj, 248, 257, 297<br />
format<br />
text or binary, 170<br />
filters<br />
project view, 57<br />
sandbox view, 53<br />
using within extensions Project window, 200<br />
Windows interface<br />
all members, 44<br />
frozen members, 45<br />
locked by me, 45<br />
locked members, 45<br />
members with label, 45<br />
members with state, 45<br />
modified members, 44<br />
out-of-sync members, 45<br />
subprojects, 45<br />
using, 44<br />
finding files<br />
Make, 277–278<br />
folder<br />
described, 448<br />
Freeze<br />
Windows interface command, 106<br />
freeze (a member)<br />
described, 448<br />
freeze (a project)<br />
described, 448<br />
Freeze Project<br />
Windows interface command, 134<br />
freezing<br />
members, 106<br />
projects, 134<br />
frozen<br />
described, 448<br />
G<br />
generic command line format in Make, 303<br />
global configuration file<br />
described, 448<br />
glossary of terms, 445<br />
graph, 124<br />
graphic user interface<br />
application window, 317<br />
context menu, 318<br />
Issue Details, 319<br />
menu bar, 317<br />
Query Bar, 318<br />
Query Builder, 318<br />
Query Results, 318<br />
status bar, 318<br />
toolbar, 318<br />
group<br />
described, 313, 454<br />
permissions<br />
described, 313<br />
group recipes, 289<br />
GROUPEPILOG, 280<br />
GROUPFLAGS, 290<br />
GROUPPROLOG, 280, 290<br />
groups<br />
defined, 35<br />
GROUPSHELL, 290<br />
GROUPSUFFIX, 290<br />
H<br />
head rev<br />
updating to, 113<br />
head revision<br />
described, 448<br />
Header keyword, 131<br />
headers<br />
makefile variable, 238<br />
History > Demote<br />
464 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Web interface command, 142<br />
History > Promote<br />
Web interface command, 142<br />
history view, 58<br />
I<br />
Id keyword, 131<br />
ident command, 130<br />
IDEs, 197<br />
IGNORE, 266, 284<br />
Ignore Non-Members option, 122<br />
ignoring errors in Make, 299<br />
IMPORT, 261<br />
importing<br />
archives, 171<br />
files<br />
PVCS, 149<br />
SCCS, 149<br />
using CLI, 148<br />
INCLUDE, 269, 279<br />
INCLUDEDIRS, 270, 279<br />
inheriting meta-rules, 284<br />
installing<br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface, 50<br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface browser plugin,<br />
48, 50<br />
Integrated Development Environments<br />
see IDEs<br />
<strong>Integrity</strong> Server, 48, 49<br />
Issue Details<br />
graphic user interface, 319<br />
issue type relationships<br />
described, 312<br />
issue types<br />
described, 312, 454<br />
relationships<br />
described, 312<br />
issues<br />
adding attachments, 340<br />
associating with project members, 441<br />
described, 312, 454<br />
editing, 376<br />
linking, 347<br />
printing, 371, 371<br />
relating, 335<br />
saving, 373<br />
selecting, 367<br />
submitting, 332<br />
viewing, 367<br />
K<br />
Keep Work File option, 91<br />
keyword<br />
Author, 131<br />
Date, 131<br />
described, 449<br />
Header, 131<br />
Id, 131<br />
Locker, 131<br />
Log, 132<br />
Name, 132<br />
ProjectName, 132<br />
ProjectRevision, 132<br />
RCSfile, 132<br />
Revision, 132<br />
<strong>Source</strong>, 132<br />
State, 132<br />
keyword expansion, 129<br />
described, 449<br />
keywords, 33<br />
check out, 129<br />
defined, 33, 129<br />
locating, 130<br />
removing keyword values, 131<br />
using, 129<br />
working file, 129<br />
L<br />
label<br />
described, 449<br />
labels, 29<br />
adding, 116<br />
assigning<br />
in GUI and <strong>Source</strong> <strong>Integrity</strong> Web Interface,<br />
116<br />
in Windows and Web interfaces, 183<br />
with CLI, 94<br />
changing, 175<br />
deleting, 116<br />
requirements, 30<br />
language statements for building, 236<br />
LDFLAGS, 304<br />
LDLIBS, 295<br />
<strong>User</strong> <strong>Guide</strong> 465
Index<br />
LIBRARY, 293<br />
link, 292<br />
linking<br />
issues, 347<br />
lists<br />
common actions, 365, 367<br />
local default rules in Make, 255<br />
locating keywords, 130<br />
Lock<br />
Web interface command, 101<br />
Windows interface command, 101<br />
lock<br />
described, 449<br />
Locked option, 91<br />
locker<br />
described, 449<br />
Locker keyword, 131<br />
locking<br />
in variant sandboxes, 26<br />
members, 101<br />
revisions, 187<br />
locks<br />
removing unused, 103<br />
log file<br />
described, 449<br />
log files, 33<br />
Log keyword, 132<br />
logging, 142, 193<br />
cleaning up log files, 142, 195<br />
log file format, 194<br />
logging in, 314<br />
password, 315, 316<br />
port number, 315<br />
server name, 315<br />
user name, 315, 316<br />
logging out, 328<br />
M<br />
macro definitions, 254<br />
macro expansion in Make, 256<br />
modifying, 261–265<br />
macro modifiers in Make, 262<br />
macro naming conventions in Make, 258<br />
MAKE, 307<br />
Make<br />
attributes, 265–267<br />
back-up, 308<br />
built-in commands, 289<br />
built-in rules, 255<br />
cc, 303<br />
changing your search order, 245<br />
cleaning up, 307<br />
colons in file names, 249<br />
command prefixes, 251<br />
compatibility, 244, 296<br />
compilation configuration files, 302<br />
conditionals, 296<br />
control macros, 272–273<br />
used with group recipes, 290<br />
default rules, 255<br />
default startup rules, 298<br />
defining macros on the CLI, 259<br />
dependency of files, 246<br />
dynamic prerequisite macros, 276<br />
finding files, 277–278<br />
forms of expressions, 297<br />
generic command line format, 303<br />
group recipes, 289<br />
ignoring errors, 299<br />
local default rules, 255<br />
macro definitions, 254<br />
macro naming conventions, 258<br />
makefiles, 246, 247<br />
MAKESTARTUP, 255<br />
making libraries, 293–296<br />
metarules, 282–286<br />
metarules for library support, 294<br />
missing rules, 251<br />
modifying macro expansions, 261–265<br />
nesting macros in other macros, 259–261<br />
options<br />
-D, 254, 255<br />
-f, 255<br />
-f file, 254<br />
-k, 254<br />
-n, 254<br />
-u, 254<br />
prefix and suffix modifiers, 264<br />
problems, 304–308<br />
recipes, 288–293<br />
recursive makes, 307<br />
rules, 247, 250–251<br />
running Make without a makefile, 304<br />
run-time macros, 274–275<br />
search order, 245<br />
466 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
special target directives, 267–271<br />
specifying targets on the CLI, 252<br />
string substitution, 262–263<br />
suffix rules, 286–288<br />
suffix rules for library support, 295<br />
text diversions, 291<br />
tokenization, 263<br />
transitive closure, 285<br />
using a separate object directory, 305<br />
using CC, 302–304<br />
using different makefile, 252<br />
using inference rules, 281–288<br />
using macros, 256–265<br />
writing rules, 248–249<br />
make command, 252, 253<br />
makefile, 246, 247, 255<br />
creating, 233<br />
template, 236<br />
MAKEFLAGS, 307<br />
MAKESTARTUP, 255, 292<br />
making libraries, 293–296<br />
managing archives, 165–196<br />
managing development, 36<br />
master project<br />
see project<br />
Member > Demote<br />
Web interface command, 112<br />
Windows interface command, 111<br />
Member > Promote<br />
Web interface command, 112<br />
Windows interface command, 111<br />
member attributes, 153<br />
removing using CLI, 155<br />
setting using CLI, 153<br />
Member Commands > Add<br />
Web interface command, 73<br />
Member Commands > View<br />
Web interface command, 185<br />
Member Information<br />
Windows interface command, 109<br />
member type<br />
archived, 86<br />
non-archived, 86<br />
subproject, 86<br />
member view, 55<br />
members<br />
associating an active issue, 441<br />
checking in, 87<br />
demoting, 110<br />
editing, 85<br />
freezing, 106<br />
information<br />
active issue, 109<br />
Archive File, 108<br />
Author, 108<br />
Date, 108<br />
Label, 108<br />
Locker, 108<br />
Member, 108<br />
Revision, 108<br />
Revision description, 109<br />
State, 108<br />
Type, 108<br />
Working File, 108<br />
locking, 101<br />
promoting, 110<br />
removing from project, 75<br />
thawing, 106<br />
unlocking, 101<br />
viewing, 85<br />
viewing information, 108<br />
menu bar<br />
graphic user interface, 317<br />
Merge<br />
Web interface command, 192<br />
merging working files, 192<br />
metadata, 152<br />
attributes, 32<br />
defined, 11<br />
described, 449<br />
in configuration management, 11<br />
keywords, 33<br />
labels, 29<br />
log files, 33<br />
revision descriptions, 30<br />
timestamps, 31<br />
and building, 31<br />
setting, 31<br />
metarules, 282–286<br />
for library support in Make, 294<br />
Microsoft C++, 300<br />
Microsoft C/C++, 247<br />
Microsoft Developer Studio, 197<br />
Microsoft Developer Studio 97 extension, 218<br />
Microsoft Developer Studio extension<br />
checking in, 220<br />
<strong>User</strong> <strong>Guide</strong> 467
Index<br />
checking out, 219<br />
creating <strong>Source</strong> <strong>Integrity</strong> project, 219<br />
creating <strong>Source</strong> <strong>Integrity</strong> sandbox, 219<br />
Microsoft Make, 300<br />
Microsoft Visual Basic extension, 214<br />
checking in, 217<br />
checking out, 216<br />
creating <strong>Source</strong> <strong>Integrity</strong> project, 215<br />
creating <strong>Source</strong> <strong>Integrity</strong> sandbox, 216<br />
Microsoft Windows Explorer, 197<br />
Microsoft Windows Explorer extension, 227<br />
checking in, 229<br />
checking out, 229<br />
creating archives, 228<br />
missing rules in Make, 251<br />
mksnt, 244<br />
mksos2, 244<br />
modifiers, 262<br />
N<br />
Name keyword, 132<br />
nesting macros in other macros, 259–261<br />
new submissions<br />
notifications, 323<br />
NOAUTODEPEND, 293<br />
non-archived<br />
member type, 86<br />
non-archived (project member)<br />
described, 449<br />
notifications<br />
new submissions, 323<br />
NULL, 258, 272, 273, 277<br />
O<br />
object file, 257<br />
associations, 235<br />
OBJECTS, 292<br />
objects<br />
makefile variable, 238<br />
Open History View<br />
Web interface command, 140, 166<br />
Open Member Archive<br />
Windows interface command, 86, 166<br />
Open Member View<br />
Web interface command, 167<br />
Open Project<br />
Web interface command, 70<br />
Open Project Archive<br />
Windows interface command, 140, 166<br />
Open Project/Sandbox<br />
Windows interface command, 70<br />
Open Sandbox<br />
Web interface command, 71<br />
Open Subproject<br />
Windows interface command, 85<br />
opening<br />
attachments, 344<br />
project archives, 140<br />
projects, 70<br />
in <strong>Source</strong> <strong>Integrity</strong> Web Interface, 70, 71<br />
in Windows interface, 70<br />
related issues, 339<br />
OS, 272<br />
OS/2, 245<br />
OSRELEASE, 273<br />
OSVERSION, 272<br />
P<br />
PATH, 245<br />
Path, 245<br />
path separator, 62<br />
Personal Configuration File<br />
described, 449<br />
pj add CLI command, 74<br />
pj addrule CLI command, 153<br />
pj build CLI command, 156, 234<br />
pj checkpoint CLI command, 80, 139<br />
pj ci CLI command, 93<br />
pj clean CLI command, 159, 195<br />
pj co CLI command, 84<br />
pj create CLI command, 68<br />
pj dropblock CLI command, 157<br />
pj droprule CLI command, 155<br />
pj editblock CLI command, 157<br />
pj freeze CLI command, 107<br />
pj freezeproject CLI command, 135<br />
pj header CLI command, 153<br />
pj label CLI command, 117<br />
pj mkmf CLI command, 233<br />
pj mods CLI command, 145, 153<br />
pj print CLI command, 152<br />
pj refresh CLI command, 105<br />
pj sandbox CLI command, 79, 159<br />
468 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
pj set CLI command, 157<br />
pj thaw CLI command, 108, 174<br />
pj thawproject CLI command, 136<br />
pj unset CLI command, 156<br />
pj what CLI command, 152<br />
plugin for <strong>Source</strong> <strong>Integrity</strong> Web Interface, 48, 50<br />
plus-sign in Make, 251<br />
policy<br />
defined, 34<br />
POSIX, 244, 257, 270, 288, 293<br />
PRECIOUS, 266<br />
prefix and suffix modifiers in Make, 264<br />
prerequisites in Make, 251<br />
printing<br />
charts, 434<br />
issues, 371, 371<br />
reports, 401<br />
product terms<br />
defined, 445<br />
project<br />
adding members, 72<br />
with CLI, 74<br />
attributes, 155<br />
assigning using CLI, 155<br />
removing using CLI, 156<br />
building, 118<br />
checkpointing, 20, 136<br />
commands, 61<br />
creating<br />
in <strong>Source</strong> <strong>Integrity</strong> Web Interface, 68<br />
using Borland Delphi, 224<br />
using Microsoft Developer Studio, 219<br />
using Microsoft Visual Basic, 215<br />
using <strong>Source</strong> <strong>Integrity</strong> extensions, 210<br />
defined, 13<br />
demoting, 140<br />
described, 313, 449, 454<br />
editing information, 94<br />
freezing, 134<br />
opening, 70, 328<br />
in <strong>Source</strong> <strong>Integrity</strong> Web Interface, 70<br />
in Windows interface, 70<br />
opening in <strong>Source</strong> <strong>Integrity</strong> Web Interface, 71<br />
opening project archives, 140<br />
organization, 13<br />
overview, 13<br />
promoting, 140<br />
refreshing, 115<br />
registering, 69<br />
removing members, 75<br />
resynchronizing, 104<br />
scanning for changes, 114<br />
structure, 13<br />
thawing, 134<br />
viewing information, 94<br />
project directory<br />
described, 449<br />
PROJECT environment variable, 62<br />
project file, 143<br />
changes, 143<br />
project information<br />
changed members, 152<br />
list of members, 152<br />
reports, 128<br />
variables and attributes, 153<br />
project log<br />
described, 450<br />
project member<br />
described, 450<br />
project members<br />
associating with an active issue, 441<br />
Project view<br />
described, 450<br />
project view, 56–58<br />
filters, 57<br />
selections, 58<br />
Project window<br />
described, 450<br />
Project/Sandbox Information<br />
Windows interface command, 95<br />
projectFiles<br />
makefile variable, 238<br />
ProjectName keyword, 132<br />
ProjectRevision keyword, 132<br />
PROLOG, 266, 273, 280, 290<br />
Promote<br />
Web interface command, 186<br />
Promote Revision<br />
Windows interface command, 185<br />
promoting<br />
members, 110<br />
projects, 140<br />
revisions, 185<br />
promotion<br />
described, 450<br />
promotion state<br />
<strong>User</strong> <strong>Guide</strong> 469
Index<br />
described, 450<br />
PVCS<br />
importing, 149<br />
pvcs2rcs CLI command, 148<br />
PWD, 272, 273<br />
Q<br />
queries<br />
creating saved, 354<br />
deleting, 356<br />
filters<br />
reports, 391<br />
refreshing, 361<br />
reverting, 356<br />
running, 359<br />
query<br />
described, 313, 455<br />
Query Bar<br />
graphic user interface, 318<br />
Query Builder<br />
graphic user interface, 318<br />
Query Results<br />
graphic user interface, 318<br />
viewing, 364<br />
query toolbar<br />
Web interface, 320<br />
R<br />
rcs CLI command, 183, 189, 191, 193, 196<br />
rcsclean CLI command, 195<br />
RCSfile keyword, 132<br />
recipes in Make, 251, 288–293<br />
recursive makes, 307<br />
Reference format, 17, 196<br />
Refresh<br />
Web interface command, 115<br />
Windows interface command, 115<br />
refresh<br />
queries, 361<br />
Refresh Project<br />
Web interface command, 115<br />
Refresh Sandbox<br />
Web interface command, 115<br />
refreshing project or sandbox, 115<br />
Register Project<br />
Web interface command, 69<br />
Register Sandbox<br />
Web interface command, 69<br />
registering<br />
projects, 69<br />
related issues<br />
opening, 339<br />
removing, 338<br />
relating<br />
issues, 335<br />
Remove Members<br />
Windows interface command, 75<br />
Remove Unused Locks<br />
Windows interface command, 103<br />
removing<br />
attachments, 343<br />
keyword values, 131<br />
project members, 75<br />
related issues, 338<br />
unused locks, 103<br />
Replace Label option, 91<br />
report CLI command, 128, 152<br />
report types, 37<br />
Reporter, 124<br />
overview, 37<br />
report types, 37<br />
change history, 37<br />
changes by author, 37<br />
changes from member to label, 37<br />
changes from member to revision, 37<br />
locked revisions, 37<br />
newer revisions, 37<br />
revisions with label, 37<br />
revisions with state, 37<br />
summary of changes by file type, 37<br />
Reports<br />
Windows interface command, 124<br />
reports, 128, 386<br />
copying, 398<br />
creating, 386<br />
creating from saved queries, 391<br />
deleting, 397<br />
described, 313, 455<br />
descriptions, 392<br />
editing, 393<br />
graphs, 124<br />
printing, 401<br />
query filters, 391<br />
running, 395<br />
470 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
saving, 392, 400<br />
templates, 387<br />
Resynchronize<br />
Web interface command, 105, 113<br />
Windows interface command, 104, 113<br />
resynchronizing<br />
projects, 104<br />
sandboxes, 104<br />
reverting<br />
queries, 356<br />
revision<br />
described, 450<br />
revision description<br />
described, 450<br />
Revision Description option, 92<br />
revision descriptions, 30<br />
adding, 175<br />
Revision Information<br />
Windows interface command, 178<br />
revision information<br />
locked revisions, 182<br />
revision description, 175<br />
using CLI, 152<br />
Revision keyword, 132<br />
revision label<br />
described, 451<br />
see labels<br />
Revision Label option, 90<br />
revision labels<br />
changing, 175<br />
revision number<br />
described, 451<br />
Revision Number option, 91<br />
revision numbers<br />
changing, 91<br />
defined, 19<br />
valid, 88<br />
revisions<br />
comparing, 190<br />
defined, 10, 12<br />
deleting, 189<br />
demoting, 185<br />
editing, 184<br />
revision information, 178<br />
in configuration management, 10<br />
locking, 187<br />
promoting, 185<br />
unlocking, 187<br />
viewing, 184<br />
revision information, 178<br />
viewing metadata<br />
with archive commands, 180<br />
rlog CLI command, 180<br />
roles<br />
defined, 35<br />
root revision, 17<br />
defined, 17<br />
ROOTDIR, 244<br />
ROOTPROJECT environment variable, 62<br />
rule operator in Make, 250<br />
rules in Make, 250–251<br />
running<br />
charts, 428<br />
queries, 359<br />
reports, 395<br />
run-time macros in Make, 274–275<br />
S<br />
SAM, 34–35<br />
groups<br />
defined, 35<br />
overview, 34<br />
policy<br />
defined, 34<br />
roles<br />
defined, 35<br />
structure, 34<br />
users<br />
defined, 34<br />
Sandbox view<br />
described, 451<br />
filters, 53<br />
sandbox view, 52–55<br />
selections, 54<br />
Sandbox window<br />
described, 451<br />
sandboxes, 21, 115<br />
and projects, 22<br />
applications, 22<br />
creating, 76<br />
using Borland Delphi, 225<br />
using Microsoft Developer Studio, 219<br />
using Microsoft Visual Basic, 216<br />
using <strong>Source</strong> <strong>Integrity</strong> extensions, 212<br />
described, 451<br />
<strong>User</strong> <strong>Guide</strong> 471
Index<br />
editing information, 94<br />
overview, 21<br />
resynchronizing, 104<br />
sparse, 81<br />
using, 21<br />
variant, 24<br />
viewing information, 94<br />
saved queries<br />
creating reports, 391<br />
properties<br />
editing, 357<br />
viewing, 357<br />
undo changes, 356<br />
saving<br />
attachments, 346<br />
charts, 434<br />
distribution charts, 417<br />
issues, 373<br />
reports, 392, 400, 400<br />
session preferences, 327<br />
trend charts, 426<br />
Scan for Changes<br />
Windows interface command, 115<br />
scanning projects for changes, 114<br />
SCCS<br />
importing, 149<br />
sccs2rcs CLI command, 148<br />
SCM<br />
see Software Configuration Management<br />
search order, 245<br />
security, 34–35<br />
and SAM, 34–35<br />
Security and Administration Module<br />
see SAM<br />
selecting<br />
issues, 367<br />
selecting a project, 328<br />
selections<br />
project view, 58<br />
sandbox view, 54<br />
session<br />
closing, 328<br />
logging in, 314<br />
logging out, 328<br />
preferences<br />
email notification, 323<br />
general, 321<br />
layout, 322<br />
saving, 327<br />
setting, 321<br />
toolbar, 327<br />
session preferences<br />
setting, 321<br />
SETDIR, 267, 305<br />
setting<br />
session preferences, 321<br />
SHELL, 273<br />
SHELLFLAGS, 289<br />
SHELLMETAS, 288<br />
SILENT, 267, 273, 284, 291<br />
slash, 263<br />
Software Configuration Management, 1<br />
solving problems in Make, 304–308<br />
SOURCE, 271, 277, 305, 306<br />
source control, 437<br />
<strong>Source</strong> <strong>Integrity</strong>, 284, 300<br />
<strong>Source</strong> <strong>Integrity</strong> extensions<br />
features, 198<br />
using, 209<br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface, 49, 50<br />
browser plugin, 48, 50<br />
client component, 48<br />
installing, 50<br />
session applet, 48<br />
starting, 50–51<br />
<strong>Source</strong> keyword, 132<br />
SOURCE.x, 271<br />
sources<br />
makefile variable, 238<br />
sparse sandboxes, 81<br />
special target directives, 267–271<br />
macros and, 261<br />
specifying targets on the CLI in Make, 252<br />
starting<br />
branch during check-in, 87<br />
<strong>Source</strong> <strong>Integrity</strong> Web Interface, 50–51<br />
state<br />
assigning, 94<br />
described, 452<br />
settings<br />
assigning, 94, 176<br />
State keyword, 132<br />
State option, 91<br />
states<br />
described, 455<br />
status<br />
472 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
Web interface, 321<br />
status bar<br />
graphic user interface, 318<br />
storing<br />
binary files, 17<br />
text files, 16, 17<br />
strict locking, 84<br />
check in using CLI, 172<br />
described, 452<br />
using CLI, 172<br />
string substitution, 262–263<br />
submissions<br />
notifications, 323<br />
submitted issues<br />
relating<br />
issues, 335<br />
submitting<br />
issues, 332<br />
subproject<br />
described, 452<br />
member type, 86<br />
suffix rules, 286–288<br />
for library support in Make, 295<br />
SUFFIXES, 287<br />
SWITCHAR, 273, 289<br />
SYMBOL, 284<br />
symbols<br />
beside members<br />
frozen member, 56<br />
inaccessible archive, 57<br />
tip revision, 56<br />
beside revisions<br />
member revision, 55<br />
System V MAKE, 301<br />
T<br />
template files, 236<br />
templates<br />
reports, 387<br />
terms<br />
defined, 445<br />
text diversions in Make, 291<br />
Thaw<br />
Windows interface command, 107<br />
thaw<br />
described, 452<br />
Thaw Project<br />
Windows interface command, 135<br />
thawing<br />
members, 106<br />
projects, 134<br />
timestamps, 31<br />
and building, 31<br />
in build environment, 32<br />
setting, 31<br />
tip rev<br />
updating to, 114<br />
tip revision<br />
defined, 17<br />
described, 452<br />
tokenization, 263<br />
toolbar, 320<br />
graphic user interface, 318<br />
Web interface, 320<br />
touch, 308<br />
transitive closure, 285<br />
trend charts, 406<br />
creating, 417<br />
saving, 426<br />
specifying a graph, 421<br />
specifying a legend, 425<br />
specifying axes, 424<br />
specifying colors, 422<br />
specifying filters, 420<br />
specifying text, 418<br />
trunk, 17<br />
described, 452<br />
type (project member)<br />
described, 452<br />
U<br />
undo changes<br />
saved queries, 356<br />
Undo Checkout<br />
Windows interface command, 100<br />
UNIX, 244, 257, 283, 294<br />
UNIX System V, 263<br />
Unlock<br />
Web interface command, 103<br />
Windows interface command, 102<br />
unlocking<br />
members, 101<br />
revisions, 187<br />
Update Member option, 91<br />
<strong>User</strong> <strong>Guide</strong> 473
Index<br />
Update to Head Rev<br />
Windows interface command, 113<br />
Update to Tip Rev<br />
Windows interface command, 114<br />
Update to Tip Revision<br />
Web interface command, 113, 114<br />
updating<br />
to head rev, 113<br />
to tip rev, 114<br />
URL<br />
Change <strong>Integrity</strong> home page, 315<br />
user<br />
described, 312, 455<br />
user name<br />
described, 452<br />
users<br />
defined, 34<br />
using<br />
different makefile, 252<br />
extensions, 209<br />
inference rules in Make, 281–288<br />
keywords, 129<br />
macros in Make, 256–265<br />
V<br />
VanillaRCS configuration option, 151<br />
variant sandbox, 24<br />
converting old-style, 28<br />
deleting<br />
using CLI, 158<br />
described, 452<br />
locking in, 26<br />
using to build, 232<br />
version control, 437<br />
View<br />
Web interface command, 87<br />
View Log<br />
Windows interface command, 142<br />
View Revision<br />
Windows interface command, 86, 184<br />
View Working File<br />
Windows interface command, 85<br />
View/Edit Working File<br />
Windows interface command, 184<br />
viewing<br />
archive information, 176<br />
change packages, 442<br />
issues, 367<br />
member information, 108<br />
members, 85<br />
project information, 94<br />
Query Results, 364<br />
revision information, 178<br />
revisions, 184<br />
sandbox information, 94<br />
saved query properties, 357<br />
working file, 184<br />
views<br />
history, 58<br />
introduction, 52–58<br />
member, 55<br />
project, 56–58<br />
sandbox, 52–55<br />
Visual Basic<br />
see Microsoft Visual Basic<br />
Visual C++, 197<br />
Visual Difference window<br />
described, 453<br />
Visual J++, 197<br />
W<br />
Watcom C/C++, 247<br />
Web interface<br />
Change <strong>Integrity</strong>, 320<br />
content page, 321<br />
query toolbar, 320<br />
status, 321<br />
toolbar, 320<br />
which, 244<br />
white space in Make, 249<br />
wildcard, 63<br />
expansion, 62<br />
Windows 95, 272, 298<br />
Windows Explorer<br />
see Microsoft Windows Explorer<br />
Windows interface filters<br />
all members, 44<br />
frozen members, 45<br />
locked by me, 45<br />
locked members, 45<br />
members with label, 45<br />
members with state, 45<br />
modified members, 44<br />
out-of-sync members, 45<br />
474 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>
subprojects, 45<br />
using, 44<br />
Windows NT, 272, 298<br />
work tree<br />
described, 453<br />
workflow<br />
described, 312, 455<br />
working directory<br />
described, 453<br />
working file<br />
check in, 174<br />
cleaning up, 159, 195<br />
comparing to member revision, 99<br />
deleting, 170<br />
described, 453<br />
discarding changes, 100<br />
editing, 184<br />
keywords, 129<br />
merging, 192<br />
viewing, 184<br />
writing a rule in Make, 248–249<br />
<strong>User</strong> <strong>Guide</strong> 475
Index<br />
476 <strong>Source</strong> <strong>Integrity</strong> <strong>Professional</strong> <strong>Edition</strong>