]>
git.proxmox.com Git - rustc.git/blob - vendor/wasm-bindgen/publish.rs
1 //! Helper script to publish the wasm-bindgen suite of crates
5 //! * First, compile this script
6 //! * Next, set cwd to the root of the wasm-bindgen repository
7 //! * Execute `./publish bump` to bump versions
10 //! * Execute `./publish publish` to publish crates
12 use std
::collections
::HashMap
;
16 use std
::path
::{Path, PathBuf}
;
17 use std
::process
::Command
;
19 // note that this list must be topologically sorted by dependencies
20 const CRATES_TO_PUBLISH
: &[&str] = &[
21 "wasm-bindgen-shared",
22 "wasm-bindgen-backend",
23 "wasm-bindgen-macro-support",
25 "wasm-bindgen-test-macro",
27 "wasm-bindgen-wasm-interpreter",
28 "wasm-bindgen-wasm-conventions",
29 "wasm-bindgen-threads-xform",
30 "wasm-bindgen-multi-value-xform",
31 "wasm-bindgen-externref-xform",
32 "wasm-bindgen-cli-support",
35 "wasm-bindgen-futures",
40 const CRATES_TO_AVOID_PUBLISH
: &[&str] = &[
41 // We'll publish these when they're ready one day
42 "wasm-bindgen-typescript",
43 // These are internal crates, unlikely to ever be published
48 "wasm-bindgen-webidl",
60 let mut crates
= Vec
::new();
61 crates
.push(read_crate("./Cargo.toml".as_ref()));
62 find_crates("crates".as_ref(), &mut crates
);
63 find_crates("examples".as_ref(), &mut crates
);
65 let pos
= CRATES_TO_PUBLISH
67 .chain(CRATES_TO_AVOID_PUBLISH
)
69 .map(|(i
, c
)| (*c
, i
))
70 .collect
::<HashMap
<_
, _
>>();
71 crates
.sort_by_key(|krate
| pos
.get(&krate
.name
[..]));
73 match &env
::args().nth(1).expect("must have one argument")[..] {
75 for krate
in crates
.iter() {
76 bump_version(&krate
, &crates
);
81 for krate
in crates
.iter() {
86 s
=> panic
!("unknown command: {}", s
),
90 fn find_crates(dir
: &Path
, dst
: &mut Vec
<Crate
>) {
91 if dir
.join("Cargo.toml").exists() {
92 let krate
= read_crate(&dir
.join("Cargo.toml"));
95 .chain(CRATES_TO_AVOID_PUBLISH
)
96 .any(|c
| krate
.name
== *c
)
99 } else if dir
.iter().any(|s
| s
== "examples") {
102 panic
!("failed to find {:?} in whitelist or blacklist", krate
.name
);
106 for entry
in dir
.read_dir().unwrap() {
107 let entry
= entry
.unwrap();
108 if entry
.file_type().unwrap().is_dir() {
109 find_crates(&entry
.path(), dst
);
114 fn read_crate(manifest
: &Path
) -> Crate
{
116 let mut version
= None
;
117 for line
in fs
::read_to_string(manifest
).unwrap().lines() {
118 if name
.is_none() && line
.starts_with("name = \"") {
120 line
.replace("name = \"", "")
126 if version
.is_none() && line
.starts_with("version = \"") {
128 line
.replace("version = \"", "")
135 let name
= name
.unwrap();
136 let version
= version
.unwrap();
137 let next_version
= if CRATES_TO_PUBLISH
.contains(&&name
[..]) {
143 manifest
: manifest
.to_path_buf(),
150 fn bump_version(krate
: &Crate
, crates
: &[Crate
]) {
151 let contents
= fs
::read_to_string(&krate
.manifest
).unwrap();
153 let mut new_manifest
= String
::new();
154 let mut is_deps
= false;
155 for line
in contents
.lines() {
156 let mut rewritten
= false;
157 if line
.starts_with("version =") {
158 if CRATES_TO_PUBLISH
.contains(&&krate
.name
[..]) {
160 "bump `{}` {} => {}",
161 krate
.name
, krate
.version
, krate
.next_version
163 new_manifest
.push_str(&line
.replace(&krate
.version
, &krate
.next_version
));
168 is_deps
= if line
.starts_with("[") {
169 line
.contains("dependencies")
174 for other
in crates
{
175 if !is_deps
|| !line
.starts_with(&format
!("{} ", other
.name
)) {
178 if !line
.contains(&other
.version
) {
179 if !line
.contains("version =") {
183 "{:?} has a dep on {} but doesn't list version {}",
184 krate
.manifest
, other
.name
, other
.version
188 new_manifest
.push_str(&line
.replace(&other
.version
, &other
.next_version
));
192 new_manifest
.push_str(line
);
194 new_manifest
.push_str("\n");
196 fs
::write(&krate
.manifest
, new_manifest
).unwrap();
199 fn bump(version
: &str) -> String
{
200 let mut iter
= version
.split('
.'
).map(|s
| s
.parse
::<u32>().unwrap());
201 let major
= iter
.next().expect("major version");
202 let minor
= iter
.next().expect("minor version");
203 let patch
= iter
.next().expect("patch version");
204 format
!("{}.{}.{}", major
, minor
, patch
+ 1)
207 fn publish(krate
: &Crate
) {
208 if !CRATES_TO_PUBLISH
.iter().any(|s
| *s
== krate
.name
) {
211 let status
= Command
::new("cargo")
213 .current_dir(krate
.manifest
.parent().unwrap())
215 .arg("--allow-dirty")
217 .expect("failed to run cargo");
218 if !status
.success() {
219 println
!("FAIL: failed to publish `{}`: {}", krate
.name
, status
);