# HG changeset patch # User Mads Kiilerich # Date 2016-10-07 22:59:40 # Node ID c01acee367ecdca1473baca0ba51feaa370e3673 # Parent 747e546c561fbf34d07cd30013eaf42b0190bb3b largefiles: when setting/clearing x bit on largefiles, don't change other bits 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 + wvfs.chmod(rellfile, st) update1 = 1 updated += update1