From patchwork Mon Feb 28 09:40:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tao Klerks X-Patchwork-Id: 12762613 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 03330C433F5 for ; Mon, 28 Feb 2022 09:40:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234376AbiB1JlW (ORCPT ); Mon, 28 Feb 2022 04:41:22 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234137AbiB1JlS (ORCPT ); Mon, 28 Feb 2022 04:41:18 -0500 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0695E657B8 for ; Mon, 28 Feb 2022 01:40:40 -0800 (PST) Received: by mail-wm1-x32b.google.com with SMTP id bg16-20020a05600c3c9000b00380f6f473b0so5368709wmb.1 for ; Mon, 28 Feb 2022 01:40:39 -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=UvhmsGw3xX3OGt0yRDL6NxPbHv6qGeySg4bsKg7MscU=; b=CQzDQax5i12c+Bj0bkeZpldVZGqUKGs1yWI1hqiV4CjHpta9ylOLO7Qzj+DJu5c2pB l4/pt0h36ROH7Q6iMc2/FgZGb/vHGLk/fqtU+lyQ/1nIbKUFQJIS0ppwqVItdGLZbw+Z 77T8N2sMEKiJgAgLzmMsF5lG72M0vlWZEEkkeatEG3jqYfwM49L1gpuUuQjn33PbicbW MsPb6KHA+UA2X1poASLaM/gH4arPCHKgnY2pFmJtMedYCitCYKNzQ0Jfaj/8b1LFLFao o81+u/asJWHKITkfGvaFv1SGBawts+XvebMa8nBwro5zDjfmez0ZgkLvM65OsHKK44Xw r5GA== 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=UvhmsGw3xX3OGt0yRDL6NxPbHv6qGeySg4bsKg7MscU=; b=DfHEf8KyB5swnBbQYqqBJP7qESu108LMdSaQEIpQTAEWAL7RuC2LGWcea7rzwpxZOF bzhqKRopFQJLAxmsYIZgkO8zdI0R9pJCGGcoBmimFNZwiAvihRrHLk1bUVMM2pIpDEdw CxtDEYEkb5o7f2V/NLYAUz24s08pPtAPzNo+Z1uLwpFdQ7UtfQFq+d3qVjXNwPBJUvVl JHsXgT0BjPiC2xopHcG7m/gLWg01zThHcGFw31u8AKwi3xMVjI2SEPpnFFuTEINgLXdE qDh0169sDWVZCo02oCHOIaywnbBLLcOCeW92xANpKFymtPYOW1zfaRRRhyqht1NA47Kb uwdA== X-Gm-Message-State: AOAM53126mzqP7bO7vtZtQHkjLCqc8k6Z6YI1Z9iUY/SO0od6zPFkQou 8ARNnL6l2XUQ+Q5xLXs78fV+qEPGuZI= X-Google-Smtp-Source: ABdhPJwI/pnt+BSEJDbD2nS6N5zGGmT7meIzuPEBm8U5mJzTif1quU4JmeQDdGA+n3OgOQSHb/Q3Pw== X-Received: by 2002:a05:600c:4ed0:b0:37b:e983:287b with SMTP id g16-20020a05600c4ed000b0037be983287bmr12391801wmq.156.1646041238505; Mon, 28 Feb 2022 01:40:38 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id f22-20020a1cc916000000b00380d3e49e89sm10455084wmb.22.2022.02.28.01.40.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Feb 2022 01:40:38 -0800 (PST) Message-Id: <76b6216281e3463821e650495f3090c677905f73.1646041236.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Mon, 28 Feb 2022 09:40:35 +0000 Subject: [PATCH 1/2] t/helper/test-chmtime: update mingw to support chmtime on directories Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Tao Klerks , Tao Klerks Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Tao Klerks From: Tao Klerks The mingw_utime implementation in mingw.c does not support directories. This means that "test-tool chmtime" fails on Windows when targeting directories. This has previously been noted and sidestepped by Jeff Hostetler, in "t/helper/test-chmtime: skip directories on Windows" in the "Builtin FSMonitor Part 2" work. It would make sense to backdate file and folder changes in untracked cache tests, to avoid needing to insert explicit delays/pauses in the tests. Add support for directory date manipulation in mingw_utime by calling CreateFileW() explicitly to create the directory handle, and CloseHandle() to close it. Signed-off-by: Tao Klerks --- compat/mingw.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/compat/mingw.c b/compat/mingw.c index 03af369b2b9..2284ea90511 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -964,6 +964,8 @@ int mingw_utime (const char *file_name, const struct utimbuf *times) int fh, rc; DWORD attrs; wchar_t wfilename[MAX_PATH]; + HANDLE osfilehandle; + if (xutftowcs_path(wfilename, file_name) < 0) return -1; @@ -975,9 +977,26 @@ int mingw_utime (const char *file_name, const struct utimbuf *times) SetFileAttributesW(wfilename, attrs & ~FILE_ATTRIBUTE_READONLY); } - if ((fh = _wopen(wfilename, O_RDWR | O_BINARY)) < 0) { - rc = -1; - goto revert_attrs; + if (attrs & FILE_ATTRIBUTE_DIRECTORY) { + fh = 0; + osfilehandle = CreateFileW(wfilename, + 0x100 /*FILE_WRITE_ATTRIBUTES*/, + 0 /*FileShare.None*/, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL); + if (osfilehandle == INVALID_HANDLE_VALUE) { + errno = err_win_to_posix(GetLastError()); + rc = -1; + goto revert_attrs; + } + } else { + if ((fh = _wopen(wfilename, O_RDWR | O_BINARY)) < 0) { + rc = -1; + goto revert_attrs; + } + osfilehandle = (HANDLE)_get_osfhandle(fh); } if (times) { @@ -987,12 +1006,16 @@ int mingw_utime (const char *file_name, const struct utimbuf *times) GetSystemTimeAsFileTime(&mft); aft = mft; } - if (!SetFileTime((HANDLE)_get_osfhandle(fh), NULL, &aft, &mft)) { + if (!SetFileTime(osfilehandle, NULL, &aft, &mft)) { errno = EINVAL; rc = -1; } else rc = 0; - close(fh); + + if (fh) + close(fh); + else if (osfilehandle) + CloseHandle(osfilehandle); revert_attrs: if (attrs != INVALID_FILE_ATTRIBUTES && From patchwork Mon Feb 28 09:40:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tao Klerks X-Patchwork-Id: 12762614 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 6564DC433F5 for ; Mon, 28 Feb 2022 09:40:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234382AbiB1JlX (ORCPT ); Mon, 28 Feb 2022 04:41:23 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40450 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234373AbiB1JlU (ORCPT ); Mon, 28 Feb 2022 04:41:20 -0500 Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E01A1657B9 for ; Mon, 28 Feb 2022 01:40:40 -0800 (PST) Received: by mail-wr1-x433.google.com with SMTP id n14so14394225wrq.7 for ; Mon, 28 Feb 2022 01:40:40 -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=ltrZwux0H8DKQhesJKWG4C1mf9fhe8VI+VEq5z51xjc=; b=iINWssBOiNxmgs1LAVHpmAAThF+S9+BOwogpBspPboYOHq7TbI0wqpIxY9PxWM1a/C LG/21p8qCqSDyQEr5cAoJ6h84k9CqzXnyUuYtvuLOs0wF4rWZK01SliIDTys1XOdXcq4 hoBKw8ZH1Zttv35Tpczx67eeT4iJTeilwkrgtks66CUDfLlOunBj/oy5bvRukh++P8E2 vTSgN7fRrWKG5k9MkS5EboHLNjWfplURNUhsZYzttYzkVEZfztu6DQNiCQ3CWlw/VaX9 ANloGv0820T46FKhTbYagb1Nx2ce6ZqDK7tv3ZZJmOSXN2lgZZsbUzDrID5yuuk8b6kl 9TrQ== 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=ltrZwux0H8DKQhesJKWG4C1mf9fhe8VI+VEq5z51xjc=; b=11JvZf439dIrTffziocQo6kdzdV0EQtlkekgUw6lM8YXBR60Ypt3afD/22uGrGzgmB JGDl6dB0eLFzc37BBP38hbp0sqYhaIPybUtygvyzy3tmGVhU6iTHL8sPbm6s8nBsm2r1 rPS7ZXdoOBXOdQL4r2wBoQHqjuHLAU9kvfZnAFr0K+N/sWbBohR4fWdkKQmSFYYHDyuW ojmfaf4uBe5WX0bry7Y3XjfF72ka3ZWOw1/uxslYJsqrWsBV0OhZjhd9hhzsXeig/Z7J HsAmw6/NF//tafbcDAxmMIcAGLjgDsSDSb2anXrqZmw1XgJPYgtbkSs15lEc5k47dk94 mprw== X-Gm-Message-State: AOAM530xgRP4zdR5tjffXIr8fiIQ4HbGCjLY/Zx/oOmNqYBUAzvIaNMc p7XE/ZokuvC7WxfcXeYmrzkThFeYZIU= X-Google-Smtp-Source: ABdhPJxy7D74TQiXd3055kXzwRQ6LgNXTZ8XxtsY8MuRkHSObIpvA7p5TdXeQg4MYj84xLV14u8Efg== X-Received: by 2002:adf:fc89:0:b0:1ef:9517:c7d2 with SMTP id g9-20020adffc89000000b001ef9517c7d2mr5980033wrr.282.1646041239289; Mon, 28 Feb 2022 01:40:39 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id s16-20020adfecd0000000b001e7be443a17sm14477484wro.27.2022.02.28.01.40.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Feb 2022 01:40:38 -0800 (PST) Message-Id: In-Reply-To: References: Date: Mon, 28 Feb 2022 09:40:36 +0000 Subject: [PATCH 2/2] t7063: mtime-mangling instead of delays in untracked cache testing Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Tao Klerks , Tao Klerks Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Tao Klerks From: Tao Klerks The untracked cache test uses an avoid_racy function to deal with an mtime-resolution challenge in testing: If an untracked cache entry's mtime falls in the same second as the mtime of the index the untracked cache was stored in, then it cannot be trusted. Explicitly delaying tests is a simple effective strategy to avoid these issues, but should be avoided where possible. Switch from a delay-based strategy to instead backdating all file changes using test-tool chmtime, where that is an option, to shave 9 seconds off the test run time. Don't update test cases that delay for other reasons, for now at least (4 seconds). Signed-off-by: Tao Klerks --- t/t7063-status-untracked-cache.sh | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/t/t7063-status-untracked-cache.sh b/t/t7063-status-untracked-cache.sh index a0c123b0a77..039b4de8d25 100755 --- a/t/t7063-status-untracked-cache.sh +++ b/t/t7063-status-untracked-cache.sh @@ -24,6 +24,14 @@ sync_mtime () { find . -type d -exec ls -ld {} + >/dev/null } +chmmtime_worktree_root () { + # chmtime doesnt handle relative paths on windows, so need + # to "hardcode" a reference to the worktree folder name. + cd .. && + test-tool chmtime $1 worktree && + cd worktree +} + avoid_racy() { sleep 1 } @@ -90,6 +98,9 @@ test_expect_success 'setup' ' cd worktree && mkdir done dtwo dthree && touch one two three done/one dtwo/two dthree/three && + test-tool chmtime =-300 one two three done/one dtwo/two dthree/three && + test-tool chmtime =-300 done dtwo dthree && + chmmtime_worktree_root =-300 && git add one two done/one && : >.git/info/exclude && git update-index --untracked-cache && @@ -142,7 +153,6 @@ two EOF test_expect_success 'status first time (empty cache)' ' - avoid_racy && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && @@ -166,7 +176,6 @@ test_expect_success 'untracked cache after first status' ' ' test_expect_success 'status second time (fully populated cache)' ' - avoid_racy && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && @@ -190,8 +199,8 @@ test_expect_success 'untracked cache after second status' ' ' test_expect_success 'modify in root directory, one dir invalidation' ' - avoid_racy && : >four && + test-tool chmtime =-240 four && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../actual && @@ -241,7 +250,6 @@ EOF ' test_expect_success 'new .gitignore invalidates recursively' ' - avoid_racy && echo four >.gitignore && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ @@ -292,7 +300,6 @@ EOF ' test_expect_success 'new info/exclude invalidates everything' ' - avoid_racy && echo three >>.git/info/exclude && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ @@ -520,14 +527,14 @@ test_expect_success 'create/modify files, some of which are gitignored' ' echo three >done/three && # three is gitignored echo four >done/four && # four is gitignored at a higher level echo five >done/five && # five is not gitignored - echo test >base && #we need to ensure that the root dir is touched - rm base && + test-tool chmtime =-180 done/two done/three done/four done/five done && + # we need to ensure that the root dir is touched (in the past); + chmmtime_worktree_root =-180 && sync_mtime ' test_expect_success 'test sparse status with untracked cache' ' : >../trace.output && - avoid_racy && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../status.actual && iuc status --porcelain >../status.iuc && @@ -570,7 +577,6 @@ EOF ' test_expect_success 'test sparse status again with untracked cache' ' - avoid_racy && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../status.actual && @@ -597,11 +603,11 @@ EOF test_expect_success 'set up for test of subdir and sparse checkouts' ' mkdir done/sub && mkdir done/sub/sub && - echo "sub" > done/sub/sub/file + echo "sub" > done/sub/sub/file && + test-tool chmtime =-120 done/sub/sub/file done/sub/sub done/sub done ' test_expect_success 'test sparse status with untracked cache and subdir' ' - avoid_racy && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../status.actual && @@ -651,7 +657,6 @@ EOF ' test_expect_success 'test sparse status again with untracked cache and subdir' ' - avoid_racy && : >../trace.output && GIT_TRACE2_PERF="$TRASH_DIRECTORY/trace.output" \ git status --porcelain >../status.actual &&