forked from martinvonz/jj
-
Notifications
You must be signed in to change notification settings - Fork 0
/
flake.nix
147 lines (127 loc) · 4.37 KB
/
flake.nix
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
{
description = "Jujutsu VCS, a Git-compatible DVCS that is both simple and powerful";
inputs = {
# For listing and iterating nix systems
flake-utils.url = "github:numtide/flake-utils";
# For installing non-standard rustc versions
rust-overlay.url = "github:oxalica/rust-overlay";
rust-overlay.inputs.nixpkgs.follows = "nixpkgs";
rust-overlay.inputs.flake-utils.follows = "flake-utils";
};
outputs = { self, nixpkgs, flake-utils, rust-overlay }: {
overlays.default = (final: prev: {
jujutsu = self.packages.${final.system}.jujutsu;
});
} //
(flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [
rust-overlay.overlays.default
];
};
filterSrc = src: regexes:
pkgs.lib.cleanSourceWith {
inherit src;
filter = path: type:
let
relPath = pkgs.lib.removePrefix (toString src + "/") (toString path);
in
pkgs.lib.all (re: builtins.match re relPath == null) regexes;
};
rust-version = pkgs.rust-bin.stable."1.71.0".default;
ourRustPlatform = pkgs.makeRustPlatform {
rustc = rust-version;
cargo = rust-version;
};
# these are needed in both devShell and buildInputs
darwinDeps = with pkgs; lib.optionals stdenv.isDarwin [
darwin.apple_sdk.frameworks.Security
darwin.apple_sdk.frameworks.SystemConfiguration
libiconv
];
in
{
packages = {
jujutsu = ourRustPlatform.buildRustPackage rec {
pname = "jujutsu";
version = "unstable-${self.shortRev or "dirty"}";
buildFeatures = [ "packaging" ];
cargoBuildFlags = ["--bin" "jj"]; # don't build and install the fake editors
useNextest = true;
src = filterSrc ./. [
".*\\.nix$"
"^.jj/"
"^flake\\.lock$"
"^target/"
];
cargoLock.lockFile = ./Cargo.lock;
nativeBuildInputs = with pkgs; [
gzip
installShellFiles
makeWrapper
pkg-config
];
buildInputs = with pkgs; [
openssl zstd libgit2 libssh2
] ++ darwinDeps;
ZSTD_SYS_USE_PKG_CONFIG = "1";
LIBSSH2_SYS_USE_PKG_CONFIG = "1";
NIX_JJ_GIT_HASH = self.rev or "";
CARGO_INCREMENTAL = "0";
preCheck = "export RUST_BACKTRACE=1";
postInstall = ''
$out/bin/jj util mangen > ./jj.1
installManPage ./jj.1
installShellCompletion --cmd jj \
--bash <($out/bin/jj util completion --bash) \
--fish <($out/bin/jj util completion --fish) \
--zsh <($out/bin/jj util completion --zsh)
'';
};
default = self.packages.${system}.jujutsu;
};
apps.default = {
type = "app";
program = "${self.packages.${system}.jujutsu}/bin/jj";
};
formatter = pkgs.nixpkgs-fmt;
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
# The CI checks against the latest nightly rustfmt, so we should too.
# NOTE (aseipp): include this FIRST before the rust-version override
# below; otherwise, it will be overridden by the rust-version and
# we'll get stable rustfmt instead.
(rust-bin.selectLatestNightlyWith (toolchain: toolchain.rustfmt))
# Using the minimal profile with explicit "clippy" extension to avoid
# two versions of rustfmt
(rust-version.override {
extensions = [
"rust-src" # for rust-analyzer
"clippy"
];
})
# Foreign dependencies
openssl zstd libgit2 libssh2
pkg-config
# Make sure rust-analyzer is present
rust-analyzer
# Additional tools recommended by contributing.md
cargo-deny
cargo-insta
cargo-nextest
cargo-watch
# In case you need to run `cargo run --bin gen-protos`
protobuf
# For building the documentation website
poetry
] ++ darwinDeps;
shellHook = ''
export RUST_BACKTRACE=1
export ZSTD_SYS_USE_PKG_CONFIG=1
export LIBSSH2_SYS_USE_PKG_CONFIG=1
'';
};
}));
}