hgext/mq.py
changeset 3176 0e6b58c7beea
parent 3141 e21337e06952
child 3177 87b7ae306d54
equal deleted inserted replaced
3175:f6c36cc92d02 3176:0e6b58c7beea
  1069             if pushable:
  1069             if pushable:
  1070                 unapplied.append((i, self.series[i]))
  1070                 unapplied.append((i, self.series[i]))
  1071             self.explain_pushable(i)
  1071             self.explain_pushable(i)
  1072         return unapplied
  1072         return unapplied
  1073 
  1073 
  1074     def qseries(self, repo, missing=None, summary=False):
  1074     def qseries(self, repo, missing=None, start=0, length=0, status=None,
  1075         start = self.series_end(all_patches=True)
  1075                 summary=False):
       
  1076         def displayname(patchname):
       
  1077             if summary:
       
  1078                 msg = self.readheaders(patchname)[0]
       
  1079                 msg = msg and ': ' + msg[0] or ': '
       
  1080             else:
       
  1081                 msg = ''
       
  1082             return '%s%s' % (patchname, msg)
       
  1083 
       
  1084         def pname(i):
       
  1085             if status == 'A':
       
  1086                 return self.applied[i].name
       
  1087             else:
       
  1088                 return self.series[i]
       
  1089 
       
  1090         unapplied = self.series_end(all_patches=True)
       
  1091         if not length:
       
  1092             length = len(self.series) - start
  1076         if not missing:
  1093         if not missing:
  1077             for i in range(len(self.series)):
  1094             for i in range(start, start+length):
  1078                 patch = self.series[i]
  1095                 pfx = ''
       
  1096                 patch = pname(i)
  1079                 if self.ui.verbose:
  1097                 if self.ui.verbose:
  1080                     if i < start:
  1098                     if i < unapplied:
  1081                         status = 'A'
  1099                         status = 'A'
  1082                     elif self.pushable(i)[0]:
  1100                     elif self.pushable(i)[0]:
  1083                         status = 'U'
  1101                         status = 'U'
  1084                     else:
  1102                     else:
  1085                         status = 'G'
  1103                         status = 'G'
  1086                     self.ui.write('%d %s ' % (i, status))
  1104                     pfx = '%d %s ' % (i, status)
  1087                 if summary:
  1105                 self.ui.write('%s%s\n' % (pfx, displayname(patch)))
  1088                     msg = self.readheaders(patch)[0]
       
  1089                     msg = msg and ': ' + msg[0] or ': '
       
  1090                 else:
       
  1091                     msg = ''
       
  1092                 self.ui.write('%s%s\n' % (patch, msg))
       
  1093         else:
  1106         else:
  1094             msng_list = []
  1107             msng_list = []
  1095             for root, dirs, files in os.walk(self.path):
  1108             for root, dirs, files in os.walk(self.path):
  1096                 d = root[len(self.path) + 1:]
  1109                 d = root[len(self.path) + 1:]
  1097                 for f in files:
  1110                 for f in files:
  1100                         fl not in (self.status_path, self.series_path)
  1113                         fl not in (self.status_path, self.series_path)
  1101                         and not fl.startswith('.')):
  1114                         and not fl.startswith('.')):
  1102                         msng_list.append(fl)
  1115                         msng_list.append(fl)
  1103             msng_list.sort()
  1116             msng_list.sort()
  1104             for x in msng_list:
  1117             for x in msng_list:
  1105                 if self.ui.verbose:
  1118                 pfx = self.ui.verbose and ('D ') or ''
  1106                     self.ui.write("D ")
  1119                 self.ui.write("%s%s\n" % (pfx, displayname(x)))
  1107                 self.ui.write("%s\n" % x)
       
  1108 
  1120 
  1109     def issaveline(self, l):
  1121     def issaveline(self, l):
  1110         if l.name == '.hg.patches.save.line':
  1122         if l.name == '.hg.patches.save.line':
  1111             return True
  1123             return True
  1112 
  1124 
  1225             except ValueError:
  1237             except ValueError:
  1226                 return 0
  1238                 return 0
  1227             return next(end + 1)
  1239             return next(end + 1)
  1228         return next(end)
  1240         return next(end)
  1229 
  1241 
  1230     def qapplied(self, repo, patch=None):
       
  1231         if patch and patch not in self.series:
       
  1232             raise util.Abort(_("patch %s is not in series file") % patch)
       
  1233         if not patch:
       
  1234             end = len(self.applied)
       
  1235         else:
       
  1236             end = self.series.index(patch) + 1
       
  1237         for x in xrange(end):
       
  1238             p = self.appliedname(x)
       
  1239             self.ui.write("%s\n" % p)
       
  1240 
       
  1241     def appliedname(self, index):
  1242     def appliedname(self, index):
  1242         pname = self.applied[index].name
  1243         pname = self.applied[index].name
  1243         if not self.ui.verbose:
  1244         if not self.ui.verbose:
  1244             p = pname
  1245             p = pname
  1245         else:
  1246         else:
  1246             p = str(self.series.index(pname)) + " " + pname
  1247             p = str(self.series.index(pname)) + " " + pname
  1247         return p
  1248         return p
  1248 
       
  1249     def top(self, repo):
       
  1250         if len(self.applied):
       
  1251             p = self.appliedname(-1)
       
  1252             self.ui.write(p + '\n')
       
  1253         else:
       
  1254             self.ui.write("No patches applied\n")
       
  1255             return 1
       
  1256 
       
  1257     def next(self, repo):
       
  1258         end = self.series_end()
       
  1259         if end == len(self.series):
       
  1260             self.ui.write("All patches applied\n")
       
  1261             return 1
       
  1262         else:
       
  1263             p = self.series[end]
       
  1264             if self.ui.verbose:
       
  1265                 self.ui.write("%d " % self.series.index(p))
       
  1266             self.ui.write(p + '\n')
       
  1267 
       
  1268     def prev(self, repo):
       
  1269         if len(self.applied) > 1:
       
  1270             p = self.appliedname(-2)
       
  1271             self.ui.write(p + '\n')
       
  1272         elif len(self.applied) == 1:
       
  1273             self.ui.write("Only one patch applied\n")
       
  1274             return 1
       
  1275         else:
       
  1276             self.ui.write("No patches applied\n")
       
  1277             return 1
       
  1278 
  1249 
  1279     def qimport(self, repo, files, patchname=None, rev=None, existing=None,
  1250     def qimport(self, repo, files, patchname=None, rev=None, existing=None,
  1280                 force=None):
  1251                 force=None):
  1281         def checkseries(patchname):
  1252         def checkseries(patchname):
  1282             if patchname in self.series:
  1253             if patchname in self.series:
  1394     q.save_dirty()
  1365     q.save_dirty()
  1395     return 0
  1366     return 0
  1396 
  1367 
  1397 def applied(ui, repo, patch=None, **opts):
  1368 def applied(ui, repo, patch=None, **opts):
  1398     """print the patches already applied"""
  1369     """print the patches already applied"""
  1399     repo.mq.qapplied(repo, patch)
  1370     q = repo.mq
  1400     return 0
  1371     if patch:
       
  1372         if patch not in q.series:
       
  1373             raise util.Abort(_("patch %s is not in series file") % patch)
       
  1374         end = q.series.index(patch) + 1
       
  1375     else:
       
  1376         end = len(q.applied)
       
  1377     return q.qseries(repo, length=end, status='A', summary=opts.get('summary'))
  1401 
  1378 
  1402 def unapplied(ui, repo, patch=None, **opts):
  1379 def unapplied(ui, repo, patch=None, **opts):
  1403     """print the patches not yet applied"""
  1380     """print the patches not yet applied"""
  1404     for i, p in repo.mq.unapplied(repo, patch):
  1381     q = repo.mq
  1405         if ui.verbose:
  1382     if patch:
  1406             ui.write("%d " % i)
  1383         if patch not in q.series:
  1407         ui.write("%s\n" % p)
  1384             raise util.Abort(_("patch %s is not in series file") % patch)
       
  1385         start = q.series.index(patch) + 1
       
  1386     else:
       
  1387         start = q.series_end()
       
  1388     q.qseries(repo, start=start, summary=opts.get('summary'))
  1408 
  1389 
  1409 def qimport(ui, repo, *filename, **opts):
  1390 def qimport(ui, repo, *filename, **opts):
  1410     """import a patch
  1391     """import a patch
  1411 
  1392 
  1412     The patch will have the same name as its source file unless you
  1393     The patch will have the same name as its source file unless you
  1501     repo.mq.qseries(repo, missing=opts['missing'], summary=opts['summary'])
  1482     repo.mq.qseries(repo, missing=opts['missing'], summary=opts['summary'])
  1502     return 0
  1483     return 0
  1503 
  1484 
  1504 def top(ui, repo, **opts):
  1485 def top(ui, repo, **opts):
  1505     """print the name of the current patch"""
  1486     """print the name of the current patch"""
  1506     return repo.mq.top(repo)
  1487     q = repo.mq
       
  1488     t = len(q.applied)
       
  1489     if t:
       
  1490         return q.qseries(repo, start=t-1, length=1, status='A',
       
  1491                          summary=opts.get('summary'))
       
  1492     else:
       
  1493         ui.write("No patches applied\n")
       
  1494         return 1
  1507 
  1495 
  1508 def next(ui, repo, **opts):
  1496 def next(ui, repo, **opts):
  1509     """print the name of the next patch"""
  1497     """print the name of the next patch"""
  1510     return repo.mq.next(repo)
  1498     q = repo.mq
       
  1499     end = q.series_end()
       
  1500     if end == len(q.series):
       
  1501         ui.write("All patches applied\n")
       
  1502         return 1
       
  1503     return q.qseries(repo, start=end, length=1, summary=opts.get('summary'))
  1511 
  1504 
  1512 def prev(ui, repo, **opts):
  1505 def prev(ui, repo, **opts):
  1513     """print the name of the previous patch"""
  1506     """print the name of the previous patch"""
  1514     return repo.mq.prev(repo)
  1507     q = repo.mq
       
  1508     l = len(q.applied)
       
  1509     if l == 1:
       
  1510         ui.write("Only one patch applied\n")
       
  1511         return 1
       
  1512     if not l:
       
  1513         ui.write("No patches applied\n")
       
  1514         return 1
       
  1515     return q.qseries(repo, start=l-2, length=1, status='A',
       
  1516                      summary=opts.get('summary'))
  1515 
  1517 
  1516 def new(ui, repo, patch, **opts):
  1518 def new(ui, repo, patch, **opts):
  1517     """create a new patch
  1519     """create a new patch
  1518 
  1520 
  1519     qnew creates a new patch on top of the currently-applied patch
  1521     qnew creates a new patch on top of the currently-applied patch
  1986 
  1988 
  1987     if repo.local():
  1989     if repo.local():
  1988         repo.__class__ = mqrepo
  1990         repo.__class__ = mqrepo
  1989         repo.mq = queue(ui, repo.join(""))
  1991         repo.mq = queue(ui, repo.join(""))
  1990 
  1992 
       
  1993 seriesopts = [('s', 'summary', None, _('print first line of patch header'))]
       
  1994 
  1991 cmdtable = {
  1995 cmdtable = {
  1992     "qapplied": (applied, [], 'hg qapplied [PATCH]'),
  1996     "qapplied": (applied, [] + seriesopts, 'hg qapplied [-s] [PATCH]'),
  1993     "qclone": (clone,
  1997     "qclone": (clone,
  1994                [('', 'pull', None, _('use pull protocol to copy metadata')),
  1998                [('', 'pull', None, _('use pull protocol to copy metadata')),
  1995                 ('U', 'noupdate', None, _('do not update the new working directories')),
  1999                 ('U', 'noupdate', None, _('do not update the new working directories')),
  1996                 ('', 'uncompressed', None,
  2000                 ('', 'uncompressed', None,
  1997                  _('use uncompressed transfer (fast over LAN)')),
  2001                  _('use uncompressed transfer (fast over LAN)')),
  2041          [('e', 'edit', None, _('edit commit message')),
  2045          [('e', 'edit', None, _('edit commit message')),
  2042           ('m', 'message', '', _('use <text> as commit message')),
  2046           ('m', 'message', '', _('use <text> as commit message')),
  2043           ('l', 'logfile', '', _('read the commit message from <file>')),
  2047           ('l', 'logfile', '', _('read the commit message from <file>')),
  2044           ('f', 'force', None, _('import uncommitted changes into patch'))],
  2048           ('f', 'force', None, _('import uncommitted changes into patch'))],
  2045          'hg qnew [-e] [-m TEXT] [-l FILE] [-f] PATCH'),
  2049          'hg qnew [-e] [-m TEXT] [-l FILE] [-f] PATCH'),
  2046     "qnext": (next, [], 'hg qnext'),
  2050     "qnext": (next, [] + seriesopts, 'hg qnext [-s]'),
  2047     "qprev": (prev, [], 'hg qprev'),
  2051     "qprev": (prev, [] + seriesopts, 'hg qprev [-s]'),
  2048     "^qpop":
  2052     "^qpop":
  2049         (pop,
  2053         (pop,
  2050          [('a', 'all', None, 'pop all patches'),
  2054          [('a', 'all', None, 'pop all patches'),
  2051           ('n', 'name', '', 'queue name to pop'),
  2055           ('n', 'name', '', 'queue name to pop'),
  2052           ('f', 'force', None, 'forget any local changes')],
  2056           ('f', 'force', None, 'forget any local changes')],
  2092                   _('pop to before first guarded applied patch')),
  2096                   _('pop to before first guarded applied patch')),
  2093                  ('', 'reapply', None, _('pop, then reapply patches'))],
  2097                  ('', 'reapply', None, _('pop, then reapply patches'))],
  2094                 'hg qselect [OPTION...] [GUARD...]'),
  2098                 'hg qselect [OPTION...] [GUARD...]'),
  2095     "qseries":
  2099     "qseries":
  2096         (series,
  2100         (series,
  2097          [('m', 'missing', None, 'print patches not in series'),
  2101          [('m', 'missing', None, 'print patches not in series')] + seriesopts,
  2098           ('s', 'summary', None, _('print first line of patch header'))],
       
  2099          'hg qseries [-ms]'),
  2102          'hg qseries [-ms]'),
  2100     "^strip":
  2103     "^strip":
  2101         (strip,
  2104         (strip,
  2102          [('f', 'force', None, 'force multi-head removal'),
  2105          [('f', 'force', None, 'force multi-head removal'),
  2103           ('b', 'backup', None, 'bundle unrelated changesets'),
  2106           ('b', 'backup', None, 'bundle unrelated changesets'),
  2104           ('n', 'nobackup', None, 'no backups')],
  2107           ('n', 'nobackup', None, 'no backups')],
  2105          'hg strip [-f] [-b] [-n] REV'),
  2108          'hg strip [-f] [-b] [-n] REV'),
  2106     "qtop": (top, [], 'hg qtop'),
  2109     "qtop": (top, [] + seriesopts, 'hg qtop [-s]'),
  2107     "qunapplied": (unapplied, [], 'hg qunapplied [PATCH]'),
  2110     "qunapplied": (unapplied, [] + seriesopts, 'hg qunapplied [-s] [PATCH]'),
  2108 }
  2111 }