##// END OF EJS Templates
add tracking of execute permissions...
mpm@selenic.com -
r276:10e325db default
parent child Browse files
Show More
@@ -310,11 +310,12 b' def manifest(ui, repo, rev = []):'
310 310 if rev:
311 311 n = repo.manifest.lookup(rev)
312 312 m = repo.manifest.read(n)
313 mf = repo.manifest.readflags(n)
313 314 files = m.keys()
314 315 files.sort()
315 316
316 317 for f in files:
317 print hg.hex(m[f]), f
318 ui.write("%40s %3s %s\n" % (hg.hex(m[f]), mf[f] and "755" or "644", f))
318 319
319 320 def parents(ui, repo, node = None):
320 321 '''show the parents of the current working dir'''
@@ -11,6 +11,15 b' from demandload import *'
11 11 demandload(globals(), "re lock urllib urllib2 transaction time socket")
12 12 demandload(globals(), "tempfile byterange difflib")
13 13
14 def is_exec(f):
15 return (os.stat(f).st_mode & 0100 != 0)
16
17 def set_exec(f, mode):
18 s = os.stat(f).st_mode
19 if (s & 0100 != 0) == mode:
20 return
21 os.chmod(f, s & 0666 | (mode * 0111))
22
14 23 class filelog(revlog):
15 24 def __init__(self, opener, path):
16 25 revlog.__init__(self, opener,
@@ -85,13 +94,20 b' class manifest(revlog):'
85 94 return self.mapcache[1].copy()
86 95 text = self.revision(node)
87 96 map = {}
97 flag = {}
88 98 self.listcache = (text, text.splitlines(1))
89 99 for l in self.listcache[1]:
90 100 (f, n) = l.split('\0')
91 101 map[f] = bin(n[:40])
92 self.mapcache = (node, map)
102 flag[f] = (n[40:-1] == "x")
103 self.mapcache = (node, map, flag)
93 104 return map
94 105
106 def readflags(self, node):
107 if self.mapcache or self.mapcache[0] != node:
108 self.read(node)
109 return self.mapcache[2]
110
95 111 def diff(self, a, b):
96 112 # this is sneaky, as we're not actually using a and b
97 113 if self.listcache and self.addlist and self.listcache[0] == a:
@@ -103,11 +119,13 b' class manifest(revlog):'
103 119 else:
104 120 return mdiff.textdiff(a, b)
105 121
106 def add(self, map, transaction, link, p1=None, p2=None):
122 def add(self, map, flags, transaction, link, p1=None, p2=None):
107 123 files = map.keys()
108 124 files.sort()
109 125
110 self.addlist = ["%s\000%s\n" % (f, hex(map[f])) for f in files]
126 self.addlist = ["%s\000%s%s\n" %
127 (f, hex(map[f]), flags[f] and "x" or '')
128 for f in files]
111 129 text = "".join(self.addlist)
112 130
113 131 n = self.addrevision(text, transaction, link, p1, p2)
@@ -442,6 +460,7 b' class localrepository:'
442 460 c1 = self.changelog.read(p1)
443 461 c2 = self.changelog.read(p2)
444 462 m1 = self.manifest.read(c1[0])
463 mf1 = self.manifest.readflags(c1[0])
445 464 m2 = self.manifest.read(c2[0])
446 465 lock = self.lock()
447 466 tr = self.transaction()
@@ -453,7 +472,9 b' class localrepository:'
453 472 for f in commit:
454 473 self.ui.note(f + "\n")
455 474 try:
456 t = file(self.wjoin(f)).read()
475 fp = self.wjoin(f)
476 mf1[f] = is_exec(fp)
477 t = file(fp).read()
457 478 except IOError:
458 479 self.warn("trouble committing %s!\n" % f)
459 480 raise
@@ -466,7 +487,7 b' class localrepository:'
466 487 # update manifest
467 488 m1.update(new)
468 489 for f in remove: del m1[f]
469 mn = self.manifest.add(m1, tr, linkrev, c1[0], c2[0])
490 mn = self.manifest.add(m1, mf1, tr, linkrev, c1[0], c2[0])
470 491
471 492 # add changeset
472 493 new = new.keys()
@@ -525,7 +546,7 b' class localrepository:'
525 546 added.append(fn)
526 547 elif c[0] == 'r':
527 548 unknown.append(fn)
528 elif c[2] != s.st_size:
549 elif c[2] != s.st_size or (c[1] ^ s.st_mode) & 0100:
529 550 changed.append(fn)
530 551 elif c[1] != s.st_mode or c[3] != s.st_mtime:
531 552 if fcmp(fn):
@@ -846,8 +867,11 b' class localrepository:'
846 867 m2n = self.changelog.read(p2)[0]
847 868 man = self.manifest.ancestor(m1n, m2n)
848 869 m1 = self.manifest.read(m1n)
870 mf1 = self.manifest.readflags(m1n)
849 871 m2 = self.manifest.read(m2n)
872 mf2 = self.manifest.readflags(m2n)
850 873 ma = self.manifest.read(man)
874 mfa = self.manifest.readflags(m2n)
851 875
852 876 (c, a, d, u) = self.diffdir(self.root)
853 877
@@ -863,8 +887,10 b' class localrepository:'
863 887
864 888 # construct a working dir manifest
865 889 mw = m1.copy()
890 mfw = mf1.copy()
866 891 for f in a + c + u:
867 892 mw[f] = ""
893 mfw[f] = is_exec(self.wjoin(f))
868 894 for f in d:
869 895 if f in mw: del mw[f]
870 896
@@ -875,6 +901,11 b' class localrepository:'
875 901 if n != a and m2[f] != a:
876 902 self.ui.debug(" %s versions differ, resolve\n" % f)
877 903 merge[f] = (m1.get(f, nullid), m2[f])
904 # merge executable bits
905 # "if we changed or they changed, change in merge"
906 a, b, c = mfa.get(f, 0), mfw[f], mf2[f]
907 mode = ((a^b) | (a^c)) ^ a
908 merge[f] = (m1.get(f, nullid), m2[f], mode)
878 909 elif m2[f] != a:
879 910 self.ui.debug(" remote %s is newer, get\n" % f)
880 911 get[f] = m2[f]
@@ -939,12 +970,14 b' class localrepository:'
939 970 for f in files:
940 971 if f[0] == "/": continue
941 972 self.ui.note("getting %s\n" % f)
942 t = self.file(f).revision(get[f])
973 t = self.file(f).read(get[f])
974 wp = self.wjoin(f)
943 975 try:
944 file(self.wjoin(f), "w").write(t)
976 file(wp, "w").write(t)
945 977 except IOError:
946 os.makedirs(os.path.dirname(f))
947 file(self.wjoin(f), "w").write(t)
978 os.makedirs(os.path.dirname(wp))
979 file(wp, "w").write(t)
980 set_exec(wp, mf2[f])
948 981 self.dirstate.update([f], mode)
949 982
950 983 # merge the tricky bits
@@ -952,8 +985,9 b' class localrepository:'
952 985 files.sort()
953 986 for f in files:
954 987 self.ui.status("merging %s\n" % f)
955 m, o = merge[f]
988 m, o, flag = merge[f]
956 989 self.merge3(f, m, o)
990 set_exec(wp, flag)
957 991 self.dirstate.update([f], 'm')
958 992
959 993 for f in remove:
General Comments 0
You need to be logged in to leave comments. Login now