add --no-filters option to git hash-object

The new option allows the contents to be hashed as is, ignoring any input
filter that would have been chosen by the attributes mechanism.

This option is incompatible with --path and --stdin-paths options.

Signed-off-by: Dmitry Potapov <dpotapov@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Dmitry Potapov 2008-08-03 18:36:22 +04:00 committed by Junio C Hamano
parent 3970243150
commit 4a3d85dcf6
3 changed files with 44 additions and 5 deletions

View File

@ -9,7 +9,7 @@ git-hash-object - Compute object ID and optionally creates a blob from a file
SYNOPSIS SYNOPSIS
-------- --------
[verse] [verse]
'git hash-object' [-t <type>] [-w] [--path=<file>] [--stdin] [--] <file>... 'git hash-object' [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] <file>...
'git hash-object' [-t <type>] [-w] --stdin-paths < <list-of-paths> 'git hash-object' [-t <type>] [-w] --stdin-paths < <list-of-paths>
DESCRIPTION DESCRIPTION
@ -47,6 +47,12 @@ OPTIONS
temporary files located outside of the working directory or files temporary files located outside of the working directory or files
read from stdin. read from stdin.
--no-filters::
Hash the contents as is, ignoring any input filter that would
have been chosen by the attributes mechanism, including crlf
conversion. If the file is read from standard input then this
is always implied, unless the --path option is given.
Author Author
------ ------
Written by Junio C Hamano <gitster@pobox.com> Written by Junio C Hamano <gitster@pobox.com>

View File

@ -52,7 +52,7 @@ static void hash_stdin_paths(const char *type, int write_objects)
} }
static const char * const hash_object_usage[] = { static const char * const hash_object_usage[] = {
"git hash-object [-t <type>] [-w] [--path=<file>] [--stdin] [--] <file>...", "git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] <file>...",
"git hash-object --stdin-paths < <list-of-paths>", "git hash-object --stdin-paths < <list-of-paths>",
NULL NULL
}; };
@ -61,6 +61,7 @@ static const char *type;
static int write_object; static int write_object;
static int hashstdin; static int hashstdin;
static int stdin_paths; static int stdin_paths;
static int no_filters;
static const char *vpath; static const char *vpath;
static const struct option hash_object_options[] = { static const struct option hash_object_options[] = {
@ -68,6 +69,7 @@ static const struct option hash_object_options[] = {
OPT_BOOLEAN('w', NULL, &write_object, "write the object into the object database"), OPT_BOOLEAN('w', NULL, &write_object, "write the object into the object database"),
OPT_BOOLEAN( 0 , "stdin", &hashstdin, "read the object from stdin"), OPT_BOOLEAN( 0 , "stdin", &hashstdin, "read the object from stdin"),
OPT_BOOLEAN( 0 , "stdin-paths", &stdin_paths, "read file names from stdin"), OPT_BOOLEAN( 0 , "stdin-paths", &stdin_paths, "read file names from stdin"),
OPT_BOOLEAN( 0 , "no-filters", &no_filters, "store file as is without filters"),
OPT_STRING( 0 , "path", &vpath, "file", "process file as it were from this path"), OPT_STRING( 0 , "path", &vpath, "file", "process file as it were from this path"),
OPT_END() OPT_END()
}; };
@ -99,9 +101,15 @@ int main(int argc, const char **argv)
errstr = "Can't specify files with --stdin-paths"; errstr = "Can't specify files with --stdin-paths";
else if (vpath) else if (vpath)
errstr = "Can't use --stdin-paths with --path"; errstr = "Can't use --stdin-paths with --path";
else if (no_filters)
errstr = "Can't use --stdin-paths with --no-filters";
} }
else if (hashstdin > 1) else {
if (hashstdin > 1)
errstr = "Multiple --stdin arguments are not supported"; errstr = "Multiple --stdin arguments are not supported";
if (vpath && no_filters)
errstr = "Can't use --path with --no-filters";
}
if (errstr) { if (errstr) {
error (errstr); error (errstr);
@ -116,7 +124,8 @@ int main(int argc, const char **argv)
if (0 <= prefix_length) if (0 <= prefix_length)
arg = prefix_filename(prefix, prefix_length, arg); arg = prefix_filename(prefix, prefix_length, arg);
hash_object(arg, type, write_object, vpath ? vpath : arg); hash_object(arg, type, write_object,
no_filters ? NULL : vpath ? vpath : arg);
} }
if (stdin_paths) if (stdin_paths)

View File

@ -65,6 +65,14 @@ test_expect_success "Can't use --path with --stdin-paths" '
echo example | test_must_fail git hash-object --stdin-paths --path=foo echo example | test_must_fail git hash-object --stdin-paths --path=foo
' '
test_expect_success "Can't use --stdin-paths with --no-filters" '
echo example | test_must_fail git hash-object --stdin-paths --no-filters
'
test_expect_success "Can't use --path with --no-filters" '
test_must_fail git hash-object --no-filters --path=foo
'
# Behavior # Behavior
push_repo push_repo
@ -117,6 +125,22 @@ test_expect_success 'check that appropriate filter is invoke when --path is used
git config --unset core.autocrlf git config --unset core.autocrlf
' '
test_expect_success 'check that --no-filters option works' '
echo fooQ | tr Q "\\015" >file0 &&
cp file0 file1 &&
echo "file0 -crlf" >.gitattributes &&
echo "file1 crlf" >>.gitattributes &&
git config core.autocrlf true &&
file0_sha=$(git hash-object file0) &&
file1_sha=$(git hash-object file1) &&
test "$file0_sha" != "$file1_sha" &&
nofilters_file1=$(git hash-object --no-filters file1) &&
test "$file0_sha" = "$nofilters_file1" &&
nofilters_file1=$(cat file1 | git hash-object --stdin) &&
test "$file0_sha" = "$nofilters_file1" &&
git config --unset core.autocrlf
'
pop_repo pop_repo
for args in "-w --stdin" "--stdin -w"; do for args in "-w --stdin" "--stdin -w"; do