mercurial/localrepo.py
changeset 11303 a1aad8333864
parent 11301 3d0591a66118
child 11368 b9eb005c54ad
equal deleted inserted replaced
11302:e1dde7363601 11303:a1aad8333864
    14 import match as matchmod
    14 import match as matchmod
    15 import merge as mergemod
    15 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):
    23     capabilities = set(('lookup', 'changegroupsubset', 'branchmap'))
    23     capabilities = set(('lookup', 'changegroupsubset', 'branchmap'))
    24     supported = set('revlogv1 store fncache shared'.split())
    24     supported = set('revlogv1 store fncache shared'.split())
   208 
   208 
   209         # committed tags are stored in UTF-8
   209         # committed tags are stored in UTF-8
   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)
   217 
   217 
   218         for name in names:
   218         for name in names:
  1109             removed = mf1.keys()
  1109             removed = mf1.keys()
  1110 
  1110 
  1111         r = modified, added, removed, deleted, unknown, ignored, clean
  1111         r = modified, added, removed, deleted, unknown, ignored, clean
  1112         [l.sort() for l in r]
  1112         [l.sort() for l in r]
  1113         return r
  1113         return r
  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 
  1114 
  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
  1215         heads = [(-self.changelog.rev(h), h) for h in heads]
  1118         heads = [(-self.changelog.rev(h), h) for h in heads]