mercurial/cmdutil.py
changeset 39278 53e532007878
parent 39244 73cf21b2e8a6
child 39287 6b81d2ff118f
equal deleted inserted replaced
39277:f785073f792c 39278:53e532007878
  1052             fp = repo.ui.fin
  1052             fp = repo.ui.fin
  1053         return _unclosablefile(fp)
  1053         return _unclosablefile(fp)
  1054     fn = makefilename(ctx, pat, **props)
  1054     fn = makefilename(ctx, pat, **props)
  1055     return open(fn, mode)
  1055     return open(fn, mode)
  1056 
  1056 
  1057 def openrevlog(repo, cmd, file_, opts):
  1057 def openstorage(repo, cmd, file_, opts, returnrevlog=False):
  1058     """opens the changelog, manifest, a filelog or a given revlog"""
  1058     """opens the changelog, manifest, a filelog or a given revlog"""
  1059     cl = opts['changelog']
  1059     cl = opts['changelog']
  1060     mf = opts['manifest']
  1060     mf = opts['manifest']
  1061     dir = opts['dir']
  1061     dir = opts['dir']
  1062     msg = None
  1062     msg = None
  1090             r = repo.manifestlog.getstorage(b'')
  1090             r = repo.manifestlog.getstorage(b'')
  1091         elif file_:
  1091         elif file_:
  1092             filelog = repo.file(file_)
  1092             filelog = repo.file(file_)
  1093             if len(filelog):
  1093             if len(filelog):
  1094                 r = filelog
  1094                 r = filelog
       
  1095 
       
  1096         # Not all storage may be revlogs. If requested, try to return an actual
       
  1097         # revlog instance.
       
  1098         if returnrevlog:
       
  1099             if isinstance(r, revlog.revlog):
       
  1100                 pass
       
  1101             elif util.safehasattr(r, '_revlog'):
       
  1102                 r = r._revlog
       
  1103             elif r is not None:
       
  1104                 raise error.Abort(_('%r does not appear to be a revlog') % r)
       
  1105 
  1095     if not r:
  1106     if not r:
       
  1107         if not returnrevlog:
       
  1108             raise error.Abort(_('cannot give path to non-revlog'))
       
  1109 
  1096         if not file_:
  1110         if not file_:
  1097             raise error.CommandError(cmd, _('invalid arguments'))
  1111             raise error.CommandError(cmd, _('invalid arguments'))
  1098         if not os.path.isfile(file_):
  1112         if not os.path.isfile(file_):
  1099             raise error.Abort(_("revlog '%s' not found") % file_)
  1113             raise error.Abort(_("revlog '%s' not found") % file_)
  1100         r = revlog.revlog(vfsmod.vfs(pycompat.getcwd(), audit=False),
  1114         r = revlog.revlog(vfsmod.vfs(pycompat.getcwd(), audit=False),
  1101                           file_[:-2] + ".i")
  1115                           file_[:-2] + ".i")
  1102     return r
  1116     return r
       
  1117 
       
  1118 def openrevlog(repo, cmd, file_, opts):
       
  1119     """Obtain a revlog backing storage of an item.
       
  1120 
       
  1121     This is similar to ``openstorage()`` except it always returns a revlog.
       
  1122 
       
  1123     In most cases, a caller cares about the main storage object - not the
       
  1124     revlog backing it. Therefore, this function should only be used by code
       
  1125     that needs to examine low-level revlog implementation details. e.g. debug
       
  1126     commands.
       
  1127     """
       
  1128     return openstorage(repo, cmd, file_, opts, returnrevlog=True)
  1103 
  1129 
  1104 def copy(ui, repo, pats, opts, rename=False):
  1130 def copy(ui, repo, pats, opts, rename=False):
  1105     # called with the repo lock held
  1131     # called with the repo lock held
  1106     #
  1132     #
  1107     # hgsep => pathname that uses "/" to separate directories
  1133     # hgsep => pathname that uses "/" to separate directories