hgext/mq.py
changeset 2724 9c41ae1908c7
parent 2723 04d9b31faeca
child 2725 9ffee4f07323
equal deleted inserted replaced
2723:04d9b31faeca 2724:9c41ae1908c7
    33 demandload(globals(), "os sys re struct traceback errno bz2")
    33 demandload(globals(), "os sys re struct traceback errno bz2")
    34 from mercurial.i18n import gettext as _
    34 from mercurial.i18n import gettext as _
    35 from mercurial import ui, hg, revlog, commands, util
    35 from mercurial import ui, hg, revlog, commands, util
    36 
    36 
    37 versionstr = "0.45"
    37 versionstr = "0.45"
    38 
       
    39 repomap = {}
       
    40 
    38 
    41 commands.norepo += " qclone qversion"
    39 commands.norepo += " qclone qversion"
    42 
    40 
    43 class queue:
    41 class queue:
    44     def __init__(self, ui, path, patchdir=None):
    42     def __init__(self, ui, path, patchdir=None):
  1139         if qrepo:
  1137         if qrepo:
  1140             qrepo.add(added)
  1138             qrepo.add(added)
  1141 
  1139 
  1142 def delete(ui, repo, patch, **opts):
  1140 def delete(ui, repo, patch, **opts):
  1143     """remove a patch from the series file"""
  1141     """remove a patch from the series file"""
  1144     q = repomap[repo]
  1142     q = repo.mq
  1145     q.delete(repo, patch)
  1143     q.delete(repo, patch)
  1146     q.save_dirty()
  1144     q.save_dirty()
  1147     return 0
  1145     return 0
  1148 
  1146 
  1149 def applied(ui, repo, patch=None, **opts):
  1147 def applied(ui, repo, patch=None, **opts):
  1150     """print the patches already applied"""
  1148     """print the patches already applied"""
  1151     repomap[repo].qapplied(repo, patch)
  1149     repo.mq.qapplied(repo, patch)
  1152     return 0
  1150     return 0
  1153 
  1151 
  1154 def unapplied(ui, repo, patch=None, **opts):
  1152 def unapplied(ui, repo, patch=None, **opts):
  1155     """print the patches not yet applied"""
  1153     """print the patches not yet applied"""
  1156     repomap[repo].unapplied(repo, patch)
  1154     repo.mq.unapplied(repo, patch)
  1157     return 0
  1155     return 0
  1158 
  1156 
  1159 def qimport(ui, repo, *filename, **opts):
  1157 def qimport(ui, repo, *filename, **opts):
  1160     """import a patch"""
  1158     """import a patch"""
  1161     q = repomap[repo]
  1159     q = repo.mq
  1162     q.qimport(repo, filename, patch=opts['name'],
  1160     q.qimport(repo, filename, patch=opts['name'],
  1163               existing=opts['existing'], force=opts['force'])
  1161               existing=opts['existing'], force=opts['force'])
  1164     q.save_dirty()
  1162     q.save_dirty()
  1165     return 0
  1163     return 0
  1166 
  1164 
  1167 def init(ui, repo, **opts):
  1165 def init(ui, repo, **opts):
  1168     """init a new queue repository"""
  1166     """init a new queue repository"""
  1169     q = repomap[repo]
  1167     q = repo.mq
  1170     r = q.init(repo, create=opts['create_repo'])
  1168     r = q.init(repo, create=opts['create_repo'])
  1171     q.save_dirty()
  1169     q.save_dirty()
  1172     if r:
  1170     if r:
  1173         fp = r.wopener('.hgignore', 'w')
  1171         fp = r.wopener('.hgignore', 'w')
  1174         print >> fp, 'syntax: glob'
  1172         print >> fp, 'syntax: glob'
  1224             ui.note(_('updating destination repo\n'))
  1222             ui.note(_('updating destination repo\n'))
  1225             dr.update(dr.changelog.tip())
  1223             dr.update(dr.changelog.tip())
  1226 
  1224 
  1227 def commit(ui, repo, *pats, **opts):
  1225 def commit(ui, repo, *pats, **opts):
  1228     """commit changes in the queue repository"""
  1226     """commit changes in the queue repository"""
  1229     q = repomap[repo]
  1227     q = repo.mq
  1230     r = q.qrepo()
  1228     r = q.qrepo()
  1231     if not r: raise util.Abort('no queue repository')
  1229     if not r: raise util.Abort('no queue repository')
  1232     commands.commit(r.ui, r, *pats, **opts)
  1230     commands.commit(r.ui, r, *pats, **opts)
  1233 
  1231 
  1234 def series(ui, repo, **opts):
  1232 def series(ui, repo, **opts):
  1235     """print the entire series file"""
  1233     """print the entire series file"""
  1236     repomap[repo].qseries(repo, missing=opts['missing'])
  1234     repo.mq.qseries(repo, missing=opts['missing'])
  1237     return 0
  1235     return 0
  1238 
  1236 
  1239 def top(ui, repo, **opts):
  1237 def top(ui, repo, **opts):
  1240     """print the name of the current patch"""
  1238     """print the name of the current patch"""
  1241     repomap[repo].top(repo)
  1239     repo.mq.top(repo)
  1242     return 0
  1240     return 0
  1243 
  1241 
  1244 def next(ui, repo, **opts):
  1242 def next(ui, repo, **opts):
  1245     """print the name of the next patch"""
  1243     """print the name of the next patch"""
  1246     repomap[repo].next(repo)
  1244     repo.mq.next(repo)
  1247     return 0
  1245     return 0
  1248 
  1246 
  1249 def prev(ui, repo, **opts):
  1247 def prev(ui, repo, **opts):
  1250     """print the name of the previous patch"""
  1248     """print the name of the previous patch"""
  1251     repomap[repo].prev(repo)
  1249     repo.mq.prev(repo)
  1252     return 0
  1250     return 0
  1253 
  1251 
  1254 def new(ui, repo, patch, **opts):
  1252 def new(ui, repo, patch, **opts):
  1255     """create a new patch"""
  1253     """create a new patch"""
  1256     q = repomap[repo]
  1254     q = repo.mq
  1257     message=commands.logmessage(**opts)
  1255     message=commands.logmessage(**opts)
  1258     q.new(repo, patch, msg=message, force=opts['force'])
  1256     q.new(repo, patch, msg=message, force=opts['force'])
  1259     q.save_dirty()
  1257     q.save_dirty()
  1260     return 0
  1258     return 0
  1261 
  1259 
  1262 def refresh(ui, repo, **opts):
  1260 def refresh(ui, repo, **opts):
  1263     """update the current patch"""
  1261     """update the current patch"""
  1264     q = repomap[repo]
  1262     q = repo.mq
  1265     message=commands.logmessage(**opts)
  1263     message=commands.logmessage(**opts)
  1266     q.refresh(repo, msg=message, short=opts['short'])
  1264     q.refresh(repo, msg=message, short=opts['short'])
  1267     q.save_dirty()
  1265     q.save_dirty()
  1268     return 0
  1266     return 0
  1269 
  1267 
  1270 def diff(ui, repo, *files, **opts):
  1268 def diff(ui, repo, *files, **opts):
  1271     """diff of the current patch"""
  1269     """diff of the current patch"""
  1272     # deep in the dirstate code, the walkhelper method wants a list, not a tuple
  1270     # deep in the dirstate code, the walkhelper method wants a list, not a tuple
  1273     repomap[repo].diff(repo, list(files))
  1271     repo.mq.diff(repo, list(files))
  1274     return 0
  1272     return 0
  1275 
  1273 
  1276 def lastsavename(path):
  1274 def lastsavename(path):
  1277     (dir, base) = os.path.split(path)
  1275     (dir, base) = os.path.split(path)
  1278     names = os.listdir(dir)
  1276     names = os.listdir(dir)
  1297     newpath = path + ".%d" % (index + 1)
  1295     newpath = path + ".%d" % (index + 1)
  1298     return newpath
  1296     return newpath
  1299 
  1297 
  1300 def push(ui, repo, patch=None, **opts):
  1298 def push(ui, repo, patch=None, **opts):
  1301     """push the next patch onto the stack"""
  1299     """push the next patch onto the stack"""
  1302     q = repomap[repo]
  1300     q = repo.mq
  1303     mergeq = None
  1301     mergeq = None
  1304 
  1302 
  1305     if opts['all']:
  1303     if opts['all']:
  1306         patch = q.series[-1]
  1304         patch = q.series[-1]
  1307     if opts['merge']:
  1305     if opts['merge']:
  1325     if opts['name']:
  1323     if opts['name']:
  1326         q = queue(ui, repo.join(""), repo.join(opts['name']))
  1324         q = queue(ui, repo.join(""), repo.join(opts['name']))
  1327         ui.warn('using patch queue: %s\n' % q.path)
  1325         ui.warn('using patch queue: %s\n' % q.path)
  1328         localupdate = False
  1326         localupdate = False
  1329     else:
  1327     else:
  1330         q = repomap[repo]
  1328         q = repo.mq
  1331     q.pop(repo, patch, force=opts['force'], update=localupdate, all=opts['all'])
  1329     q.pop(repo, patch, force=opts['force'], update=localupdate, all=opts['all'])
  1332     q.save_dirty()
  1330     q.save_dirty()
  1333     return 0
  1331     return 0
  1334 
  1332 
  1335 def restore(ui, repo, rev, **opts):
  1333 def restore(ui, repo, rev, **opts):
  1336     """restore the queue state saved by a rev"""
  1334     """restore the queue state saved by a rev"""
  1337     rev = repo.lookup(rev)
  1335     rev = repo.lookup(rev)
  1338     q = repomap[repo]
  1336     q = repo.mq
  1339     q.restore(repo, rev, delete=opts['delete'],
  1337     q.restore(repo, rev, delete=opts['delete'],
  1340               qupdate=opts['update'])
  1338               qupdate=opts['update'])
  1341     q.save_dirty()
  1339     q.save_dirty()
  1342     return 0
  1340     return 0
  1343 
  1341 
  1344 def save(ui, repo, **opts):
  1342 def save(ui, repo, **opts):
  1345     """save current queue state"""
  1343     """save current queue state"""
  1346     q = repomap[repo]
  1344     q = repo.mq
  1347     message=commands.logmessage(**opts)
  1345     message=commands.logmessage(**opts)
  1348     ret = q.save(repo, msg=message)
  1346     ret = q.save(repo, msg=message)
  1349     if ret:
  1347     if ret:
  1350         return ret
  1348         return ret
  1351     q.save_dirty()
  1349     q.save_dirty()
  1377     backup = 'all'
  1375     backup = 'all'
  1378     if opts['backup']:
  1376     if opts['backup']:
  1379         backup = 'strip'
  1377         backup = 'strip'
  1380     elif opts['nobackup']:
  1378     elif opts['nobackup']:
  1381         backup = 'none'
  1379         backup = 'none'
  1382     repomap[repo].strip(repo, rev, backup=backup)
  1380     repo.mq.strip(repo, rev, backup=backup)
  1383     return 0
  1381     return 0
  1384 
  1382 
  1385 def version(ui, q=None):
  1383 def version(ui, q=None):
  1386     """print the version number"""
  1384     """print the version number"""
  1387     ui.write("mq version %s\n" % versionstr)
  1385     ui.write("mq version %s\n" % versionstr)
  1393             if self.tagscache:
  1391             if self.tagscache:
  1394                 return self.tagscache
  1392                 return self.tagscache
  1395 
  1393 
  1396             tagscache = super(self.__class__, self).tags()
  1394             tagscache = super(self.__class__, self).tags()
  1397 
  1395 
  1398             q = repomap[repo]
  1396             q = self.mq
  1399             if not q.applied:
  1397             if not q.applied:
  1400                 return tagscache
  1398                 return tagscache
  1401 
  1399 
  1402             mqtags = [patch.split(':') for patch in q.applied]
  1400             mqtags = [patch.split(':') for patch in q.applied]
  1403             mqtags.append((mqtags[-1][0], 'qtip'))
  1401             mqtags.append((mqtags[-1][0], 'qtip'))
  1409                     tagscache[patch[1]] = revlog.bin(patch[0])
  1407                     tagscache[patch[1]] = revlog.bin(patch[0])
  1410 
  1408 
  1411             return tagscache
  1409             return tagscache
  1412 
  1410 
  1413     repo.__class__ = MqRepo
  1411     repo.__class__ = MqRepo
  1414     repomap[repo] = queue(ui, repo.join(""))
  1412     repo.mq = queue(ui, repo.join(""))
  1415 
  1413 
  1416 cmdtable = {
  1414 cmdtable = {
  1417     "qapplied": (applied, [], 'hg qapplied [PATCH]'),
  1415     "qapplied": (applied, [], 'hg qapplied [PATCH]'),
  1418     "qclone": (clone,
  1416     "qclone": (clone,
  1419                [('', 'pull', None, _('use pull protocol to copy metadata')),
  1417                [('', 'pull', None, _('use pull protocol to copy metadata')),