# HG changeset patch # User Patrick Mezard # Date 1336774770 -7200 # Node ID 4ae3ba9e4d7a2672311ced09b52022269f4bab90 # Parent 6ca125af882f4ab29d643e39a138164d6bafceae mq: introduce mq.check setting When: [mq] check = True is set, qpush, qpop and qgoto behave as if -c/--check were passed. If incompatible options like -f/--force or --exact are set, this setting is ignored. This setting enables what many users expect mq default behaviour to be. diff -r 6ca125af882f -r 4ae3ba9e4d7a hgext/mq.py --- a/hgext/mq.py Sat May 12 00:19:30 2012 +0200 +++ b/hgext/mq.py Sat May 12 00:19:30 2012 +0200 @@ -46,6 +46,17 @@ You will by default be managing a patch queue named "patches". You can create other, independent patch queues with the :hg:`qqueue` command. + +If the working directory contains uncommitted files, qpush, qpop and +qgoto abort immediately. If -f/--force is used, the changes are +discarded. Setting: + + [mq] + check = True + +make them behave as if -c/--check were passed, and non-conflicting +local changes will be tolerated and preserved. If incompatible options +such as -f/--force or --exact are passed, this setting is ignored. ''' from mercurial.i18n import _ @@ -1986,6 +1997,14 @@ self.removeundo(repo) return imported +def fixcheckopts(ui, opts): + if (not ui.configbool('mq', 'check') or opts.get('force') + or opts.get('exact')): + return opts + opts = dict(opts) + opts['check'] = True + return opts + @command("qdelete|qremove|qrm", [('k', 'keep', None, _('keep patch file')), ('r', 'rev', [], @@ -2533,6 +2552,7 @@ '''push or pop patches until named patch is at top of stack Returns 0 on success.''' + opts = fixcheckopts(ui, opts) q = repo.mq patch = q.lookup(patch) nobackup = opts.get('no_backup') @@ -2687,6 +2707,7 @@ q = repo.mq mergeq = None + opts = fixcheckopts(ui, opts) if opts.get('merge'): if opts.get('name'): newpath = repo.join(opts.get('name')) @@ -2725,6 +2746,7 @@ Return 0 on success. """ + opts = fixcheckopts(ui, opts) localupdate = True if opts.get('name'): q = queue(ui, repo.path, repo.join(opts.get('name'))) diff -r 6ca125af882f -r 4ae3ba9e4d7a tests/test-mq-qpush-fail.t --- a/tests/test-mq-qpush-fail.t Sat May 12 00:19:30 2012 +0200 +++ b/tests/test-mq-qpush-fail.t Sat May 12 00:19:30 2012 +0200 @@ -387,3 +387,38 @@ now at: p2 $ hg st a M a + +test mq.check setting + + $ hg --config mq.check=1 qpush + applying p3 + now at: p3 + $ hg st a + M a + $ hg --config mq.check=1 qpop + popping p3 + now at: p2 + $ hg st a + M a + $ hg --config mq.check=1 qgoto p3 + applying p3 + now at: p3 + $ hg st a + M a + $ echo b >> b + $ hg --config mq.check=1 qpop --force + popping p3 + now at: p2 + $ hg st b + $ hg --config mq.check=1 qpush --exact + abort: local changes found, refresh first + [255] + $ hg revert -qa a + $ hg qpop + popping p2 + patch queue now empty + $ echo a >> a + $ hg --config mq.check=1 qpush --force + applying p2 + now at: p2 + $ hg st a diff -r 6ca125af882f -r 4ae3ba9e4d7a tests/test-mq.t --- a/tests/test-mq.t Sat May 12 00:19:30 2012 +0200 +++ b/tests/test-mq.t Sat May 12 00:19:30 2012 +0200 @@ -59,6 +59,15 @@ You will by default be managing a patch queue named "patches". You can create other, independent patch queues with the "hg qqueue" command. + If the working directory contains uncommitted files, qpush, qpop and qgoto + abort immediately. If -f/--force is used, the changes are discarded. Setting: + + [mq] check = True + + make them behave as if -c/--check were passed, and non-conflicting local + changes will be tolerated and preserved. If incompatible options such as + -f/--force or --exact are passed, this setting is ignored. + list of commands: qapplied print the patches already applied