comparison hgext/mq.py @ 3141:e21337e06952

mq: Add --rev argument to qimport, to adopt existing changesets.
author Brendan Cully <brendan@kublai.com>
date Tue, 19 Sep 2006 10:22:30 -0700
parents 15fde1970003
children 0e6b58c7beea
comparison
equal deleted inserted replaced
3140:1eb50c9d2649 3141:e21337e06952
1274 return 1 1274 return 1
1275 else: 1275 else:
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:
1288 patchname = filename 1356 patchname = filename
1289 if not os.path.isfile(self.join(patchname)): 1357 if not os.path.isfile(self.join(patchname)):
1293 text = file(filename).read() 1361 text = file(filename).read()
1294 except IOError: 1362 except IOError:
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()
1309 self.ui.warn("adding %s to series file\n" % patchname) 1373 self.ui.warn("adding %s to series file\n" % patchname)
1310 i += 1 1374 i += 1
1341 if ui.verbose: 1405 if ui.verbose:
1342 ui.write("%d " % i) 1406 ui.write("%d " % i)
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
1353 def init(ui, repo, **opts): 1429 def init(ui, repo, **opts):
1354 """init a new queue repository 1430 """init a new queue repository
1951 _('hg qheader [PATCH]')), 2027 _('hg qheader [PATCH]')),
1952 "^qimport": 2028 "^qimport":
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')],
1961 'hg qinit [-c]'), 2038 'hg qinit [-c]'),
1962 "qnew": 2039 "qnew":