From patchwork Wed Oct 4 18:18:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Cai X-Patchwork-Id: 13409144 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D7470E7C4E7 for ; Wed, 4 Oct 2023 18:18:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233700AbjJDSSb (ORCPT ); Wed, 4 Oct 2023 14:18:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55984 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233410AbjJDSSa (ORCPT ); Wed, 4 Oct 2023 14:18:30 -0400 Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3F270BF for ; Wed, 4 Oct 2023 11:18:25 -0700 (PDT) Received: by mail-wr1-x429.google.com with SMTP id ffacd0b85a97d-31c5cac3ae2so130389f8f.3 for ; Wed, 04 Oct 2023 11:18:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1696443503; x=1697048303; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=4zLkouxQ8uIAcXIsnxRd/ch5Qk5tIZ/NPnI+/iSnVhU=; b=jFwDHJrma5Itd6+GBRNQqJRR1gB8WUq8CANYZVcOCtkXUrwOJhKWrfJP0HLOmZ/LSJ dGT8E8O5qWkw4vPXu/JbIUEzeoC5X6Id+gieVn1tUzU0udq5mWqaPZ0UVGqaeLzQhq+J CVuUUCtmWkaF7SSJ3dO4JsR4TmaSiwepi0rs22RJ+A0pk2j+ylCy86UAJVE2o8IZG6Mw gCDWhTuofjTN5SQ8xVb9HjTF4sQFp8KA0wpMMUa1FnKHMKfE2jd14wblEcFrh5YHqh/L B4Ms2qn/b17WglRFgts+ca76L8M90rm6CPNBeN6VBCIBoDnuQd0xKu/HzXa0sqYh4GfX /3Pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696443503; x=1697048303; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4zLkouxQ8uIAcXIsnxRd/ch5Qk5tIZ/NPnI+/iSnVhU=; b=Pj1FGJBIQkXWBkp0yAEKSTALn/tG5l8DBmAzf0qM0zLKfyMl08iNaWxI+Tf5VTKJ24 +E1++ePIwiuEOvKDms2Nf2Rlj09UJdIKbQMNH3FCZuF86vw3zCYpT8u2N5M1VQsbhbXd qlKEPSR8Z7naJGlrJWWsHMU0cxgE4ch4/5GR6y/pAGOD7QlmnmZTQXjI/oVJ6TZGVhlC nJA9560fQ7zBD264P+UtdVR+ZCt8N2MKBevwJ2v78xL2ctwuaG5F7RTtHTzCDZ6s6Vxd P36eOoMc917KgpiLU6WSWRF1dbhNZJwcL+j70vQN00bngQPUmf4YJZmMu7uSlBU6MDNK 3G6w== X-Gm-Message-State: AOJu0YzwgWEEIJRS7uOM8sNZmoBfidfqN66Hm/rEDBAwNHtcDJWGHsLP rYvk9Sm5KmWOFXFUzLxxybjlHV81zjg= X-Google-Smtp-Source: AGHT+IH46Y7C4Xd28mZWkKsllHWQQtRctdYVjl0uwOwNY+lhyW8oMT6sT0L663IcZotaDaZJsQJBug== X-Received: by 2002:a5d:6d41:0:b0:323:2f54:b6cb with SMTP id k1-20020a5d6d41000000b003232f54b6cbmr3007299wri.8.1696443503314; Wed, 04 Oct 2023 11:18:23 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id y22-20020a1c4b16000000b0040642a1df1csm2065905wma.25.2023.10.04.11.18.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Oct 2023 11:18:23 -0700 (PDT) Message-ID: <446bce03a96836f35f94e9ef8548cf4a2b041ba8.1696443502.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 04 Oct 2023 18:18:20 +0000 Subject: [PATCH v2 1/2] attr: add attr.tree for setting the treeish to read attributes from Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jeff King , John Cai , John Cai Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: John Cai From: John Cai 44451a2e5e (attr: teach "--attr-source=" global option to "git", 2023-05-06) provided the ability to pass in a treeish as the attr source. In the context of serving Git repositories as bare repos like we do at GitLab however, it would be easier to point --attr-source to HEAD for all commands by setting it once. Add a new config attr.tree that allows this. Signed-off-by: John Cai --- Documentation/config.txt | 2 ++ Documentation/config/attr.txt | 5 +++++ attr.c | 7 +++++++ t/t0003-attributes.sh | 4 ++++ 4 files changed, 18 insertions(+) create mode 100644 Documentation/config/attr.txt diff --git a/Documentation/config.txt b/Documentation/config.txt index 229b63a454c..b1891c2b5af 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -371,6 +371,8 @@ other popular tools, and describe them in your documentation. include::config/advice.txt[] +include::config/attr.txt[] + include::config/core.txt[] include::config/add.txt[] diff --git a/Documentation/config/attr.txt b/Documentation/config/attr.txt new file mode 100644 index 00000000000..e4f2122b7ab --- /dev/null +++ b/Documentation/config/attr.txt @@ -0,0 +1,5 @@ +attr.tree: + A to read gitattributes from instead of the worktree. See + linkgit:gitattributes[5]. This is equivalent to setting the + `GIT_ATTR_SOURCE` environment variable, or passing in --attr-source to + the Git command. diff --git a/attr.c b/attr.c index 71c84fbcf86..bb0d54eb967 100644 --- a/attr.c +++ b/attr.c @@ -1205,6 +1205,13 @@ static void compute_default_attr_source(struct object_id *attr_source) if (!default_attr_source_tree_object_name) default_attr_source_tree_object_name = getenv(GIT_ATTR_SOURCE_ENVIRONMENT); + if (!default_attr_source_tree_object_name) { + char *attr_tree; + + if (!git_config_get_string("attr.tree", &attr_tree)) + default_attr_source_tree_object_name = attr_tree; + } + if (!default_attr_source_tree_object_name || !is_null_oid(attr_source)) return; diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index 26e082f05b4..6342187c751 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -40,6 +40,10 @@ attr_check_source () { test_cmp expect actual && test_must_be_empty err + git $git_opts -c "attr.tree=$source" check-attr test -- "$path" >actual 2>err && + test_cmp expect actual && + test_must_be_empty err + GIT_ATTR_SOURCE="$source" git $git_opts check-attr test -- "$path" >actual 2>err && test_cmp expect actual && test_must_be_empty err From patchwork Wed Oct 4 18:18:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Cai X-Patchwork-Id: 13409145 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 036A8E7C4E9 for ; Wed, 4 Oct 2023 18:18:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233691AbjJDSSh (ORCPT ); Wed, 4 Oct 2023 14:18:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56010 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233594AbjJDSSa (ORCPT ); Wed, 4 Oct 2023 14:18:30 -0400 Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E6670A7 for ; Wed, 4 Oct 2023 11:18:25 -0700 (PDT) Received: by mail-wr1-x429.google.com with SMTP id ffacd0b85a97d-32336a30d18so132558f8f.2 for ; Wed, 04 Oct 2023 11:18:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1696443504; x=1697048304; darn=vger.kernel.org; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:from:to:cc:subject:date :message-id:reply-to; bh=pBBGcxISST1P9ReGHJjUt9XfMzQN41CQCCAMvugdggs=; b=BQtmi+ABUhqomML6fdbGlhYRxQrA6lPPO4TCcAh+C9qkoJQodCOtAEO8iaUWxGQEoF /DqHuuAcPHREgQRRahRytSpBmDj+6PyvQrowJCWL6YkGhsNrZYus9Ck3WX1m126xmrge H+7lUdG8IA/cvEYv+s0mX79GvbVRsulCstAcHcIwGuapEU1ISqG5zL1rKXa5TQvXIhdQ GcYWnVuwF5I0BF2+xfQyUGL18Y9oDLLxirub1YPe2Q24ShV0wFK6hwvmTPW690CmJdnm 3Zsq0bjn70aHK0/6STl4OnrP3n25VghnUyyUU/Ju+04nidZpECWzrmsbSE0i81foDNRf tcOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1696443504; x=1697048304; h=cc:to:mime-version:content-transfer-encoding:fcc:subject:date:from :references:in-reply-to:message-id:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pBBGcxISST1P9ReGHJjUt9XfMzQN41CQCCAMvugdggs=; b=oPghe1JxxbdZaF24o5OPpPYbfj7VASYyEhEfayj4K43aTMyjvcJmZG/0diTQmTrpN1 DwYp2aLCejkKBRLfv9Z0Dx9b6UjikPNcsPAql//rroofvLUIzR/+R/GoKktbTlfZi0me jTohOd/+cb8rbBFl+NALiqYUYvP41dKv/el50lAmyS9PivsE6HBuBFkhHQxB5hNjQ1yh zD99TPOfSYgA6cW93SXsAo330vo6WVf3BHjmUsx7xZ7yZcQMy+6Cuut5PUphLzfXlCTG EiO1nlqs4rXM3ulQO2KCBQBfHh5kJCts93U5V+0ixHb+ELakNvq65Hr/WYnIJqeaDiND AcUQ== X-Gm-Message-State: AOJu0YzJHEMHXVHD+MHIFwqlAm7xmX6TmpX4TFIp83Hx4IcA8p3wB4ND be4SVn7rM382Kol0CC1SGMNQof/AsbE= X-Google-Smtp-Source: AGHT+IFfZfK9BTqpYm8zLclD1KNGZE59CUAs2yMY7Hbq4tSikwcCkKInc1camzrj7fpTjsnZEhmEMg== X-Received: by 2002:adf:f546:0:b0:317:634c:46e9 with SMTP id j6-20020adff546000000b00317634c46e9mr3021512wrp.43.1696443504178; Wed, 04 Oct 2023 11:18:24 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id a12-20020a5d570c000000b00327bf4f2f16sm4523167wrv.30.2023.10.04.11.18.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Oct 2023 11:18:23 -0700 (PDT) Message-ID: <52d9e1803526bf1f267d23f6ef163049f8be77b7.1696443502.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 04 Oct 2023 18:18:21 +0000 Subject: [PATCH v2 2/2] attr: add attr.allowInvalidSource config to allow invalid revision Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Jeff King , John Cai , John Cai Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: John Cai From: John Cai The previous commit provided the ability to pass in a treeish as the attr source via the attr.tree config. The default behavior is that when a revision does not resolve to a valid tree is passed, Git will die. When HEAD is unborn however, it does not point to a valid treeish, causing Git to die. In the context of serving repositories through bare repositories, we'd like to be able to set attr.tree to HEAD and allow cases where HEAD does not resolve to a valid tree to be treated as if there were no treeish provided. Add attr.allowInvalidSource that allows this. Signed-off-by: John Cai --- Documentation/config/attr.txt | 7 ++++++ attr.c | 16 ++++++++++--- t/t0003-attributes.sh | 45 +++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/Documentation/config/attr.txt b/Documentation/config/attr.txt index e4f2122b7ab..00113a4950e 100644 --- a/Documentation/config/attr.txt +++ b/Documentation/config/attr.txt @@ -3,3 +3,10 @@ attr.tree: linkgit:gitattributes[5]. This is equivalent to setting the `GIT_ATTR_SOURCE` environment variable, or passing in --attr-source to the Git command. + +attr.allowInvalidSource:: + If `attr.tree` cannot resolve to a valid tree object, ignore + `attr.tree` instead of erroring out, and fall back to looking for + attributes in the default locations. Useful when passing `HEAD` into + `attr-source` since it allows `HEAD` to point to an unborn branch in + cases like an empty repository. diff --git a/attr.c b/attr.c index bb0d54eb967..1a7ac39b9d1 100644 --- a/attr.c +++ b/attr.c @@ -1202,21 +1202,31 @@ void set_git_attr_source(const char *tree_object_name) static void compute_default_attr_source(struct object_id *attr_source) { + int attr_source_from_config = 0; + if (!default_attr_source_tree_object_name) default_attr_source_tree_object_name = getenv(GIT_ATTR_SOURCE_ENVIRONMENT); if (!default_attr_source_tree_object_name) { char *attr_tree; - if (!git_config_get_string("attr.tree", &attr_tree)) + if (!git_config_get_string("attr.tree", &attr_tree)) { + attr_source_from_config = 1; default_attr_source_tree_object_name = attr_tree; + } } if (!default_attr_source_tree_object_name || !is_null_oid(attr_source)) return; - if (repo_get_oid_treeish(the_repository, default_attr_source_tree_object_name, attr_source)) - die(_("bad --attr-source or GIT_ATTR_SOURCE")); + if (repo_get_oid_treeish(the_repository, default_attr_source_tree_object_name, attr_source)) { + int allow_invalid_attr_source = 0; + + git_config_get_bool("attr.allowinvalidsource", &allow_invalid_attr_source); + + if (!(allow_invalid_attr_source && attr_source_from_config)) + die(_("bad --attr-source or GIT_ATTR_SOURCE")); + } } static struct object_id *default_attr_source(void) diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index 6342187c751..972b64496e7 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -346,6 +346,51 @@ test_expect_success 'bare repository: check that .gitattribute is ignored' ' ) ' +bad_attr_source_err="fatal: bad --attr-source or GIT_ATTR_SOURCE" + +test_expect_success 'attr.allowInvalidSource when HEAD is unborn' ' + test_when_finished rm -rf empty && + echo $bad_attr_source_err >expect_err && + echo "f/path: test: unspecified" >expect && + git init empty && + test_must_fail git -C empty --attr-source=HEAD check-attr test -- f/path 2>err && + test_cmp expect_err err && + git -C empty -c attr.tree=HEAD -c attr.allowInvalidSource=true check-attr test -- f/path >actual 2>err && + test_must_be_empty err && + test_cmp expect actual +' + +test_expect_success 'attr.allowInvalidSource when --attr-source points to non-existing ref' ' + test_when_finished rm -rf empty && + echo $bad_attr_source_err >expect_err && + echo "f/path: test: unspecified" >expect && + git init empty && + test_must_fail git -C empty --attr-source=refs/does/not/exist check-attr test -- f/path 2>err && + test_cmp expect_err err && + git -C empty -c attr.tree=refs/does/not/exist -c attr.allowInvalidSource=true check-attr test -- f/path >actual 2>err && + test_must_be_empty err && + test_cmp expect actual +' + +test_expect_success 'bad attr source defaults to reading .gitattributes file' ' + test_when_finished rm -rf empty && + git init empty && + echo "f/path test=val" >empty/.gitattributes && + echo "f/path: test: val" >expect && + git -C empty -c attr.tree=HEAD -c attr.allowInvalidSource=true check-attr test -- f/path >actual 2>err && + test_must_be_empty err && + test_cmp expect actual +' + +test_expect_success 'attr.allowInvalidSource has no effect on --attr-source' ' + test_when_finished rm -rf empty && + echo $bad_attr_source_err >expect_err && + echo "f/path: test: unspecified" >expect && + git init empty && + test_must_fail git -C empty -c attr.allowInvalidSource=true --attr-source=HEAD check-attr test -- f/path 2>err && + test_cmp expect_err err +' + test_expect_success 'bare repository: with --source' ' ( cd bare.git &&