# HG changeset patch # User Henrik Stuart # Date 2010-06-02 17:39:45 # Node ID 457813cb30245902ea49f999f6045c21ab87b4d5 # Parent 5f01fd602542213c764a673b413301e5078a4f1d mq: fix naming issues for qqueue directories diff --git a/hgext/mq.py b/hgext/mq.py --- a/hgext/mq.py +++ b/hgext/mq.py @@ -238,8 +238,12 @@ class queue(object): def __init__(self, ui, path, patchdir=None): self.basepath = path try: - fh = open(os.path.join(path, '.queue')) - curpath = os.path.join(path, fh.read().rstrip()) + fh = open(os.path.join(path, 'patches.queue')) + cur = fh.read().rstrip() + if not cur: + curpath = os.path.join(path, 'patches') + else: + curpath = os.path.join(path, 'patches-' + cur) except IOError: curpath = os.path.join(path, 'patches') self.path = patchdir or curpath @@ -2562,11 +2566,14 @@ def qqueue(ui, repo, name=None, **opts): q = repo.mq _defaultqueue = 'patches' - _allqueues = '.queues' - _activequeue = '.queue' + _allqueues = 'patches.queues' + _activequeue = 'patches.queue' def _getcurrent(): - return os.path.basename(q.path) + cur = os.path.basename(q.path) + if cur.startswith('patches-'): + cur = cur[8:] + return cur def _noqueues(): try: @@ -2595,7 +2602,8 @@ def qqueue(ui, repo, name=None, **opts): raise util.Abort(_('patches applied - cannot set new queue active')) fh = repo.opener(_activequeue, 'w') - fh.write(name) + if name != 'patches': + fh.write(name) fh.close() def _addqueue(name): @@ -2603,6 +2611,12 @@ def qqueue(ui, repo, name=None, **opts): fh.write('%s\n' % (name,)) fh.close() + def _validname(name): + for n in name: + if n in ':\\/.': + return False + return True + if not name or opts.get('list'): current = _getcurrent() for queue in _getqueues(): @@ -2613,6 +2627,10 @@ def qqueue(ui, repo, name=None, **opts): ui.write('\n') return + if not _validname(name): + raise util.Abort( + _('invalid queue name, may not contain the characters ":\\/."')) + existing = _getqueues() if name not in existing and opts.get('delete'): @@ -2631,13 +2649,13 @@ def qqueue(ui, repo, name=None, **opts): if name == current: raise util.Abort(_('cannot delete currently active queue')) - fh = repo.opener('.queues.new', 'w') + fh = repo.opener('patches.queues.new', 'w') for queue in existing: if queue == name: continue fh.write('%s\n' % (queue,)) fh.close() - util.rename(repo.join('.queues.new'), repo.join(_allqueues)) + util.rename(repo.join('patches.queues.new'), repo.join(_allqueues)) else: _setactive(name) diff --git a/tests/test-mq-qqueue b/tests/test-mq-qqueue --- a/tests/test-mq-qqueue +++ b/tests/test-mq-qqueue @@ -44,4 +44,17 @@ hg qpop -a hg qqueue patches hg qqueue foo --delete hg qqueue + +echo %% tricky cases +hg qqueue store --create +hg qnew test +hg qqueue +hg qpop -a +hg qqueue patches +hg qun + +echo %% invalid names +hg qqueue test/../../bar --create +hg qqueue . --create + cd .. diff --git a/tests/test-mq-qqueue.out b/tests/test-mq-qqueue.out --- a/tests/test-mq-qqueue.out +++ b/tests/test-mq-qqueue.out @@ -21,3 +21,12 @@ abort: cannot delete currently active qu popping otherstuff patch queue now empty patches (active) +%% tricky cases +patches +store (active) +popping test +patch queue now empty +somestuff +%% invalid names +abort: invalid queue name, may not contain the characters ":\/." +abort: invalid queue name, may not contain the characters ":\/."