397c36820620a32e4556743deb9b0e229a9f0d0d
[clearscm.git] / lib / Clearcase / Vob.pm
1 =pod
2
3 =head1 NAME $RCSfile: Vob.pm,v $
4
5 Object oriented interface to a Clearcase VOB
6
7 =head1 VERSION
8
9 =over
10
11 =item Author
12
13 Andrew DeFaria <Andrew@ClearSCM.com>
14
15 =item Revision
16
17 $Revision: 1.15 $
18
19 =item Created
20
21 Thu Dec 29 12:07:59 PST 2005
22
23 =item Modified
24
25 $Date: 2011/11/16 19:46:13 $
26
27 =back
28
29 =head1 SYNOPSIS
30
31 Provides access to information about a Clearcase VOB. Note that information
32 about the number of elements, branches, etc. that is provided by countdb are not
33 initially instantiated with the VOB object, rather those member variables are
34 expanded if and when accessed. This helps the VOB object to be more efficient.
35
36  # Create VOB object
37  my $vob = new Clearcase::Vob (tag => "/vobs/test");
38
39  # Access member variables...
40  display "Tag:\t\t"             . $vob->tag;
41  display "Global path:\t"       . $vob->gpath;
42  display "Sever host:\t"        . $vob->shost;
43  display "Access:\t\t"          . $vob->access;
44  display "Mount options:\t"     . $vob->mopts;
45  display "Region:\t\t"          . $vob->region;
46  display "Active:\t\t"          . $vob->active;
47  display "Replica UUID:\t"      . $vob->replica_uuid;
48  display "Host:\t\t"            . $vob->host;
49  display "Access path:\t"       . $vob->access_path;
50  display "Family UUID:\t"       . $vob->family_uuid;
51
52  # This members are not initially expanded until accessed
53  display "Elements:\t"          . $vob->elements;
54  display "Branches:\t"          . $vob->branches;
55  display "Versions:\t"          . $vob->versions;
56  display "DB Size:\t"           . $vob->dbsize;
57  display "Adm Size:\t"          . $vob->admsize;
58  display "CT Size:\t"           . $vob->ctsize;
59  display "DO Size:\t"           . $vob->dbsize;
60  display "Src Size:\t"          . $vob->srcsize;
61  display "Size:\t\t"            . $vob->size;
62
63  # VOB manipulation
64  display "Umounting " . $vob->tag . "...";
65
66  $vob->umount;
67
68  display "Mounting " . $vob->tag . "...";
69
70  $vob->mount;
71
72 =head2 DESCRIPTION
73
74 This module, and others below the Clearcase directory, implement an object
75 oriented approach to Clearcase. In general Clearcase entities are made into
76 objects that can be manipulated easily in Perl. This module is the main or
77 global module. Contained herein are members and methods of a general or global
78 nature. Also contained here is an IPC interface to cleartool such that cleartool
79 runs in the background andcommands are fed to it via the exec method. When
80 making repeated calls to cleartool this can result in a substantial savings of
81 time as most operating systems' fork/exec sequence is time consuming. Factors of
82 8 fold improvement have been measured.
83
84 Additionally a global variable, $cc, is implemented from this module such that
85 you should not need to instantiate another one, though you could.
86
87 =head2 ROUTINES
88
89 The following routines are exported:
90
91 =cut
92
93 package Clearcase::Vob;
94
95 use strict;
96 use warnings;
97
98 use Clearcase;
99 use OSDep;
100
101 sub new ($) {
102   my ($class, $tag) = @_;
103
104 =pod
105
106 =head2 new (tag)
107
108 Construct a new Clearcase VOB object. Note that not all members are
109 initially populated because doing so would be time consuming. Such
110 member variables will be expanded when accessed.
111
112 Parameters:
113
114 =for html <blockquote>
115
116 =over
117
118 =item tag
119
120 VOB tag to be instantiated. You can use either an object oriented call
121 (i.e. my $vob = new Clearcase::Vob (tag => "/vobs/test")) or the
122 normal call (i.e. my $vob = new Clearcase::Vob ("/vobs/test")). You
123 can also instantiate a new vob by supplying a tag and then later
124 calling the create method.
125
126 =back
127
128 =for html </blockquote>
129
130 Returns:
131
132 =for html <blockquote>
133
134 =over
135
136 =item Clearcase VOB object
137
138 =back
139
140 =for html </blockquote>
141
142 =cut
143
144   $class = bless {
145     tag => $tag
146   }, $class;
147
148   $class->updateVobInfo;
149
150   return $class;
151 } # new
152
153 sub tag () {
154   my ($self) = @_;
155    
156 =pod
157
158 =head2 tag
159
160 Returns the VOB's tag
161
162 Parameters:
163
164 =for html <blockquote>
165
166 =over
167
168 =item none
169
170 =back
171
172 =for html </blockquote>
173
174 Returns:
175
176 =for html <blockquote>
177
178 =over
179
180 =item VOB's tag
181
182 =back
183
184 =for html </blockquote>
185
186 =cut
187
188   return $self->{tag};
189 } # tag
190
191 sub gpath () {
192   my ($self) = @_;
193   
194 =pod
195
196 =head2 gpath
197
198 Returns the VOB's global path
199
200 Parameters:
201
202 =for html <blockquote>
203
204 =over
205
206 =item none
207
208 =back
209
210 =for html </blockquote>
211
212 Returns:
213
214 =for html <blockquote>
215
216 =over
217
218 =item VOB's gpath
219
220 =back
221
222 =for html </blockquote>
223
224 =cut
225
226   return $self->{gpath};
227 } # gpath
228
229 sub shost () {
230   my ($self) = @_;
231   
232 =pod
233
234 =head2 shost
235
236 Returns the VOB's server host
237
238 Parameters:
239
240 =for html <blockquote>
241
242 =over
243
244 =item none
245
246 =back
247
248 =for html </blockquote>
249
250 Returns:
251
252 =for html <blockquote>
253
254 =over
255
256 =item VOB's server host
257
258 =back
259
260 =for html </blockquote>
261
262 =cut
263
264   return $self->{shost};
265 } # shost
266
267 sub access () {
268   my ($self) = @_;
269   
270 =pod
271
272 =head2 access
273
274 Returns the type of VOB access
275
276 Parameters:
277
278 =for html <blockquote>
279
280 =over
281
282 =item none
283
284 =back
285
286 =for html </blockquote>
287
288 Returns:
289
290 =for html <blockquote>
291
292 =over
293
294 =item access
295
296 Returns either public for public VOBs or private for private VOBs
297
298 =back
299
300 =for html </blockquote>
301
302 =cut
303
304   return $self->{access};
305 } # access
306
307 sub mopts () {
308   my ($self) = @_;
309   
310 =pod
311
312 =head2 mopts
313
314 Returns the mount options
315
316 Parameters:
317
318 =for html <blockquote>
319
320 =over
321
322 =item none
323
324 =back
325
326 =for html </blockquote>
327
328 Returns:
329
330 =for html <blockquote>
331
332 =over
333
334 =item VOB's mount options
335
336 =back
337
338 =for html </blockquote>
339
340 =cut
341
342   return $self->{mopts};
343 } # mopts
344
345 sub region () {
346   my ($self) = @_;
347   
348 =pod
349
350 =head3 region
351
352 Returns the region for this VOB tag
353
354 Parameters:
355
356 =for html <blockquote>
357
358 =over
359
360 =item none
361
362 =back
363
364 =for html </blockquote>
365
366 Returns:
367
368 =for html <blockquote>
369
370 =over
371
372 =item region
373
374 =back
375
376 =for html </blockquote>
377
378 =cut
379
380   return $self->{region};
381 } # region
382
383 sub active () {
384   my ($self) = @_;
385   
386 =pod
387
388 =head2 active
389
390 Returns that active status (whether or not the vob is currently mounted) of the
391 VOB
392
393 Parameters:
394
395 =for html <blockquote>
396
397 =over
398
399 =item none
400
401 =back
402
403 =for html </blockquote>
404
405 Returns:
406
407 =for html <blockquote>
408
409 =over
410
411 =item Returns YES for an active VOB or NO for an inactive one
412
413 =back
414
415 =for html </blockquote>
416
417 =cut
418
419   return $self->{active};
420 } # active
421
422 sub replica_uuid () {
423   my ($self) = @_;
424   
425 =pod
426
427 =head2 replica_uuid
428
429 Returns the VOBS replica_uuid
430
431 Parameters:
432
433 =for html <blockquote>
434
435 =over
436
437 =item none
438
439 =back
440
441 =for html </blockquote>
442
443 Returns:
444
445 =for html <blockquote>
446
447 =over
448
449 =item VOB replica_uuid
450
451 =back
452
453 =for html </blockquote>
454
455 =cut
456
457   return $self->{replica_uuid};
458 } # replica_uuid
459
460 sub host () {
461   my ($self) = @_;
462   
463 =pod
464
465 =head2 host
466
467 Returns the VOB's host
468
469 Parameters:
470
471 =for html <blockquote>
472
473 =over
474
475 =item none
476
477 =back
478
479 =for html </blockquote>
480
481 Returns:
482
483 =for html <blockquote>
484
485 =over
486
487 =item VOB's host
488
489 =back
490
491 =for html </blockquote>
492
493 =cut
494
495   return $self->{host};
496 } # host
497
498 sub access_path () {
499   my ($self) = @_;
500   
501 =pod
502
503 =head2 access_path
504
505 Returns the VOB's access path
506
507 Parameters:
508
509 =for html <blockquote>
510
511 =over
512
513 =item none
514
515 =back
516
517 =for html </blockquote>
518
519 Returns:
520
521 =for html <blockquote>
522
523 =over
524
525 =item VOB access path
526
527 This is the path relative to the VOB's host
528
529 =back
530
531 =for html </blockquote>
532
533 =cut
534
535   return $self->{access_path};
536 } # access_path
537
538 sub family_uuid () {
539   my ($self) = @_;
540   
541 =pod
542
543 =head2 family_uuid
544
545 Returns the VOB family UUID
546
547 Parameters:
548
549 =for html <blockquote>
550
551 =over
552
553 =item none
554
555 =back
556
557 =for html </blockquote>
558
559 Returns:
560
561 =for html <blockquote>
562
563 =over
564
565 =item VOB family UUID
566
567 =back
568
569 =for html </blockquote>
570
571 =cut
572
573   return $self->{family_uuid};
574 } # family_uuid
575
576 sub vob_registry_attributes () {
577   my ($self) = @_;
578   
579 =pod
580
581 =head2 vob_registry_attributes
582
583 Returns the VOB Registry Attributes
584
585 Parameters:
586
587 =for html <blockquote>
588
589 =over
590
591 =item none
592
593 =back
594
595 =for html </blockquote>
596
597 Returns:
598
599 =for html <blockquote>
600
601 =over
602
603 =item VOB Registry Attributes
604
605 =back
606
607 =for html </blockquote>
608
609 =cut
610
611   return $self->{vob_registry_attributes};
612 } # vob_registry_attributes
613
614 sub expand_space () {
615   my ($self) = @_;
616
617   my ($status, @output) = $Clearcase::CC->execute ("space -vob $self->{tag}");
618
619   # Initialize fields in case of command failure
620   $self->{dbsize}  = 0;
621   $self->{admsize} = 0;
622   $self->{ctsize}  = 0;
623   $self->{dosize}  = 0;
624   $self->{srcsize} = 0;
625   $self->{size}    = 0;
626
627   foreach (@output) {
628     if (/(\d*\.\d).*VOB database(.*)/) {
629       $self->{dbsize} = $1;
630     } elsif (/(\d*\.\d).*administration data(.*)/) {
631       $self->{admsize} = $1;
632     } elsif (/(\d*\.\d).*cleartext pool(.*)/) {
633       $self->{ctsize} = $1;
634     } elsif (/(\d*\.\d).*derived object pool(.*)/) {
635       $self->{dosize} = $1;
636     } elsif (/(\d*\.\d).*source pool(.*)/) {
637       $self->{srcsize} = $1;
638     } elsif (/(\d*\.\d).*Subtotal(.*)/) {
639       $self->{size} = $1;
640     } # if
641   } # foreach
642   
643   return;
644 } # expand_space
645
646 sub countdb () {
647   my ($self) = @_;
648
649   # Set values to zero in case we cannot get the right values from countdb
650   $self->{elements} = 0;
651   $self->{branches} = 0;
652   $self->{versions} = 0;
653
654   # Countdb needs to be done in the vob's db directory
655   my $cwd = `pwd`;
656   
657   chomp $cwd;
658   chdir "$self->{gpath}/db";
659
660    my $cmd    = "$Clearcase::COUNTDB vob_db 2>&1";
661    my @output = `$cmd`;
662
663    if ($? != 0) {
664      chdir $cwd;
665      return;
666     }    # if
667
668   chomp @output;
669
670   # Parse output
671   foreach (@output) {
672     if (/^ELEMENT\s*:\s*(\d*)/) {
673       $self->{elements} = $1;
674     } elsif (/^BRANCH\s*:\s*(\d*)/) {
675       $self->{branches} = $1;
676     } elsif (/^VERSION\s*:\s*(\d*)/) {
677       $self->{versions} = $1;
678     } # if
679   } # foreach
680
681   chdir $cwd;
682   
683   return;
684 } # countdb
685
686 sub elements () {
687   my ($self) = @_;
688
689 =pod
690
691 =head2 elements
692
693 Returns the number of elements in the VOB (obtained via countdb)
694
695 Parameters:
696
697 =for html <blockquote>
698
699 =over
700
701 =item none
702
703 =back
704
705 =for html </blockquote>
706
707 Returns:
708
709 =for html <blockquote>
710
711 =over
712
713 =item number of elements
714
715 =back
716
717 =for html </blockquote>
718
719 =cut
720
721   $self->countdb if !$self->{elements};
722   
723   return $self->{elements};
724 } # elements
725
726 sub branches () {
727   my ($self) = @_;
728
729 =pod
730
731 =head3 branches
732
733 Returns the number of branch types in the vob
734
735 Parameters:
736
737 =for html <blockquote>
738
739 =over
740
741 =item none
742
743 =back
744
745 =for html </blockquote>
746
747 Returns:
748
749 =for html <blockquote>
750
751 =over
752
753 =item number of branch types
754
755 =back
756
757 =for html </blockquote>
758
759 =cut
760
761   $self->countdb if !$self->{branches};
762   
763   return $self->{branches};
764 } # branches
765
766 sub versions () {
767   my ($self) = @_;
768
769 =pod
770
771 =head2 versions
772
773 Returns the number of element versions in the VOB
774
775 Parameters:
776
777 =for html <blockquote>
778
779 =over
780
781 =item none
782
783 =back
784
785 =for html </blockquote>
786
787 Returns:
788
789 =for html <blockquote>
790
791 =over
792
793 =item number of element versions
794
795 =back
796
797 =for html </blockquote>
798
799 =cut
800
801   $self->countdb if !$self->{versions};
802   
803   return $self->{versions};
804 } # versions
805
806 sub dbsize () {
807   my ($self) = @_;
808
809 =pod
810
811 =head3 dbsize
812
813 Returns the size of the VOB's database
814
815 Parameters:
816
817 =for html <blockquote>
818
819 =over
820
821 =item none
822
823 =back
824
825 =for html </blockquote>
826
827 Returns:
828
829 =for html <blockquote>
830
831 =over
832
833 =item database size
834
835 =back
836
837 =for html </blockquote>
838
839 =cut
840
841   $self->expand_space if !$self->{dbsize};
842   
843   return $self->{dbsize};
844 } # dbsize
845
846 sub admsize () {
847   my ($self) = @_;
848
849 =pod
850
851 =head2 admsize
852
853 Returns the size of administrative data in the VOB
854
855 Parameters:
856
857 =for html <blockquote>
858
859 =over
860
861 =item none
862
863 =back
864
865 =for html </blockquote>
866
867 Returns:
868
869 =for html <blockquote>
870
871 =over
872
873 =item adminstrative size
874
875 =back
876
877 =for html </blockquote>
878
879 =cut
880
881   $self->expand_space if !$self->{admsize};
882   
883   return $self->{admsize};
884 } # admsize
885
886 sub ctsize () {
887   my ($self) = @_;
888
889 =pod
890
891 =head3 ctsize
892
893 Returns the size of the cleartext pool
894
895 Parameters:
896
897 =for html <blockquote>
898
899 =over
900
901 =item none
902
903 =back
904
905 =for html </blockquote>
906
907 Returns:
908
909 =for html <blockquote>
910
911 =over
912
913 =item cleartext pool size
914
915 =back
916
917 =for html </blockquote>
918
919 =cut
920
921   $self->expand_space if !$self->{ctsize};
922   
923   return $self->{ctsize};
924 } # ctsize
925
926 sub dosize () {
927   my ($self) = @_;
928
929 =pod
930
931 =head2 dosize
932
933 Returns the size of the derived object pool
934
935 Parameters:
936
937 =for html <blockquote>
938
939 =over
940
941 =item none
942
943 =back
944
945 =for html </blockquote>
946
947 Returns:
948
949 =for html <blockquote>
950
951 =over
952
953 =item derived object pool size
954
955 =back
956
957 =for html </blockquote>
958
959 =cut
960
961   $self->expand_space if !$self->{dosize};
962   
963   return $self->{dosize};
964 } # dosize
965
966 sub srcsize () {
967   my ($self) = @_;
968
969 =pod
970
971 =head2 srcsize
972
973 Returns the size of the source pool
974
975 Parameters:
976
977 =for html <blockquote>
978
979 =over
980
981 =item none
982
983 =back
984
985 =for html </blockquote>
986
987 Returns:
988
989 =for html <blockquote>
990
991 =over
992
993 =item source pool size
994
995 =back
996
997 =for html </blockquote>
998
999 =cut
1000
1001   $self->expand_space if !$self->{srcsize};
1002    
1003   return $self->{srcsize};
1004 } # srcsize
1005
1006 sub size () {
1007   my ($self) = @_;
1008
1009 =pod
1010
1011 =head2 size
1012
1013 Returns the size of the VOB
1014
1015 Parameters:
1016
1017 =for html <blockquote>
1018
1019 =over
1020
1021 =item none
1022
1023 =back
1024
1025 =for html </blockquote>
1026
1027 Returns:
1028
1029 =for html <blockquote>
1030
1031 =over
1032
1033 =item size
1034
1035 =back
1036
1037 =for html </blockquote>
1038
1039 =cut
1040
1041   $self->expand_space if !$self->{size};
1042   
1043   return $self->{size};
1044 } # size
1045
1046 sub mount () {
1047   my ($self) = @_;
1048
1049 =pod
1050
1051 =head2 mount
1052
1053 Mount the current VOB
1054
1055 Parameters:
1056
1057 =for html <blockquote>
1058
1059 =over
1060
1061 =item none
1062
1063 =back
1064
1065 =for html </blockquote>
1066
1067 Returns:
1068
1069 =for html <blockquote>
1070
1071 =over
1072
1073 =item $status
1074
1075 Status of the mount command
1076
1077 =item @output
1078
1079 An array of lines output from the cleartool mount command
1080
1081 =back
1082
1083 =for html </blockquote>
1084
1085 =cut
1086
1087   return 0 if $self->{active} && $self->{active} eq "YES";
1088
1089   my ($status, @output) = $Clearcase::CC->execute ("mount $self->{tag}");
1090
1091   return ($status, @output);
1092 } # mount
1093
1094 sub umount () {
1095   my ($self) = @_;
1096
1097 =pod
1098
1099 =head3 umount
1100
1101 Unmounts the current VOB
1102
1103 Parameters:
1104
1105 =for html <blockquote>
1106
1107 =over
1108
1109 =item none
1110
1111 =back
1112
1113 =for html </blockquote>
1114
1115 Returns:
1116
1117 =for html <blockquote>
1118
1119 =over
1120
1121 =item $status
1122
1123 Status from cleartool
1124
1125 =item @output
1126
1127 Ouput from cleartool
1128
1129 =back
1130
1131 =for html </blockquote>
1132
1133 =cut
1134
1135   my ($status, @output) = $Clearcase::CC->execute ("umount $self->{tag}");
1136
1137   return ($status, @output);
1138 } # umount
1139
1140 sub exists () {
1141   my ($self) = @_;
1142
1143 =pod
1144
1145 =head2 exists
1146
1147 Returns true or false if the VOB exists
1148
1149 Parameters:
1150
1151 =for html <blockquote>
1152
1153 =over
1154
1155 =item none
1156
1157 =back
1158
1159 =for html </blockquote>
1160
1161 Returns:
1162
1163 =for html <blockquote>
1164
1165 =over
1166
1167 =item boolean
1168
1169 =back
1170
1171 =for html </blockquote>
1172
1173 =cut
1174
1175   my ($status, @output) = $Clearcase::CC->execute ("lsvob $self->{tag}");
1176
1177   return !$status;
1178 } # exists
1179
1180 sub create (;$$$) {
1181   my ($self, $host, $vbs, $comment) = @_;
1182
1183 =pod
1184
1185 =head2 create
1186
1187 Creates a VOB. First instantiate a VOB object with a tag. Then call create. A 
1188 small subset of parameters is supported for create.
1189
1190 Parameters:
1191
1192 =for html <blockquote>
1193
1194 =over
1195
1196 =item $host (optional)
1197
1198 Host to create the vob on. Default is the current host.
1199
1200 =item $vbs (optional)
1201
1202 VOB storage area. This is a global pathname to the VOB storage
1203 area. Default will attempt to use -stgloc -auto.
1204
1205 =item $comment (optional)
1206
1207 Comment for this VOB's creation. Default is -nc
1208
1209 =back
1210
1211 =for html </blockquote>
1212
1213 Returns:
1214
1215 =for html <blockquote>
1216
1217 =over
1218
1219 =item $status
1220
1221 Status from cleartool
1222
1223 =item @output
1224
1225 Ouput from cleartool
1226
1227 =back
1228
1229 =for html </blockquote>
1230
1231 =cut
1232
1233   return (0, ()) if $self->exists;
1234
1235   $comment = Clearcase::setComment $comment;
1236
1237   my ($status, @output);
1238
1239   if ($host && $vbs) {
1240     ($status, @output) = $Clearcase::CC->execute (
1241       "mkvob -tag $self->{tag} $comment -host $host -hpath $vbs "
1242     . "-gpath $vbs $vbs");
1243   } else {
1244     # Note this requires that -stgloc's work and that using -auto is not a 
1245     # problem.
1246     ($status, @output) =
1247       $Clearcase::CC->execute ("mkvob -tag $self->{tag} $comment "
1248     . "-stgloc -auto");
1249   } # if
1250
1251   $self->updateVobInfo;
1252
1253   return ($status, @output);
1254 } # create
1255
1256 sub remove () {
1257   my ($self) = @_;
1258
1259 =pod
1260
1261 =head2 remove
1262
1263 Removed this VOB
1264
1265 Parameters:
1266
1267 =for html <blockquote>
1268
1269 =over
1270
1271 =item none
1272
1273 =back
1274
1275 =for html </blockquote>
1276
1277 Returns:
1278
1279 =for html <blockquote>
1280
1281 =over
1282
1283 =item $status
1284
1285 Status from cleartool
1286
1287 =item @output
1288
1289 Ouput from cleartool
1290
1291 =back
1292
1293 =for html </blockquote>
1294
1295 =cut
1296
1297   return $Clearcase::CC->execute ("rmvob -force $self->{gpath}");
1298 } # remove
1299
1300 sub updateVobInfo ($$) {
1301   my ($self) = @_;
1302
1303   my ($status, @output) = $Clearcase::CC->execute ("lsvob -long $self->{tag}");
1304
1305   # Assuming this vob is an empty shell of an object that the user may possibly
1306   # use the create method on, return our blessings...
1307   return if $status != 0;
1308
1309   foreach (@output) {
1310     if (/Global path: (.*)/) {
1311       $self->{gpath} = $1;
1312     } elsif (/Server host: (.*)/) {
1313       $self->{shost} = $1;
1314     } elsif (/Access: (.*)/) {
1315       $self->{access} = $1;
1316     } elsif (/Mount options: (.*)/) {
1317       $self->{mopts} = $1;
1318     } elsif (/Region: (.*)/) {
1319       $self->{region} = $1;
1320     } elsif (/Active: (.*)/) {
1321       $self->{active} = $1;
1322     } elsif (/Vob tag replica uuid: (.*)/) {
1323       $self->{replica_uuid} = $1;
1324     } elsif (/Vob on host: (.*)/) {
1325       $self->{host} = $1;
1326     } elsif (/Vob server access path: (.*)/) {
1327       $self->{access_path} = $1;
1328     } elsif (/Vob family uuid:  (.*)/) {
1329       $self->{family_uuid} = $1;
1330     } elsif (/Vob registry attributes: (.*)/) {
1331       $self->{vob_registry_attributes} = $1;
1332     } # if
1333  } # foreach
1334  
1335  return;
1336 } # getVobInfo
1337
1338 1;
1339
1340 =pod
1341
1342 =head2 DEPENDENCIES
1343
1344 =head3 ClearSCM Perl Modules
1345
1346 =for html <p><a href="/php/cvs_man.php?file=lib/Clearcase.pm">Clearcase</a></p>
1347
1348 =for html <p><a href="/php/cvs_man.php?file=lib/OSDep.pm">OSdep</a></p>
1349
1350 =head2 BUGS AND LIMITATIONS
1351
1352 There are no known bugs in this module
1353
1354 Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
1355
1356 =head2 LICENSE AND COPYRIGHT
1357
1358 Copyright (c) 2007, ClearSCM, Inc. All rights reserved.
1359
1360 =cut