diff options
author | Michael Haggerty <mhagger@alum.mit.edu> | 2011-09-15 23:10:27 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-10-05 13:45:30 -0700 |
commit | 7e9d2fe96060957d90870d2fac9b85608423e277 (patch) | |
tree | dc68fe7286d63488a9a9a0115554b7ac75a16e41 | |
parent | Refactor check_refname_format() (diff) | |
download | tgif-7e9d2fe96060957d90870d2fac9b85608423e277.tar.xz |
Do not allow ".lock" at the end of any refname component
Allowing any refname component to end with ".lock" is looking for
trouble; for example,
$ git br foo.lock/bar
$ git br foo
fatal: Unable to create '[...]/.git/refs/heads/foo.lock': File exists.
Therefore, do not allow any refname component to end with ".lock".
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | Documentation/git-check-ref-format.txt | 4 | ||||
-rw-r--r-- | refs.c | 4 | ||||
-rwxr-xr-x | t/t1402-check-ref-format.sh | 8 |
3 files changed, 7 insertions, 9 deletions
diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.txt index dcb8cc38a3..9114751966 100644 --- a/Documentation/git-check-ref-format.txt +++ b/Documentation/git-check-ref-format.txt @@ -28,7 +28,7 @@ git imposes the following rules on how references are named: . They can include slash `/` for hierarchical (directory) grouping, but no slash-separated component can begin with a - dot `.`. + dot `.` or end with the sequence `.lock`. . They must contain at least one `/`. This enforces the presence of a category like `heads/`, `tags/` etc. but the actual names are not @@ -47,8 +47,6 @@ git imposes the following rules on how references are named: . They cannot end with a slash `/` nor a dot `.`. -. They cannot end with the sequence `.lock`. - . They cannot contain a sequence `@{`. . They cannot contain a `\`. @@ -898,6 +898,8 @@ static int check_refname_component(const char *ref) return -1; /* Component has zero length. */ if (ref[0] == '.') return -1; /* Component starts with '.'. */ + if (cp - ref >= 5 && !memcmp(cp - 5, ".lock", 5)) + return -1; /* Refname ends with ".lock". */ return cp - ref; } @@ -931,8 +933,6 @@ int check_refname_format(const char *ref, int flags) if (ref[component_len - 1] == '.') return -1; /* Refname ends with '.'. */ - if (component_len >= 5 && !memcmp(&ref[component_len - 5], ".lock", 5)) - return -1; /* Refname ends with ".lock". */ if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2) return -1; /* Refname has only one component. */ return 0; diff --git a/t/t1402-check-ref-format.sh b/t/t1402-check-ref-format.sh index 1cad88f2dc..419788f78f 100755 --- a/t/t1402-check-ref-format.sh +++ b/t/t1402-check-ref-format.sh @@ -43,8 +43,8 @@ invalid_ref 'heads/foo?bar' valid_ref 'foo./bar' invalid_ref 'heads/foo.lock' invalid_ref 'heads///foo.lock' -valid_ref 'foo.lock/bar' -valid_ref 'foo.lock///bar' +invalid_ref 'foo.lock/bar' +invalid_ref 'foo.lock///bar' valid_ref 'heads/foo@bar' invalid_ref 'heads/v@{ation' invalid_ref 'heads/foo\bar' @@ -160,7 +160,7 @@ invalid_ref_normalized 'heads/./foo' invalid_ref_normalized 'heads\foo' invalid_ref_normalized 'heads/foo.lock' invalid_ref_normalized 'heads///foo.lock' -valid_ref_normalized 'foo.lock/bar' 'foo.lock/bar' -valid_ref_normalized 'foo.lock///bar' 'foo.lock/bar' +invalid_ref_normalized 'foo.lock/bar' +invalid_ref_normalized 'foo.lock///bar' test_done |