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