Skip to content

Commit 4c3aa69

Browse files
authored
Merge pull request #168 from NathanReb/fix-weird-opam-truncation
Fix a bug in opam file transformation for distrib
2 parents c3f689a + deeaf88 commit 4c3aa69

9 files changed

+89
-8
lines changed

CHANGES.md

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
- Fix a bug where `opam submit` would fail if the opam files had no description
66
(#165, @NathanReb)
7+
- Fix a bug where opam files could be inproperly tempered with while building
8+
the distribution tarball (#168, @NathanReb)
79

810
## 1.3.2 (2019-07-12)
911

dune-project

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
(lang dune 1.0)
2-
(name dune-release)
1+
(lang dune 1.2)
2+
(name dune-release)

dune-release.opam

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ build: [
1515

1616
depends: [
1717
"ocaml" {>= "4.06.0"}
18-
"dune" {build}
18+
"dune" {>= "1.2.0"}
1919
"fmt"
2020
"bos"
2121
"cmdliner"

lib/pkg.ml

+14-4
Original file line numberDiff line numberDiff line change
@@ -448,16 +448,26 @@ let v ~dry_run
448448

449449
(* Distrib *)
450450

451+
let version_line_re =
452+
let open Re in
453+
seq
454+
[bos; str "version:"; rep space; char '"'; rep1 any; char '"'; rep space; eos]
455+
456+
let prepare_opam_for_distrib ~version ~content =
457+
let re = Re.compile version_line_re in
458+
let is_not_version_field line = not (Re.execp re line) in
459+
let without_version = List.filter is_not_version_field content in
460+
Fmt.strf "version: \"%s\"" version :: without_version
461+
451462
let distrib_version_opam_files ~dry_run ~version =
452463
infer_pkg_names Fpath.(v ".") [] >>= fun names ->
453464
List.fold_left (fun acc name ->
454465
acc >>= fun _acc ->
455466
let file = Fpath.(v name + "opam") in
456467
OS.File.read_lines file
457-
>>= fun o ->
458-
let o = List.filter (fun l -> not (String.is_prefix ~affix:"version" l)) o in
459-
let o = Fmt.strf "version: \"%s\"" version :: o in
460-
Sos.write_file ~dry_run file (String.concat ~sep:"\n" o))
468+
>>= fun content ->
469+
let content = prepare_opam_for_distrib ~version ~content in
470+
Sos.write_file ~dry_run file (String.concat ~sep:"\n" content))
461471
(Ok ()) names
462472

463473
let distrib_prepare ~dry_run p ~dist_build_dir ~version =

lib/pkg.mli

+8
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,14 @@ val extract_tag : t -> (string, Sos.error) result
154154

155155
val dev_repo : t -> (string option, Sos.error) result
156156

157+
(**/**)
158+
159+
val version_line_re : Re.t
160+
161+
val prepare_opam_for_distrib : version: string -> content: string list -> string list
162+
163+
(**/**)
164+
157165
(*---------------------------------------------------------------------------
158166
Copyright (c) 2016 Daniel C. Bünzli
159167

tests/dune

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
(test
22
(name tests)
3-
(libraries dune-release alcotest))
3+
(libraries dune-release alcotest)
4+
(action (run %{test} -e)))

tests/test_pkg.ml

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
let test_version_line_re =
2+
let make_test ~input ~expected =
3+
let test_name =
4+
if expected then
5+
input ^ "is a valid version field line"
6+
else
7+
input ^ "is not a valid version field line"
8+
in
9+
let test_fun () =
10+
let re = Re.compile Dune_release.Pkg.version_line_re in
11+
let actual = Re.execp re input in
12+
Alcotest.(check bool) test_name expected actual
13+
in
14+
(test_name, `Quick, test_fun)
15+
in
16+
[ make_test ~input:"" ~expected:false
17+
; make_test ~input:{|version:""|} ~expected:false
18+
; make_test ~input:{|version:"1"|} ~expected:true
19+
; make_test ~input:{|version: "1" |} ~expected:true
20+
; make_test ~input:{|version:"1.jfpojef.adp921709"|} ~expected:true
21+
]
22+
23+
let test_prepare_opam_for_distrib =
24+
let make_test ~name ~version ~content ~expected () =
25+
let test_name = "prepare_opam_for_distrib: " ^ name in
26+
let test_fun () =
27+
let actual = Dune_release.Pkg.prepare_opam_for_distrib ~version ~content in
28+
Alcotest.(check (list string)) test_name expected actual
29+
in
30+
(test_name, `Quick, test_fun)
31+
in
32+
[ make_test ~name:"empty" ~content:[] ~version:"1" ~expected:[{|version: "1"|}] ()
33+
; make_test
34+
~name:"replace version"
35+
~content:[{|version: "1"|}]
36+
~version:"2"
37+
~expected:[{|version: "2"|}]
38+
()
39+
; make_test
40+
~name:"only replace version field"
41+
~content:
42+
[ {|version: "1"|}
43+
; {|description: """|}
44+
; {|version: "1" blablabla|}
45+
; {|"""|}
46+
]
47+
~version:"2"
48+
~expected:
49+
[ {|version: "2"|}
50+
; {|description: """|}
51+
; {|version: "1" blablabla|}
52+
; {|"""|}
53+
]
54+
()
55+
]
56+
57+
let suite =
58+
("Pkg", test_version_line_re @ test_prepare_opam_for_distrib)

tests/test_pkg.mli

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
val suite : unit Alcotest.test

tests/tests.ml

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
let () =
22
Alcotest.run "dune-release" [
33
Test_github.suite;
4+
Test_pkg.suite;
45
Test_tags.suite;
56
]

0 commit comments

Comments
 (0)