Merge "Hard-code openjdk8 for validate job"
[releng/builder.git] / scripts / branch_cut / branch_cut.awk
1 #!/usr/bin/awk -f
2 # SPDX-License-Identifier: EPL-1.0
3 ##############################################################################
4 # Copyright (c) 2017 The Linux Foundation and others.
5 #
6 # All rights reserved. This program and the accompanying materials
7 # are made available under the terms of the Eclipse Public License v1.0
8 # which accompanies this distribution, and is available at
9 # http://www.eclipse.org/legal/epl-v10.html
10 #
11 ##############################################################################
12
13 BEGIN {
14     new_tag                     = new_reltag       # new release tag
15     curr_tag                    = curr_reltag      # current release tag
16     prev_tag                    = prev_reltag      # previous release tag
17
18     new_release                 = tolower(new_tag)
19     curr_release                = tolower(curr_tag)
20     prev_release                = tolower(prev_tag)
21
22     ws = "[\\t ]*"                                 # white-spaces
23     startpat = "^" ws "- project:"                 # start pattern
24     endpat = startpat                              # end pattern
25     op = "^" ws "---" ws "$"                       # match files starts with "---"
26
27     next_release_tag            = "^" ws "next-release-tag: " curr_tag
28     master                      = "'master'"
29     new_branch                  = "'stable/" new_release "'"
30     curr_branch                 = "'stable/" curr_release "'"
31     prev_branch                 = "'stable/" prev_release "'"
32
33     # replace block to add new release
34     new_rel_yaml_tag            = "- " new_release ":";
35     br_master_yaml_tag          = "    branch: 'master'";
36     jre_yaml_tag                = "    jre: 'openjdk8'";
37     curr_rel_yaml_tag           = "- " curr_release ":";
38     br_stable_curr_yaml_tag     = "    branch: 'stable/" curr_release "'";
39
40     # replace block for autorelease-projects
41     #new_rel_yaml_tag           = "- " new_release ":";
42     next_rel_tag_new_yaml_tag   = "    next-release-tag: " new_tag;
43     #br_master_yaml_tag         = "    branch: 'master'";
44     jdk_yaml_tag                = "    jdk: 'openjdk8'";
45     intg_test_yaml_tag          = "    integration-test: " new_release;
46     #curr_rel_yaml_tag          = "- " curr_release ":";
47     next_rel_tag_curr_yaml_tag  = "    next-release-tag: " curr_tag;
48     #br_stable_curr_yaml_tag    = "    branch: 'stable/" curr_release "'";
49
50     # search patterns
51     smaster = "^" ws "- master:"
52     sstream = "^" ws "stream:"
53     srelease = "^" ws "- " curr_release ":"
54     #if (l ~ next_release_tag) { next_release_tag = 1; continue; }
55     sbranch = "^" ws "branch: " master
56
57     debug = 0                                   # set to 1 to print debug info
58     file_format = 2                             # project stream format
59
60     release_found = 0
61     stream_found = 0
62     nrt_found = 0
63 }
64
65 {
66     # exit if release info is not available
67     if ((length(new_release) == 0 || length(curr_release) == 0)) {
68         exit;
69     }
70
71     # read all lines of the file into an array
72     file[NR] = $0
73 }
74
75 END {
76     n = NR                                      # total number of lines
77     find_blks()                                 # gets number of blocks between start/end pattern
78     process_blk(arr_bs[1], arr_be[1], 1)        # pass start and end of each block and process first block
79     update_file(arr_be[1])                      # write processed content
80
81     if (debug) {
82         print "number of blocks="nb;
83         print "total records in file[]="length(f);
84         print "size of firstblk[]="length(firstblk);
85         print "size of newblk[]="length(newblk);
86         print "size of oldmaster[]="length(oldmaster);
87         print "size of newblk[]="length(newblk);
88     }
89 }
90
91 function find_blks(   i, l, bs, be) {
92     for (i = 1; i <= n; i++) {
93         l = file[i]
94         if (l ~ startpat) project = 1                        # start pattern
95         if (bs > be && l ~ endpat) arr_be[++be] = i - 1      # block end
96         if (           l ~ startpat) arr_bs[++bs] = i - 1    # block start
97     }
98     nb = be
99
100     # to handle files with single blocks
101     if (nb == 0 && length(file) > 1 && project == 1) {
102         nb = 1
103         arr_bs[1] = 1                               # start after line '---'
104         arr_be[1] = length(file)                    # set length of the file
105     }
106
107     if (debug) {
108         for (i = 1; i < nb; i++)
109             print "find_blks: nb=" nb " arr_bs[" i "]="arr_bs[i]" arr_be[" i "]="arr_be[i];
110     }
111 }
112
113 function process_blk(bs, be, bn,   i, l) {
114     if (debug) {
115         print "process_blk: bn=" bn ", bs=" bs " ,be=" be
116     }
117
118     # get the first block
119     for (i = bs + 1; i <= be ; i++) {
120         l = file[i]
121         # determine file format
122         if (l ~ /stream:/) {
123             x=index(l,":")
124             s = substr(l, x+2, length(l) - x)
125             if (s == curr_release || s == new_release) {
126                 file_format = 1
127             } else if (length(s) == 0 ) {
128                 file_format = 0
129             }
130         }
131         firstblk[++nex] = l
132     }
133
134     if (debug) {
135         print "process_blk: stream='" s "' length(s)=" length(s)" file_format='" file_format "'"
136     }
137
138     # Handle single stream format
139     if (file_format == 1) {
140         # create new block to be inserted
141         for (i = 1; i <= length(firstblk); i++) {
142             l = firstblk[i]
143             if (l ~ /name:|stream:/) sub(curr_release, new_release, l)
144             newblk[++nex1] = l
145         }
146         # re-create old block and change master to stable/branch
147         for (i = 1; i <= length(firstblk)-1; i++) {
148             l = firstblk[i]
149             if (l ~ /branch:/) sub(master, curr_branch, l)
150             oldmaster[++nex2] = l
151         }
152     } else if (file_format == 0) {
153         # Handle multi-stream format
154         for (i = 1; i <= length(firstblk)-1; i++) {
155             l = firstblk[i]
156             if (l ~ sstream) { stream_found = 1; }
157             if (l ~ srelease) { release_found = 1; indent = substr(l, 1, index(l, "-")-1); continue; }
158             if (l ~ next_release_tag) { nrt_found = 1; continue; }
159             if (l ~ sbranch) {
160                 # append lines
161                 if (stream_found && release_found && !nrt_found) {
162                     newblk[++nex3] = indent new_rel_yaml_tag;
163                     newblk[++nex3] = indent br_master_yaml_tag;
164                     newblk[++nex3] = indent jre_yaml_tag;
165                     newblk[++nex3] = indent curr_rel_yaml_tag;
166                     newblk[++nex3] = indent br_stable_curr_yaml_tag;
167                     stream_found = 0; release_found = 0;
168                     continue;
169                 }
170                 if (stream_found && release_found && nrt_found) {
171                     newblk[++nex3] = indent new_rel_yaml_tag;
172                     newblk[++nex3] = indent next_rel_tag_new_yaml_tag;
173                     newblk[++nex3] = indent br_master_yaml_tag;
174                     newblk[++nex3] = indent jdk_yaml_tag;
175                     newblk[++nex3] = indent intg_test_yaml_tag;
176                     newblk[++nex3] = indent curr_rel_yaml_tag;
177                     newblk[++nex3] = indent next_rel_tag_curr_yaml_tag;
178                     newblk[++nex3] = indent br_stable_curr_yaml_tag;
179                     stream_found = 0; release_found = 0; nrt_found=0;
180                     continue;
181                 }
182             }
183             newblk[++nex3] = l
184
185             if (debug) {
186                 print "process_blk: append(newblk[]) : stream="stream" release_found="release_found
187             }
188         }
189     } else {
190         # exit on unknown file format
191         exit;
192     }
193 }
194
195 function update_file(be,   i, j, l) {
196     i = 1
197     # handle lines before "---"
198     while (i <= n) {
199         print l = file[i++]
200         if (l ~ op) break
201     }
202
203     if (debug) {
204         print "writing master block"
205     }
206
207     # Handle single stream format
208     if (file_format == 1) {
209         for (j = 1; j <= nex1; j++)                   # write new branch block
210             print newblk[j]
211
212         if (debug) {
213             print "writing stable block"
214         }
215
216         for (j = 1; j <= nex2; j++)                   # write updated branch block
217             print oldmaster[j]
218
219     # Handle multi-stream format
220     } else if (file_format == 0) {
221         # print the first block
222         for (j = 1; j <= nex3; j++)                   # write multi-stream block
223             print newblk[j]
224     }
225
226     if (debug) {
227         print "writing rest of the file"
228     }
229
230     while (be <= n) {                                 # write rest of the file
231         print file[be++]
232     }
233 }