Patchwork [2,of,2,STABLE] shelve: remove useless and incorrect code paths for file access

login
register
mail settings
Submitter Katsunori FUJIWARA
Date Oct. 28, 2013, 4:14 p.m.
Message ID <0d0cec904aa3575e2721.1382976854@feefifofum>
Download mbox | patch
Permalink /patch/2828/
State Accepted
Commit ff38dfbce4f8aa5d4f5f9b66dd05504f8eda705b
Headers show

Comments

Katsunori FUJIWARA - Oct. 28, 2013, 4:14 p.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# Date 1382976223 -32400
#      Tue Oct 29 01:03:43 2013 +0900
# Branch stable
# Node ID 0d0cec904aa3575e27215e0ab67f30713fe62c0f
# Parent  5cbd059b04e23c6abb2d2f5254658bf7adf2f131
shelve: remove useless and incorrect code paths for file access

This patch removes code paths in "shelvedfile.opener()", because:

    - explicit "vfs.mkdir()" invocation is useless

      "vfs.__call__()" for modes other than "read" creates parent
      directory of target file automatically by "util.ensuredirs()".

    - mode checking in "except IOError" code path is useless

      ENOENT occurs only for "read" mode, because target file is
      created forcibly for other modes.

    - there is no explicit "return" statement in the code path for
      "except IOError" if "mode[0] in 'wa'"

      this is incorrect, because None may be returnd unexpectedly,
      even though it seems the EEXIST case in the directory creation
      race for ".hg/shelved" and is very rare.

      this directory creation race is also treated in
      "util.ensuredirs()".
Augie Fackler - Oct. 30, 2013, 6:19 p.m.
On Tue, Oct 29, 2013 at 01:14:14AM +0900, FUJIWARA Katsunori wrote:
> # HG changeset patch
> # User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
> # Date 1382976223 -32400
> #      Tue Oct 29 01:03:43 2013 +0900
> # Branch stable
> # Node ID 0d0cec904aa3575e27215e0ab67f30713fe62c0f
> # Parent  5cbd059b04e23c6abb2d2f5254658bf7adf2f131
> shelve: remove useless and incorrect code paths for file access

queueing for stable, thanks

>
> This patch removes code paths in "shelvedfile.opener()", because:
>
>     - explicit "vfs.mkdir()" invocation is useless
>
>       "vfs.__call__()" for modes other than "read" creates parent
>       directory of target file automatically by "util.ensuredirs()".
>
>     - mode checking in "except IOError" code path is useless
>
>       ENOENT occurs only for "read" mode, because target file is
>       created forcibly for other modes.
>
>     - there is no explicit "return" statement in the code path for
>       "except IOError" if "mode[0] in 'wa'"
>
>       this is incorrect, because None may be returnd unexpectedly,
>       even though it seems the EEXIST case in the directory creation
>       race for ".hg/shelved" and is very rare.
>
>       this directory creation race is also treated in
>       "util.ensuredirs()".
>
> diff --git a/hgext/shelve.py b/hgext/shelve.py
> --- a/hgext/shelve.py
> +++ b/hgext/shelve.py
> @@ -66,16 +66,7 @@
>          except IOError, err:
>              if err.errno != errno.ENOENT:
>                  raise
> -            if mode[0] in 'wa':
> -                try:
> -                    self.vfs.mkdir()
> -                    return self.vfs(self.fname, mode)
> -                except IOError, err:
> -                    if err.errno != errno.EEXIST:
> -                        raise
> -            elif mode[0] == 'r':
> -                raise util.Abort(_("shelved change '%s' not found") %
> -                                 self.name)
> +            raise util.Abort(_("shelved change '%s' not found") % self.name)
>
>  class shelvedstate(object):
>      """Handle persistence during unshelving operations.
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel

Patch

diff --git a/hgext/shelve.py b/hgext/shelve.py
--- a/hgext/shelve.py
+++ b/hgext/shelve.py
@@ -66,16 +66,7 @@ 
         except IOError, err:
             if err.errno != errno.ENOENT:
                 raise
-            if mode[0] in 'wa':
-                try:
-                    self.vfs.mkdir()
-                    return self.vfs(self.fname, mode)
-                except IOError, err:
-                    if err.errno != errno.EEXIST:
-                        raise
-            elif mode[0] == 'r':
-                raise util.Abort(_("shelved change '%s' not found") %
-                                 self.name)
+            raise util.Abort(_("shelved change '%s' not found") % self.name)
 
 class shelvedstate(object):
     """Handle persistence during unshelving operations.