##// END OF EJS Templates
mq: Add --rev argument to qimport, to adopt existing changesets.
Brendan Cully -
r3141:e21337e0 default
parent child Browse files
Show More
@@ -1276,12 +1276,80 b' class queue:'
1276 self.ui.write("No patches applied\n")
1276 self.ui.write("No patches applied\n")
1277 return 1
1277 return 1
1278
1278
1279 def qimport(self, repo, files, patchname=None, existing=None, force=None):
1279 def qimport(self, repo, files, patchname=None, rev=None, existing=None,
1280 if len(files) > 1 and patchname:
1280 force=None):
1281 def checkseries(patchname):
1282 if patchname in self.series:
1283 raise util.Abort(_('patch %s is already in the series file')
1284 % patchname)
1285 def checkfile(patchname):
1286 if not force and os.path.exists(self.join(patchname)):
1287 raise util.Abort(_('patch "%s" already exists')
1288 % patchname)
1289
1290 if rev:
1291 if files:
1292 raise util.Abort(_('option "-r" not valid when importing '
1293 'files'))
1294 rev = [int(r) for r in cmdutil.revrange(self.ui, repo, rev)]
1295 rev.sort(lambda x, y: cmp(y, x))
1296 if (len(files) > 1 or len(rev) > 1) and patchname:
1281 raise util.Abort(_('option "-n" not valid when importing multiple '
1297 raise util.Abort(_('option "-n" not valid when importing multiple '
1282 'files'))
1298 'patches'))
1283 i = 0
1299 i = 0
1284 added = []
1300 added = []
1301 if rev:
1302 # If mq patches are applied, we can only import revisions
1303 # that form a linear path to qbase.
1304 # Otherwise, they should form a linear path to a head.
1305 heads = repo.changelog.heads(repo.changelog.node(rev[-1]))
1306 if len(heads) > 1:
1307 raise util.Abort(_('revision %d is the root of more than one '
1308 'branch') % rev[-1])
1309 if self.applied:
1310 base = revlog.hex(repo.changelog.node(rev[0]))
1311 if base in [n.rev for n in self.applied]:
1312 raise util.Abort(_('revision %d is already managed')
1313 % rev[0])
1314 if heads != [revlog.bin(self.applied[-1].rev)]:
1315 raise util.Abort(_('revision %d is not the parent of '
1316 'the queue') % rev[0])
1317 base = repo.changelog.rev(revlog.bin(self.applied[0].rev))
1318 lastparent = repo.changelog.parentrevs(base)[0]
1319 else:
1320 if heads != [repo.changelog.node(rev[0])]:
1321 raise util.Abort(_('revision %d has unmanaged children')
1322 % rev[0])
1323 lastparent = None
1324
1325 for r in rev:
1326 p1, p2 = repo.changelog.parentrevs(r)
1327 n = repo.changelog.node(r)
1328 if p2 != -1:
1329 raise util.Abort(_('cannot import merge revision %d') % r)
1330 if lastparent and lastparent != r:
1331 raise util.Abort(_('revision %d is not the parent of %d')
1332 % (r, lastparent))
1333 lastparent = p1
1334
1335 if not patchname:
1336 patchname = '%d.diff' % r
1337 checkseries(patchname)
1338 checkfile(patchname)
1339 self.full_series.insert(0, patchname)
1340
1341 patchf = self.opener(patchname, "w")
1342 patch.export(repo, [n], fp=patchf, opts=self.diffopts())
1343 patchf.close()
1344
1345 se = statusentry(revlog.hex(n), patchname)
1346 self.applied.insert(0, se)
1347
1348 added.append(patchname)
1349 patchname = None
1350 self.parse_series()
1351 self.applied_dirty = 1
1352
1285 for filename in files:
1353 for filename in files:
1286 if existing:
1354 if existing:
1287 if not patchname:
1355 if not patchname:
@@ -1295,14 +1363,10 b' class queue:'
1295 raise util.Abort(_("unable to read %s") % patchname)
1363 raise util.Abort(_("unable to read %s") % patchname)
1296 if not patchname:
1364 if not patchname:
1297 patchname = os.path.basename(filename)
1365 patchname = os.path.basename(filename)
1298 if not force and os.path.exists(self.join(patchname)):
1366 checkfile(patchname)
1299 raise util.Abort(_('patch "%s" already exists')
1300 % patchname)
1301 patchf = self.opener(patchname, "w")
1367 patchf = self.opener(patchname, "w")
1302 patchf.write(text)
1368 patchf.write(text)
1303 if patchname in self.series:
1369 checkseries(patchname)
1304 raise util.Abort(_('patch %s is already in the series file')
1305 % patchname)
1306 index = self.full_series_end() + i
1370 index = self.full_series_end() + i
1307 self.full_series[index:index] = [patchname]
1371 self.full_series[index:index] = [patchname]
1308 self.parse_series()
1372 self.parse_series()
@@ -1343,10 +1407,22 b' def unapplied(ui, repo, patch=None, **op'
1343 ui.write("%s\n" % p)
1407 ui.write("%s\n" % p)
1344
1408
1345 def qimport(ui, repo, *filename, **opts):
1409 def qimport(ui, repo, *filename, **opts):
1346 """import a patch"""
1410 """import a patch
1411
1412 The patch will have the same name as its source file unless you
1413 give it a new one with --name.
1414
1415 You can register an existing patch inside the patch directory
1416 with the --existing flag.
1417
1418 With --force, an existing patch of the same name will be overwritten.
1419
1420 An existing changeset may be placed under mq control with --rev
1421 (e.g. qimport --rev tip -n patch will place tip under mq control).
1422 """
1347 q = repo.mq
1423 q = repo.mq
1348 q.qimport(repo, filename, patchname=opts['name'],
1424 q.qimport(repo, filename, patchname=opts['name'],
1349 existing=opts['existing'], force=opts['force'])
1425 existing=opts['existing'], force=opts['force'], rev=opts['rev'])
1350 q.save_dirty()
1426 q.save_dirty()
1351 return 0
1427 return 0
1352
1428
@@ -1953,8 +2029,9 b' cmdtable = {'
1953 (qimport,
2029 (qimport,
1954 [('e', 'existing', None, 'import file in patch dir'),
2030 [('e', 'existing', None, 'import file in patch dir'),
1955 ('n', 'name', '', 'patch file name'),
2031 ('n', 'name', '', 'patch file name'),
1956 ('f', 'force', None, 'overwrite existing files')],
2032 ('f', 'force', None, 'overwrite existing files'),
1957 'hg qimport [-e] [-n NAME] [-f] FILE...'),
2033 ('r', 'rev', [], 'place existing revisions under mq control')],
2034 'hg qimport [-e] [-n NAME] [-f] [-r REV]... FILE...'),
1958 "^qinit":
2035 "^qinit":
1959 (init,
2036 (init,
1960 [('c', 'create-repo', None, 'create queue repository')],
2037 [('c', 'create-repo', None, 'create queue repository')],
General Comments 0
You need to be logged in to leave comments. Login now