Commit c29fa84
committed
Optionally set
Users can opt-in to setting each CI job's environment variable
`COMMODORE_CATALOG_COMPILE_PROCESSES` based on the cluster's CPU limit
by setting the environment variable `COMMODORE_PROCESSES_FROM_CPU_LIMIT`
to a non-empty value in their GitLab CI config.
For CI configurations that opt-in to this feature, we compute the
Commodore process count based on the cluster's CPU limit by rounding
down to the next nearest integer, clamped at 1.
Currently, the CPU limit parser supports unsuffixed CPU limits and
milli-CPU CPU limits and will raise an error for other CPU limit
configurations.
For CI configurations that don't opt-in to this feature,
`COMMODORE_CATALOG_COMPILE_PROCESSES` is set to `0` which allows
Commodore to auto-detect the number of worker processes to use,
preserving the Commodore v1.33.1 and older behavior.
diff --git a/gitlab/bin/step-render-pipeline b/gitlab/bin/step-render-pipeline
index 23b40f1..1572c1e 100755
--- a/gitlab/bin/step-render-pipeline
+++ b/gitlab/bin/step-render-pipeline
@@ -20,5 +20,6 @@ jsonnet \
--ext-str cluster_catalog_urls="${cluster_catalog_urls}" \
--ext-str server_fqdn="${CI_SERVER_FQDN}" \
--ext-str server_ssh_host="${CI_SERVER_SHELL_SSH_HOST}" \
+ --ext-str commodore_proc_count="${COMMODORE_PROCESSES_FROM_CPU_LIMIT:-}" \
/opt/commodore-compile.jsonnet \
>generated-commodore-compile.yml
diff --git a/gitlab/commodore-compile.jsonnet b/gitlab/commodore-compile.jsonnet
index edb7c9b..76a49fd 100644
--- a/gitlab/commodore-compile.jsonnet
+++ b/gitlab/commodore-compile.jsonnet
@@ -103,6 +103,35 @@ local gitInsteadOf(cluster) =
'git config --add --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@%(gitlab_fqdn)s".insteadOf ssh://git@%(ssh_hostport)s' % gitlab_params,
] + catalogInsteadOf;
+local cpu_limit(cluster) = std.get(cpu_limits, cluster, '2');
+
+// Compute Commodore process count based on CPU limit for the cluster by
+// rounding down to the next nearest integer, clamped at 1.
+local proc_count(cluster) =
+ local parseK8sCPU(cl) =
+ local val = if std.endsWith(cl, 'm') then
+ {
+ isMilli: true,
+ num: cl[:-1],
+ }
+ else {
+ isMilli: false,
+ num: cl,
+ };
+ local clnum = std.parseYaml(val.num);
+ if std.isString(clnum) then
+ error 'Failed to parse K8s CPU limit %s: the parser currently only supports unsuffixed values and milli-CPU values' % cl
+ else
+ if val.isMilli then clnum / 1000 else clnum;
+ if std.extVar('commodore_proc_count') != '' then (
+ local cl = parseK8sCPU(cpu_limit(cluster));
+ if cl >= 1 then std.floor(cl) else 1
+ ) else
+ // Commodore auto-selects the number of worker processes when the value of
+ // the flag/envvar is 0. This matches the behavior of Commodore v1.33.1
+ // and older.
+ 0;
+
local compile_job(cluster) =
{
stage: 'build',
@@ -114,8 +143,9 @@ local compile_job(cluster) =
{
KUBERNETES_MEMORY_LIMIT: std.get(memory_limits, cluster, '3Gi'),
KUBERNETES_MEMORY_REQUEST: std.get(memory_requests, cluster, '3Gi'),
- KUBERNETES_CPU_LIMIT: std.get(cpu_limits, cluster, '2'),
+ KUBERNETES_CPU_LIMIT: cpu_limit(cluster),
KUBERNETES_CPU_REQUEST: std.get(cpu_requests, cluster, '800m'),
+ COMMODORE_CATALOG_COMPILE_PROCESSES: proc_count(cluster),
},
before_script:
[
@@ -149,8 +179,9 @@ local deploy_job(cluster) =
{
KUBERNETES_MEMORY_LIMIT: std.get(memory_limits, cluster, '3Gi'),
KUBERNETES_MEMORY_REQUEST: std.get(memory_requests, cluster, '3Gi'),
- KUBERNETES_CPU_LIMIT: std.get(cpu_limits, cluster, '2'),
+ KUBERNETES_CPU_LIMIT: cpu_limit(cluster),
KUBERNETES_CPU_REQUEST: std.get(cpu_requests, cluster, '800m'),
+ COMMODORE_CATALOG_COMPILE_PROCESSES: proc_count(cluster),
},
image:
{
diff --git a/gitlab/tests/golden/custom-ssh-port.yml b/gitlab/tests/golden/custom-ssh-port.yml
index f29a0a9..fd98c3c 100644
--- a/gitlab/tests/golden/custom-ssh-port.yml
+++ b/gitlab/tests/golden/custom-ssh-port.yml
@@ -29,6 +29,7 @@
],
"stage": "build",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 0,
"KUBERNETES_CPU_LIMIT": "2",
"KUBERNETES_CPU_REQUEST": "800m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
@@ -58,6 +59,7 @@
],
"stage": "deploy",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 0,
"KUBERNETES_CPU_LIMIT": "2",
"KUBERNETES_CPU_REQUEST": "800m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
diff --git a/gitlab/tests/golden/default.yml b/gitlab/tests/golden/default.yml
index f29a0a9..fd98c3c 100644
--- a/gitlab/tests/golden/default.yml
+++ b/gitlab/tests/golden/default.yml
@@ -29,6 +29,7 @@
],
"stage": "build",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 0,
"KUBERNETES_CPU_LIMIT": "2",
"KUBERNETES_CPU_REQUEST": "800m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
@@ -58,6 +59,7 @@
],
"stage": "deploy",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 0,
"KUBERNETES_CPU_LIMIT": "2",
"KUBERNETES_CPU_REQUEST": "800m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
diff --git a/gitlab/tests/golden/external-catalog.yml b/gitlab/tests/golden/external-catalog.yml
index b5c82c8..f7436e9 100644
--- a/gitlab/tests/golden/external-catalog.yml
+++ b/gitlab/tests/golden/external-catalog.yml
@@ -29,6 +29,7 @@
],
"stage": "build",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 0,
"KUBERNETES_CPU_LIMIT": "2",
"KUBERNETES_CPU_REQUEST": "800m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
@@ -58,6 +59,7 @@
],
"stage": "deploy",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 0,
"KUBERNETES_CPU_LIMIT": "2",
"KUBERNETES_CPU_REQUEST": "800m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
@@ -94,6 +96,7 @@
],
"stage": "build",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 0,
"KUBERNETES_CPU_LIMIT": "2",
"KUBERNETES_CPU_REQUEST": "800m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
@@ -123,6 +126,7 @@
],
"stage": "deploy",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 0,
"KUBERNETES_CPU_LIMIT": "2",
"KUBERNETES_CPU_REQUEST": "800m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
@@ -157,6 +161,7 @@
],
"stage": "build",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 0,
"KUBERNETES_CPU_LIMIT": "2",
"KUBERNETES_CPU_REQUEST": "800m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
@@ -184,6 +189,7 @@
],
"stage": "deploy",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 0,
"KUBERNETES_CPU_LIMIT": "2",
"KUBERNETES_CPU_REQUEST": "800m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
diff --git a/gitlab/tests/golden/k8s-resources.yml b/gitlab/tests/golden/k8s-resources.yml
index 15fe5c3..0566c3e 100644
--- a/gitlab/tests/golden/k8s-resources.yml
+++ b/gitlab/tests/golden/k8s-resources.yml
@@ -29,6 +29,7 @@
],
"stage": "build",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 2,
"KUBERNETES_CPU_LIMIT": "2500m",
"KUBERNETES_CPU_REQUEST": "800m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
@@ -58,12 +59,80 @@
],
"stage": "deploy",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 2,
"KUBERNETES_CPU_LIMIT": "2500m",
"KUBERNETES_CPU_REQUEST": "800m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
"KUBERNETES_MEMORY_REQUEST": "3Gi"
}
},
+ "c-cluster-id-1000_compile": {
+ "artifacts": {
+ "expire_in": "1 week",
+ "paths": [
+ "diff.txt"
+ ]
+ },
+ "before_script": [
+ "install --directory --mode=0700 ~/.ssh",
+ "echo \"$SSH_KNOWN_HOSTS\" >> ~/.ssh/known_hosts",
+ "echo \"$SSH_CONFIG\" >> ~/.ssh/config"
+ ],
+ "image": {
+ "name": "docker.io/projectsyn/commodore:v1.34.0"
+ },
+ "rules": [
+ {
+ "if": "$CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH"
+ }
+ ],
+ "script": [
+ "git config --add --global url.\"https://gitlab-ci-token:${CI_JOB_TOKEN}@git.vshn.net:80\".insteadOf ssh://git@${CI_SERVER_SHELL_SSH_HOST}",
+ "git config --add --global url.\"https://gitlab-ci-token:${CI_JOB_TOKEN}@git.vshn.net:80\".insteadOf ssh://git@${CI_SERVER_SHELL_SSH_HOST}${CI_SERVER_SHELL_SSH_PORT:+:${CI_SERVER_SHELL_SSH_PORT}}",
+ "git config --add --global url.\"https://gitlab-ci-token:${ACCESS_TOKEN_c_cluster_id_1000}@git.vshn.net:80/cluster-catalogs/c-cluster-id-1000.git\".insteadOf ssh://git@${CI_SERVER_SHELL_SSH_HOST}/cluster-catalogs/c-cluster-id-1000.git",
+ "git config --add --global url.\"https://gitlab-ci-token:${ACCESS_TOKEN_c_cluster_id_1000}@git.vshn.net:80/cluster-catalogs/c-cluster-id-1000.git\".insteadOf ssh://git@${CI_SERVER_SHELL_SSH_HOST}${CI_SERVER_SHELL_SSH_PORT:+:${CI_SERVER_SHELL_SSH_PORT}}/cluster-catalogs/c-cluster-id-1000.git",
+ "/usr/local/bin/entrypoint.sh commodore catalog compile --tenant-repo-revision-override $CI_COMMIT_SHA c-cluster-id-1000",
+ "(cd catalog/ && git --no-pager diff --staged --output ../diff.txt)"
+ ],
+ "stage": "build",
+ "variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 1,
+ "KUBERNETES_CPU_LIMIT": "800m",
+ "KUBERNETES_CPU_REQUEST": "800m",
+ "KUBERNETES_MEMORY_LIMIT": "3Gi",
+ "KUBERNETES_MEMORY_REQUEST": "3Gi"
+ }
+ },
+ "c-cluster-id-1000_deploy": {
+ "before_script": [
+ "install --directory --mode=0700 ~/.ssh",
+ "echo \"$SSH_KNOWN_HOSTS\" >> ~/.ssh/known_hosts",
+ "echo \"$SSH_CONFIG\" >> ~/.ssh/config"
+ ],
+ "image": {
+ "name": "docker.io/projectsyn/commodore:v1.34.0"
+ },
+ "rules": [
+ {
+ "if": "$CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH"
+ }
+ ],
+ "script": [
+ "git config --add --global url.\"https://gitlab-ci-token:${CI_JOB_TOKEN}@git.vshn.net:80\".insteadOf ssh://git@${CI_SERVER_SHELL_SSH_HOST}",
+ "git config --add --global url.\"https://gitlab-ci-token:${CI_JOB_TOKEN}@git.vshn.net:80\".insteadOf ssh://git@${CI_SERVER_SHELL_SSH_HOST}${CI_SERVER_SHELL_SSH_PORT:+:${CI_SERVER_SHELL_SSH_PORT}}",
+ "git config --add --global url.\"https://gitlab-ci-token:${ACCESS_TOKEN_c_cluster_id_1000}@git.vshn.net:80/cluster-catalogs/c-cluster-id-1000.git\".insteadOf ssh://git@${CI_SERVER_SHELL_SSH_HOST}/cluster-catalogs/c-cluster-id-1000.git",
+ "git config --add --global url.\"https://gitlab-ci-token:${ACCESS_TOKEN_c_cluster_id_1000}@git.vshn.net:80/cluster-catalogs/c-cluster-id-1000.git\".insteadOf ssh://git@${CI_SERVER_SHELL_SSH_HOST}${CI_SERVER_SHELL_SSH_PORT:+:${CI_SERVER_SHELL_SSH_PORT}}/cluster-catalogs/c-cluster-id-1000.git",
+ "/usr/local/bin/entrypoint.sh commodore catalog compile --push c-cluster-id-1000"
+ ],
+ "stage": "deploy",
+ "variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 1,
+ "KUBERNETES_CPU_LIMIT": "800m",
+ "KUBERNETES_CPU_REQUEST": "800m",
+ "KUBERNETES_MEMORY_LIMIT": "3Gi",
+ "KUBERNETES_MEMORY_REQUEST": "3Gi"
+ }
+ },
"c-cluster-id-1234_compile": {
"artifacts": {
"expire_in": "1 week",
@@ -94,7 +163,8 @@
],
"stage": "build",
"variables": {
- "KUBERNETES_CPU_LIMIT": "2",
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 1,
+ "KUBERNETES_CPU_LIMIT": "1.6",
"KUBERNETES_CPU_REQUEST": "1200m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
"KUBERNETES_MEMORY_REQUEST": "2Gi"
@@ -123,7 +193,8 @@
],
"stage": "deploy",
"variables": {
- "KUBERNETES_CPU_LIMIT": "2",
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 1,
+ "KUBERNETES_CPU_LIMIT": "1.6",
"KUBERNETES_CPU_REQUEST": "1200m",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
"KUBERNETES_MEMORY_REQUEST": "2Gi"
@@ -159,6 +230,7 @@
],
"stage": "build",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 2,
"KUBERNETES_CPU_LIMIT": "2",
"KUBERNETES_CPU_REQUEST": "2",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
@@ -188,6 +260,7 @@
],
"stage": "deploy",
"variables": {
+ "COMMODORE_CATALOG_COMPILE_PROCESSES": 2,
"KUBERNETES_CPU_LIMIT": "2",
"KUBERNETES_CPU_REQUEST": "2",
"KUBERNETES_MEMORY_LIMIT": "3Gi",
diff --git a/gitlab/tests/k8s-resources.env b/gitlab/tests/k8s-resources.env
index 6cb7afb..d0cc5c4 100644
--- a/gitlab/tests/k8s-resources.env
+++ b/gitlab/tests/k8s-resources.env
@@ -1,6 +1,7 @@
-CLUSTERS="c-cluster-id-1234 c-cluster-id-5678 c-cluster-id-0099"
-CLUSTER_CATALOG_URLS="c-cluster-id-1234=ssh://git@git.vshn.net/cluster-catalogs/c-cluster-id-1234.git c-cluster-id-5678=ssh://git@git.vshn.net/cluster-catalogs/c-cluster-id-5678.git c-cluster-id-0099=ssh://git@git.vshn.net/cluster-catalogs/c-cluster-id-0099.git "
+CLUSTERS="c-cluster-id-1234 c-cluster-id-5678 c-cluster-id-0099 c-cluster-id-1000"
+CLUSTER_CATALOG_URLS="c-cluster-id-1234=ssh://git@git.vshn.net/cluster-catalogs/c-cluster-id-1234.git c-cluster-id-5678=ssh://git@git.vshn.net/cluster-catalogs/c-cluster-id-5678.git c-cluster-id-0099=ssh://git@git.vshn.net/cluster-catalogs/c-cluster-id-0099.git c-cluster-id-1000=ssh://git@git.vshn.net/cluster-catalogs/c-cluster-id-1000.git "
MEMORY_LIMITS="c-cluster-id-1234=3Gi"
MEMORY_REQUESTS="c-cluster-id-1234=2Gi"
CPU_REQUESTS="c-cluster-id-1234=1200m c-cluster-id-5678=2"
-CPU_LIMITS="c-cluster-id-0099=2500m"
+CPU_LIMITS="c-cluster-id-1234=1.6 c-cluster-id-0099=2500m c-cluster-id-1000=800m"
+COMMODORE_PROCESSES_FROM_CPU_LIMIT="true"
diff --git a/gitlab/tests/run-instance.sh b/gitlab/tests/run-instance.sh
index eaff60f..5176461 100755
--- a/gitlab/tests/run-instance.sh
+++ b/gitlab/tests/run-instance.sh
@@ -16,4 +16,5 @@ jsonnet --ext-str clusters="$CLUSTERS" \
--ext-str memory_requests="${MEMORY_REQUESTS:-}" \
--ext-str cpu_limits="${CPU_LIMITS:-}" \
--ext-str cpu_requests="${CPU_REQUESTS:-}" \
+ --ext-str commodore_proc_count="${COMMODORE_PROCESSES_FROM_CPU_LIMIT:-}" \
commodore-compile.jsonnetCOMMODORE_CATALOG_COMPILE_PROCESSES based on cluster's CPU limit1 parent 1216264 commit c29fa84
8 files changed
Lines changed: 124 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| 23 | + | |
23 | 24 | | |
24 | 25 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
106 | 135 | | |
107 | 136 | | |
108 | 137 | | |
| |||
114 | 143 | | |
115 | 144 | | |
116 | 145 | | |
117 | | - | |
| 146 | + | |
118 | 147 | | |
| 148 | + | |
119 | 149 | | |
120 | 150 | | |
121 | 151 | | |
| |||
149 | 179 | | |
150 | 180 | | |
151 | 181 | | |
152 | | - | |
| 182 | + | |
153 | 183 | | |
| 184 | + | |
154 | 185 | | |
155 | 186 | | |
156 | 187 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
58 | 59 | | |
59 | 60 | | |
60 | 61 | | |
| 62 | + | |
61 | 63 | | |
62 | 64 | | |
63 | 65 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
58 | 59 | | |
59 | 60 | | |
60 | 61 | | |
| 62 | + | |
61 | 63 | | |
62 | 64 | | |
63 | 65 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
58 | 59 | | |
59 | 60 | | |
60 | 61 | | |
| 62 | + | |
61 | 63 | | |
62 | 64 | | |
63 | 65 | | |
| |||
94 | 96 | | |
95 | 97 | | |
96 | 98 | | |
| 99 | + | |
97 | 100 | | |
98 | 101 | | |
99 | 102 | | |
| |||
123 | 126 | | |
124 | 127 | | |
125 | 128 | | |
| 129 | + | |
126 | 130 | | |
127 | 131 | | |
128 | 132 | | |
| |||
157 | 161 | | |
158 | 162 | | |
159 | 163 | | |
| 164 | + | |
160 | 165 | | |
161 | 166 | | |
162 | 167 | | |
| |||
184 | 189 | | |
185 | 190 | | |
186 | 191 | | |
| 192 | + | |
187 | 193 | | |
188 | 194 | | |
189 | 195 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
58 | 59 | | |
59 | 60 | | |
60 | 61 | | |
| 62 | + | |
61 | 63 | | |
62 | 64 | | |
63 | 65 | | |
64 | 66 | | |
65 | 67 | | |
66 | 68 | | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
67 | 136 | | |
68 | 137 | | |
69 | 138 | | |
| |||
94 | 163 | | |
95 | 164 | | |
96 | 165 | | |
97 | | - | |
| 166 | + | |
| 167 | + | |
98 | 168 | | |
99 | 169 | | |
100 | 170 | | |
| |||
123 | 193 | | |
124 | 194 | | |
125 | 195 | | |
126 | | - | |
| 196 | + | |
| 197 | + | |
127 | 198 | | |
128 | 199 | | |
129 | 200 | | |
| |||
159 | 230 | | |
160 | 231 | | |
161 | 232 | | |
| 233 | + | |
162 | 234 | | |
163 | 235 | | |
164 | 236 | | |
| |||
188 | 260 | | |
189 | 261 | | |
190 | 262 | | |
| 263 | + | |
191 | 264 | | |
192 | 265 | | |
193 | 266 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
2 | | - | |
| 1 | + | |
| 2 | + | |
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
| 6 | + | |
| 7 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| 19 | + | |
19 | 20 | | |
0 commit comments