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 code 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 - 2020, 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