1{
2 fetchgit,
3 fetchhg,
4 fetchzip,
5 lib,
6}:
7
8let
9 inherit (lib)
10 assertOneOf
11 makeOverridable
12 optionalString
13 ;
14in
15
16makeOverridable (
17 {
18 owner,
19 repo,
20 rev,
21 domain ? "sr.ht",
22 vc ? "git",
23 name ? "source",
24 fetchSubmodules ? false,
25 ... # For hash agility
26 }@args:
27
28 assert (
29 assertOneOf "vc" vc [
30 "hg"
31 "git"
32 ]
33 );
34
35 let
36 urlFor = resource: "https://${resource}.${domain}/${owner}/${repo}";
37 baseUrl = urlFor vc;
38 baseArgs =
39 {
40 inherit name;
41 }
42 // removeAttrs args [
43 "owner"
44 "repo"
45 "rev"
46 "domain"
47 "vc"
48 "name"
49 "fetchSubmodules"
50 ];
51 vcArgs = baseArgs // {
52 inherit rev;
53 url = baseUrl;
54 };
55 fetcher = if fetchSubmodules then vc else "zip";
56 cases = {
57 git = {
58 fetch = fetchgit;
59 arguments = vcArgs // {
60 fetchSubmodules = true;
61 };
62 };
63 hg = {
64 fetch = fetchhg;
65 arguments = vcArgs // {
66 fetchSubrepos = true;
67 };
68 };
69 zip = {
70 fetch = fetchzip;
71 arguments = baseArgs // {
72 url = "${baseUrl}/archive/${rev}.tar.gz";
73 postFetch = optionalString (vc == "hg") ''
74 rm -f "$out/.hg_archival.txt"
75 ''; # impure file; see #12002
76 passthru = {
77 gitRepoUrl = urlFor "git";
78 };
79 };
80 };
81 };
82 in
83 cases.${fetcher}.fetch cases.${fetcher}.arguments
84 // {
85 inherit rev;
86 meta.homepage = "${baseUrl}";
87 }
88)