summaryrefslogtreecommitdiff
path: root/tools/release/helpers/cargo.ts
blob: 2f750779cbc8d9d0f0f8f530e525f60452031b48 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.

import { runCommand } from "./helpers.ts";

export interface CargoMetadata {
  packages: CargoPackageMetadata[];
  /** Identifiers in the `packages` array of the workspace members. */
  "workspace_members": string[];
  /** The absolute workspace root directory path. */
  "workspace_root": string;
}

export interface CargoPackageMetadata {
  id: string;
  name: string;
  version: string;
  dependencies: CargoDependencyMetadata[];
  /** Path to Cargo.toml */
  "manifest_path": string;
}

export interface CargoDependencyMetadata {
  name: string;
  /** Version requrement (ex. ^0.1.0) */
  req: string;
}

export async function getMetadata(directory: string) {
  const result = await runCommand({
    cwd: directory,
    cmd: ["cargo", "metadata", "--format-version", "1"],
  });
  return JSON.parse(result!) as CargoMetadata;
}

export function publishCrate(directory: string) {
  return runCargoSubCommand({
    directory,
    args: ["publish"],
  });
}

export function build(directory: string) {
  return runCargoSubCommand({
    directory,
    args: ["build", "-vv"],
  });
}

export function check(directory: string) {
  return runCargoSubCommand({
    directory,
    args: ["check"],
  });
}

async function runCargoSubCommand(params: {
  args: string[];
  directory: string;
}) {
  const p = Deno.run({
    cwd: params.directory,
    cmd: ["cargo", ...params.args],
    stderr: "inherit",
    stdout: "inherit",
  });

  const status = await p.status();
  if (!status.success) {
    throw new Error("Failed");
  }
}