##// 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 if rev:
310 if rev:
311 n = repo.manifest.lookup(rev)
311 n = repo.manifest.lookup(rev)
312 m = repo.manifest.read(n)
312 m = repo.manifest.read(n)
313 mf = repo.manifest.readflags(n)
313 files = m.keys()
314 files = m.keys()
314 files.sort()
315 files.sort()
315
316
316 for f in files:
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 def parents(ui, repo, node = None):
320 def parents(ui, repo, node = None):
320 '''show the parents of the current working dir'''
321 '''show the parents of the current working dir'''
@@ -11,6 +11,15 b' from demandload import *'
11 demandload(globals(), "re lock urllib urllib2 transaction time socket")
11 demandload(globals(), "re lock urllib urllib2 transaction time socket")
12 demandload(globals(), "tempfile byterange difflib")
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 class filelog(revlog):
23 class filelog(revlog):
15 def __init__(self, opener, path):
24 def __init__(self, opener, path):
16 revlog.__init__(self, opener,
25 revlog.__init__(self, opener,
@@ -85,13 +94,20 b' class manifest(revlog):'
85 return self.mapcache[1].copy()
94 return self.mapcache[1].copy()
86 text = self.revision(node)
95 text = self.revision(node)
87 map = {}
96 map = {}
97 flag = {}
88 self.listcache = (text, text.splitlines(1))
98 self.listcache = (text, text.splitlines(1))
89 for l in self.listcache[1]:
99 for l in self.listcache[1]:
90 (f, n) = l.split('\0')
100 (f, n) = l.split('\0')
91 map[f] = bin(n[:40])
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 return map
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 def diff(self, a, b):
111 def diff(self, a, b):
96 # this is sneaky, as we're not actually using a and b
112 # this is sneaky, as we're not actually using a and b
97 if self.listcache and self.addlist and self.listcache[0] == a:
113 if self.listcache and self.addlist and self.listcache[0] == a:
@@ -103,11 +119,13 b' class manifest(revlog):'
103 else:
119 else:
104 return mdiff.textdiff(a, b)
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 files = map.keys()
123 files = map.keys()
108 files.sort()
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 text = "".join(self.addlist)
129 text = "".join(self.addlist)
112
130
113 n = self.addrevision(text, transaction, link, p1, p2)
131 n = self.addrevision(text, transaction, link, p1, p2)
@@ -442,6 +460,7 b' class localrepository:'
442 c1 = self.changelog.read(p1)
460 c1 = self.changelog.read(p1)
443 c2 = self.changelog.read(p2)
461 c2 = self.changelog.read(p2)
444 m1 = self.manifest.read(c1[0])
462 m1 = self.manifest.read(c1[0])
463 mf1 = self.manifest.readflags(c1[0])
445 m2 = self.manifest.read(c2[0])
464 m2 = self.manifest.read(c2[0])
446 lock = self.lock()
465 lock = self.lock()
447 tr = self.transaction()
466 tr = self.transaction()
@@ -453,7 +472,9 b' class localrepository:'
453 for f in commit:
472 for f in commit:
454 self.ui.note(f + "\n")
473 self.ui.note(f + "\n")
455 try:
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 except IOError:
478 except IOError:
458 self.warn("trouble committing %s!\n" % f)
479 self.warn("trouble committing %s!\n" % f)
459 raise
480 raise
@@ -466,7 +487,7 b' class localrepository:'
466 # update manifest
487 # update manifest
467 m1.update(new)
488 m1.update(new)
468 for f in remove: del m1[f]
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 # add changeset
492 # add changeset
472 new = new.keys()
493 new = new.keys()
@@ -525,7 +546,7 b' class localrepository:'
525 added.append(fn)
546 added.append(fn)
526 elif c[0] == 'r':
547 elif c[0] == 'r':
527 unknown.append(fn)
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 changed.append(fn)
550 changed.append(fn)
530 elif c[1] != s.st_mode or c[3] != s.st_mtime:
551 elif c[1] != s.st_mode or c[3] != s.st_mtime:
531 if fcmp(fn):
552 if fcmp(fn):
@@ -846,8 +867,11 b' class localrepository:'
846 m2n = self.changelog.read(p2)[0]
867 m2n = self.changelog.read(p2)[0]
847 man = self.manifest.ancestor(m1n, m2n)
868 man = self.manifest.ancestor(m1n, m2n)
848 m1 = self.manifest.read(m1n)
869 m1 = self.manifest.read(m1n)
870 mf1 = self.manifest.readflags(m1n)
849 m2 = self.manifest.read(m2n)
871 m2 = self.manifest.read(m2n)
872 mf2 = self.manifest.readflags(m2n)
850 ma = self.manifest.read(man)
873 ma = self.manifest.read(man)
874 mfa = self.manifest.readflags(m2n)
851
875
852 (c, a, d, u) = self.diffdir(self.root)
876 (c, a, d, u) = self.diffdir(self.root)
853
877
@@ -863,8 +887,10 b' class localrepository:'
863
887
864 # construct a working dir manifest
888 # construct a working dir manifest
865 mw = m1.copy()
889 mw = m1.copy()
890 mfw = mf1.copy()
866 for f in a + c + u:
891 for f in a + c + u:
867 mw[f] = ""
892 mw[f] = ""
893 mfw[f] = is_exec(self.wjoin(f))
868 for f in d:
894 for f in d:
869 if f in mw: del mw[f]
895 if f in mw: del mw[f]
870
896
@@ -875,6 +901,11 b' class localrepository:'
875 if n != a and m2[f] != a:
901 if n != a and m2[f] != a:
876 self.ui.debug(" %s versions differ, resolve\n" % f)
902 self.ui.debug(" %s versions differ, resolve\n" % f)
877 merge[f] = (m1.get(f, nullid), m2[f])
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 elif m2[f] != a:
909 elif m2[f] != a:
879 self.ui.debug(" remote %s is newer, get\n" % f)
910 self.ui.debug(" remote %s is newer, get\n" % f)
880 get[f] = m2[f]
911 get[f] = m2[f]
@@ -939,12 +970,14 b' class localrepository:'
939 for f in files:
970 for f in files:
940 if f[0] == "/": continue
971 if f[0] == "/": continue
941 self.ui.note("getting %s\n" % f)
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 try:
975 try:
944 file(self.wjoin(f), "w").write(t)
976 file(wp, "w").write(t)
945 except IOError:
977 except IOError:
946 os.makedirs(os.path.dirname(f))
978 os.makedirs(os.path.dirname(wp))
947 file(self.wjoin(f), "w").write(t)
979 file(wp, "w").write(t)
980 set_exec(wp, mf2[f])
948 self.dirstate.update([f], mode)
981 self.dirstate.update([f], mode)
949
982
950 # merge the tricky bits
983 # merge the tricky bits
@@ -952,8 +985,9 b' class localrepository:'
952 files.sort()
985 files.sort()
953 for f in files:
986 for f in files:
954 self.ui.status("merging %s\n" % f)
987 self.ui.status("merging %s\n" % f)
955 m, o = merge[f]
988 m, o, flag = merge[f]
956 self.merge3(f, m, o)
989 self.merge3(f, m, o)
990 set_exec(wp, flag)
957 self.dirstate.update([f], 'm')
991 self.dirstate.update([f], 'm')
958
992
959 for f in remove:
993 for f in remove:
General Comments 0
You need to be logged in to leave comments. Login now