Skip to content

Commit 5b9a11a

Browse files
Merge pull request #53 from multiversx/whole-src-11-jan
Package whole project source code
2 parents 75c2152 + cb52ffe commit 5b9a11a

12 files changed

Lines changed: 45 additions & 74 deletions

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
FROM ubuntu:22.04
22

33
# Constants
4-
ARG BUILDER_NAME="multiversx/sdk-rust-contract-builder:v6.0.0"
4+
ARG BUILDER_NAME="multiversx/sdk-rust-contract-builder:v6.1.0"
55
ARG VERSION_RUST="nightly-2023-12-11"
66
ARG VERSION_BINARYEN="version_112"
77
ARG DOWNLOAD_URL_BINARYEN="https://github.com/WebAssembly/binaryen/releases/download/${VERSION_BINARYEN}/binaryen-${VERSION_BINARYEN}-x86_64-linux.tar.gz"

build_with_docker.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def main(cli_args: List[str]):
2020
parser.add_argument("--packaged-src", type=str, help="source code packaged in a JSON file")
2121
parser.add_argument("--contract", type=str)
2222
parser.add_argument("--output", type=str, default=Path(os.getcwd()) / "output")
23-
parser.add_argument("--package-whole-project-src", action="store_true", default=False, help="include all project files in *.source.json (default: %(default)s)")
23+
parser.add_argument("--package-whole-project-src", action="store_true", default=False, help="deprecated parameter, not used anymore")
2424
parser.add_argument("--cargo-target-dir", help="deprecated parameter, not used anymore")
2525
parser.add_argument("--no-wasm-opt", action="store_true", default=False, help="do not optimize wasm files after the build (default: %(default)s)")
2626
parser.add_argument("--build-root", type=str, required=False, help="root path (within container) for the build (default: %(default)s)")
@@ -35,7 +35,6 @@ def main(cli_args: List[str]):
3535
packaged_src_path = Path(parsed_args.packaged_src).expanduser().resolve() if parsed_args.packaged_src else None
3636
contract_path = parsed_args.contract
3737
output_path = Path(parsed_args.output).expanduser().resolve()
38-
package_whole_project_src = parsed_args.package_whole_project_src
3938
no_wasm_opt = parsed_args.no_wasm_opt
4039
build_root = Path(parsed_args.build_root) if parsed_args.build_root else None
4140
cargo_verbose = parsed_args.cargo_verbose
@@ -97,9 +96,6 @@ def main(cli_args: List[str]):
9796
if build_root:
9897
entrypoint_args.extend(["--build-root", str(build_root)])
9998

100-
if package_whole_project_src:
101-
entrypoint_args.append("--package-whole-project-src")
102-
10399
# Run docker container
104100
args = docker_general_args + docker_mount_args + docker_env_args + [image] + entrypoint_args
105101
logger.info(f"Running docker: {args}")

