hgext/largefiles/lfcommands.py
changeset 31659 1af4a1641bdb
parent 31623 8228bc8fed8c
child 31740 3e37b479ce2f
equal deleted inserted replaced
31658:32d998dc2a00 31659:1af4a1641bdb
   401     lfiles = lfutil.listlfiles(repo, node)
   401     lfiles = lfutil.listlfiles(repo, node)
   402     if filelist:
   402     if filelist:
   403         lfiles = set(lfiles) & set(filelist)
   403         lfiles = set(lfiles) & set(filelist)
   404     toget = []
   404     toget = []
   405 
   405 
       
   406     ctx = repo[node]
   406     for lfile in lfiles:
   407     for lfile in lfiles:
   407         try:
   408         try:
   408             expectedhash = repo[node][lfutil.standin(lfile)].data().strip()
   409             expectedhash = ctx[lfutil.standin(lfile)].data().strip()
   409         except IOError as err:
   410         except IOError as err:
   410             if err.errno == errno.ENOENT:
   411             if err.errno == errno.ENOENT:
   411                 continue # node must be None and standin wasn't found in wctx
   412                 continue # node must be None and standin wasn't found in wctx
   412             raise
   413             raise
   413         if not lfutil.findfile(repo, expectedhash):
   414         if not lfutil.findfile(repo, expectedhash):
   455             lfiles = [f for f in lfiles if f in filelist]
   456             lfiles = [f for f in lfiles if f in filelist]
   456 
   457 
   457         update = {}
   458         update = {}
   458         updated, removed = 0, 0
   459         updated, removed = 0, 0
   459         wvfs = repo.wvfs
   460         wvfs = repo.wvfs
       
   461         wctx = repo[None]
   460         for lfile in lfiles:
   462         for lfile in lfiles:
   461             rellfile = lfile
   463             rellfile = lfile
   462             rellfileorig = os.path.relpath(
   464             rellfileorig = os.path.relpath(
   463                 scmutil.origpath(ui, repo, wvfs.join(rellfile)),
   465                 scmutil.origpath(ui, repo, wvfs.join(rellfile)),
   464                 start=repo.root)
   466                 start=repo.root)
   472                     shutil.copyfile(wvfs.join(rellfile),
   474                     shutil.copyfile(wvfs.join(rellfile),
   473                                     wvfs.join(rellfileorig))
   475                                     wvfs.join(rellfileorig))
   474                     wvfs.unlinkpath(relstandinorig)
   476                     wvfs.unlinkpath(relstandinorig)
   475                 expecthash = lfutil.readstandin(repo, lfile)
   477                 expecthash = lfutil.readstandin(repo, lfile)
   476                 if expecthash != '':
   478                 if expecthash != '':
   477                     if lfile not in repo[None]: # not switched to normal file
   479                     if lfile not in wctx: # not switched to normal file
   478                         wvfs.unlinkpath(rellfile, ignoremissing=True)
   480                         wvfs.unlinkpath(rellfile, ignoremissing=True)
   479                     # use normallookup() to allocate an entry in largefiles
   481                     # use normallookup() to allocate an entry in largefiles
   480                     # dirstate to prevent lfilesrepo.status() from reporting
   482                     # dirstate to prevent lfilesrepo.status() from reporting
   481                     # missing files as removed.
   483                     # missing files as removed.
   482                     lfdirstate.normallookup(lfile)
   484                     lfdirstate.normallookup(lfile)
   485                 # Remove lfiles for which the standin is deleted, unless the
   487                 # Remove lfiles for which the standin is deleted, unless the
   486                 # lfile is added to the repository again. This happens when a
   488                 # lfile is added to the repository again. This happens when a
   487                 # largefile is converted back to a normal file: the standin
   489                 # largefile is converted back to a normal file: the standin
   488                 # disappears, but a new (normal) file appears as the lfile.
   490                 # disappears, but a new (normal) file appears as the lfile.
   489                 if (wvfs.exists(rellfile) and
   491                 if (wvfs.exists(rellfile) and
   490                     repo.dirstate.normalize(lfile) not in repo[None]):
   492                     repo.dirstate.normalize(lfile) not in wctx):
   491                     wvfs.unlinkpath(rellfile)
   493                     wvfs.unlinkpath(rellfile)
   492                     removed += 1
   494                     removed += 1
   493 
   495 
   494         # largefile processing might be slow and be interrupted - be prepared
   496         # largefile processing might be slow and be interrupted - be prepared
   495         lfdirstate.write()
   497         lfdirstate.write()