##// END OF EJS Templates
move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman -
r11303:a1aad833 default
parent child Browse files
Show More
@@ -247,7 +247,7 b' def sign(ui, repo, *revs, **opts):'
247 repo.wfile(".hgsigs", "ab").write(sigmessage)
247 repo.wfile(".hgsigs", "ab").write(sigmessage)
248
248
249 if '.hgsigs' not in repo.dirstate:
249 if '.hgsigs' not in repo.dirstate:
250 repo.add([".hgsigs"])
250 repo[None].add([".hgsigs"])
251
251
252 if opts["no_commit"]:
252 if opts["no_commit"]:
253 return
253 return
@@ -358,7 +358,7 b' def demo(ui, repo, *args, **opts):'
358 demoitems('keywordmaps', kwmaps.iteritems())
358 demoitems('keywordmaps', kwmaps.iteritems())
359 keywords = '$' + '$\n$'.join(sorted(kwmaps.keys())) + '$\n'
359 keywords = '$' + '$\n$'.join(sorted(kwmaps.keys())) + '$\n'
360 repo.wopener(fn, 'w').write(keywords)
360 repo.wopener(fn, 'w').write(keywords)
361 repo.add([fn])
361 repo[None].add([fn])
362 ui.note(_('\nkeywords written to %s:\n') % fn)
362 ui.note(_('\nkeywords written to %s:\n') % fn)
363 ui.note(keywords)
363 ui.note(keywords)
364 repo.dirstate.setbranch('demobranch')
364 repo.dirstate.setbranch('demobranch')
@@ -705,7 +705,7 b' class queue(object):'
705 if not keep:
705 if not keep:
706 r = self.qrepo()
706 r = self.qrepo()
707 if r:
707 if r:
708 r.remove(patches, True)
708 r[None].remove(patches, True)
709 else:
709 else:
710 for p in patches:
710 for p in patches:
711 os.unlink(self.join(p))
711 os.unlink(self.join(p))
@@ -874,7 +874,7 b' class queue(object):'
874 wlock = None
874 wlock = None
875 r = self.qrepo()
875 r = self.qrepo()
876 if r:
876 if r:
877 r.add([patchfn])
877 r[None].add([patchfn])
878 except:
878 except:
879 repo.rollback()
879 repo.rollback()
880 raise
880 raise
@@ -1713,7 +1713,7 b' class queue(object):'
1713 self.series_dirty = 1
1713 self.series_dirty = 1
1714 qrepo = self.qrepo()
1714 qrepo = self.qrepo()
1715 if qrepo:
1715 if qrepo:
1716 qrepo.add(added)
1716 qrepo[None].add(added)
1717
1717
1718 def delete(ui, repo, *patches, **opts):
1718 def delete(ui, repo, *patches, **opts):
1719 """remove patches from queue
1719 """remove patches from queue
@@ -1832,7 +1832,7 b' def qinit(ui, repo, create):'
1832 fp.close()
1832 fp.close()
1833 if not os.path.exists(r.wjoin('series')):
1833 if not os.path.exists(r.wjoin('series')):
1834 r.wopener('series', 'w').close()
1834 r.wopener('series', 'w').close()
1835 r.add(['.hgignore', 'series'])
1835 r[None].add(['.hgignore', 'series'])
1836 commands.add(ui, r)
1836 commands.add(ui, r)
1837 return 0
1837 return 0
1838
1838
@@ -2308,6 +2308,7 b' def rename(ui, repo, patch, name=None, *'
2308 util.rename(q.join(patch), absdest)
2308 util.rename(q.join(patch), absdest)
2309 r = q.qrepo()
2309 r = q.qrepo()
2310 if r:
2310 if r:
2311 wctx = r[None]
2311 wlock = r.wlock()
2312 wlock = r.wlock()
2312 try:
2313 try:
2313 if r.dirstate[patch] == 'a':
2314 if r.dirstate[patch] == 'a':
@@ -2315,9 +2316,9 b' def rename(ui, repo, patch, name=None, *'
2315 r.dirstate.add(name)
2316 r.dirstate.add(name)
2316 else:
2317 else:
2317 if r.dirstate[name] == 'r':
2318 if r.dirstate[name] == 'r':
2318 r.undelete([name])
2319 wctx.undelete([name])
2319 r.copy(patch, name)
2320 wctx.copy(patch, name)
2320 r.remove([patch], False)
2321 wctx.remove([patch], False)
2321 finally:
2322 finally:
2322 wlock.release()
2323 wlock.release()
2323
2324
@@ -311,12 +311,13 b' def addremove(repo, pats=[], opts={}, dr'
311 copies[new] = old
311 copies[new] = old
312
312
313 if not dry_run:
313 if not dry_run:
314 wctx = repo[None]
314 wlock = repo.wlock()
315 wlock = repo.wlock()
315 try:
316 try:
316 repo.remove(deleted)
317 wctx.remove(deleted)
317 repo.add(unknown)
318 wctx.add(unknown)
318 for new, old in copies.iteritems():
319 for new, old in copies.iteritems():
319 repo.copy(old, new)
320 wctx.copy(old, new)
320 finally:
321 finally:
321 wlock.release()
322 wlock.release()
322
323
@@ -329,6 +330,7 b' def copy(ui, repo, pats, opts, rename=Fa'
329 targets = {}
330 targets = {}
330 after = opts.get("after")
331 after = opts.get("after")
331 dryrun = opts.get("dry_run")
332 dryrun = opts.get("dry_run")
333 wctx = repo[None]
332
334
333 def walkpat(pat):
335 def walkpat(pat):
334 srcs = []
336 srcs = []
@@ -421,12 +423,12 b' def copy(ui, repo, pats, opts, rename=Fa'
421 "data will be stored for %s.\n")
423 "data will be stored for %s.\n")
422 % (repo.pathto(origsrc, cwd), reltarget))
424 % (repo.pathto(origsrc, cwd), reltarget))
423 if repo.dirstate[abstarget] in '?r' and not dryrun:
425 if repo.dirstate[abstarget] in '?r' and not dryrun:
424 repo.add([abstarget])
426 wctx.add([abstarget])
425 elif not dryrun:
427 elif not dryrun:
426 repo.copy(origsrc, abstarget)
428 wctx.copy(origsrc, abstarget)
427
429
428 if rename and not dryrun:
430 if rename and not dryrun:
429 repo.remove([abssrc], not after)
431 wctx.remove([abssrc], not after)
430
432
431 # pat: ossep
433 # pat: ossep
432 # dest ossep
434 # dest ossep
@@ -56,7 +56,7 b' def add(ui, repo, *pats, **opts):'
56 if ui.verbose or not exact:
56 if ui.verbose or not exact:
57 ui.status(_('adding %s\n') % m.rel(f))
57 ui.status(_('adding %s\n') % m.rel(f))
58 if not opts.get('dry_run'):
58 if not opts.get('dry_run'):
59 bad += [f for f in repo.add(names) if f in m.files()]
59 bad += [f for f in repo[None].add(names) if f in m.files()]
60 return bad and 1 or 0
60 return bad and 1 or 0
61
61
62 def addremove(ui, repo, *pats, **opts):
62 def addremove(ui, repo, *pats, **opts):
@@ -1314,7 +1314,7 b' def forget(ui, repo, *pats, **opts):'
1314 if ui.verbose or not m.exact(f):
1314 if ui.verbose or not m.exact(f):
1315 ui.status(_('removing %s\n') % m.rel(f))
1315 ui.status(_('removing %s\n') % m.rel(f))
1316
1316
1317 repo.remove(forget, unlink=False)
1317 repo[None].remove(forget, unlink=False)
1318 return errs
1318 return errs
1319
1319
1320 def grep(ui, repo, pattern, *pats, **opts):
1320 def grep(ui, repo, pattern, *pats, **opts):
@@ -2669,8 +2669,8 b' def remove(ui, repo, *pats, **opts):'
2669 if ui.verbose or not m.exact(f):
2669 if ui.verbose or not m.exact(f):
2670 ui.status(_('removing %s\n') % m.rel(f))
2670 ui.status(_('removing %s\n') % m.rel(f))
2671
2671
2672 repo.forget(forget)
2672 repo[None].forget(forget)
2673 repo.remove(remove, unlink=not after)
2673 repo[None].remove(remove, unlink=not after)
2674 return ret
2674 return ret
2675
2675
2676 def rename(ui, repo, *pats, **opts):
2676 def rename(ui, repo, *pats, **opts):
@@ -8,7 +8,7 b''
8 from node import nullid, nullrev, short, hex
8 from node import nullid, nullrev, short, hex
9 from i18n import _
9 from i18n import _
10 import ancestor, bdiff, error, util, subrepo, patch
10 import ancestor, bdiff, error, util, subrepo, patch
11 import os, errno
11 import os, errno, stat
12
12
13 propertycache = util.propertycache
13 propertycache = util.propertycache
14
14
@@ -761,6 +761,103 b' class workingctx(changectx):'
761 self.modified() or self.added() or self.removed() or
761 self.modified() or self.added() or self.removed() or
762 (missing and self.deleted()))
762 (missing and self.deleted()))
763
763
764 def add(self, list):
765 wlock = self._repo.wlock()
766 ui, ds = self._repo.ui, self._repo.dirstate
767 try:
768 rejected = []
769 for f in list:
770 p = self._repo.wjoin(f)
771 try:
772 st = os.lstat(p)
773 except:
774 ui.warn(_("%s does not exist!\n") % f)
775 rejected.append(f)
776 continue
777 if st.st_size > 10000000:
778 ui.warn(_("%s: up to %d MB of RAM may be required "
779 "to manage this file\n"
780 "(use 'hg revert %s' to cancel the "
781 "pending addition)\n")
782 % (f, 3 * st.st_size // 1000000, f))
783 if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)):
784 ui.warn(_("%s not added: only files and symlinks "
785 "supported currently\n") % f)
786 rejected.append(p)
787 elif ds[f] in 'amn':
788 ui.warn(_("%s already tracked!\n") % f)
789 elif ds[f] == 'r':
790 ds.normallookup(f)
791 else:
792 ds.add(f)
793 return rejected
794 finally:
795 wlock.release()
796
797 def forget(self, list):
798 wlock = self._repo.wlock()
799 try:
800 for f in list:
801 if self._repo.dirstate[f] != 'a':
802 self._repo.ui.warn(_("%s not added!\n") % f)
803 else:
804 self._repo.dirstate.forget(f)
805 finally:
806 wlock.release()
807
808 def remove(self, list, unlink=False):
809 if unlink:
810 for f in list:
811 try:
812 util.unlink(self._repo.wjoin(f))
813 except OSError, inst:
814 if inst.errno != errno.ENOENT:
815 raise
816 wlock = self._repo.wlock()
817 try:
818 for f in list:
819 if unlink and os.path.exists(self._repo.wjoin(f)):
820 self._repo.ui.warn(_("%s still exists!\n") % f)
821 elif self._repo.dirstate[f] == 'a':
822 self._repo.dirstate.forget(f)
823 elif f not in self._repo.dirstate:
824 self._repo.ui.warn(_("%s not tracked!\n") % f)
825 else:
826 self._repo.dirstate.remove(f)
827 finally:
828 wlock.release()
829
830 def undelete(self, list):
831 pctxs = self.parents()
832 wlock = self._repo.wlock()
833 try:
834 for f in list:
835 if self._repo.dirstate[f] != 'r':
836 self._repo.ui.warn(_("%s not removed!\n") % f)
837 else:
838 fctx = f in pctxs[0] and pctxs[0] or pctxs[1]
839 t = fctx.data()
840 self._repo.wwrite(f, t, fctx.flags())
841 self._repo.dirstate.normal(f)
842 finally:
843 wlock.release()
844
845 def copy(self, source, dest):
846 p = self._repo.wjoin(dest)
847 if not (os.path.exists(p) or os.path.islink(p)):
848 self._repo.ui.warn(_("%s does not exist!\n") % dest)
849 elif not (os.path.isfile(p) or os.path.islink(p)):
850 self._repo.ui.warn(_("copy failed: %s is not a file or a "
851 "symbolic link\n") % dest)
852 else:
853 wlock = self._repo.wlock()
854 try:
855 if self._repo.dirstate[dest] in '?r':
856 self._repo.dirstate.add(dest)
857 self._repo.dirstate.copy(source, dest)
858 finally:
859 wlock.release()
860
764 class workingfilectx(filectx):
861 class workingfilectx(filectx):
765 """A workingfilectx object makes access to data related to a particular
862 """A workingfilectx object makes access to data related to a particular
766 file in the working directory convenient."""
863 file in the working directory convenient."""
@@ -16,7 +16,7 b' import merge as mergemod'
16 import tags as tagsmod
16 import tags as tagsmod
17 import url as urlmod
17 import url as urlmod
18 from lock import release
18 from lock import release
19 import weakref, stat, errno, os, time, inspect
19 import weakref, errno, os, time, inspect
20 propertycache = util.propertycache
20 propertycache = util.propertycache
21
21
22 class localrepository(repo.repository):
22 class localrepository(repo.repository):
@@ -210,7 +210,7 b' class localrepository(repo.repository):'
210 writetags(fp, names, encoding.fromlocal, prevtags)
210 writetags(fp, names, encoding.fromlocal, prevtags)
211
211
212 if '.hgtags' not in self.dirstate:
212 if '.hgtags' not in self.dirstate:
213 self.add(['.hgtags'])
213 self[None].add(['.hgtags'])
214
214
215 m = matchmod.exact(self.root, '', ['.hgtags'])
215 m = matchmod.exact(self.root, '', ['.hgtags'])
216 tagnode = self.commit(message, user, date, extra=extra, match=m)
216 tagnode = self.commit(message, user, date, extra=extra, match=m)
@@ -1112,103 +1112,6 b' class localrepository(repo.repository):'
1112 [l.sort() for l in r]
1112 [l.sort() for l in r]
1113 return r
1113 return r
1114
1114
1115 def add(self, list):
1116 wlock = self.wlock()
1117 try:
1118 rejected = []
1119 for f in list:
1120 p = self.wjoin(f)
1121 try:
1122 st = os.lstat(p)
1123 except:
1124 self.ui.warn(_("%s does not exist!\n") % f)
1125 rejected.append(f)
1126 continue
1127 if st.st_size > 10000000:
1128 self.ui.warn(_("%s: up to %d MB of RAM may be required "
1129 "to manage this file\n"
1130 "(use 'hg revert %s' to cancel the "
1131 "pending addition)\n")
1132 % (f, 3 * st.st_size // 1000000, f))
1133 if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)):
1134 self.ui.warn(_("%s not added: only files and symlinks "
1135 "supported currently\n") % f)
1136 rejected.append(p)
1137 elif self.dirstate[f] in 'amn':
1138 self.ui.warn(_("%s already tracked!\n") % f)
1139 elif self.dirstate[f] == 'r':
1140 self.dirstate.normallookup(f)
1141 else:
1142 self.dirstate.add(f)
1143 return rejected
1144 finally:
1145 wlock.release()
1146
1147 def forget(self, list):
1148 wlock = self.wlock()
1149 try:
1150 for f in list:
1151 if self.dirstate[f] != 'a':
1152 self.ui.warn(_("%s not added!\n") % f)
1153 else:
1154 self.dirstate.forget(f)
1155 finally:
1156 wlock.release()
1157
1158 def remove(self, list, unlink=False):
1159 if unlink:
1160 for f in list:
1161 try:
1162 util.unlink(self.wjoin(f))
1163 except OSError, inst:
1164 if inst.errno != errno.ENOENT:
1165 raise
1166 wlock = self.wlock()
1167 try:
1168 for f in list:
1169 if unlink and os.path.exists(self.wjoin(f)):
1170 self.ui.warn(_("%s still exists!\n") % f)
1171 elif self.dirstate[f] == 'a':
1172 self.dirstate.forget(f)
1173 elif f not in self.dirstate:
1174 self.ui.warn(_("%s not tracked!\n") % f)
1175 else:
1176 self.dirstate.remove(f)
1177 finally:
1178 wlock.release()
1179
1180 def undelete(self, list):
1181 manifests = [self.manifest.read(self.changelog.read(p)[0])
1182 for p in self.dirstate.parents() if p != nullid]
1183 wlock = self.wlock()
1184 try:
1185 for f in list:
1186 if self.dirstate[f] != 'r':
1187 self.ui.warn(_("%s not removed!\n") % f)
1188 else:
1189 m = f in manifests[0] and manifests[0] or manifests[1]
1190 t = self.file(f).read(m[f])
1191 self.wwrite(f, t, m.flags(f))
1192 self.dirstate.normal(f)
1193 finally:
1194 wlock.release()
1195
1196 def copy(self, source, dest):
1197 p = self.wjoin(dest)
1198 if not (os.path.exists(p) or os.path.islink(p)):
1199 self.ui.warn(_("%s does not exist!\n") % dest)
1200 elif not (os.path.isfile(p) or os.path.islink(p)):
1201 self.ui.warn(_("copy failed: %s is not a file or a "
1202 "symbolic link\n") % dest)
1203 else:
1204 wlock = self.wlock()
1205 try:
1206 if self.dirstate[dest] in '?r':
1207 self.dirstate.add(dest)
1208 self.dirstate.copy(source, dest)
1209 finally:
1210 wlock.release()
1211
1212 def heads(self, start=None):
1115 def heads(self, start=None):
1213 heads = self.changelog.heads(start)
1116 heads = self.changelog.heads(start)
1214 # sort the output in rev descending order
1117 # sort the output in rev descending order
@@ -1226,10 +1226,13 b' def updatedir(ui, repo, patches, similar'
1226 copies.append((gp.oldpath, gp.path))
1226 copies.append((gp.oldpath, gp.path))
1227 elif gp.op == 'DELETE':
1227 elif gp.op == 'DELETE':
1228 removes.add(gp.path)
1228 removes.add(gp.path)
1229
1230 wctx = repo[None]
1229 for src, dst in copies:
1231 for src, dst in copies:
1230 repo.copy(src, dst)
1232 wctx.copy(src, dst)
1231 if (not similarity) and removes:
1233 if (not similarity) and removes:
1232 repo.remove(sorted(removes), True)
1234 wctx.remove(sorted(removes), True)
1235
1233 for f in patches:
1236 for f in patches:
1234 gp = patches[f]
1237 gp = patches[f]
1235 if gp and gp.mode:
1238 if gp and gp.mode:
@@ -13,7 +13,7 b' f.close()'
13 os.utime('foo', (1000, 1000))
13 os.utime('foo', (1000, 1000))
14
14
15 # add+commit 'foo'
15 # add+commit 'foo'
16 repo.add(['foo'])
16 repo[None].add(['foo'])
17 repo.commit(text='commit1', date="0 0")
17 repo.commit(text='commit1', date="0 0")
18
18
19 print "workingfilectx.date =", repo[None]['foo'].date()
19 print "workingfilectx.date =", repo[None]['foo'].date()
@@ -13,7 +13,7 b' def addcommit(name, time):'
13 f = open(name, 'w')
13 f = open(name, 'w')
14 f.write('%s\n' % name)
14 f.write('%s\n' % name)
15 f.close()
15 f.close()
16 repo.add([name])
16 repo[None].add([name])
17 commit(name, time)
17 commit(name, time)
18
18
19 def update(rev):
19 def update(rev):
General Comments 0
You need to be logged in to leave comments. Login now