[PATCH] convert: handle exec bit removal while converting to svn

Augie Fackler raf at durin42.com
Fri Feb 8 13:54:28 EST 2019


queued, thanks

> On Feb 7, 2019, at 14:21, Nikita Slyusarev <nslus at yandex-team.com> wrote:
> 
> # HG changeset patch
> # User Nikita Slyusarev <nslus at yandex-team.com>
> # Date 1549565330 -10800
> #      Thu Feb 07 21:48:50 2019 +0300
> # Node ID afd7bd1378b43b306567245ac0e394c4432e944d
> # Parent  286eeed148932d53eab7193c8e5deda39f9131f9
> convert: handle exec bit removal while converting to svn
> 
> Subversion `putcommit` method checks original file's executablity to decide
> if executable property should be removed from svn. It is checked right after
> writing file contents.
> 
> Content writing is implemented using `vfs.write` and vfs seems to remove exec
> bit, at least in some cases. This leads to executability checks being
> ineffective. If cset contains only this ignored exec bit removal, conversion
> stops with an error, because it fails to to compose svn commit properly.
> 
> This fix moves exec bit checking so that it's performed before dumping file
> contents.
> 
> Added test to check executable bit removal.
> 
> diff --git a/hgext/convert/subversion.py b/hgext/convert/subversion.py
> --- a/hgext/convert/subversion.py
> +++ b/hgext/convert/subversion.py
> @@ -1206,10 +1206,18 @@
>                     os.unlink(filename)
>             except OSError:
>                 pass
> +
> +            if self.is_exec:
> +                # We need to check executability of the file before the change,
> +                # because `vfs.write` is able to reset exec bit.
> +                wasexec = False
> +                if os.path.exists(self.wjoin(filename)):
> +                    wasexec = self.is_exec(self.wjoin(filename))
> +
>             self.wopener.write(filename, data)
> 
>             if self.is_exec:
> -                if self.is_exec(self.wjoin(filename)):
> +                if wasexec:
>                     if 'x' not in flags:
>                         self.delexec.append(filename)
>                 else:
> diff --git a/tests/test-convert-svn-sink.t b/tests/test-convert-svn-sink.t
> --- a/tests/test-convert-svn-sink.t
> +++ b/tests/test-convert-svn-sink.t
> @@ -466,3 +466,42 @@
>   msg: Add file a
>    A /a
>   $ rm -rf a a-hg a-hg-wc
> +
> +#if execbit
> +
> +Executable bit removal
> +
> +  $ hg init a
> +
> +  $ echo a > a/exec
> +  $ chmod +x a/exec
> +  $ hg --cwd a ci -d '1 0' -A -m 'create executable'
> +  adding exec
> +  $ chmod -x a/exec
> +  $ hg --cwd a ci -d '2 0' -A -m 'remove executable bit'
> +
> +  $ hg convert -d svn a
> +  assuming destination a-hg
> +  initializing svn repository 'a-hg'
> +  initializing svn working copy 'a-hg-wc'
> +  scanning source...
> +  sorting...
> +  converting...
> +  1 create executable
> +  0 remove executable bit
> +  $ svnupanddisplay a-hg-wc 0
> +   2 2 test .
> +   2 2 test exec
> +  revision: 2
> +  author: test
> +  msg: remove executable bit
> +   M /exec
> +  revision: 1
> +  author: test
> +  msg: create executable
> +   A /exec
> +  $ test ! -x a-hg-wc/exec
> +
> +  $ rm -rf a a-hg a-hg-wc
> +
> +#endif
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list