Skip to content

Commit 1d74d8b

Browse files
authored
Merge pull request #6029 from kit-ty-kate/nullify-pos-effective
Nullify positions of the extensions fields in OpamFile.OPAM.effective_part
2 parents 62ad0c2 + 764f282 commit 1d74d8b

File tree

6 files changed

+303
-1
lines changed

6 files changed

+303
-1
lines changed

master_changes.md

+3
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ users)
4141
## Var/Option
4242

4343
## Update / Upgrade
44+
* Fix `opam upgrade` wanting to recompile opam files containing the `x-env-path-rewrite` field [#6029 @kit-ty-kate - fix #6028]
4445

4546
## Tree
4647

@@ -102,6 +103,7 @@ users)
102103

103104
## Reftests
104105
### Tests
106+
* add a complete test to make sure effectively_equal does not take the location of the fields into account [#6029 @kit-ty-kate]
105107

106108
### Engine
107109

@@ -121,5 +123,6 @@ users)
121123
## opam-solver
122124

123125
## opam-format
126+
* `OpamTypesBase`: Add `nullify_pos_map` and `nullify_pos_value` [#6029 @kit-ty-kate]
124127

125128
## opam-core

src/format/opamFile.ml

+4-1
Original file line numberDiff line numberDiff line change
@@ -3629,7 +3629,10 @@ module OPAM = struct
36293629

36303630
(* We keep only `x-env-path-rewrite` as it affects build/install *)
36313631
extensions =
3632-
OpamStd.String.Map.filter (fun x _ -> String.equal rewrite_xfield x)
3632+
OpamStd.String.Map.filter_map (fun k v ->
3633+
if String.equal rewrite_xfield k
3634+
then Some (OpamTypesBase.nullify_pos_value v)
3635+
else None)
36333636
t.extensions;
36343637

36353638
url = OpamStd.Option.map effective_url t.url;

src/format/opamTypesBase.ml

+50
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,56 @@ let pos_null =
6262
stop = -1, -1;
6363
}
6464
let nullify_pos pelem = {pelem; pos = pos_null}
65+
let nullify_pos_map f {pelem; pos = _} = nullify_pos (f pelem)
66+
67+
let rec nullify_pos_value {pelem; pos = _} =
68+
nullify_pos @@
69+
match pelem with
70+
| Bool b -> Bool (b : bool)
71+
| Int i -> Int (i : int)
72+
| String s -> String (s : string)
73+
| Relop (relop, v1, v2) ->
74+
Relop
75+
(nullify_pos_map
76+
(fun (x : OpamParserTypes.FullPos.relop_kind) -> x)
77+
relop,
78+
nullify_pos_value v1,
79+
nullify_pos_value v2)
80+
| Prefix_relop (relop, v) ->
81+
Prefix_relop
82+
(nullify_pos_map
83+
(fun (x : OpamParserTypes.FullPos.relop_kind) -> x)
84+
relop,
85+
nullify_pos_value v)
86+
| Logop (logop, v1, v2) ->
87+
Logop
88+
(nullify_pos_map
89+
(fun (x : OpamParserTypes.FullPos.logop_kind) -> x)
90+
logop,
91+
nullify_pos_value v1,
92+
nullify_pos_value v2)
93+
| Pfxop (pfxop, v) ->
94+
Pfxop
95+
(nullify_pos_map
96+
(fun (x : OpamParserTypes.FullPos.pfxop_kind) -> x)
97+
pfxop,
98+
nullify_pos_value v)
99+
| Ident s -> Ident (s : string)
100+
| List {pelem = l; pos = _} ->
101+
List (nullify_pos (List.map nullify_pos_value l))
102+
| Group {pelem = l; pos = _} ->
103+
Group (nullify_pos (List.map nullify_pos_value l))
104+
| Option (v, {pelem = filter; pos = _}) ->
105+
Option
106+
(nullify_pos_value v,
107+
nullify_pos (List.map nullify_pos_value filter))
108+
| Env_binding (v1, env_update_op, v2) ->
109+
Env_binding
110+
(nullify_pos_value v1,
111+
nullify_pos_map
112+
(fun (x : OpamParserTypes.FullPos.env_update_op_kind) -> x)
113+
env_update_op,
114+
nullify_pos_value v2)
65115

