Re: [RFC PATCH] checkout: Force matching mtime between files
- From
Robin H. Johnson <robbat2@gentoo.org>
- Date
- Apr 25, 2018, 20:07 UTC
- Message-ID
- <robbat2-20180425T173507-286694375Z@orbis-terrarum.net>
- In-Reply-To
- <ad4d0d66-58f4-5cab-d314-a30a50e8ad32@xiplink.com>
On Wed, Apr 25, 2018 at 11:18:26AM -0400, Marc Branchaud wrote:
Show 11 quoted lines
> > The best approach to do so is to have those people do the "touch" > > thing in their own post-checkout hook. People who use Git as the > > source control system won't have to pay runtime cost of doing the > > touch thing, and we do not have to maintain such a hook script. > > Only those who use the "feature" would. > > The post-checkout hook approach is not exactly straightforward. > > Naively, it's simply > > for F in `git diff --name-only $1 $2`; do touch "$F"; done
Even this naive attempt gets it wrong: successive files have increasing times. You need to capture the time at the start, and use it as the time for the files. touch /tmp/ref && \ for F in `git diff --name-only $1 $2`; do touch -r /tmp/ref "$F"; done && \ rm /tmp/ref (or pass a fixed time into touch).
> But consider: > > * Symlinks can cause the wrong file to be touched. (Granted, Michał's > proposed patch also doesn't deal with symlinks.)
Yes, it blindly touches the file, and rather than trying to do utimensat's AT_SYMLINK_NOFOLLOW flag.
Show 7 quoted lines
> Let's assume that a
> hook can be crafted will all possible sophistication. There are still
> some fundamental problems:
>
> * In a "file checkout" ("git checkout -- path/to/file"), $1 and $2 are
> identical so the above loop does nothing. Offhand I'm not even sure how
> a hook might get the right files in this case.Yes, this would need to be a new hook that knows more than post-checkout presently does.
post-checkout right now runs AFTER the worktree has been updated, and only gets the refs of old/new HEAD and if the branch was changed. It does NOT know which files were actually modified, and since it
If a hook is added for that, then this behavior can be implemented in the hook. Alternatively adding a pre-checkout hook to absorb some state of the unmodified worktree (this could be a bit expensive).
Show 7 quoted lines
> * The hook has to be set up in every repo and submodule (at least until > something like Ævar's experiments come to fruition). > > * A fresh clone can't run the hook. This is especially important when > dealing with submodules. (In one case where we were bit by this, make > though that half of a fresh submodule clone's files were stale, and > decided to re-autoconf the entire thing.)
The fresh clone case really matters for my usage, where new clones are firing in CI/CD processes.
Show 8 quoted lines
> I just don't think the hook approach can completely solve the problem. > > I appreciate Ævar's concern that there are more than just two mtime > requests floating around. But I think git's users are best served by a > built-in approach, with a config setting to control the desired mtime > handling (defaulting to the current behaviour). People who want a > different mtime solution will at least have a clear place in the code to > propose a patch.
+1 as long as we can set the behavior during the clone.
-- Robin Hugh Johnson Gentoo Linux: Dev, Infra Lead, Foundation Treasurer E-Mail : robbat2@gentoo.org GnuPG FP : 11ACBA4F 4778E3F6 E4EDF38E B27B944E 34884E85 GnuPG FP : 7D0B3CEB E9B85B1F 825BCECF EE05E6F6 A48F6136