integration_tests/previous_builds.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,32 +48,34 @@ def __init__(self, name: str,
4848
),
4949
PreviousBuild(
5050
name="a.3",
51-
project_archive_url="https://github.com/multiversx/mx-reproducible-contract-build-example-sc/archive/refs/tags/v0.4.7.zip",
52-
project_relative_path_in_archive="mx-reproducible-contract-build-example-sc-0.4.7",
51+
project_archive_url="https://github.com/multiversx/mx-contracts-rs/archive/refs/tags/v0.45.2.1-reproducible.zip",
52+
project_relative_path_in_archive="mx-contracts-rs-0.45.2.1-reproducible",
5353
packaged_src_url=None,
5454
contract_name=None,
5555
expected_code_hashes={
56-
"adder": "9fd12f88f9474ba115fb75e9d18a8fdbc4f42147de005445048442d49c3aa725",
57-
"multisig": "9600fc699c85fd5a24ecf28f0b8cf01dc281c81399fb018d5ad8405b7d401041",
58-
"multisig-full": "9eed9c35113209fc69631cf29aac6e81f0e331132bf6e46198e679259075ad49",
59-
"multisig-view": "3993cf3fb5cd18102e2b8946ea1997f6f1cc512537f453265ba1afd7378fc0c6",
60-
"lottery-esdt": "e06b1a5c7fb71181a79e9be6b86d8ad154e5c2def4da6d2f0aa5266163823291"
56+
"adder": "384b680df7a95ebceca02ffb3e760a2fc288dea1b802685ef15df22ae88ba15b",
57+
"multisig": "b82f074c02e308b80cfb7144d7dc959bfac73e14dc3291837fdd8b042a7739cf",
58+
"multisig-full": "44a0eafb3bedfd671d1df586313f716924e2e4ef00ae7bf26df2c11eb4291389",
59+
"multisig-view": "d3e8328d525fcf196bb5bb4ce0741d9146dccb475461a693c407cdfa02334789",
60+
"lottery-esdt": "e06b1a5c7fb71181a79e9be6b86d8ad154e5c2def4da6d2f0aa5266163823291",
61+
"ping-pong-egld": "9283ca2f077edf2704053f0973fdd1eb90ee871ddcd672f962de4ba4422df84b"
6162
},
62-
docker_image="multiversx/sdk-rust-contract-builder:v5.4.0"
63+
docker_image="multiversx/sdk-rust-contract-builder:v5.4.1"
6364
),
6465
PreviousBuild(
6566
name="a.4",
66-
project_archive_url="https://github.com/multiversx/mx-reproducible-contract-build-example-sc/archive/refs/tags/v0.5.0-beta.0.zip",
67-
project_relative_path_in_archive="mx-reproducible-contract-build-example-sc-0.5.0-beta.0",
67+
project_archive_url="https://github.com/multiversx/mx-contracts-rs/archive/refs/tags/v0.45.2.1-reproducible.zip",
68+
project_relative_path_in_archive="mx-contracts-rs-0.45.2.1-reproducible",
6869
packaged_src_url=None,
6970
contract_name=None,
7071
expected_code_hashes={
7172
"adder": "384b680df7a95ebceca02ffb3e760a2fc288dea1b802685ef15df22ae88ba15b",
72-
"multisig": "d1453017d1fcac43f3b54c390b112b37af38ae840a2464d8ff68e3981da9972d",
73-
"multisig-full": "e7fd6d118639e4b4381b3a667435948cd70f1f06b6ef39e227bd88349f7e7979",
74-
"multisig-view": "290c9b3e374dffa33649ed46bd0b626c66f933eff9437f11f3559372d7538f85",
75-
"lottery-esdt": "d4d4b6d2d797749435a4127a12d5ea16b911d6783e00cbc9faf4bace7d655c7a"
73+
"multisig": "87cb62542c9b2d0b5a791cb35f7e44e71bb6d768d6ddb93155be61ad76267475",
74+
"multisig-full": "f6b5457682b39ea1bd52fd6fe293257a3d5a5bb931c9e404c9ba24617cd51438",
75+
"multisig-view": "1904fe0bfd12cb90fda87e5cf2d2f211d9eed8b48c296e6d858547bfe39bec0c",
76+
"lottery-esdt": "a54bd4278b12cc93fedd6ca0addf6aad4043528c33e54ce43cf92d4d2dd755ee",
77+
"ping-pong-egld": "8b107da10aef0d9610a939c4ca07c666674c465d0266fb28d5f981861f084f62"
7678
},
7779
docker_image="sdk-rust-contract-builder:next"
78-
)
80+
),
7981
]

integration_tests/shared.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ def download_packaged_src(json_url: str, name: str) -> Path:
3131

