Compare commits

...

38 commits

Author SHA1 Message Date
jade 5adafc5bfb fix wrong comment 2024-05-02 20:09:04 -07:00
jade 87e36b9f18 un-flakes your hub
fixes #66
2024-05-02 19:56:08 -07:00
jade 1be18e491b Merge pull request 'Check for pure eval mode before calling builtins.storePath' (#65) from 9999years/fix-64 into master
Reviewed-on: #65
2024-04-30 19:53:03 +00:00
Rebecca Turner baa7aa7bd0
Check for pure eval mode before calling builtins.storePath 2024-03-08 16:32:20 -08:00
Eelco Dolstra 0f9255e01c Force root sources like "./." into the Nix store 2023-10-04 15:37:54 +02:00
Eelco Dolstra 5a16547d46 Prevent double copying and work around an apparent Nix bug
Fixes #60.
2023-10-04 12:49:46 +02:00
Eelco Dolstra 4f910c9827 Doh 2023-10-02 19:19:56 +02:00
Eelco Dolstra 7ae5ae625a Drop "flake = false" and suggest flakehub 2023-10-02 19:16:54 +02:00
Eelco Dolstra e1262c7073
Merge pull request #59 from hercules-ci/port-nix-7796-flake-outPath
nix#7796: Ensure that `self.outPath == ./.`
2023-10-02 19:10:16 +02:00
Robert Hensing bc5e257a8d nix#7796: Ensure that self.outPath == ./.
Ported from https://github.com/NixOS/nix/pull/7796
First released in Nix 2.14
2023-10-02 18:57:55 +02:00
Eelco Dolstra 2bf43d60c7 Change from rolling to tagged releases 2023-10-02 16:09:08 +02:00
Eelco Dolstra 6256b599c8 Add description 2023-10-02 14:48:41 +02:00
Eelco Dolstra c30381e188 Add flake.nix 2023-10-02 14:43:40 +02:00
Eelco Dolstra e654cc30bf
Merge pull request #56 from Alper-Celik/master
add support for sourcehut
2023-10-02 14:15:41 +02:00
Eelco Dolstra 5717e26155
Merge pull request #57 from lucperkins/flakehub-publish
Add FlakeHub publish Action
2023-10-02 14:15:23 +02:00
Luc Perkins 92556b8539
Add FlakeHub publish Action 2023-09-18 14:15:22 +03:00
Alper Çelik bcb80df051
add support for sourcehut 2023-04-26 10:33:29 +03:00
Eelco Dolstra 35bb57c0c8
Merge pull request #50 from hercules-ci/nix-7207-_type-is-flake
Apply nix#7207 `_type = "flake";`
2023-01-17 12:47:33 +01:00
Robert Hensing 43bfa87aa2 Apply nix#7207 _type = "flake";
https://github.com/NixOS/nix/pull/7207 adds this attribute in order
to help identify flake outputs for the purpose of type checking.
2023-01-16 19:59:47 +01:00
Eelco Dolstra 009399224d
Merge pull request #47 from blaggacao/master
fix: top level functors break legacy nix commands
2022-11-17 11:41:32 +01:00
David Arnold 6f56392cc4
fix: top level functors break legacy nix commands
see: https://github.com/divnix/std/issues/186
2022-11-14 20:28:19 -05:00
Eelco Dolstra b4a34015c6
Merge pull request #40 from SuperSandro2000/patch-1
Quote url literal
2022-04-19 15:22:48 +02:00
Sandro 246e885130
Quote url literal 2022-04-19 13:59:50 +02:00
Eelco Dolstra 64a525ee38
Merge pull request #37 from Artturin/addsupportfornewshcmea
add support for new style of defaults
2022-03-25 10:10:09 +01:00
Eelco Dolstra 913e1270ff
Merge pull request #36 from charlesbaynham/master
Support submodules fetches for git imports
2022-03-25 10:09:12 +01:00
Artturin aee797a673 add support for new style of defaults 2022-03-25 04:47:29 +02:00
Charles Baynham 3b935d922d
Pass along submodules flag to fetchGit 2022-03-19 23:30:58 +00:00
Eelco Dolstra b7547d3eed
Merge pull request #29 from piperswe/patch-1
Add a README.md containing copy & paste helpers
2022-01-03 11:29:42 +01:00
Piper McCorkle b640d1826b
Add a README.md containing copy & paste helpers 2021-12-30 17:50:53 -05:00
Eelco Dolstra 12c64ca55c
Merge pull request #24 from hercules-ci/issue-16-mit-license
Revert "Revert unlicensed contribution"
2021-08-02 16:09:59 +02:00
Robert Hensing 4112a081ef Revert "Revert unlicensed contribution"
The last contributor has agreed after all. Maybe I acted one day
too soon? In that case, apologies for the drama.

This reverts commit 14dbada01f.
2021-08-02 13:43:28 +02:00
Eelco Dolstra bef1b74164
Merge pull request #23 from hercules-ci/issue-16-mit-license
Add MIT license
2021-08-01 17:35:36 +02:00
Robert Hensing 14dbada01f Revert unlicensed contribution
Some explanation is in order:

I have tried to contact Zanculmarktum three times in the last
25 days, but I have not received any response.
Meanwhile, others are waiting to be able to use flake-compat, so
I have decided that it is best to move forward with the licensing
effort, considering that everyone else except Eelco has already
agreed, and quickly as well.

I have no hard feelings towards Zanculmarktum and I really do not
like having to make this commit.

This reverts commit e363cffac2 and
subsequent improvements.

I should note that it could be argued that their contribution was
not a creative work in the sense of most copyright law, but I'd
prefer to avoid any confusion by choosing to reimplement their
contribution in a "clean room" manner.
2021-08-01 14:12:05 +02:00
Robert Hensing 2cb6b2d577 Add MIT license 2021-08-01 14:10:57 +02:00
Eelco Dolstra c6f3b63532
Merge pull request #12 from hercules-ci/pure
Make tarball fetchers pure
2021-07-29 13:15:37 +02:00
Eelco Dolstra 99f1c2157f Don't zero src's lastModified if it has one 2020-11-26 21:59:33 +01:00
Eelco Dolstra 8812d6d109 Don't pass rev/shortRev for dirty trees 2020-11-26 21:53:11 +01:00
Robert Hensing a2fd0358b1 Make fetchers pure 2020-10-28 12:27:16 +01:00
4 changed files with 142 additions and 17 deletions

20
COPYING Normal file
View file

@ -0,0 +1,20 @@
Copyright (c) 2020-2021 Eelco Dolstra and the flake-compat contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

41
README.md Normal file
View file

@ -0,0 +1,41 @@
# flake-compat
## Usage
> [!WARNING]
> During the Lix private beta period during which Forgejo is private, this
> requires configuring netrc in Lix for the tarball download to work.
>
> Your netrc should look something like so:
> ```
> machine git.lix.systems login YOUR-USERNAME password SOME-PERSONAL-ACCESS-TOKEN-REPO-READ
> ```
>
> We are terribly sorry for the UX for this being very bad
> ([issue](https://git.lix.systems/lix-project/lix/issues/254)).
To use, add the following to your `flake.nix`:
<!-- FIXME: this can use the standard non-api archive url when we are
un-privated -->
```nix
inputs.flake-compat.url = "https://git.lix.systems/api/v1/repos/lix-project/flake-compat/archive/main.tar.gz";
```
Afterwards, create a `default.nix` file containing the following:
```nix
(import
(
let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in
fetchTarball {
url = lock.nodes.flake-compat.locked.url;
sha256 = lock.nodes.flake-compat.locked.narHash;
}
)
{ src = ./.; }
).defaultNix
```
If you would like a `shell.nix` file, create one containing the above, replacing `defaultNix` with `shellNix`.

View file

@ -16,7 +16,11 @@ let
fetchTree =
info:
if info.type == "github" then
{ outPath = fetchTarball "https://api.${info.host or "github.com"}/repos/${info.owner}/${info.repo}/tarball/${info.rev}";
{ outPath =
fetchTarball
({ url = "https://api.${info.host or "github.com"}/repos/${info.owner}/${info.repo}/tarball/${info.rev}"; }
// (if info ? narHash then { sha256 = info.narHash; } else {})
);
rev = info.rev;
shortRev = builtins.substring 0 7 info.rev;
lastModified = info.lastModified;
@ -29,28 +33,47 @@ let
({ url = info.url; }
// (if info ? rev then { inherit (info) rev; } else {})
// (if info ? ref then { inherit (info) ref; } else {})
// (if info ? submodules then { inherit (info) submodules; } else {})
);
rev = info.rev;
shortRev = builtins.substring 0 7 info.rev;
lastModified = info.lastModified;
lastModifiedDate = formatSecondsSinceEpoch info.lastModified;
narHash = info.narHash;
}
} // (if info ? rev then {
rev = info.rev;
shortRev = builtins.substring 0 7 info.rev;
} else {
})
else if info.type == "path" then
{ outPath = builtins.path { path = info.path; };
narHash = info.narHash;
}
else if info.type == "tarball" then
{ outPath = fetchTarball info.url;
narHash = info.narHash;
{ outPath =
fetchTarball
({ inherit (info) url; }
// (if info ? narHash then { sha256 = info.narHash; } else {})
);
}
else if info.type == "gitlab" then
{ inherit (info) rev narHash lastModified;
outPath = fetchTarball "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}";
outPath =
fetchTarball
({ url = "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}"; }
// (if info ? narHash then { sha256 = info.narHash; } else {})
);
shortRev = builtins.substring 0 7 info.rev;
}
else if info.type == "sourcehut" then
{ inherit (info) rev narHash lastModified;
outPath =
fetchTarball
({ url = "https://${info.host or "git.sr.ht"}/${info.owner}/${info.repo}/archive/${info.rev}.tar.gz"; }
// (if info ? narHash then { sha256 = info.narHash; } else {})
);
shortRev = builtins.substring 0 7 info.rev;
}
else
# FIXME: add Mercurial, tarball inputs.
# FIXME: add Mercurial inputs.
throw "flake input has unsupported input type '${info.type}'";
callFlake4 = flakeSrc: locks:
@ -78,15 +101,32 @@ let
# tree is a valid git repository.
tryFetchGit = src:
if isGit && !isShallow
then builtins.fetchGit src
else { outPath = src; };
then
let res = builtins.fetchGit src;
in if res.rev == "0000000000000000000000000000000000000000" then removeAttrs res ["rev" "shortRev"] else res
else {
outPath =
# Massage `src` into a store path.
if builtins.isPath src
then
if dirOf (toString src) == builtins.storeDir
# `builtins.storePath` is not available in pure-eval mode.
&& builtins ? currentSystem
then
# If it's already a store path, don't copy it again.
builtins.storePath src
else
"${src}"
else
src;
};
# NB git worktrees have a file for .git, so we don't check the type of .git
isGit = builtins.pathExists (src + "/.git");
isShallow = builtins.pathExists (src + "/.git/shallow");
in
(if src ? outPath then src else tryFetchGit src)
// { lastModified = 0; lastModifiedDate = formatSecondsSinceEpoch 0; };
{ lastModified = 0; lastModifiedDate = formatSecondsSinceEpoch 0; }
// (if src ? outPath then src else tryFetchGit src);
# Format number of seconds in the Unix epoch as %Y%m%d%H%M%S.
formatSecondsSinceEpoch = t:
@ -124,7 +164,9 @@ let
subdir = if key == lockFile.root then "" else node.locked.dir or "";
flake = import (sourceInfo + (if subdir != "" then "/" else "") + subdir + "/flake.nix");
outPath = sourceInfo + ((if subdir == "" then "" else "/") + subdir);
flake = import (outPath + "/flake.nix");
inputs = builtins.mapAttrs
(inputName: inputSpec: allNodes.${resolveInput inputSpec})
@ -151,7 +193,21 @@ let
outputs = flake.outputs (inputs // { self = result; });
result = outputs // sourceInfo // { inherit inputs; inherit outputs; inherit sourceInfo; };
result =
outputs
# We add the sourceInfo attribute for its metadata, as they are
# relevant metadata for the flake. However, the outPath of the
# sourceInfo does not necessarily match the outPath of the flake,
# as the flake may be in a subdirectory of a source.
# This is shadowed in the next //
// sourceInfo
// {
# This shadows the sourceInfo.outPath
inherit outPath;
inherit inputs; inherit outputs; inherit sourceInfo; _type = "flake";
};
in
if node.flake or true then
assert builtins.isFunction flake.outputs;
@ -173,10 +229,12 @@ let
in
rec {
defaultNix =
result
// (if result ? defaultPackage.${system} then { default = result.defaultPackage.${system}; } else {});
(builtins.removeAttrs result ["__functor"])
// (if result ? defaultPackage.${system} then { default = result.defaultPackage.${system}; } else {})
// (if result ? packages.${system}.default then { default = result.packages.${system}.default; } else {});
shellNix =
defaultNix
// (if result ? devShell.${system} then { default = result.devShell.${system}; } else {});
// (if result ? devShell.${system} then { default = result.devShell.${system}; } else {})
// (if result ? devShells.${system}.default then { default = result.devShells.${system}.default; } else {});
}

6
flake.nix Normal file
View file

@ -0,0 +1,6 @@
{
description = "Allow flakes to be used with Nix < 2.4";
outputs = { self }: {
};
}