From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.180.0/23 X-Spam-Status: No, score=-4.1 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by dcvr.yhbt.net (Postfix) with ESMTP id 176F520989 for ; Tue, 11 Oct 2016 00:22:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752840AbcJKAWA (ORCPT ); Mon, 10 Oct 2016 20:22:00 -0400 Received: from mail-pa0-f48.google.com ([209.85.220.48]:32851 "EHLO mail-pa0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752690AbcJKAVz (ORCPT ); Mon, 10 Oct 2016 20:21:55 -0400 Received: by mail-pa0-f48.google.com with SMTP id vu5so3988640pab.0 for ; Mon, 10 Oct 2016 17:21:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kGP0WrCoC4YrmqDSNCGmfomMTJAOYGm1TKkyJPmtDZg=; b=jyNW6yx1ZE9enKZf6CQzR/QDlvZebLccn2JVoGXLBJcX3U55WDDFMs2r0JBJtpvUNZ rfhlhdYcdATPkq54J4On7TRMvcs8tzahAIqSTfcEZVwRwSBQwsjL9amuYzEVjfHb4Gq8 TzqmjCKgf5wvVAlkyE380/fO1kOFW6HTlrCuDXQeH3X3rAxuxuQIgILbkk79gghTVoE0 oTeKeiPrjbbFFZfdFLqWATYIw8aeXIKYqdiKiDRKGNqWajQo47Bki/o8k3ynEstXZnTM M2letG1sJ3e7H/qDwGR47HiqKfW17pybhs6MEGjM+Yo6oNIL9IzvX3lQUhqguy3O7KH3 A9nQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kGP0WrCoC4YrmqDSNCGmfomMTJAOYGm1TKkyJPmtDZg=; b=WGb33pD7GQXT2RXoaeuF0dClhlxZLZ/8MgmsxL2M+83DrOO/Ef6iLaAOXA7AGdM0Bf Td2yjVM0M/dlc3+TFC6+36E5aUh5AW75ks7R7G6rXKC7Vlva5PfVWHTjaEOw0Hzrm4U6 FwK4Hu3XFSTk0ycccyzOz2/0bFr1LZ/k8frvqJ2TNJPRHxlX0pNSdgCDC8mZ2aSUoWu+ hV/7tqaxs+u2JoZRpSM/jBUcYL1zZJjkpKhsQBYWk+8sb/FPZz6DnithsEe5Dmu+ATPo IY3LyBmw+RUOj4xr+I+1O0VsJ97+15bW0vjzPUmGmk8clHo6Y5e70J8wMolA/tmqVuQb OIzQ== X-Gm-Message-State: AA6/9Rl5TIxX1JGqIzff08baSo4+j4lGatmICI2mqgmJNqQIZ/yQBj0gpaivhwWruoVzgdYi X-Received: by 10.66.216.162 with SMTP id or2mr1761109pac.44.1476145314924; Mon, 10 Oct 2016 17:21:54 -0700 (PDT) Received: from localhost ([2620:0:1000:5b10:b8ee:61f5:e989:77a7]) by smtp.gmail.com with ESMTPSA id e6sm514290pfb.57.2016.10.10.17.21.54 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Mon, 10 Oct 2016 17:21:54 -0700 (PDT) From: Stefan Beller To: gitster@pobox.com Cc: git@vger.kernel.org, bmwill@google.com, pclouds@gmail.com, Stefan Beller Subject: [PATCH 18/28] attr: support quoting pathname patterns in C style Date: Mon, 10 Oct 2016 17:21:05 -0700 Message-Id: <20161011002115.23312-19-sbeller@google.com> X-Mailer: git-send-email 2.10.1.382.ga23ca1b.dirty In-Reply-To: <20161011002115.23312-1-sbeller@google.com> References: <20161011002115.23312-1-sbeller@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Nguyễn Thái Ngọc Duy Full pattern must be quoted. So 'pat"t"ern attr' will give exactly 'pat"t"ern', not 'pattern'. Also clarify that leading whitespaces are not part of the pattern and document comment syntax. Signed-off-by: Nguyễn Thái Ngọc Duy Signed-off-by: Junio C Hamano Signed-off-by: Stefan Beller --- Documentation/gitattributes.txt | 8 +++++--- attr.c | 15 +++++++++++++-- t/t0003-attributes.sh | 26 ++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt index 7aff940..8a061af 100644 --- a/Documentation/gitattributes.txt +++ b/Documentation/gitattributes.txt @@ -21,9 +21,11 @@ Each line in `gitattributes` file is of form: pattern attr1 attr2 ... That is, a pattern followed by an attributes list, -separated by whitespaces. When the pattern matches the -path in question, the attributes listed on the line are given to -the path. +separated by whitespaces. Leading and trailing whitespaces are +ignored. Lines that begin with '#' are ignored. Patterns +that begin with a double quote are quoted in C style. +When the pattern matches the path in question, the attributes +listed on the line are given to the path. Each attribute can be in one of these states for a given path: diff --git a/attr.c b/attr.c index 6e3bd25..6a14c9a 100644 --- a/attr.c +++ b/attr.c @@ -13,6 +13,7 @@ #include "attr.h" #include "dir.h" #include "utf8.h" +#include "quote.h" const char git_attr__true[] = "(builtin)true"; const char git_attr__false[] = "\0(builtin)false"; @@ -225,12 +226,21 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, const char *cp, *name, *states; struct match_attr *res = NULL; int is_macro; + struct strbuf pattern = STRBUF_INIT; cp = line + strspn(line, blank); if (!*cp || *cp == '#') return NULL; name = cp; - namelen = strcspn(name, blank); + + if (*cp == '"' && !unquote_c_style(&pattern, name, &states)) { + name = pattern.buf; + namelen = pattern.len; + } else { + namelen = strcspn(name, blank); + states = name + namelen; + } + if (strlen(ATTRIBUTE_MACRO_PREFIX) < namelen && starts_with(name, ATTRIBUTE_MACRO_PREFIX)) { if (!macro_ok) { @@ -250,7 +260,6 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, else is_macro = 0; - states = name + namelen; states += strspn(states, blank); /* First pass to count the attr_states */ @@ -293,9 +302,11 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, cannot_trust_maybe_real = 1; } + strbuf_release(&pattern); return res; fail_return: + strbuf_release(&pattern); free(res); return NULL; } diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index f0fbb42..f19ae4f 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -13,10 +13,31 @@ attr_check () { test_line_count = 0 err } +attr_check_quote () { + + path="$1" + quoted_path="$2" + expect="$3" + + git check-attr test -- "$path" >actual && + echo "\"$quoted_path\": test: $expect" >expect && + test_cmp expect actual + +} + +test_expect_success 'open-quoted pathname' ' + echo "\"a test=a" >.gitattributes && + test_must_fail attr_check a a +' + + test_expect_success 'setup' ' mkdir -p a/b/d a/c b && ( echo "[attr]notest !test" + echo "\" d \" test=d" + echo " e test=e" + echo " e\" test=e" echo "f test=f" echo "a/i test=a/i" echo "onoff test -test" @@ -69,6 +90,11 @@ test_expect_success 'command line checks' ' ' test_expect_success 'attribute test' ' + + attr_check " d " d && + attr_check e e && + attr_check_quote e\" e\\\" e && + attr_check f f && attr_check a/f f && attr_check a/c/f f && -- 2.10.1.382.ga23ca1b.dirty