Skip to content

Commit

Permalink
add --no-filters option to git hash-object
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Dmitry Potapov authored and Junio C Hamano committed Aug 3, 2008
1 parent 3970243 commit 4a3d85d
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 5 deletions.
8 changes: 7 additions & 1 deletion Documentation/git-hash-object.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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>
Expand Down
17 changes: 13 additions & 4 deletions hash-object.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
};
Expand All @@ -61,13 +61,15 @@ 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[] = {
OPT_STRING('t', NULL, &type, "type", "object type"),
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()
};
Expand Down Expand Up @@ -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);
Expand All @@ -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)
Expand Down
24 changes: 24 additions & 0 deletions t/t1007-hash-object.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 4a3d85d

Please sign in to comment.