patch: patchmeta gives (islink, isexec) tuple instead of int mode
authorPatrick Mezard <pmezard@gmail.com>
Sat, 18 Oct 2008 23:45:45 +0200
changeset 7149 01a056c54385
parent 7148 7d84e5b00e29
child 7150 6d1d61bb2984
patch: patchmeta gives (islink, isexec) tuple instead of int mode
mercurial/patch.py
--- a/mercurial/patch.py	Sat Oct 18 23:45:45 2008 +0200
+++ b/mercurial/patch.py	Sat Oct 18 23:45:45 2008 +0200
@@ -148,8 +148,10 @@
 
     'op' is the performed operation within ADD, DELETE, RENAME, MODIFY
     or COPY.  'path' is patched file path. 'oldpath' is set to the
-    origin file when 'op' is either COPY or RENAME, None
-    otherwise. 'mode' is set to the new mode of patched file or None.
+    origin file when 'op' is either COPY or RENAME, None otherwise. If
+    file mode is changed, 'mode' is a tuple (islink, isexec) where
+    'islink' is True if the file is a symlink and 'isexec' is True if
+    the file is executable. Otherwise, 'mode' is None.
     """
     def __init__(self, path):
         self.path = path
@@ -159,6 +161,11 @@
         self.lineno = 0
         self.binary = False
 
+    def setmode(self, mode):
+        islink = mode & 020000
+        isexec = mode & 0100
+        self.mode = (islink, isexec)
+
 def readgitpatch(fp, firstline=None):
     """extract git-style metadata about patches from <patchname>"""
 
@@ -208,9 +215,9 @@
                 gp.op = 'DELETE'
             elif line.startswith('new file mode '):
                 gp.op = 'ADD'
-                gp.mode = int(line.rstrip()[-6:], 8)
+                gp.setmode(int(line.rstrip()[-6:], 8))
             elif line.startswith('new mode '):
-                gp.mode = int(line.rstrip()[-6:], 8)
+                gp.setmode(int(line.rstrip()[-6:], 8))
             elif line.startswith('GIT binary patch'):
                 dopatch |= GP_BINARY
                 gp.binary = True
@@ -1096,17 +1103,14 @@
     for f in patches:
         ctype, gp = patches[f]
         if gp and gp.mode:
-            flags = ''
-            if gp.mode & 0100:
-                flags = 'x'
-            elif gp.mode & 020000:
-                flags = 'l'
+            islink, isexec = gp.mode
             dst = os.path.join(repo.root, gp.path)
             # patch won't create empty files
             if ctype == 'ADD' and not os.path.exists(dst):
+                flags = (isexec and 'x' or '') + (islink and 'l' or '')
                 repo.wwrite(gp.path, '', flags)
             else:
-                util.set_flags(dst, 'l' in flags, 'x' in flags)
+                util.set_flags(dst, islink, isexec)
     cmdutil.addremove(repo, cfiles)
     files = patches.keys()
     files.extend([r for r in removes if r not in files])