3232
def run_docker(
3333
project_path: Optional[Path],
34-
package_whole_project_src: bool,
3534
packaged_src_path: Optional[Path],
3635
contract_name: Optional[str],
3736
image: str,
@@ -66,9 +65,6 @@ def run_docker(
6665
if project_path:
6766
entrypoint_args.extend(["--project", "project"])
6867

69-
if package_whole_project_src:
70-
entrypoint_args.append("--package-whole-project-src")
71-
7268
if packaged_src_path:
7369
entrypoint_args.extend(["--packaged-src", "packaged-src.json"])
7470

integration_tests/test_previous_builds_are_reproducible.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ def main(cli_args: List[str]):
4141

4242
run_docker(
4343
project_path=project_path,
44-
package_whole_project_src=False,
4544
packaged_src_path=packaged_src_path,
4645
contract_name=build.contract_name,
4746
image=build.docker_image,

integration_tests/test_project_folder_and_packaged_src_are_equivalent.py

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,26 @@
88

99

1010
def main(cli_args: List[str]):
11-
repository_url = "https://github.com/multiversx/mx-reproducible-contract-build-example-sc"
12-
tag = "0.5.0-beta.0"
13-
archve_subfolder = f"mx-reproducible-contract-build-example-sc-{tag}"
11+
repository_url = "https://github.com/multiversx/mx-contracts-rs"
12+
tag = "0.45.2.1-reproducible"
13+
archve_subfolder = f"mx-contracts-rs-{tag}"
1414
project_path = download_project_repository(f"{repository_url}/archive/refs/tags/v{tag}.zip", archve_subfolder)
1515
project_path = project_path / archve_subfolder
1616

17-
# Only package_whole_project_src = True works.
18-
# package_whole_project_src = False does not work, since a missing Cargo.lock at the workspace level leads to build errors.
1917
check_project_folder_and_packaged_src_are_equivalent(
2018
project_path=project_path,
21-
package_whole_project_src=True,
2219
parent_output_folder=PARENT_OUTPUT_FOLDER,
23-
contracts=["adder", "multisig"],
20+
contracts=["adder", "multisig", "lottery-esdt"],
2421
)
2522

2623

2724
def check_project_folder_and_packaged_src_are_equivalent(
2825
project_path: Path,
29-
package_whole_project_src: bool,
3026
parent_output_folder: Path,
3127
contracts: List[str]):
3228
for contract in contracts:
33-
output_using_project = parent_output_folder / "using-project" / contract / ("whole" if package_whole_project_src else "truncated")
34-
output_using_packaged_src = parent_output_folder / "using-packaged-src" / contract / ("whole" if package_whole_project_src else "truncated")
29+
output_using_project = parent_output_folder / "using-project" / contract
30+
output_using_packaged_src = parent_output_folder / "using-packaged-src" / contract
3531

3632
shutil.rmtree(output_using_project, ignore_errors=True)
3733
shutil.rmtree(output_using_packaged_src, ignore_errors=True)
@@ -41,18 +37,16 @@ def check_project_folder_and_packaged_src_are_equivalent(
4137

4238
run_docker(
4339
project_path=project_path,
44-
package_whole_project_src=package_whole_project_src,
4540
packaged_src_path=None,
4641
contract_name=contract,
4742
image="sdk-rust-contract-builder:next",
4843
output_folder=output_using_project
4944
)
5045

51-
packaged_src_path = output_using_project / f"{contract}/{contract}-0.0.0.source.json"
46+
packaged_src_path = next((output_using_project / contract).glob("*.source.json"))
5247

5348
run_docker(
5449
project_path=None,
55-
package_whole_project_src=package_whole_project_src,
5650
packaged_src_path=packaged_src_path,
5751
contract_name=contract,
5852
image="sdk-rust-contract-builder:next",

multiversx_sdk_rust_contract_builder/build_options.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,20 @@
66
class BuildOptions:
77
def __init__(
88
self,
9-
package_whole_project_src: bool,
109
specific_contract: str,
1110
cargo_target_dir: Path,
1211
no_wasm_opt: bool,
1312
build_root_folder: Path,
1413
) -> None:
15-
self.package_whole_project_src = package_whole_project_src
1614
self.specific_contract = specific_contract
1715
self.cargo_target_dir = cargo_target_dir
1816
self.no_wasm_opt = no_wasm_opt
1917
self.build_root_folder = build_root_folder
2018

2119
def to_dict(self) -> Dict[str, Any]:
2220
return {
23-
"packageWholeProjectSrc": self.package_whole_project_src,
21+
# "packageWholeProjectSrc" is kept due to compatibility reasons.
22+
"packageWholeProjectSrc": True,
2423
"specificContract": self.specific_contract,
2524
"cargoTargetDir": str(self.cargo_target_dir),
2625
"noWasmOpt": self.no_wasm_opt,

multiversx_sdk_rust_contract_builder/build_outcome.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def many_from_folders(cls, build_folder: Path, output_folder: Path) -> Dict[str,
7070
entry.codehash = find_file_in_folder(output_folder, f"{contract_name}.codehash.txt").read_text()
7171
entry.bytecode_path = BuildArtifact.find_in_output(f"{contract_name}.wasm", output_folder)
7272
entry.abi_path = BuildArtifact.find_in_output(f"{contract_name}.abi.json", output_folder)
73+
# This is the whole project source code. The file *.partial-source.json is not listed here - so that it's advertised as little as possible.
7374
entry.src_package_path = BuildArtifact.find_in_output("*.source.json", output_folder)
7475

7576
result[contract_name] = entry

multiversx_sdk_rust_contract_builder/builder.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from pathlib import Path
66
from typing import Any, Dict, List, Set
77

8-
from multiversx_sdk_rust_contract_builder import cargo_toml, source_code
8+
from multiversx_sdk_rust_contract_builder import source_code
99
from multiversx_sdk_rust_contract_builder.build_metadata import BuildMetadata
1010
from multiversx_sdk_rust_contract_builder.build_options import BuildOptions
1111
from multiversx_sdk_rust_contract_builder.build_outcome import BuildOutcome
@@ -31,7 +31,6 @@ def build_project(
3131
project_folder = project_folder.expanduser().resolve()
3232
parent_output_folder = parent_output_folder.expanduser().resolve()
3333
cargo_target_dir = options.cargo_target_dir.expanduser().resolve()
34-
package_whole_project_src = options.package_whole_project_src
3534
no_wasm_opt = options.no_wasm_opt
3635
specific_contract = options.specific_contract
3736
build_root_folder = options.build_root_folder
@@ -45,9 +44,6 @@ def build_project(
4544
# We copy the whole project folder to the build path, to ensure that all local dependencies are available.
4645
project_within_build_folder = copy_project_folder_to_build_folder(project_folder, build_root_folder)
4746

48-
if not package_whole_project_src:
49-
cargo_toml.remove_dev_dependencies_sections_from_all(project_within_build_folder)
50-
5147
for contract_folder in sorted(contracts_folders):
5248
contract_name, contract_version = get_contract_name_and_version(contract_folder)
5349
logging.info(f"Contract = {contract_name}, version = {contract_version}")
@@ -75,13 +71,23 @@ def build_project(
7571
# The bundle (packaged source code) is created after build, so that Cargo.lock files are included (if previously missing).
7672
create_packaged_source_code(
7773
parent_project_folder=project_within_build_folder,
78-
package_whole_project_src=package_whole_project_src,
74+
package_whole_project_src=True,
7975
contract_folder=contract_build_subfolder,
8076
output_folder=output_subfolder,
8177
build_metadata=metadata.to_dict(),
8278
build_options=options.to_dict(),
79+
package_filename=f"{contract_name}-{contract_version}.source.json"
8380
)
8481

82+
create_packaged_source_code(
83+
parent_project_folder=project_within_build_folder,
84+
package_whole_project_src=False,
85+
contract_folder=contract_build_subfolder,
86+
output_folder=output_subfolder,
87+
build_metadata=metadata.to_dict(),
88+
build_options=options.to_dict(),
89+
package_filename=f"{contract_name}-{contract_version}.partial-source.json"
90+
)
8591
outcome.gather_artifacts(contract_build_subfolder, output_subfolder)
8692

8793
return outcome
@@ -168,7 +174,8 @@ def create_packaged_source_code(
168174
contract_folder: Path,
169175
output_folder: Path,
170176
build_metadata: Dict[str, Any],
171-
build_options: Dict[str, Any]
177+
build_options: Dict[str, Any],
178+
package_filename: str
172179
):
173180
source_code_files = source_code.get_source_code_files(
174181
project_folder=parent_project_folder,
@@ -185,7 +192,7 @@ def create_packaged_source_code(
185192
)
186193

187194
package = PackagedSourceCode.from_filesystem(metadata, parent_project_folder, source_code_files)
188-
package_path = output_folder / f"{contract_name}-{contract_version}.source.json"
195+
package_path = output_folder / package_filename
189196
package.save_to_file(package_path)
190197

191198
size_of_file = package_path.stat().st_size
Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
import logging
21
import shutil
32
from pathlib import Path
43
from typing import Tuple
54

65
import toml
76

8-
from multiversx_sdk_rust_contract_builder.filesystem import get_all_files
9-
107

118
def get_contract_name_and_version(contract_folder: Path) -> Tuple[str, str]:
129
file = contract_folder / "Cargo.toml"
@@ -21,19 +18,3 @@ def promote_cargo_lock_to_contract_folder(build_folder: Path, contract_folder: P
2118
from_path = build_folder / "wasm" / "Cargo.lock"
2219
to_path = contract_folder / "wasm" / "Cargo.lock"
2320
shutil.copy(from_path, to_path)
24-
25-
26-
def remove_dev_dependencies_sections_from_all(folder: Path):
27-
logging.info(f"remove_dev_dependencies_sections_from_all({folder})")
28-
29-
all_files = get_all_files(folder, lambda file: file.name == "Cargo.toml")
30-
for file in all_files:
31-
remove_dev_dependencies_sections(file)
32-
33-
34-
def remove_dev_dependencies_sections(file: Path):
35-
data = toml.loads(file.read_text())
36-
37-
if "dev-dependencies" in data:
38-
del data["dev-dependencies"]
39-
file.write_text(toml.dumps(data))

0 commit comments

Comments
 (0)