2020-03-23 13:38:04 +03:00
|
|
|
import json
|
2020-12-01 11:30:17 +03:00
|
|
|
from dataclasses import dataclass, InitVar, field
|
|
|
|
from typing import List, Optional, Dict, Any
|
2020-03-23 13:38:04 +03:00
|
|
|
|
|
|
|
from .errors import UpdateError
|
2020-04-21 12:06:55 +03:00
|
|
|
from .options import Options
|
2020-11-18 11:23:07 +03:00
|
|
|
from .utils import run
|
2020-03-23 13:38:04 +03:00
|
|
|
|
|
|
|
|
2020-12-01 11:30:17 +03:00
|
|
|
@dataclass
|
|
|
|
class Position:
|
|
|
|
file: str
|
|
|
|
line: int
|
|
|
|
column: int
|
|
|
|
|
|
|
|
|
2020-03-23 13:38:04 +03:00
|
|
|
@dataclass
|
|
|
|
class Package:
|
2020-11-18 23:34:22 +03:00
|
|
|
attribute: str
|
2020-03-23 13:38:04 +03:00
|
|
|
name: str
|
2020-03-24 16:25:17 +03:00
|
|
|
old_version: str
|
2020-03-23 13:38:04 +03:00
|
|
|
filename: str
|
|
|
|
line: int
|
|
|
|
urls: Optional[List[str]]
|
|
|
|
url: Optional[str]
|
|
|
|
rev: str
|
|
|
|
hash: str
|
|
|
|
mod_sha256: Optional[str]
|
2020-05-08 12:21:06 +03:00
|
|
|
vendor_sha256: Optional[str]
|
2020-03-23 13:38:04 +03:00
|
|
|
cargo_sha256: Optional[str]
|
2020-11-18 05:57:44 +03:00
|
|
|
tests: Optional[List[str]]
|
2020-03-23 13:38:04 +03:00
|
|
|
|
2020-12-01 11:30:17 +03:00
|
|
|
raw_version_position: InitVar[Optional[Dict[str, Any]]]
|
|
|
|
|
2020-03-24 16:25:17 +03:00
|
|
|
new_version: Optional[str] = None
|
2020-12-01 11:30:17 +03:00
|
|
|
version_position: Optional[Position] = field(init=False)
|
|
|
|
|
|
|
|
def __post_init__(self, raw_version_position: Optional[Dict[str, Any]]) -> None:
|
|
|
|
if raw_version_position is None:
|
|
|
|
self.version_position = None
|
|
|
|
else:
|
|
|
|
self.version_position = Position(**raw_version_position)
|
2020-03-24 16:25:17 +03:00
|
|
|
|
2020-03-23 13:38:04 +03:00
|
|
|
|
|
|
|
def eval_expression(import_path: str, attr: str) -> str:
|
|
|
|
return f"""(with import {import_path} {{}};
|
|
|
|
let
|
|
|
|
pkg = {attr};
|
2020-12-01 11:30:17 +03:00
|
|
|
raw_version_position = builtins.unsafeGetAttrPos "version" pkg;
|
|
|
|
|
2020-04-21 17:16:18 +03:00
|
|
|
position = if pkg ? isRubyGem then
|
2020-12-01 11:30:17 +03:00
|
|
|
raw_version_position
|
2020-04-21 17:16:18 +03:00
|
|
|
else
|
|
|
|
builtins.unsafeGetAttrPos "src" pkg;
|
2020-03-23 13:38:04 +03:00
|
|
|
in {{
|
|
|
|
name = pkg.name;
|
2020-03-24 16:25:17 +03:00
|
|
|
old_version = (builtins.parseDrvName pkg.name).version;
|
2020-12-01 11:30:17 +03:00
|
|
|
inherit raw_version_position;
|
2020-04-06 13:43:52 +03:00
|
|
|
filename = position.file;
|
|
|
|
line = position.line;
|
2020-03-23 13:38:04 +03:00
|
|
|
urls = pkg.src.urls or null;
|
|
|
|
url = pkg.src.url or null;
|
|
|
|
rev = pkg.src.url.rev or null;
|
|
|
|
hash = pkg.src.outputHash;
|
|
|
|
mod_sha256 = pkg.modSha256 or null;
|
2020-05-08 12:21:06 +03:00
|
|
|
vendor_sha256 = pkg.vendorSha256 or null;
|
2021-07-19 00:39:46 +03:00
|
|
|
cargo_sha256 = pkg.cargoHash or pkg.cargoSha256 or null;
|
2020-11-18 05:57:44 +03:00
|
|
|
tests = pkg.passthru.tests or null;
|
2020-03-23 13:38:04 +03:00
|
|
|
}})"""
|
|
|
|
|
|
|
|
|
|
|
|
def eval_attr(opts: Options) -> Package:
|
2020-08-16 14:27:27 +03:00
|
|
|
expr = eval_expression(opts.import_path, opts.attribute)
|
2020-11-18 11:23:07 +03:00
|
|
|
cmd = [
|
|
|
|
"nix",
|
|
|
|
"eval",
|
|
|
|
"--json",
|
|
|
|
"--impure",
|
|
|
|
"--experimental-features",
|
|
|
|
"nix-command",
|
|
|
|
"--expr",
|
|
|
|
expr,
|
|
|
|
]
|
2020-08-16 14:27:27 +03:00
|
|
|
res = run(cmd)
|
2020-03-23 13:38:04 +03:00
|
|
|
out = json.loads(res.stdout)
|
2020-11-18 23:34:22 +03:00
|
|
|
package = Package(attribute=opts.attribute, **out)
|
2020-03-24 16:25:17 +03:00
|
|
|
if package.old_version == "":
|
2020-03-23 13:38:04 +03:00
|
|
|
raise UpdateError(
|
|
|
|
f"Nix's builtins.parseDrvName could not parse the version from {package.name}"
|
|
|
|
)
|
|
|
|
|
|
|
|
return package
|