From patchwork Wed Mar 2 06:05:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tao Klerks X-Patchwork-Id: 12765527 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 75553C433EF for ; Wed, 2 Mar 2022 06:05:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239671AbiCBGGO (ORCPT ); Wed, 2 Mar 2022 01:06:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33286 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238945AbiCBGGK (ORCPT ); Wed, 2 Mar 2022 01:06:10 -0500 Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9471CB12DD for ; Tue, 1 Mar 2022 22:05:28 -0800 (PST) Received: by mail-wr1-x430.google.com with SMTP id m6so983292wrr.10 for ; Tue, 01 Mar 2022 22:05:28 -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=2MJFo7fZonL9Bx7BAcWxAHXY8nDVOJffRn3+iOUcx0E=; b=aKGDM7oe2YRz+Q9i2UTMWFRmarPkK7g/pog7lXfISr2K1nMQzZgcK1cYNidapuGAyy Is1vWWbur8rJY2OZ2dnpo92xjiV84Li2qak+hs4a/n13TCuHOtiD3KagkOG6Q/sS/zXU uQ6qDNDV4JL8Ak6NkzAV03ufnuRQ2ZSYJQcDIyyWQqWprVsHDTIlVT+ns4hLEMYK7ItO +ptskV5bX5v0cJXMg64k4Hw9FzAPhEGPjzVI1ga753pdUklf6XZaSP6LrEaHGRVlfslS RlxadwB+8wElhOdfpPArYIgMJZGJdasDvANsLFL2GFhL9oIbJPXVSlhLu/BQwJbEjA4b 70YQ== 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=2MJFo7fZonL9Bx7BAcWxAHXY8nDVOJffRn3+iOUcx0E=; b=vDDZrBn7cLRD92cPk3DlFbYBGOSkLXsobli+F5s9wlgHJJfn4FwIy54KYLyhqWBnmq +YUGfAp74KZzU5AqTkjathk79p+IYpnb0cOKFCJKFT7+oZxZmmJ4R0OgXOGiexGfN2YY yVPxqix7Y+MMD2YvfynC0Af9aMycn+x7fMoY/35J06Ef531ZWxYUaCFOtq6Sntlau0ok BWR5eeQm3lnaDU/9yXGy85UtqFcVh4uEgdMVaHHmyTkx+82HQ6eg3UeAhrvQhJMhOTjN 2dU0kwl0BfhBF9xYUTtLcHFuHMJermm5ker2Iihq4mflw8lskECQRzbYzokyktVuU2RC 5+TA== X-Gm-Message-State: AOAM531ruzgK9rM2+VW/xpkxSEHX//1/Wc5AoSkMDewEQlM7NfE+4lPM A8c3vexWFT348nqRSK+tB7U9Ccmy4ns= X-Google-Smtp-Source: ABdhPJxJMcdU0e84z6s2HfY1b8IiGL7V8bEMxZeSrvyJ3IThAYeFyk1wqvU5Ra7yPWQZBvmbsRA3QQ== X-Received: by 2002:adf:f28a:0:b0:1f0:246e:11f8 with SMTP id k10-20020adff28a000000b001f0246e11f8mr2373697wro.481.1646201126978; Tue, 01 Mar 2022 22:05:26 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id az11-20020a05600c600b00b003820f5c48e9sm3564811wmb.38.2022.03.01.22.05.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Mar 2022 22:05:26 -0800 (PST) Message-Id: <052b3dd9bba8a79890863ace0992aaee41874402.1646201124.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Wed, 02 Mar 2022 06:05:23 +0000 Subject: [PATCH v3 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: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jeff Hostetler , Tao Klerks , 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 temporarily by Jeff Hostetler, in "t/helper/test-chmtime: skip directories on Windows" in the "Builtin FSMonitor Part 2" work, but not yet fixed. 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 replacing the file-oriented _wopen() call with the directory-supporting CreateFileW() windows API explicitly. Signed-off-by: Tao Klerks --- compat/mingw.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/compat/mingw.c b/compat/mingw.c index 03af369b2b9..58f347d6ae5 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -961,9 +961,11 @@ static inline void time_t_to_filetime(time_t t, FILETIME *ft) int mingw_utime (const char *file_name, const struct utimbuf *times) { FILETIME mft, aft; - int fh, rc; + int rc; DWORD attrs; wchar_t wfilename[MAX_PATH]; + HANDLE osfilehandle; + if (xutftowcs_path(wfilename, file_name) < 0) return -1; @@ -975,7 +977,17 @@ 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) { + osfilehandle = CreateFileW(wfilename, + FILE_WRITE_ATTRIBUTES, + 0 /*FileShare.None*/, + NULL, + OPEN_EXISTING, + (attrs != INVALID_FILE_ATTRIBUTES && + (attrs & FILE_ATTRIBUTE_DIRECTORY)) ? + FILE_FLAG_BACKUP_SEMANTICS : 0, + NULL); + if (osfilehandle == INVALID_HANDLE_VALUE) { + errno = err_win_to_posix(GetLastError()); rc = -1; goto revert_attrs; } @@ -987,12 +999,15 @@ 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 (osfilehandle != INVALID_HANDLE_VALUE) + CloseHandle(osfilehandle); revert_attrs: if (attrs != INVALID_FILE_ATTRIBUTES && From patchwork Wed Mar 2 06:05:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tao Klerks X-Patchwork-Id: 12765528 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 1A3C1C433EF for ; Wed, 2 Mar 2022 06:05:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239676AbiCBGGR (ORCPT ); Wed, 2 Mar 2022 01:06:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33298 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239640AbiCBGGL (ORCPT ); Wed, 2 Mar 2022 01:06:11 -0500 Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 682D9B12DB for ; Tue, 1 Mar 2022 22:05:29 -0800 (PST) Received: by mail-wr1-x435.google.com with SMTP id ay10so1000668wrb.6 for ; Tue, 01 Mar 2022 22:05:29 -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=T/T4aWmJixlES1DO3pnbI01kRsytk4GnW0hV4zHqsgE=; b=WKW7cfQQ5RpnsPllCNijZ4FGNAOM0cOKQKb7uw2cOYn81zkLx4rpmA8NXViEA0VF7Z vf/0mkO12x+orf+YNvNqgmqWgFvAw4Zjv0qscDG8Q2VKEJSyaVOh+XjECDU/l15+JM/N h/kdD/X73GVkzCp76T/nKAr4i42CzQvliBYNAomVMBgBGJQDvUfodQ/7xENPRjiQqxOZ fD+/XPoFiQrlE3DJcmq1j7GZmHrcFJalf3H5YNlVTCRlzUNnLc0WVltuKxF9qEF1ekgz C8UiCyw0Azqm/+2aoMe14AzbL+RWK+gZ2rpt8JRILCtfbeXP16UNljiBQfXTAw7qSAGZ 1a3g== 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=T/T4aWmJixlES1DO3pnbI01kRsytk4GnW0hV4zHqsgE=; b=L1eO6+CZv65hwx3aYsI2I6pN5moHjWatEBYloo7BwWSJ0IV2cvrh4vEbIP/nnniaeO RA0Zh8B4zZ9wexTNRZLzHT+h9MKZzLLRlRtugIb6lWJJhAluyjQHhuMM6RIayqiL7L5v z5uHpb8dYQ4HB+s3ogpNFSDdLl9apvp4eLekPsgGtfaa93+AND/yG4C3a6ZnqVaNw4dc 2XD/sMtbXsIkK4k+xIS8Vbce1YusnoUtCRZzCzGDT1uepAUN3/klrWHgLkDyqD2Z989n LoL1YouBfrh4e7t8xcmnwh8gUhomH8i5qLmMORcvURJvi9GXjesAGfiFtC4j72euqGYt 43Pw== X-Gm-Message-State: AOAM530Yvfev1qLVJacnoB0FvuB96i03n+m9P5oiKnqovLqhLlurfAB3 GfYMGoGp76ix4MnGfwY0jBriX0bjjoE= X-Google-Smtp-Source: ABdhPJzo7ppixSgusGrf/1c60wOXasxwKSBzftmxspP8GGF7v3Xm1G720/KhXUp3fdiOCkJ2U+EwuQ== X-Received: by 2002:a5d:5255:0:b0:1ed:f971:5497 with SMTP id k21-20020a5d5255000000b001edf9715497mr20740134wrc.528.1646201127822; Tue, 01 Mar 2022 22:05:27 -0800 (PST) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id o13-20020a5d648d000000b001efd62a840dsm9471449wri.111.2022.03.01.22.05.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Mar 2022 22:05:27 -0800 (PST) Message-Id: In-Reply-To: References: Date: Wed, 02 Mar 2022 06:05:24 +0000 Subject: [PATCH v3 2/2] t7063: mtime-mangling instead of delays in untracked cache testing Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: =?utf-8?b?w4Z2YXIgQXJuZmrDtnLDsA==?= Bjarmason , Jeff Hostetler , Tao Klerks , 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 | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/t/t7063-status-untracked-cache.sh b/t/t7063-status-untracked-cache.sh index a0c123b0a77..ca90ee805e7 100755 --- a/t/t7063-status-untracked-cache.sh +++ b/t/t7063-status-untracked-cache.sh @@ -90,6 +90,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 && + test-tool chmtime =-300 . && git add one two done/one && : >.git/info/exclude && git update-index --untracked-cache && @@ -142,7 +145,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 +168,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 +191,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 +242,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 +292,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 +519,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); + test-tool chmtime =-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 +569,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 +595,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 +649,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 &&