comparison hgext/mq.py @ 4948:6fd953d5faea

dirstate: break update into separate functions
author Matt Mackall <mpm@selenic.com>
date Sat, 21 Jul 2007 16:02:09 -0500
parents bbdcacf7cef8
children fc61495ea9cf
comparison
equal deleted inserted replaced
4947:81078e177266 4948:6fd953d5faea
499 for f in files: 499 for f in files:
500 if os.path.exists(repo.dirstate.wjoin(f)): 500 if os.path.exists(repo.dirstate.wjoin(f)):
501 merged.append(f) 501 merged.append(f)
502 else: 502 else:
503 removed.append(f) 503 removed.append(f)
504 repo.dirstate.update(repo.dirstate.filterfiles(removed), 'r') 504 for f in removed:
505 repo.dirstate.update(repo.dirstate.filterfiles(merged), 'm') 505 repo.dirstate.remove(f)
506 for f in merged:
507 repo.dirstate.merge(f)
506 p1, p2 = repo.dirstate.parents() 508 p1, p2 = repo.dirstate.parents()
507 repo.dirstate.setparents(p1, merge) 509 repo.dirstate.setparents(p1, merge)
508 files = patch.updatedir(self.ui, repo, files, wlock=wlock) 510 files = patch.updatedir(self.ui, repo, files, wlock=wlock)
509 n = repo.commit(files, message, user, date, force=1, lock=lock, 511 n = repo.commit(files, message, user, date, force=1, lock=lock,
510 wlock=wlock) 512 wlock=wlock)
866 for f in m: 868 for f in m:
867 getfile(f, mmap[f]) 869 getfile(f, mmap[f])
868 for f in r: 870 for f in r:
869 getfile(f, mmap[f]) 871 getfile(f, mmap[f])
870 util.set_exec(repo.wjoin(f), mmap.execf(f)) 872 util.set_exec(repo.wjoin(f), mmap.execf(f))
871 repo.dirstate.update(m + r, 'n') 873 for f in m + r:
874 repo.dirstate.normal(f)
872 for f in a: 875 for f in a:
873 try: 876 try:
874 os.unlink(repo.wjoin(f)) 877 os.unlink(repo.wjoin(f))
875 except OSError, e: 878 except OSError, e:
876 if e.errno != errno.ENOENT: 879 if e.errno != errno.ENOENT:
877 raise 880 raise
878 try: os.removedirs(os.path.dirname(repo.wjoin(f))) 881 try: os.removedirs(os.path.dirname(repo.wjoin(f)))
879 except: pass 882 except: pass
880 if a: 883 repo.dirstate.forget(f)
881 repo.dirstate.forget(a)
882 repo.dirstate.setparents(qp, revlog.nullid) 884 repo.dirstate.setparents(qp, revlog.nullid)
883 self.strip(repo, rev, update=False, backup='strip', wlock=wlock) 885 self.strip(repo, rev, update=False, backup='strip', wlock=wlock)
884 del self.applied[start:end] 886 del self.applied[start:end]
885 if len(self.applied): 887 if len(self.applied):
886 self.ui.write("Now at: %s\n" % self.applied[-1].name) 888 self.ui.write("Now at: %s\n" % self.applied[-1].name)
1008 for dst in a: 1010 for dst in a:
1009 src = repo.dirstate.copied(dst) 1011 src = repo.dirstate.copied(dst)
1010 if src is None: 1012 if src is None:
1011 continue 1013 continue
1012 copies.setdefault(src, []).append(dst) 1014 copies.setdefault(src, []).append(dst)
1013 repo.dirstate.update(a, 'a') 1015 repo.dirstate.add(dst)
1014 # remember the copies between patchparent and tip 1016 # remember the copies between patchparent and tip
1015 # this may be slow, so don't do it if we're not tracking copies 1017 # this may be slow, so don't do it if we're not tracking copies
1016 if self.diffopts().git: 1018 if self.diffopts().git:
1017 for dst in aaa: 1019 for dst in aaa:
1018 f = repo.file(dst) 1020 f = repo.file(dst)
1025 if dst in copies: 1027 if dst in copies:
1026 del copies[dst] 1028 del copies[dst]
1027 for src, dsts in copies.iteritems(): 1029 for src, dsts in copies.iteritems():
1028 for dst in dsts: 1030 for dst in dsts:
1029 repo.dirstate.copy(src, dst) 1031 repo.dirstate.copy(src, dst)
1030 repo.dirstate.update(r, 'r') 1032 for f in r:
1033 repo.dirstate.remove(f)
1031 # if the patch excludes a modified file, mark that file with mtime=0 1034 # if the patch excludes a modified file, mark that file with mtime=0
1032 # so status can see it. 1035 # so status can see it.
1033 mm = [] 1036 mm = []
1034 for i in xrange(len(m)-1, -1, -1): 1037 for i in xrange(len(m)-1, -1, -1):
1035 if not matchfn(m[i]): 1038 if not matchfn(m[i]):
1036 mm.append(m[i]) 1039 mm.append(m[i])
1037 del m[i] 1040 del m[i]
1038 repo.dirstate.update(m, 'n') 1041 for f in m:
1039 repo.dirstate.update(mm, 'n', st_mtime=-1, st_size=-1) 1042 repo.dirstate.normal(f)
1040 repo.dirstate.forget(forget) 1043 for f in mm:
1044 repo.dirstate.normaldirty(f)
1045 for f in forget:
1046 repo.dirstate.forget(f)
1041 1047
1042 if not msg: 1048 if not msg:
1043 if not message: 1049 if not message:
1044 message = "[mq]: %s\n" % patchfn 1050 message = "[mq]: %s\n" % patchfn
1045 else: 1051 else:
1064 except OSError, e: 1070 except OSError, e:
1065 if e.errno != errno.ENOENT: 1071 if e.errno != errno.ENOENT:
1066 raise 1072 raise
1067 try: os.removedirs(os.path.dirname(f)) 1073 try: os.removedirs(os.path.dirname(f))
1068 except: pass 1074 except: pass
1069 # forget the file copies in the dirstate 1075 # forget the file copies in the dirstate
1070 # push should readd the files later on 1076 # push should readd the files later on
1071 repo.dirstate.forget(added) 1077 repo.dirstate.forget(a)
1072 self.pop(repo, force=True, wlock=wlock) 1078 self.pop(repo, force=True, wlock=wlock)
1073 self.push(repo, force=True, wlock=wlock) 1079 self.push(repo, force=True, wlock=wlock)
1074 1080
1075 def init(self, repo, create=False): 1081 def init(self, repo, create=False):
1076 if not create and os.path.isdir(self.path): 1082 if not create and os.path.isdir(self.path):