[PATCH 1 of 6] largefiles: when setting/clearing x bit on largefiles, don't change other bits

Yuya Nishihara yuya at tcha.org
Thu Oct 13 09:39:53 EDT 2016


On Sat, 08 Oct 2016 01:26:05 +0200, Mads Kiilerich wrote:
> # HG changeset patch
> # User Mads Kiilerich <madski at unity3d.com>
> # Date 1475881180 -7200
> #      Sat Oct 08 00:59:40 2016 +0200
> # Node ID 96315a5833ed015acb7bd8f6d7f1e38db6fa9c50
> # Parent  1779dde4c9ef97cb242f8d501655f236f66e5439
> largefiles: when setting/clearing x bit on largefiles, don't change other bits

The series looks good to me. Queued up to the patch 5, thanks.

> It is only the X bit that it matters to copy from the standin to the largefile
> in the working directory. While it generally doesn't do any harm to copy the
> whole mode, it is also "wrong" to copy more than the X bit we care about. It
> can make a difference if someone should try to handle largefiles differently,
> such as marking them read-only.
> 
> Thus, do similar to what utils.setflags does and set the X bit where there are
> R bits and obey umask.
> 
> diff --git a/hgext/largefiles/lfcommands.py b/hgext/largefiles/lfcommands.py
> --- a/hgext/largefiles/lfcommands.py
> +++ b/hgext/largefiles/lfcommands.py
> @@ -515,9 +515,13 @@ def updatelfiles(ui, repo, filelist=None
>              rellfile = lfile
>              relstandin = lfutil.standin(lfile)
>              if wvfs.exists(relstandin):
> -                mode = wvfs.stat(relstandin).st_mode
> -                if mode != wvfs.stat(rellfile).st_mode:
> -                    wvfs.chmod(rellfile, mode)
> +                standinexec = wvfs.stat(relstandin).st_mode & 0o100
> +                st = wvfs.stat(rellfile).st_mode
> +                if standinexec != st & 0o100:
> +                    st &= ~0o111
> +                    if standinexec:
> +                        st |= (st >> 2) & 0o111 & ~util.umask

This 2-bit shift seemed a bit obscure. Any comment would help future readers.


More information about the Mercurial-devel mailing list