1$! Compare_curl_source.com 2$! 3$! $Id$ 4$! 5$! This procedure compares the files in two directories and reports the 6$! differences. It is customized for the vmsports repository layout. 7$! 8$! It needs to be customized to the local site directories. 9$! 10$! This is used by me for these purposes: 11$! 1. Compare the original source of a project with an existing 12$! VMS port. 13$! 2. Compare the checked out repository of a project with the 14$! the local working copy to make sure they are in sync. 15$! 3. Keep a copy directory up to date. The third is needed by 16$! me because VMS Backup can create a saveset of files from a 17$! NFS mounted volume. 18$! 19$! First the files in the original source directory which is assumed to be 20$! under source codde control are compared with the copy directory. 21$! 22$! Then the files are are only in the copy directory are listed. 23$! 24$! The result will five diagnostics about of files: 25$! 1. Files that are not generation 1. 26$! 2. Files missing in the copy directory. 27$! 3. Files in the copy directory not in the source directory. 28$! 4. Files different from the source directory. 29$! 5. Files that VMS DIFF can not process. 30$! 31$! This needs to be run on an ODS-5 volume. 32$! 33$! If UPDATE is given as a second parameter, files missing or different in the 34$! copy directory will be updated. 35$! 36$! By default: 37$! The directory src_root:[project_name] will be translated to something like 38$! DISK:[dir.dir.reference.project_name] and this will be used 39$! to calculate DISK:[dir.dir.vms_source.project_name] for the VMS specific 40$! source directory. 41$! 42$! The copy directory is vms_root:[project_name] 43$! The UPDATE parameter is ignored. 44$! 45$! This setting is used to make sure that the working vms directory 46$! and the repository checkout directory have the same contents. 47$! 48$! If P1 is "SRCBCK" then this 49$! The source directory tree is: src_root:[project_name] 50$! The copy directory is src_root1:[project_name] 51$! 52$! src_root1:[project_name] is used by me to work around that VMS backup will 53$! not use NFS as a source directory so I need to make a copy. 54$! 55$! This is to make sure that the backup save set for the unmodified 56$! source is up to date. 57$! 58$! If your repository checkout is not on an NFS mounted volume, you do not 59$! need to use this option or have the logical name src_root1 defined. 60$! 61$! If P1 is "VMSBCK" then this changes the two directories: 62$! The source directory is vms_root:[project_name] 63$! The copy directory is vms_root1:[project_name] 64$! 65$! vms_root:[project_name] is where I do the VMS specific edits. 66$! vms_root1:[project_name] is used by me to work around that VMS backup will 67$! not use NFS as a source directory so I need to make a copy. 68$! 69$! This is to make sure that the backup save set for the unmodified 70$! source is up to date. 71$! 72$! Copyright 2011, John Malmberg 73$! 74$! Permission to use, copy, modify, and/or distribute this software for any 75$! purpose with or without fee is hereby granted, provided that the above 76$! copyright notice and this permission notice appear in all copies. 77$! 78$! THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 79$! WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 80$! MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 81$! ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 82$! WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 83$! ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 84$! OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 85$! 86$! 18-Aug-2011 J. Malmberg 87$!========================================================================== 88$! 89$! Update missing/changed files. 90$ update_file = 0 91$ if (p2 .eqs. "UPDATE") 92$ then 93$ update_file = 1 94$ endif 95$! 96$ myproc = f$environment("PROCEDURE") 97$ myprocdir = f$parse(myproc,,,"DIRECTORY") - "[" - "]" - "<" - ">" 98$ myprocdir = f$edit(myprocdir, "LOWERCASE") 99$ mydefault = f$environment("DEFAULT") 100$ mydir = f$parse(mydefault,,,"DIRECTORY") 101$ mydir = f$edit(mydir, "LOWERCASE") 102$ odelim = f$extract(0, 1, mydir) 103$ mydir = mydir - "[" - "]" - "<" - ">" 104$ mydev = f$parse(mydefault,,,"DEVICE") 105$! 106$ ref = "" 107$ if P1 .eqs. "" 108$ then 109$ ref_base_dir = myprocdir 110$ wrk_base_dir = mydir 111$ update_file = 0 112$ resultd = f$parse("src_root:",,,,"NO_CONCEAL") 113$ resultd = f$edit(resultd, "LOWERCASE") 114$ resultd = resultd - "][" - "><" - ".;" - ".." 115$ resultd_len = f$length(resultd) - 1 116$ delim = f$extract(resultd_len, 1, resultd) 117$ ref_root_base = mydir + delim 118$ resultd = resultd - ref_root_base - "reference." + "vms_source." 119$ ref = resultd + ref_base_dir 120$ wrk = "VMS_ROOT:" + odelim + wrk_base_dir 121$ resultd_len = f$length(resultd) - 1 122$ resultd = f$extract(0, resultd_len, resultd) + delim 123$ ref_root_dir = f$parse(resultd,,,"DIRECTORY") 124$ ref_root_dir = f$edit(ref_root_dir, "LOWERCASE") 125$ ref_root_dir = ref_root_dir - "[" - "]" 126$ ref_base_dir = ref_root_dir + "." + ref_base_dir 127$ endif 128$! 129$ if p1 .eqs. "SRCBCK" 130$ then 131$ ref_base_dir = "curl" 132$ wrk_base_dir = "curl" 133$ ref = "src_root:[" + ref_base_dir 134$ wrk = "src_root1:[" + wrk_base_dir 135$ if update_file 136$ then 137$ if f$search("src_root1:[000000]curl.dir") .eqs. "" 138$ then 139$ create/dir/prot=o:rwed src_root1:[curl] 140$ endif 141$ endif 142$ endif 143$! 144$! 145$ if p1 .eqs. "VMSBCK" 146$ then 147$ ref_base_dir = "curl" 148$ wrk_base_dir = "curl" 149$ ref = "vms_root:[" + ref_base_dir 150$ wrk = "vms_root1:[" + wrk_base_dir 151$ if update_file 152$ then 153$ if f$search("vms_root1:[000000]curl.dir") .eqs. "" 154$ then 155$ create/dir/prot=o:rwed vms_root1:[curl] 156$ endif 157$ endif 158$ endif 159$! 160$! 161$ if ref .eqs. "" 162$ then 163$ write sys$output "Unknown compare type specified!" 164$ exit 44 165$ endif 166$! 167$! 168$! Future - check the device types involved for the 169$! the syntax to check. 170$ ODS2_SYNTAX = 0 171$ NFS_MANGLE = 0 172$ PWRK_MANGLE = 0 173$! 174$ vax = f$getsyi("HW_MODEL") .lt. 1024 175$ if vax 176$ then 177$ ODS2_SYNTAX = 1 178$ endif 179$! 180$ report_missing = 1 181$! 182$ if .not. ODS2_SYNTAX 183$ then 184$ set proc/parse=extended 185$ endif 186$! 187$loop: 188$ ref_spec = f$search("''ref'...]*.*;",1) 189$ if ref_spec .eqs. "" then goto loop_end 190$! 191$ ref_dev = f$parse(ref_spec,,,"DEVICE") 192$ ref_dir = f$parse(ref_spec,,,"DIRECTORY") 193$ ref_dir = f$edit(ref_dir, "LOWERCASE") 194$ ref_name = f$parse(ref_spec,,,"NAME") 195$ ref_type = f$parse(ref_spec,,,"TYPE") 196$! 197$! 198$ rel_path = ref_dir - "[" - ref_base_dir 199$! rel_path_len = f$length(rel_path) - 1 200$! delim = f$extract(rel_path_len, 1, rel_path) 201$! rel_path = rel_path - ".]" - ".>" - "]" - ">" 202$! rel_path = rel_path + delim 203$! 204$ if ODS2_SYNTAX 205$ then 206$! if rel_path .eqs. ".examples.scripts^.noah]" 207$! then 208$! rel_path = ".examples.scripts_noah]" 209$! endif 210$! if rel_path .eqs. ".examples.scripts^.v2]" 211$! then 212$! rel_path = ".examples.scripts_v2]" 213$! endif 214$ endif 215$! 216$ wrk_path = wrk + rel_path 217$! 218$ ref_name_type = ref_name + ref_type 219$! 220$ if ODS2_SYNTAX 221$ then 222$ endif 223$! 224$ wrk_spec = wrk_path + ref_name_type 225$! 226$! 227$ wrk_chk = f$search(wrk_spec, 0) 228$ if wrk_chk .eqs. "" 229$ then 230$ if report_missing 231$ then 232$ write sys$output "''wrk_spec' is missing" 233$ endif 234$ if update_file 235$ then 236$ copy/log 'ref_spec' 'wrk_spec' 237$ endif 238$ goto loop 239$ endif 240$! 241$ wrk_name = f$parse(wrk_spec,,,"NAME") 242$ wrk_type = f$parse(wrk_spec,,,"TYPE") 243$ wrk_fname = wrk_name + wrk_type" 244$ ref_fname = ref_name + ref_type 245$! 246$ if ref_fname .nes. wrk_fname 247$ then 248$ write sys$output "''wrk_spc' wrong name, should be ""''ref_fname'""" 249$ endif 250$! 251$ ref_type = f$edit(ref_type, "UPCASE") 252$ if ref_type .eqs. ".DIR" then goto loop 253$! 254$ if ODS2_SYNTAX 255$ then 256$ ref_fname = f$edit(ref_fname, "LOWERCASE") 257$ endif 258$! 259$! These files are in the wrong format for VMS diff, and we don't change them. 260$ ref_skip = 0 261$ if ref_type .eqs. ".PDF" then ref_skip = 1 262$ if ref_type .eqs. ".HTML" then ref_skip = 1 263$ if ref_type .eqs. ".HQX" then ref_skip = 1 264$ if ref_type .eqs. ".P12" then ref_skip = 1 265$ if ref_type .eqs. "." 266$ then 267$ if f$locate("test", ref_fname) .eq. 0 then ref_skip = 1 268$ if ref_fname .eqs. "configure." then ref_skip = 1 269$ endif 270$ if ref_fname .eqs. "MACINSTALL.TXT" then ref_skip = 1 271$ if ref_fname .eqs. "$macinstall.txt" then ref_skip = 1 272$ if ref_fname .eqs. "curl.mcp$5nxml$5nsit$5nhqx" then ref_skip = 1 273$ if ref_fname .eqs. "curl_GUSIConfig.cpp" then ref_skip = 1 274$ if ref_fname .eqs. "curl_$gusic$onfig.cpp" then ref_skip = 1 275$ if ref_fname .eqs. "macos_main.cpp" then ref_skip = 1 276$! 277$! 278$ if ref_skip .ne. 0 279$ then 280$ if report_missing 281$ then 282$ write sys$output "Skipping diff of ''ref_fname'" 283$ endif 284$ goto loop 285$ endif 286$! 287$! 288$ wrk_ver = f$parse(wrk_chk,,,"VERSION") 289$ if wrk_ver .nes. ";1" 290$ then 291$ write sys$output "Version for ''wrk_spec' is not 1" 292$ endif 293$ set noon 294$ diff/out=nl: 'wrk_spec' 'ref_spec' 295$ if $severity .nes. "1" 296$ then 297$ write sys$output "''wrk_spec' is different from ''ref_spec'" 298$ if update_file 299$ then 300$ delete 'wrk_spec';* 301$ copy/log 'ref_spec' 'wrk_spec' 302$ endif 303$ endif 304$ set on 305$ 306$! 307$ goto loop 308$loop_end: 309$! 310$! 311$missing_loop: 312$! For missing loop, check the latest generation. 313$ ref_spec = f$search("''wrk'...]*.*;") 314$ if ref_spec .eqs. "" then goto missing_loop_end 315$! 316$ ref_dev = f$parse(ref_spec,,,"DEVICE") 317$ ref_dir = f$parse(ref_spec,,,"DIRECTORY") 318$ ref_dir = f$edit(ref_dir, "LOWERCASE") 319$ ref_name = f$parse(ref_spec,,,"NAME") 320$ ref_type = f$parse(ref_spec,,,"TYPE") 321$ ref_name_type = ref_name + ref_type 322$! 323$ rel_path = ref_dir - "[" - wrk_base_dir 324$! 325$! 326$ wrk_path = ref + rel_path 327$ wrk_spec = wrk_path + ref_name + ref_type 328$ wrk_name = f$parse(wrk_spec,,,"NAME") 329$ wrk_type = f$parse(wrk_spec,,,"TYPE") 330$! 331$ wrk_fname = wrk_name + wrk_type" 332$ ref_fname = ref_name + ref_type 333$! 334$ wrk_skip = 0 335$ ref_utype = f$edit(ref_type,"UPCASE") 336$ ref_ufname = f$edit(ref_fname,"UPCASE") 337$! 338$ if wrk_skip .eq. 0 339$ then 340$ wrk_chk = f$search(wrk_spec, 0) 341$ if wrk_chk .eqs. "" 342$ then 343$ if report_missing 344$ then 345$ write sys$output "''wrk_spec' is missing" 346$ endif 347$ goto missing_loop 348$ endif 349$ else 350$ goto missing_loop 351$ endif 352$! 353$ if ref_fname .nes. wrk_fname 354$ then 355$ write sys$output "''wrk_spc' wrong name, should be ""''ref_fname'""" 356$ endif 357$! 358$ if ref_utype .eqs. ".DIR" then goto missing_loop 359$! 360$ wrk_ver = f$parse(wrk_chk,,,"VERSION") 361$ if wrk_ver .nes. ";1" 362$ then 363$ write sys$output "Version for ''wrk_spec' is not 1" 364$ endif 365$! 366$ goto missing_loop 367$! 368$! 369$missing_loop_end: 370$! 371$exit 372