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" % |
|
|
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 |
|
|
|
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).re |
|
|
973 | t = self.file(f).read(get[f]) | |
|
974 | wp = self.wjoin(f) | |
|
943 | 975 | try: |
|
944 |
file( |
|
|
976 | file(wp, "w").write(t) | |
|
945 | 977 | except IOError: |
|
946 |
os.makedirs(os.path.dirname( |
|
|
947 |
file( |
|
|
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