2017-09-14 14:22:32 +03:00
# include "command.hh"
# include "common-args.hh"
# include "store-api.hh"
# include "archive.hh"
2023-11-04 22:25:41 +02:00
# include "posix-source-accessor.hh"
2017-09-14 14:22:32 +03:00
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-04 22:25:41 +02:00
ContentAddressMethod caMethod = FileIngestionMethod : : Recursive ;
2024-01-19 08:07:26 +02:00
HashAlgorithm hashAlgo = HashAlgorithm : : SHA256 ;
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 " ,
. 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 ) {
2023-11-04 22:25:41 +02:00
this - > caMethod = parseIngestionMethod ( s ) ;
2023-11-15 10:23:26 +02:00
} } ,
} ) ;
2024-01-19 08:07:26 +02:00
2024-01-20 03:14:48 +02:00
addFlag ( Flag : : mkHashAlgoFlag ( & hashAlgo ) ) ;
2017-09-14 14:22:32 +03:00
}
void run ( ref < Store > store ) override
{
if ( ! namePart ) namePart = baseNameOf ( path ) ;
2023-11-04 22:25:41 +02:00
PosixSourceAccessor accessor ;
auto path2 = CanonPath : : fromCwd ( path ) ;
auto storePath = dryRun
? store - > computeStorePath (
2024-01-19 08:07:26 +02:00
* namePart , accessor , path2 , caMethod , hashAlgo , { } ) . first
2023-11-04 22:25:41 +02:00
: store - > addToStoreSlow (
2024-01-19 08:07:26 +02:00
* namePart , accessor , path2 , caMethod , hashAlgo , { } ) . path ;
2023-11-04 22:25:41 +02:00
logger - > cout ( " %s " , store - > printStorePath ( storePath ) ) ;
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-04 22:25:41 +02:00
caMethod = 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 " } ) ;