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 } |