From patchwork Mon Feb 7 17:31:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lessley Dennington X-Patchwork-Id: 12737785 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 AF41EC4332F for ; Mon, 7 Feb 2022 17:47:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235794AbiBGRpu (ORCPT ); Mon, 7 Feb 2022 12:45:50 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51306 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1355828AbiBGRcJ (ORCPT ); Mon, 7 Feb 2022 12:32:09 -0500 Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B58C4C0401DF for ; Mon, 7 Feb 2022 09:31:49 -0800 (PST) Received: by mail-wr1-x42d.google.com with SMTP id h6so7430290wrb.9 for ; Mon, 07 Feb 2022 09:31:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=Y9pEqdJHX8Qi44UJwJPMvieLjxpez4B5c/alq0PRzBo=; b=L680iJ3XV4B9X3Pj5vXgzbFpoOFY/m/CBboBqNLBzoqqx+KGXO3a0cWB3VrBruudCF d0g8wfncPWeOzYM6RZg4OKmxjb9166vnk0A2mW5ZEooh6VEyrNRTMe2ughsXNSg9JpE8 u6NN7BAYUc3Nsumvk7TZWNRfQzpeQihVcVZF2cdsAq3DvmmxlTTdU/CfVPZfMvGm3LPu TbJQ2LTlattgHnijH1wOAYpbq3PYiDkMOcdmGA/xXwDPeaAALGdrsUnMKsK3vEhPOpG4 RdVdtfrAmfsWyAs6seTvfRO9wsMJRR1TBh+Blrh3ndiFx0OdPwUGFpWEJyBUGov+RmXW x/rQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=Y9pEqdJHX8Qi44UJwJPMvieLjxpez4B5c/alq0PRzBo=; b=wUyiA2R8bmH3PUDWIF03hb55dxa/0Ik0yjI16rL3+C9UTrEKe8KAK9h/t6k9hDv2lW R2/6kFonbKrOGW2duGf0CFYayAvQscGKOtRnl5n6rO/cKiHfY5j312fva0oV/A3P6DFT rTQ346/obBkgA0wx3GtlwMgP6fpcp6sZ87j/I8Z9NHezU/UPw2Fqyu0Lf9V/P3LIPKXI X5GEY6ssmcPWmcYJvLhJhncOB7lulIBV8G4LYVBWZPUKGz6MpZRDDrsiMC5Simr9EVAd zl3uh+6g7XmDZSBhvEDQF9ZOkPvFQoxw8F8uV+mLzk12bNyzng2YNEDvSfiqMmnJ1KXA cv9w== X-Gm-Message-State: AOAM5326OMJiVpsGhgzhX9hITR0XTJb4FO38tK1CQccXgY/MuuXeKo6s 8L1vPUZwH7wokzjXWFQ2tZMr4JunhtQ= X-Google-Smtp-Source: ABdhPJyDtpJ8U1ykV/7laz9SnsRP7gvx37aNZ2G4JLPqXST7VI+xG3ocLGzlmky5L4uVFd+Pzo46dA== X-Received: by 2002:a05:6000:1b8a:: with SMTP id r10mr381682wru.665.1644255108138; Mon, 07 Feb 2022 09:31:48 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id f12sm10577489wrs.1.2022.02.07.09.31.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Feb 2022 09:31:47 -0800 (PST) Message-Id: <26422c759a018262dd0095817d7d67e1e39908fe.1644255105.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 07 Feb 2022 17:31:43 +0000 Subject: [PATCH v7 1/3] completion: address sparse-checkout issues Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: stolee@gmail.com, gitster@pobox.com, johannes.schindelin@gmail.com, Elijah Newren , Taylor Blau , SZEDER =?utf-8?b?R8OhYm9y?= , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Lessley Dennington , Lessley Dennington Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Lessley Dennington From: Lessley Dennington Correct multiple issues with tab completion of the git sparse-checkout command. These issues were: 1. git sparse-checkout previously resulted in an incomplete list of subcommands (it was missing reapply and add). 2. Subcommand options were not tab-completable. 3. git sparse-checkout set and git sparse-checkout add showed both file names and directory names. While this may be a less surprising behavior for non-cone mode, cone mode sparse checkouts should complete only directory names. Note that while the new strategy of just using git ls-tree to complete on directory names is simple and a step in the right direction, it does have some caveats. These are: 1. Likelihood of poor performance in large monorepos (as a result of recursively completing directory names). 2. Inability to handle paths containing unusual characters. These caveats will be fixed by subsequent commits in this series. Signed-off-by: Lessley Dennington Reviewed-by: Elijah Newren --- contrib/completion/git-completion.bash | 16 ++--- t/t9902-completion.sh | 83 ++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 8 deletions(-) diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index c82ccaebcc7..7f6c86dc6c0 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -2988,7 +2988,7 @@ _git_show_branch () _git_sparse_checkout () { - local subcommands="list init set disable" + local subcommands="list init set disable add reapply" local subcommand="$(__git_find_on_cmdline "$subcommands")" if [ -z "$subcommand" ]; then __gitcomp "$subcommands" @@ -2996,14 +2996,14 @@ _git_sparse_checkout () fi case "$subcommand,$cur" in - init,--*) - __gitcomp "--cone" - ;; - set,--*) - __gitcomp "--stdin" - ;; - *) + *,--*) + __gitcomp_builtin sparse-checkout_$subcommand "" "--" ;; + set,*|add,*) + if [ "$(__git config core.sparseCheckoutCone)" == "true" ] || + [ -n "$(__git_find_on_cmdline --cone)" ]; then + __gitcomp "$(git ls-tree -d -r HEAD --name-only)" + fi esac } diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index 518203fbe07..f6eeb9aa035 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -1447,6 +1447,89 @@ test_expect_success 'git checkout - with --detach, complete only references' ' EOF ' +test_expect_success 'setup sparse-checkout tests' ' + # set up sparse-checkout repo + git init sparse-checkout && + ( + cd sparse-checkout && + mkdir -p folder1/0/1 folder2/0 folder3 && + touch folder1/0/1/t.txt && + touch folder2/0/t.txt && + touch folder3/t.txt && + git add . && + git commit -am "Initial commit" + ) +' + +test_expect_success 'sparse-checkout completes subcommands' ' + test_completion "git sparse-checkout " <<-\EOF + list Z + init Z + set Z + add Z + reapply Z + disable Z + EOF +' + +test_expect_success 'cone mode sparse-checkout completes directory names' ' + # initialize sparse-checkout definitions + git -C sparse-checkout sparse-checkout set --cone folder1/0 folder3 && + + # test tab completion + ( + cd sparse-checkout && + test_completion "git sparse-checkout set f" <<-\EOF + folder1 Z + folder1/0 Z + folder1/0/1 Z + folder2 Z + folder2/0 Z + folder3 Z + EOF + ) && + + ( + cd sparse-checkout/folder1 && + test_completion "git sparse-checkout add " <<-\EOF + ./ Z + 0 Z + 0/1 Z + EOF + ) +' + +test_expect_success 'non-cone mode sparse-checkout uses bash completion' ' + # reset sparse-checkout repo to non-cone mode + git -C sparse-checkout sparse-checkout disable && + git -C sparse-checkout sparse-checkout set --no-cone && + + ( + cd sparse-checkout && + # expected to be empty since we have not configured + # custom completion for non-cone mode + test_completion "git sparse-checkout set f" <<-\EOF + + EOF + ) +' + +test_expect_success 'git sparse-checkout set --cone completes directory names' ' + git -C sparse-checkout sparse-checkout disable && + + ( + cd sparse-checkout && + test_completion "git sparse-checkout set --cone f" <<-\EOF + folder1 Z + folder1/0 Z + folder1/0/1 Z + folder2 Z + folder2/0 Z + folder3 Z + EOF + ) +' + test_expect_success 'git switch - with -d, complete all references' ' test_completion "git switch -d " <<-\EOF HEAD Z From patchwork Mon Feb 7 17:31:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lessley Dennington X-Patchwork-Id: 12737783 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 0F463C433EF for ; Mon, 7 Feb 2022 17:46:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233637AbiBGRps (ORCPT ); Mon, 7 Feb 2022 12:45:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51346 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1356035AbiBGRcL (ORCPT ); Mon, 7 Feb 2022 12:32:11 -0500 Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9A562C0401DC for ; Mon, 7 Feb 2022 09:31:50 -0800 (PST) Received: by mail-wr1-x434.google.com with SMTP id h6so7430355wrb.9 for ; Mon, 07 Feb 2022 09:31:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=omt8JnpozvPIujQIzL2htQ5+QzI2TZKOqNiLhOJ7DZ8=; b=We+8TjERv1HzXKEHit7ga7uLzL4IDyW8w3KUrK7SZ5No/1PpEkZewP8xw0BUwJM7N5 ifQ38Y+DVRqq9FgDOYfFGN+3Lpcx6SfQPHAw8gfUwzj8sEVTUOmzNmqgkCu008hdWlEa RUJeu154/zETun3Tb67+KgoM3qJUf1eJsjS3EVVFalrtUtaip2JxgVkEVHVqR0Wix5yi mREk8g+xBvXZk834zw4XgVO21V3NntJTO8iCfPlYmcaYhxLecAevxqcPqroVlops1w/P gNsp9/JdHnzNDCMTncXIJ53uOsTfAPd8vBPAPCwbKAUuEOTmr5g/BplQUa3WnKh0HPY/ gOnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=omt8JnpozvPIujQIzL2htQ5+QzI2TZKOqNiLhOJ7DZ8=; b=1dqoJL1wotO36+BUc2qXGILay1js7ZgEDlVfBEOV1EAvbxv4Tzz6qPE5mKNG00aHns 4CTGDux5VipIHuVEpnFPXO2Sy10QQ5JG0mr1QsgIqaw8YR65rQUimfk92ylLIJd8+e4k 3eKSasNJjcEvZIRE4XFxG4OEZ3fvbIRfODWmFC/Rt/RxdOoTVpu6hkWIcctWvwoIfrZq hw56xjgTqxAMyig9xT6pTcjq49RQ+gafQPraP2zSANvHkZIqSyZInjeinMr7PFhzc8Vj ulQNYg7NI8109tfW6Z90DT/tKKuobPc8ouxR0OMomeaYfWvsiT+Zlykoum4sDEDrk+Ep yGTw== X-Gm-Message-State: AOAM532goDa3CdEinmgicamiJ7on/ct0ADaPAaz1NpPMP+yYMobrw7wD QwrZKUoCzvicrV237w/BqAK7Xu3tGAU= X-Google-Smtp-Source: ABdhPJwtyUl01FzxXB/88Te6arUExpfP0yCWs6ZmLF4SrOq4RhtQiUERJX/e1PvRRcR4D6fj8bWdAA== X-Received: by 2002:a5d:4687:: with SMTP id u7mr408271wrq.534.1644255109076; Mon, 07 Feb 2022 09:31:49 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id o10sm11535205wri.19.2022.02.07.09.31.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Feb 2022 09:31:48 -0800 (PST) Message-Id: <2c20830b4ce0da0b559f645ba1bf211702cf97c6.1644255105.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 07 Feb 2022 17:31:44 +0000 Subject: [PATCH v7 2/3] completion: improve sparse-checkout cone mode directory completion Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: stolee@gmail.com, gitster@pobox.com, johannes.schindelin@gmail.com, Elijah Newren , Taylor Blau , SZEDER =?utf-8?b?R8OhYm9y?= , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Lessley Dennington , Lessley Dennington Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Lessley Dennington From: Lessley Dennington Use new __gitcomp_directories method to complete directory names in cone mode sparse-checkouts. This method addresses the caveat of poor performance in monorepos from the previous commit (by completing only one level of directories). The unusual character caveat from the previous commit will be fixed by the final commit in this series. Co-authored-by: Elijah Newren Co-authored-by: Lessley Dennington Signed-off-by: Lessley Dennington Reviewed-by: Elijah Newren --- contrib/completion/git-completion.bash | 32 +++++++++++++++++++++- t/t9902-completion.sh | 38 +++++++++++++++----------- 2 files changed, 53 insertions(+), 17 deletions(-) diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 7f6c86dc6c0..eeb80fdc6e4 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -2986,6 +2986,36 @@ _git_show_branch () __git_complete_revlist } +__gitcomp_directories () +{ + local _tmp_dir _tmp_completions + + # Get the directory of the current token; this differs from dirname + # in that it keeps up to the final trailing slash. If no slash found + # that's fine too. + [[ "$cur" =~ .*/ ]] + _tmp_dir=$BASH_REMATCH + + # Find possible directory completions, adding trailing '/' characters + _tmp_completions="$(git ls-tree -d --name-only HEAD $_tmp_dir | + sed -e s%$%/%)" + + if [[ -n "$_tmp_completions" ]]; then + # There were some directory completions, so find ones that + # start with "$cur", the current token, and put those in COMPREPLY + local i=0 c IFS=$' \t\n' + for c in $_tmp_completions; do + if [[ $c == "$cur"* ]]; then + COMPREPLY+=("$c") + fi + done + elif [[ "$cur" =~ /$ ]]; then + # No possible further completions any deeper, so assume we're at + # a leaf directory and just consider it complete + __gitcomp_direct_append "$cur " + fi +} + _git_sparse_checkout () { local subcommands="list init set disable add reapply" @@ -3002,7 +3032,7 @@ _git_sparse_checkout () set,*|add,*) if [ "$(__git config core.sparseCheckoutCone)" == "true" ] || [ -n "$(__git_find_on_cmdline --cone)" ]; then - __gitcomp "$(git ls-tree -d -r HEAD --name-only)" + __gitcomp_directories fi esac } diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index f6eeb9aa035..b38a7302249 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -1480,21 +1480,30 @@ test_expect_success 'cone mode sparse-checkout completes directory names' ' ( cd sparse-checkout && test_completion "git sparse-checkout set f" <<-\EOF - folder1 Z - folder1/0 Z - folder1/0/1 Z - folder2 Z - folder2/0 Z - folder3 Z + folder1/ + folder2/ + folder3/ + EOF + ) && + + ( + cd sparse-checkout && + test_completion "git sparse-checkout set folder1/" <<-\EOF + folder1/0/ + EOF + ) && + + ( + cd sparse-checkout && + test_completion "git sparse-checkout set folder1/0/" <<-\EOF + folder1/0/1/ EOF ) && ( cd sparse-checkout/folder1 && - test_completion "git sparse-checkout add " <<-\EOF - ./ Z - 0 Z - 0/1 Z + test_completion "git sparse-checkout add 0" <<-\EOF + 0/ EOF ) ' @@ -1520,12 +1529,9 @@ test_expect_success 'git sparse-checkout set --cone completes directory names' ' ( cd sparse-checkout && test_completion "git sparse-checkout set --cone f" <<-\EOF - folder1 Z - folder1/0 Z - folder1/0/1 Z - folder2 Z - folder2/0 Z - folder3 Z + folder1/ + folder2/ + folder3/ EOF ) ' From patchwork Mon Feb 7 17:31:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Lessley Dennington X-Patchwork-Id: 12737784 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 8D177C433EF for ; Mon, 7 Feb 2022 17:47:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230478AbiBGRpt (ORCPT ); Mon, 7 Feb 2022 12:45:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51362 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1356064AbiBGRcM (ORCPT ); Mon, 7 Feb 2022 12:32:12 -0500 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 96241C0401DD for ; Mon, 7 Feb 2022 09:31:51 -0800 (PST) Received: by mail-wr1-x42b.google.com with SMTP id m14so26091635wrg.12 for ; Mon, 07 Feb 2022 09:31:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:mime-version :content-transfer-encoding:fcc:to:cc; bh=7s9SOp4oA+tWD/gjgFBvXJC0eheDkkcEANsh3bpt5w0=; b=louii8NDI9BVcTFLLaf2qzS7LF+yjp1+vqjF5SGAVTN1uc+si/hc5BdTV6dp/MG/Cg L51r0H0CYXp/jBSZZYH26h773lP3KwBgxqfTGcBfWKVpjfwes7NM73iod7IqDUrCZ7z/ JdzqbVZxXjJBHaGIiq6Jr5bWQnQr8BWmR8L42+OyYvKxGWvZU1guuvXy5WpphpN943O/ ItsH9poAdKy5osmNeVD2XRG/y8UW97EFGTy06cf9LB/iu6okFDu1VTVeTmzSWAn7ib85 cePm7uBeoMwDCKSmYMyATNC9zhBS6+V+84TpcUFD0RcdAuZ2LEGc+etFrJhrFkyN4Zxz Arxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:mime-version:content-transfer-encoding:fcc:to:cc; bh=7s9SOp4oA+tWD/gjgFBvXJC0eheDkkcEANsh3bpt5w0=; b=hdopqA1+yc9hhj3bpUb+BmcBqcHYt4YR762hHNPGsQkvijVoyrwBjVaADFZvW35D/+ 7ki4+dEW33of4nP/0chbGHjQ+3/o0SdMg5G5vA0r1/7aJtZgisDh47EVKbLTBeox9ZYC phT11KCC8CzizCwRKPS4Yp1fYGsSsQNXObm9ont9ZwmW+DVoPuFRaTB4Ki29evpEuyoa LDfOZxZjFcC9XM43uEQrmWiTjKqK+Z3IGiSZa0L1dXeojshO3iR/VXFY0h1Ifv0GZdec +OTabn4eu6OBoPfRsBC3MafBsLYKxarV/G+uAeW21bp7oYyGdXP94r2uizcWlxl2SmnM 7rKg== X-Gm-Message-State: AOAM5305bWnb4/yi/lM8g3TpDzPc7mu2tqOx36fktG2JYSwX9bTnn3zG 1+Z86Xml6rH69vYWI32IKz9/JYUmb6U= X-Google-Smtp-Source: ABdhPJy92afPLYtURlbr+h45SHEugTPbssV7giuroMluZew725KT3rTE7UP4/ze/wOtAp7X8Acb4iA== X-Received: by 2002:adf:e504:: with SMTP id j4mr413047wrm.330.1644255109965; Mon, 07 Feb 2022 09:31:49 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id q2sm10386206wrw.14.2022.02.07.09.31.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Feb 2022 09:31:49 -0800 (PST) Message-Id: <996cbe7dfb73c211eae012813b352b0d0de3954c.1644255105.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 07 Feb 2022 17:31:45 +0000 Subject: [PATCH v7 3/3] completion: handle unusual characters for sparse-checkout MIME-Version: 1.0 Fcc: Sent To: git@vger.kernel.org Cc: stolee@gmail.com, gitster@pobox.com, johannes.schindelin@gmail.com, Elijah Newren , Taylor Blau , SZEDER =?utf-8?b?R8OhYm9y?= , =?utf-8?b?w4Z2YXIgQXJuZmrDtnI=?= =?utf-8?b?w7A=?= Bjarmason , Lessley Dennington , Lessley Dennington Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Lessley Dennington From: Lessley Dennington Update the __gitcomp_directories method to de-quote and handle unusual characters in directory names. Although this initially involved an attempt to re-use the logic in __git_index_files, this method removed subdirectories (e.g. folder1/0/ became folder1/), so instead new custom logic was placed directly in the __gitcomp_directories method. Note there are two tests for this new functionality - one for spaces and accents and one for backslashes and tabs. The backslashes and tabs test uses FUNNYNAMES to avoid running on Windows. This is because: 1. Backslashes are explicitly not allowed in Windows file paths. 2. Although tabs appear to be allowed when creating a file in a Windows bash shell, they actually are not renderable (and appear as empty boxes in the shell). Co-authored-by: Johannes Schindelin Co-authored-by: Lessley Dennington Helped-by: Ævar Arnfjörð Bjarmason Signed-off-by: Lessley Dennington Reviewed-by: Elijah Newren --- contrib/completion/git-completion.bash | 24 ++++++------- t/t9902-completion.sh | 49 ++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 13 deletions(-) diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index eeb80fdc6e4..6d81f03f291 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -2988,7 +2988,7 @@ _git_show_branch () __gitcomp_directories () { - local _tmp_dir _tmp_completions + local _tmp_dir _tmp_completions _found=0 # Get the directory of the current token; this differs from dirname # in that it keeps up to the final trailing slash. If no slash found @@ -2996,20 +2996,18 @@ __gitcomp_directories () [[ "$cur" =~ .*/ ]] _tmp_dir=$BASH_REMATCH - # Find possible directory completions, adding trailing '/' characters - _tmp_completions="$(git ls-tree -d --name-only HEAD $_tmp_dir | - sed -e s%$%/%)" - - if [[ -n "$_tmp_completions" ]]; then - # There were some directory completions, so find ones that - # start with "$cur", the current token, and put those in COMPREPLY - local i=0 c IFS=$' \t\n' - for c in $_tmp_completions; do + # Find possible directory completions, adding trailing '/' characters, + # de-quoting, and handling unusual characters. + while IFS= read -r -d $'\0' c ; do + # If there are directory completions, find ones that start + # with "$cur", the current token, and put those in COMPREPLY if [[ $c == "$cur"* ]]; then - COMPREPLY+=("$c") + COMPREPLY+=("$c/") + _found=1 fi - done - elif [[ "$cur" =~ /$ ]]; then + done < <(git ls-tree -z -d --name-only HEAD $_tmp_dir) + + if [[ $_found == 0 ]] && [[ "$cur" =~ /$ ]]; then # No possible further completions any deeper, so assume we're at # a leaf directory and just consider it complete __gitcomp_direct_append "$cur " diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index b38a7302249..da6c86c64b3 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -1508,6 +1508,55 @@ test_expect_success 'cone mode sparse-checkout completes directory names' ' ) ' +test_expect_success 'cone mode sparse-checkout completes directory names with spaces and accents' ' + # reset sparse-checkout + git -C sparse-checkout sparse-checkout disable && + ( + cd sparse-checkout && + mkdir "directory with spaces" && + mkdir "directory-with-áccent" && + >"directory with spaces/randomfile" && + >"directory-with-áccent/randomfile" && + git add . && + git commit -m "Add directory with spaces and directory with accent" && + git sparse-checkout set --cone "directory with spaces" \ + "directory-with-áccent" && + test_completion "git sparse-checkout add dir" <<-\EOF && + directory with spaces/ + directory-with-áccent/ + EOF + rm -rf "directory with spaces" && + rm -rf "directory-with-áccent" && + git add . && + git commit -m "Remove directory with spaces and directory with accent" + ) +' + +# use FUNNYNAMES to avoid running on Windows, which doesn't permit backslashes or tabs in paths +test_expect_success FUNNYNAMES 'cone mode sparse-checkout completes directory names with backslashes and tabs' ' + # reset sparse-checkout + git -C sparse-checkout sparse-checkout disable && + ( + cd sparse-checkout && + mkdir "directory\with\backslashes" && + mkdir "$(printf "directory\twith\ttabs")" && + >"directory\with\backslashes/randomfile" && + >"$(printf "directory\twith\ttabs")/randomfile" && + git add . && + git commit -m "Add directory with backslashes and directory with tabs" && + git sparse-checkout set --cone "directory\with\backslashes" \ + "$(printf "directory\twith\ttabs")" && + test_completion "git sparse-checkout add dir" <<-\EOF && + directory\with\backslashes/ + directory with tabs/ + EOF + rm -rf "directory\with\backslashes" && + rm -rf "$(printf "directory\twith\ttabs")" && + git add . && + git commit -m "Remove directory with backslashes and directory with tabs" + ) +' + test_expect_success 'non-cone mode sparse-checkout uses bash completion' ' # reset sparse-checkout repo to non-cone mode git -C sparse-checkout sparse-checkout disable &&