2017-09-14 14:22:32 +03:00
# include "command.hh"
# include "common-args.hh"
# include "store-api.hh"
# include "archive.hh"
using namespace nix ;
2023-11-15 10:23:26 +02:00
static FileIngestionMethod parseIngestionMethod ( std : : string_view input )
{
if ( input = = " flat " ) {
return FileIngestionMethod : : Flat ;
} else if ( input = = " nar " ) {
return FileIngestionMethod : : Recursive ;
} else {
throw UsageError ( " Unknown hash mode '%s', expect `flat` or `nar` " ) ;
}
}
2017-09-14 14:22:32 +03:00
struct CmdAddToStore : MixDryRun , StoreCommand
{
Path path ;
2019-02-12 14:43:32 +02:00
std : : optional < std : : string > namePart ;
2023-11-15 10:23:26 +02:00
FileIngestionMethod ingestionMethod = FileIngestionMethod : : Recursive ;
2017-09-14 14:22:32 +03:00
CmdAddToStore ( )
{
2020-12-04 01:58:09 +02:00
// FIXME: completion
2017-09-14 14:22:32 +03:00
expectArg ( " path " , & path ) ;
2020-05-04 23:40:19 +03:00
addFlag ( {
. longName = " name " ,
. shortName = ' n ' ,
2021-01-13 15:18:04 +02:00
. description = " Override the name component of the store path. It defaults to the base name of *path*. " ,
2020-05-04 23:40:19 +03:00
. labels = { " name " } ,
. handler = { & namePart } ,
} ) ;
2023-11-15 10:23:26 +02:00
addFlag ( {
. longName = " mode " ,
. shortName = ' n ' ,
. description = R " (
How to compute the hash of the input .
One of :
- ` nar ` ( the default ) : Serialises the input as an archive ( following the [ _Nix Archive Format_ ] ( https : //edolstra.github.io/pubs/phd-thesis.pdf#page=101)) and passes that to the hash function.
- ` flat ` : Assumes that the input is a single file and directly passes it to the hash function ;
) " ,
. labels = { " hash-mode " } ,
. handler = { [ this ] ( std : : string s ) {
this - > ingestionMethod = parseIngestionMethod ( s ) ;
} } ,
} ) ;
2017-09-14 14:22:32 +03:00
}
void run ( ref < Store > store ) override
{
if ( ! namePart ) namePart = baseNameOf ( path ) ;
StringSink sink ;
dumpPath ( path , sink ) ;
2023-11-28 15:20:27 +02:00
auto narHash = hashString ( HashAlgorithm : : SHA256 , sink . s ) ;
2019-12-05 20:11:09 +02:00
2020-07-30 20:38:24 +03:00
Hash hash = narHash ;
if ( ingestionMethod = = FileIngestionMethod : : Flat ) {
2023-11-28 15:20:27 +02:00
HashSink hsink ( HashAlgorithm : : SHA256 ) ;
2020-06-12 20:26:08 +03:00
readFile ( path , hsink ) ;
hash = hsink . finish ( ) . first ;
}
2020-06-12 23:25:29 +03:00
2020-08-06 21:31:48 +03:00
ValidPathInfo info {
2020-10-07 16:52:20 +03:00
* store ,
2023-01-23 19:58:11 +02:00
std : : move ( * namePart ) ,
FixedOutputInfo {
2023-07-06 01:53:44 +03:00
. method = std : : move ( ingestionMethod ) ,
. hash = std : : move ( hash ) ,
2023-02-28 18:57:20 +02:00
. references = { } ,
2020-10-07 16:52:20 +03:00
} ,
2020-08-06 21:31:48 +03:00
narHash ,
} ;
2022-01-17 23:20:05 +02:00
info . narSize = sink . s . size ( ) ;
2017-09-14 14:22:32 +03:00
2020-05-29 23:19:48 +03:00
if ( ! dryRun ) {
2022-01-17 23:20:05 +02:00
auto source = StringSource ( sink . s ) ;
2020-05-29 23:19:48 +03:00
store - > addToStore ( info , source ) ;
}
2017-09-14 14:22:32 +03:00
2020-09-25 18:30:04 +03:00
logger - > cout ( " %s " , store - > printStorePath ( info . path ) ) ;
2017-09-14 14:22:32 +03:00
}
} ;
2023-11-15 10:23:26 +02:00
struct CmdAdd : CmdAddToStore
2020-12-04 01:58:09 +02:00
{
std : : string description ( ) override
{
2023-11-15 10:23:26 +02:00
return " Add a file or directory to the Nix store " ;
2020-12-04 01:58:09 +02:00
}
std : : string doc ( ) override
{
return
2023-11-15 10:23:26 +02:00
# include "add.md"
2020-12-04 01:58:09 +02:00
;
}
} ;
2023-11-15 10:23:26 +02:00
struct CmdAddFile : CmdAddToStore
2020-12-04 01:58:09 +02:00
{
2023-11-15 10:23:26 +02:00
CmdAddFile ( )
2020-12-04 01:58:09 +02:00
{
2023-11-15 10:23:26 +02:00
ingestionMethod = FileIngestionMethod : : Flat ;
2020-12-04 01:58:09 +02:00
}
std : : string description ( ) override
{
2023-11-15 10:23:26 +02:00
return " Deprecated. Use [`nix store add --mode flat`](@docroot@/command-ref/new-cli/nix3-store-add.md) instead. " ;
2020-12-04 01:58:09 +02:00
}
2023-11-15 10:23:26 +02:00
} ;
2020-12-04 01:58:09 +02:00
2023-11-15 10:23:26 +02:00
struct CmdAddPath : CmdAddToStore
{
std : : string description ( ) override
2020-12-04 01:58:09 +02:00
{
2023-11-15 10:23:26 +02:00
return " Deprecated alias to [`nix store add`](@docroot@/command-ref/new-cli/nix3-store-add.md). " ;
2017-09-14 14:22:32 +03:00
}
} ;
2020-12-04 01:58:09 +02:00
static auto rCmdAddFile = registerCommand2 < CmdAddFile > ( { " store " , " add-file " } ) ;
static auto rCmdAddPath = registerCommand2 < CmdAddPath > ( { " store " , " add-path " } ) ;
2023-11-15 10:23:26 +02:00
static auto rCmdAdd = registerCommand2 < CmdAdd > ( { " store " , " add " } ) ;