Browse Source

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>
maint
Dmitry Potapov 17 years ago committed by Junio C Hamano
parent
commit
4a3d85dcf6
  1. 8
      Documentation/git-hash-object.txt
  2. 17
      hash-object.c
  3. 24
      t/t1007-hash-object.sh

8
Documentation/git-hash-object.txt

@ -9,7 +9,7 @@ git-hash-object - Compute object ID and optionally creates a blob from a file @@ -9,7 +9,7 @@ git-hash-object - Compute object ID and optionally creates a blob from a file
SYNOPSIS
--------
[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>

DESCRIPTION
@ -47,6 +47,12 @@ OPTIONS @@ -47,6 +47,12 @@ OPTIONS
temporary files located outside of the working directory or files
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
------
Written by Junio C Hamano <gitster@pobox.com>

17
hash-object.c

@ -52,7 +52,7 @@ static void hash_stdin_paths(const char *type, int write_objects) @@ -52,7 +52,7 @@ static void hash_stdin_paths(const char *type, int write_objects)
}

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>",
NULL
};
@ -61,6 +61,7 @@ static const char *type; @@ -61,6 +61,7 @@ static const char *type;
static int write_object;
static int hashstdin;
static int stdin_paths;
static int no_filters;
static const char *vpath;

static const struct option hash_object_options[] = {
@ -68,6 +69,7 @@ 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( 0 , "stdin", &hashstdin, "read the object 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_END()
};
@ -99,9 +101,15 @@ int main(int argc, const char **argv) @@ -99,9 +101,15 @@ int main(int argc, const char **argv)
errstr = "Can't specify files with --stdin-paths";
else if (vpath)
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)
errstr = "Multiple --stdin arguments are not supported";
if (vpath && no_filters)
errstr = "Can't use --path with --no-filters";
}
else if (hashstdin > 1)
errstr = "Multiple --stdin arguments are not supported";

if (errstr) {
error (errstr);
@ -116,7 +124,8 @@ int main(int argc, const char **argv) @@ -116,7 +124,8 @@ int main(int argc, const char **argv)

if (0 <= prefix_length)
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)

24
t/t1007-hash-object.sh

@ -65,6 +65,14 @@ test_expect_success "Can't use --path with --stdin-paths" ' @@ -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
'

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

push_repo
@ -117,6 +125,22 @@ test_expect_success 'check that appropriate filter is invoke when --path is used @@ -117,6 +125,22 @@ test_expect_success 'check that appropriate filter is invoke when --path is used
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

for args in "-w --stdin" "--stdin -w"; do

Loading…
Cancel
Save