66116
(* XXX update *)
67117
let pos_best pos1 pos2 =

src/format/opamTypesBase.mli

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ val string_of_shell: shell -> string
4242
(** The empty file position *)
4343
val pos_null: pos
4444
val nullify_pos : 'a -> 'a with_pos
45+
val nullify_pos_map : ('a -> 'b) -> 'a with_pos -> 'b with_pos
46+
val nullify_pos_value : value -> value
4547

4648
(** [pos_best pos1 pos2] returns the most detailed position between [pos1] and
4749
[pos2] (defaulting to [pos1]) *)

tests/reftests/dune.inc

+18
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,24 @@
416416
%{targets}
417417
(run ./run.exe %{exe:../../src/client/opamMain.exe.exe} %{dep:download.test} %{read-lines:testing-env}))))
418418

419+
(rule
420+
(alias reftest-effectively-equal)
421+
(action
422+
(diff effectively-equal.test effectively-equal.out)))
423+
424+
(alias
425+
(name reftest)
426+
(deps (alias reftest-effectively-equal)))
427+
428+
(rule
429+
(targets effectively-equal.out)
430+
(deps root-N0REP0)
431+
(package opam)
432+
(action
433+
(with-stdout-to
434+
%{targets}
435+
(run ./run.exe %{exe:../../src/client/opamMain.exe.exe} %{dep:effectively-equal.test} %{read-lines:testing-env}))))
436+
419437
(rule
420438
(alias reftest-empty-conflicts-001)
421439
(action

tests/reftests/effectively-equal.test

+226
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
N0REP0
2+
### : test all the fields to check that effectively_equal works as expected
3+
### : each fields' value is placed on the next line to ensure the position will differ from the normalised version
4+
### <pkg:test-all-fields.1>
5+
opam-version:
6+
"2.0"
7+
name:
8+
"test-all-fields"
9+
version:
10+
"1"
11+
depends:
12+
["dummy-dep" {some-filter}]
13+
conflicts:
14+
["dummy-conflict" {some-filter}]
15+
depopts:
16+
["dummy-dep" {some-filter}]
17+
conflict-class:
18+
"conflict-class"
19+
available:
20+
true
21+
flags:
22+
[plugin]
23+
setenv:
24+
[ENV = "some value"]
25+
build:
26+
["false" {some-filter}]
27+
run-test:
28+
["false" {some-filter}]
29+
install:
30+
["false" {some-filter}]
31+
remove:
32+
["false" {some-filter}]
33+
substs:
34+
["some-file"]
35+
patches:
36+
["some-patches" {some-filter}]
37+
build-env:
38+
[BUILD_ENV = "some value"]
39+
extra-source
40+
"some-file"
41+
{
42+
src:
43+
"https://example.com"
44+
checksum: "md5=d41d8cd98f00b204e9800998ecf8427e"
45+
}
46+
messages:
47+
["message" {some-filter}]
48+
post-messages:
49+
["post-message" {some-filter}]
50+
depexts:
51+
[["depext"] {some-filter}]
52+
dev-repo:
53+
"git+https://example.com"
54+
pin-depends:
55+
["dep.dev" "https://example.com"]
56+
maintainer:
57+
"maintainer"
58+
authors:
59+
["author1" "author2"]
60+
license:
61+
"LicenseRef-custom"
62+
tags:
63+
["tag"]
64+
homepage:
65+
"https://example.com"
66+
doc:
67+
"https://example.com"
68+
bug-reports:
69+
"https://example.com"
70+
x-some-extension:
71+
[ext "something"]
72+
x-env-path-rewrite:
73+
[[ENV false]]
74+
url
75+
{
76+
src: "https://example.com"
77+
checksum: "md5=d41d8cd98f00b204e9800998ecf8427e"
78+
}
79+
synopsis:
80+
"some synopsis"
81+
description:
82+
"some description"
83+
### opam switch create eff-eq --empty
84+
### opam var --global some-filter=false
85+
Added '[some-filter "false" "Set through 'opam var'"]' to field global-variables in global configuration
86+
### opam install --fake test-all-fields
87+
The following actions will be faked:
88+
=== install 1 package
89+
- install test-all-fields 1
90+
91+
<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
92+
Faking installation of test-all-fields.1
93+
Done.
94+
### cat OPAM/repo/default/packages/test-all-fields/test-all-fields.1/opam
95+
opam-version:
96+
"2.0"
97+
name:
98+
"test-all-fields"
99+
version:
100+
"1"
101+
depends:
102+
["dummy-dep" {some-filter}]
103+
conflicts:
104+
["dummy-conflict" {some-filter}]
105+
depopts:
106+
["dummy-dep" {some-filter}]
107+
conflict-class:
108+
"conflict-class"
109+
available:
110+
true
111+
flags:
112+
[plugin]
113+
setenv:
114+
[ENV = "some value"]
115+
build:
116+
["false" {some-filter}]
117+
run-test:
118+
["false" {some-filter}]
119+
install:
120+
["false" {some-filter}]
121+
remove:
122+
["false" {some-filter}]
123+
substs:
124+
["some-file"]
125+
patches:
126+
["some-patches" {some-filter}]
127+
build-env:
128+
[BUILD_ENV = "some value"]
129+
extra-source
130+
"some-file"
131+
{
132+
src:
133+
"https://example.com"
134+
checksum: "md5=d41d8cd98f00b204e9800998ecf8427e"
135+
}
136+
messages:
137+
["message" {some-filter}]
138+
post-messages:
139+
["post-message" {some-filter}]
140+
depexts:
141+
[["depext"] {some-filter}]
142+
dev-repo:
143+
"git+https://example.com"
144+
pin-depends:
145+
["dep.dev" "https://example.com"]
146+
maintainer:
147+
"maintainer"
148+
authors:
149+
["author1" "author2"]
150+
license:
151+
"LicenseRef-custom"
152+
tags:
153+
["tag"]
154+
homepage:
155+
"https://example.com"
156+
doc:
157+
"https://example.com"
158+
bug-reports:
159+
"https://example.com"
160+
x-some-extension:
161+
[ext "something"]
162+
x-env-path-rewrite:
163+
[[ENV false]]
164+
url
165+
{
166+
src: "https://example.com"
167+
checksum: "md5=d41d8cd98f00b204e9800998ecf8427e"
168+
}
169+
synopsis:
170+
"some synopsis"
171+
description:
172+
"some description"
173+
### cat OPAM/eff-eq/.opam-switch/packages/test-all-fields.1/opam
174+
opam-version: "2.0"
175+
synopsis: "some synopsis"
176+
description: "some description"
177+
maintainer: "maintainer"
178+
authors: ["author1" "author2"]
179+
license: "LicenseRef-custom"
180+
tags: "tag"
181+
homepage: "https://example.com"
182+
doc: "https://example.com"
183+
bug-reports: "https://example.com"
184+
depends: [
185+
"dummy-dep" {some-filter}
186+
]
187+
depopts: [
188+
"dummy-dep" {some-filter}
189+
]
190+
conflicts: [
191+
"dummy-conflict" {some-filter}
192+
]
193+
conflict-class: "conflict-class"
194+
flags: plugin
195+
setenv: ENV = "some value"
196+
build: "false" {some-filter}
197+
run-test: "false" {some-filter}
198+
install: "false" {some-filter}
199+
remove: "false" {some-filter}
200+
substs: "some-file"
201+
patches: "some-patches" {some-filter}
202+
build-env: BUILD_ENV = "some value"
203+
messages: "message" {some-filter}
204+
post-messages: "post-message" {some-filter}
205+
depexts: ["depext"] {some-filter}
206+
dev-repo: "git+https://example.com"
207+
pin-depends: ["dep.dev" "https://example.com"]
208+
url {
209+
src: "https://example.com"
210+
checksum: "md5=d41d8cd98f00b204e9800998ecf8427e"
211+
}
212+
extra-source "some-file" {
213+
src: "https://example.com"
214+
checksum: "md5=d41d8cd98f00b204e9800998ecf8427e"
215+
}
216+
x-env-path-rewrite: [
217+
[ENV false]
218+
]
219+
x-some-extension: [ext "something"]
220+
### opam upgrade
221+
Already up-to-date.
222+
Nothing to do.
223+
### rm OPAM/eff-eq/.opam-switch/packages/cache
224+
### opam upgrade --show
225+
Already up-to-date.
226+
Nothing to do.

0 commit comments

Comments
 (0)