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
148
149
150
151
152
153
154
155
156
157
|
{ lib, stdenv, fetchurl, fetchpatch, python3Packages, makeWrapper, gettext, installShellFiles
, re2Support ? true
, rustSupport ? stdenv.hostPlatform.isLinux, rustPlatform
, fullBuild ? false
, gitSupport ? fullBuild
, guiSupport ? fullBuild, tk
, highlightSupport ? fullBuild
, ApplicationServices
}:
let
inherit (python3Packages) docutils python fb-re2 pygit2 pygments;
self = python3Packages.buildPythonApplication rec {
pname = "mercurial";
version = "5.8";
src = fetchurl {
url = "https://mercurial-scm.org/release/mercurial-${version}.tar.gz";
sha256 = "17rhlmmkqz5ll3k68jfzpcifg3nndbcbc2nx7kw8xn3qcj7nlpgw";
};
patches = [
# https://phab.mercurial-scm.org/D10638, needed for below patch to apply
(fetchpatch {
url = "https://www.mercurial-scm.org/repo/hg/raw-rev/c365850b611490a5fdb235eb1cea310a542c2f84";
sha256 = "1gn3xvahbjdhbglffqpmj559w1bkqqsk70wqcanwv7nh972aqy9g";
})
# https://phab.mercurial-scm.org/D10639, fixes https://bz.mercurial-scm.org/show_bug.cgi?id=6514
(fetchpatch {
url = "https://www.mercurial-scm.org/repo/hg/raw-rev/c8f62920f07a40af3403ba9aefa1dac8a97d53ea";
sha256 = "1kw0xjg2c4jby0ncarjvpa5qafsyl1wzbk6jxls4hnxlxdl53nmn";
})
];
format = "other";
passthru = { inherit python; }; # pass it so that the same version can be used in hg2git
cargoDeps = if rustSupport then rustPlatform.fetchCargoTarball {
inherit src;
name = "${pname}-${version}";
sha256 = "1kc2giqvfwsdl5fb0qmz96ws1gdrs3skfdzvpiif2i8f7r4nqlhd";
sourceRoot = "${pname}-${version}/rust";
} else null;
cargoRoot = if rustSupport then "rust" else null;
propagatedBuildInputs = lib.optional re2Support fb-re2
++ lib.optional gitSupport pygit2
++ lib.optional highlightSupport pygments;
nativeBuildInputs = [ makeWrapper gettext installShellFiles ]
++ lib.optionals rustSupport (with rustPlatform; [
cargoSetupHook
rust.cargo
rust.rustc
]);
buildInputs = [ docutils ]
++ lib.optionals stdenv.isDarwin [ ApplicationServices ];
makeFlags = [ "PREFIX=$(out)" ]
++ lib.optional rustSupport "PURE=--rust";
postInstall = (lib.optionalString guiSupport ''
mkdir -p $out/etc/mercurial
cp contrib/hgk $out/bin
cat >> $out/etc/mercurial/hgrc << EOF
[extensions]
hgk=$out/lib/${python.libPrefix}/site-packages/hgext/hgk.py
EOF
# setting HG so that hgk can be run itself as well (not only hg view)
WRAP_TK=" --set TK_LIBRARY ${tk}/lib/${tk.libPrefix}
--set HG $out/bin/hg
--prefix PATH : ${tk}/bin "
'') + ''
for i in $(cd $out/bin && ls); do
wrapProgram $out/bin/$i \
$WRAP_TK
done
# copy hgweb.cgi to allow use in apache
mkdir -p $out/share/cgi-bin
cp -v hgweb.cgi contrib/hgweb.wsgi $out/share/cgi-bin
chmod u+x $out/share/cgi-bin/hgweb.cgi
installShellCompletion --cmd hg \
--bash contrib/bash_completion \
--zsh contrib/zsh_completion
'';
passthru.tests = {};
meta = with lib; {
description = "A fast, lightweight SCM system for very large distributed projects";
homepage = "https://www.mercurial-scm.org";
downloadPage = "https://www.mercurial-scm.org/release/";
license = licenses.gpl2Plus;
maintainers = with maintainers; [ eelco lukegb ];
updateWalker = true;
platforms = platforms.unix;
};
};
in
self.overridePythonAttrs (origAttrs: {
passthru = origAttrs.passthru // rec {
# withExtensions takes a function which takes the python packages set and
# returns a list of extensions to install.
#
# for instance: mercurial.withExtension (pm: [ pm.hg-evolve ])
withExtensions = f: let
python = self.python;
mercurialHighPrio = ps: (ps.toPythonModule self).overrideAttrs (oldAttrs: {
meta = oldAttrs.meta // {
priority = 50;
};
});
plugins = (f python.pkgs) ++ [ (mercurialHighPrio python.pkgs) ];
env = python.withPackages (ps: plugins);
in stdenv.mkDerivation {
pname = "${self.pname}-with-extensions";
inherit (self) src version meta;
buildInputs = self.buildInputs ++ self.propagatedBuildInputs;
nativeBuildInputs = self.nativeBuildInputs;
phases = [ "installPhase" "installCheckPhase" ];
installPhase = ''
runHook preInstall
mkdir -p $out/bin
for bindir in ${lib.concatStringsSep " " (map (d: "${lib.getBin d}/bin") plugins)}; do
for bin in $bindir/*; do
ln -s ${env}/bin/$(basename $bin) $out/bin/
done
done
ln -s ${self}/share $out/share
runHook postInstall
'';
installCheckPhase = ''
runHook preInstallCheck
$out/bin/hg help >/dev/null || exit 1
runHook postInstallCheck
'';
};
tests = origAttrs.passthru.tests // {
withExtensions = withExtensions (pm: [ pm.hg-evolve ]);
};
};
})
|