##// END OF EJS Templates
subrepo: check phase of state in each subrepositories before committing...
FUJIWARA Katsunori -
r20176:4c96c50e default
parent child Browse files
Show More
@@ -945,6 +945,15 b' information about working with phases.'
945 945 Phase of newly-created commits.
946 946 Default: draft
947 947
948 ``checksubrepos``
949
950 Check phase of state in each subrepositories, allowed values are
951 "ignore", "follow" or "abort". For settings other than "ignore",
952 the phase of each subrepository commit is checked before committing
953 in the parent repository. If there is any greater phase than the parent
954 ("secret" vs "draft", for example), the commit is either aborted
955 with "abort" or the higher phase is used with "follow". Default: "follow".
956
948 957 ``profiling``
949 958 -------------
950 959
@@ -1382,7 +1382,7 b' class localrepository(object):'
1382 1382 parent2=xp2, pending=p)
1383 1383 self.changelog.finalize(trp)
1384 1384 # set the new commit is proper phase
1385 targetphase = phases.newcommitphase(self.ui)
1385 targetphase = subrepo.newcommitphase(self.ui, ctx)
1386 1386 if targetphase:
1387 1387 # retract boundary do not alter parent changeset.
1388 1388 # if a parent have higher the resulting phase will
@@ -10,6 +10,7 b' import xml.dom.minidom'
10 10 import stat, subprocess, tarfile
11 11 from i18n import _
12 12 import config, util, node, error, cmdutil, bookmarks, match as matchmod
13 import phases
13 14 import pathutil
14 15 hg = None
15 16 propertycache = util.propertycache
@@ -351,6 +352,37 b' def subrepo(ctx, path):'
351 352 raise util.Abort(_('unknown subrepo type %s') % state[2])
352 353 return types[state[2]](ctx, path, state[:2])
353 354
355 def newcommitphase(ui, ctx):
356 commitphase = phases.newcommitphase(ui)
357 substate = getattr(ctx, "substate", None)
358 if not substate:
359 return commitphase
360 check = ui.config('phases', 'checksubrepos', 'follow')
361 if check not in ('ignore', 'follow', 'abort'):
362 raise util.Abort(_('invalid phases.checksubrepos configuration: %s')
363 % (check))
364 if check == 'ignore':
365 return commitphase
366 maxphase = phases.public
367 maxsub = None
368 for s in sorted(substate):
369 sub = ctx.sub(s)
370 subphase = sub.phase(substate[s][1])
371 if maxphase < subphase:
372 maxphase = subphase
373 maxsub = s
374 if commitphase < maxphase:
375 if check == 'abort':
376 raise util.Abort(_("can't commit in %s phase"
377 " conflicting %s from subrepository %s") %
378 (phases.phasenames[commitphase],
379 phases.phasenames[maxphase], maxsub))
380 ui.warn(_("warning: changes are committed in"
381 " %s phase from subrepository %s\n") %
382 (phases.phasenames[maxphase], maxsub))
383 return maxphase
384 return commitphase
385
354 386 # subrepo classes need to implement the following abstract class:
355 387
356 388 class abstractsubrepo(object):
@@ -385,6 +417,11 b' class abstractsubrepo(object):'
385 417 """
386 418 raise NotImplementedError
387 419
420 def phase(self, state):
421 """returns phase of specified state in the subrepository.
422 """
423 return phases.public
424
388 425 def remove(self):
389 426 """remove the subrepo
390 427
@@ -652,6 +689,10 b' class hgsubrepo(abstractsubrepo):'
652 689 return node.hex(n)
653 690
654 691 @annotatesubrepoerror
692 def phase(self, state):
693 return self._repo[state].phase()
694
695 @annotatesubrepoerror
655 696 def remove(self):
656 697 # we can't fully delete the repository as it may contain
657 698 # local-only history
@@ -1232,4 +1232,69 b' Courtesy phases synchronisation to publi'
1232 1232 searching for changes
1233 1233 no changes found
1234 1234 [1]
1235 $ cd ..
1235 1236
1237 Test phase choice for newly created commit with "phases.subrepochecks"
1238 configuration
1239
1240 $ cd t
1241 $ hg update -q -r 12
1242
1243 $ cat >> s/ss/.hg/hgrc <<EOF
1244 > [phases]
1245 > new-commit = secret
1246 > EOF
1247 $ cat >> s/.hg/hgrc <<EOF
1248 > [phases]
1249 > new-commit = draft
1250 > EOF
1251 $ echo phasecheck1 >> s/ss/a
1252 $ hg -R s commit -S --config phases.checksubrepos=abort -m phasecheck1
1253 committing subrepository ss
1254 transaction abort!
1255 rollback completed
1256 abort: can't commit in draft phase conflicting secret from subrepository ss
1257 [255]
1258 $ echo phasecheck2 >> s/ss/a
1259 $ hg -R s commit -S --config phases.checksubrepos=ignore -m phasecheck2
1260 committing subrepository ss
1261 $ hg -R s/ss phase tip
1262 3: secret
1263 $ hg -R s phase tip
1264 6: draft
1265 $ echo phasecheck3 >> s/ss/a
1266 $ hg -R s commit -S -m phasecheck3
1267 committing subrepository ss
1268 warning: changes are committed in secret phase from subrepository ss
1269 $ hg -R s/ss phase tip
1270 4: secret
1271 $ hg -R s phase tip
1272 7: secret
1273
1274 $ cat >> t/.hg/hgrc <<EOF
1275 > [phases]
1276 > new-commit = draft
1277 > EOF
1278 $ cat >> .hg/hgrc <<EOF
1279 > [phases]
1280 > new-commit = public
1281 > EOF
1282 $ echo phasecheck4 >> s/ss/a
1283 $ echo phasecheck4 >> t/t
1284 $ hg commit -S -m phasecheck4
1285 committing subrepository s
1286 committing subrepository s/ss
1287 warning: changes are committed in secret phase from subrepository ss
1288 committing subrepository t
1289 warning: changes are committed in secret phase from subrepository s
1290 created new head
1291 $ hg -R s/ss phase tip
1292 5: secret
1293 $ hg -R s phase tip
1294 8: secret
1295 $ hg -R t phase tip
1296 6: draft
1297 $ hg phase tip
1298 15: secret
1299
1300 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now