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