# HG changeset patch # User Patrick Mezard # Date 1285192270 -7200 # Node ID ab237534d800ad247e8655e94672080ebbcbe778 # Parent 4ae3e5dffa60ae2843871534cda9c79ed1f340eb mq: always require --force when pushing patches (issue2363) --force was not necessary when passing --rev since 55578a8d7e84, but this behaviour is usually harmful when branch names are passed instead of explicit revisions. diff -r 4ae3e5dffa60 -r ab237534d800 hgext/mq.py --- a/hgext/mq.py Tue Sep 21 23:14:58 2010 +0200 +++ b/hgext/mq.py Wed Sep 22 23:51:10 2010 +0200 @@ -2713,8 +2713,16 @@ editor, extra) def push(self, remote, force=False, revs=None, newbranch=False): - if self.mq.applied and not force and not revs: - raise util.Abort(_('source has mq patches applied')) + if self.mq.applied and not force: + haspatches = True + if revs: + # Assume applied patches have no non-patch descendants + # and are not on remote already. If they appear in the + # set of resolved 'revs', bail out. + applied = set(e.node for e in self.mq.applied) + haspatches = bool([n for n in revs if n in applied]) + if haspatches: + raise util.Abort(_('source has mq patches applied')) return super(mqrepo, self).push(remote, force, revs, newbranch) def _findtags(self): diff -r 4ae3e5dffa60 -r ab237534d800 tests/test-mq-safety --- a/tests/test-mq-safety Tue Sep 21 23:14:58 2010 +0200 +++ b/tests/test-mq-safety Wed Sep 22 23:51:10 2010 +0200 @@ -62,3 +62,29 @@ hg up default hg log hg qpush +cd .. + +echo '% testing applied patches, push and --force' +hg init forcepush +cd forcepush +echo a > a +hg ci -Am adda +echo a >> a +hg ci -m changea +hg up 0 +hg branch branch +echo b > b +hg ci -Am addb +hg up 0 +hg --cwd .. clone -r 0 forcepush forcepush2 +echo a >> a +hg qnew patch +echo '% pushing applied patch with --rev without --force' +hg push -r default ../forcepush2 +echo '% pushing applied patch with branchhash, without --force' +hg push ../forcepush2#default +echo '% pushing revs excluding applied patch' +hg push --new-branch -r branch -r 2 ../forcepush2 +echo '% pushing applied patch with --force' +hg push --force -r default ../forcepush2 +cd .. diff -r 4ae3e5dffa60 -r ab237534d800 tests/test-mq-safety.out --- a/tests/test-mq-safety.out Tue Sep 21 23:14:58 2010 +0200 +++ b/tests/test-mq-safety.out Wed Sep 22 23:51:10 2010 +0200 @@ -45,3 +45,36 @@ applying qp now at: qp +% testing applied patches, push and --force +adding a +1 files updated, 0 files merged, 0 files removed, 0 files unresolved +marked working directory as branch branch +adding b +0 files updated, 0 files merged, 1 files removed, 0 files unresolved +requesting all changes +adding changesets +adding manifests +adding file changes +added 1 changesets with 1 changes to 1 files +updating to branch default +1 files updated, 0 files merged, 0 files removed, 0 files unresolved +% pushing applied patch with --rev without --force +pushing to ../forcepush2 +abort: source has mq patches applied +% pushing applied patch with branchhash, without --force +pushing to ../forcepush2 +abort: source has mq patches applied +% pushing revs excluding applied patch +pushing to ../forcepush2 +searching for changes +adding changesets +adding manifests +adding file changes +added 1 changesets with 1 changes to 1 files +% pushing applied patch with --force +pushing to ../forcepush2 +searching for changes +adding changesets +adding manifests +adding file changes +added 1 changesets with 1 changes to 1 files (+1 heads)