{ lib, stdenvNoCC, buildPackages , cacert, subversion, glibcLocales, sshSupport ? true, openssh ? null }: { url, rev ? "HEAD", sha256 ? "", hash ? "" , ignoreExternals ? false, ignoreKeywords ? false, name ? null , preferLocalBuild ? true }: assert sshSupport -> openssh != null; let repoName = let fst = lib.head; snd = l: lib.head (lib.tail l); trd = l: lib.head (lib.tail (lib.tail l)); path_ = (p: if lib.head p == "" then lib.tail p else p) # ~ drop final slash if any (lib.reverseList (lib.splitString "/" url)); path = [ (lib.removeSuffix "/" (lib.head path_)) ] ++ (lib.tail path_); in # ../repo/trunk -> repo if fst path == "trunk" then snd path # ../repo/branches/branch -> repo-branch else if snd path == "branches" then "${trd path}-${fst path}" # ../repo/tags/tag -> repo-tag else if snd path == "tags" then "${trd path}-${fst path}" # ../repo (no trunk) -> repo else fst path; name_ = if name == null then "${repoName}-r${toString rev}" else name; in if hash != "" && sha256 != "" then throw "Only one of sha256 or hash can be set" else stdenvNoCC.mkDerivation { name = name_; builder = ./builder.sh; nativeBuildInputs = [ cacert subversion glibcLocales ] ++ lib.optional sshSupport openssh; SVN_SSH = if sshSupport then "${buildPackages.openssh}/bin/ssh" else null; outputHashAlgo = if hash != "" then null else "sha256"; outputHashMode = "recursive"; outputHash = if hash != "" then hash else if sha256 != "" then sha256 else lib.fakeSha256; inherit url rev ignoreExternals ignoreKeywords; impureEnvVars = lib.fetchers.proxyImpureEnvVars; inherit preferLocalBuild; }