Permission handling for the other OS
authormpm@selenic.com
Thu, 23 Jun 2005 09:33:18 -0800
changeset 441 e8af362cfb01
parent 440 22b5aaeb3637
child 442 3e2aee6c5500
Permission handling for the other OS -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Permission handling for the other OS From: K Thananchayan <thananck@yahoo.com> Preserve exec permission under Windows on existing source files. Not an ideal solution as there is no way to specify exec permission for a new file. Nevertheless, this helps working on crossplatform projects. manifest hash: c50da52ad4645f40bd6204c4fd458e880bc3f801 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCuvJeywK+sNU5EO8RAscXAJ40eAHZjTip5to6BGPdoXxxL5gNQQCgl5GT 8S1Ckank5I/0ScGtapZKqTA= =QrQp -----END PGP SIGNATURE-----
mercurial/hg.py
mercurial/util.py
--- a/mercurial/hg.py	Thu Jun 23 09:26:43 2005 -0800
+++ b/mercurial/hg.py	Thu Jun 23 09:33:18 2005 -0800
@@ -12,22 +12,6 @@
 demandload(globals(), "re lock urllib urllib2 transaction time socket")
 demandload(globals(), "tempfile httprangereader bdiff")
 
-def is_exec(f):
-    return (os.stat(f).st_mode & 0100 != 0)
-
-def set_exec(f, mode):
-    s = os.stat(f).st_mode
-    if (s & 0100 != 0) == mode:
-        return
-    if mode:
-        # Turn on +x for every +r bit when making a file executable
-        # and obey umask.
-        umask = os.umask(0)
-        os.umask(umask)
-        os.chmod(f, s | (s & 0444) >> 2 & ~umask)
-    else:
-        os.chmod(f, s & 0666)
-
 class filelog(revlog):
     def __init__(self, opener, path):
         revlog.__init__(self, opener,
@@ -509,7 +493,7 @@
         for f in files:
             try:
                 t = self.wfile(f).read()
-                tm = is_exec(self.wjoin(f))
+                tm = util.is_exec(self.wjoin(f), mfm.get(f, False))
                 r = self.file(f)
                 mfm[f] = tm
                 mm[f] = r.add(t, {}, tr, linkrev,
@@ -565,8 +549,7 @@
         for f in commit:
             self.ui.note(f + "\n")
             try:
-                fp = self.wjoin(f)
-                mf1[f] = is_exec(fp)
+                mf1[f] = util.is_exec(self.wjoin(f), mf1.get(f, False))
                 t = self.wfile(f).read()
             except IOError:
                 self.warn("trouble committing %s!\n" % f)
@@ -1031,7 +1014,7 @@
         mfw = mf1.copy()
         for f in a + c + u:
             mw[f] = ""
-            mfw[f] = is_exec(self.wjoin(f))
+            mfw[f] = util.is_exec(self.wjoin(f), mfw.get(f, False))
         for f in d:
             if f in mw: del mw[f]
 
@@ -1081,13 +1064,13 @@
                 if not s and mfw[f] != mf2[f]:
                     if force:
                         self.ui.debug(" updating permissions for %s\n" % f)
-                        set_exec(self.wjoin(f), mf2[f])
+                        util.set_exec(self.wjoin(f), mf2[f])
                     else:
                         a, b, c = mfa.get(f, 0), mfw[f], mf2[f]
                         mode = ((a^b) | (a^c)) ^ a
                         if mode != b:
                             self.ui.debug(" updating permissions for %s\n" % f)
-                            set_exec(self.wjoin(f), mode)
+                            util.set_exec(self.wjoin(f), mode)
                             mark[f] = 1
                 del m2[f]
             elif f in ma:
@@ -1169,7 +1152,7 @@
             except IOError:
                 os.makedirs(os.path.dirname(self.wjoin(f)))
                 self.wfile(f, "w").write(t)
-            set_exec(self.wjoin(f), mf2[f])
+            util.set_exec(self.wjoin(f), mf2[f])
             self.dirstate.update([f], mode)
 
         # merge the tricky bits
@@ -1179,7 +1162,7 @@
             self.ui.status("merging %s\n" % f)
             m, o, flag = merge[f]
             self.merge3(f, m, o)
-            set_exec(self.wjoin(f), flag)
+            util.set_exec(self.wjoin(f), flag)
             self.dirstate.update([f], 'm')
 
         for f in remove:
--- a/mercurial/util.py	Thu Jun 23 09:26:43 2005 -0800
+++ b/mercurial/util.py	Thu Jun 23 09:33:18 2005 -0800
@@ -16,6 +16,12 @@
 
 # Platfor specific varients
 if os.name == 'nt':
+    def is_exec(f, last):
+        return last
+
+    def set_exec(f, mode):
+        pass
+    
     def pconvert(path):
         return path.replace("\\", "/")
 
@@ -27,6 +33,22 @@
     def readlock(pathname):
         return file(pathname).read()
 else:
+    def is_exec(f, last):
+        return (os.stat(f).st_mode & 0100 != 0)
+
+    def set_exec(f, mode):
+        s = os.stat(f).st_mode
+        if (s & 0100 != 0) == mode:
+            return
+        if mode:
+            # Turn on +x for every +r bit when making a file executable
+            # and obey umask.
+            umask = os.umask(0)
+            os.umask(umask)
+            os.chmod(f, s | (s & 0444) >> 2 & ~umask)
+        else:
+            os.chmod(f, s & 0666)
+
     def pconvert(path):
         return path