Show More
@@ -0,0 +1,47 b'' | |||||
|
1 | #!/bin/sh | |||
|
2 | ||||
|
3 | echo "[extensions]" >> $HGRCPATH | |||
|
4 | echo "mq=" >> $HGRCPATH | |||
|
5 | ||||
|
6 | hg init foo | |||
|
7 | cd foo | |||
|
8 | echo a > a | |||
|
9 | hg ci -qAm a | |||
|
10 | ||||
|
11 | echo %% default queue | |||
|
12 | hg qqueue | |||
|
13 | ||||
|
14 | echo b > a | |||
|
15 | hg qnew -fgDU somestuff | |||
|
16 | ||||
|
17 | echo %% applied patches in default queue | |||
|
18 | hg qap | |||
|
19 | ||||
|
20 | echo %% try to change patch \(create succeeds, switch fails\) | |||
|
21 | hg qqueue foo --create | |||
|
22 | hg qqueue | |||
|
23 | ||||
|
24 | echo %% empty default queue | |||
|
25 | hg qpop | |||
|
26 | ||||
|
27 | echo %% switch queue | |||
|
28 | hg qqueue foo | |||
|
29 | hg qqueue | |||
|
30 | ||||
|
31 | echo %% unapplied patches | |||
|
32 | hg qun | |||
|
33 | echo c > a | |||
|
34 | hg qnew -fgDU otherstuff | |||
|
35 | ||||
|
36 | echo %% fail switching back | |||
|
37 | hg qqueue patches | |||
|
38 | ||||
|
39 | echo %% fail deleting current | |||
|
40 | hg qqueue foo --delete | |||
|
41 | ||||
|
42 | echo %% switch back and delete foo | |||
|
43 | hg qpop -a | |||
|
44 | hg qqueue patches | |||
|
45 | hg qqueue foo --delete | |||
|
46 | hg qqueue | |||
|
47 | cd .. |
@@ -0,0 +1,23 b'' | |||||
|
1 | %% default queue | |||
|
2 | patches (active) | |||
|
3 | %% applied patches in default queue | |||
|
4 | somestuff | |||
|
5 | %% try to change patch (create succeeds, switch fails) | |||
|
6 | abort: patches applied - cannot set new queue active | |||
|
7 | foo | |||
|
8 | patches (active) | |||
|
9 | %% empty default queue | |||
|
10 | popping somestuff | |||
|
11 | patch queue now empty | |||
|
12 | %% switch queue | |||
|
13 | foo (active) | |||
|
14 | patches | |||
|
15 | %% unapplied patches | |||
|
16 | %% fail switching back | |||
|
17 | abort: patches applied - cannot set new queue active | |||
|
18 | %% fail deleting current | |||
|
19 | abort: cannot delete currently active queue | |||
|
20 | %% switch back and delete foo | |||
|
21 | popping otherstuff | |||
|
22 | patch queue now empty | |||
|
23 | patches (active) |
@@ -234,7 +234,12 b' class patchheader(object):' | |||||
234 | class queue(object): |
|
234 | class queue(object): | |
235 | def __init__(self, ui, path, patchdir=None): |
|
235 | def __init__(self, ui, path, patchdir=None): | |
236 | self.basepath = path |
|
236 | self.basepath = path | |
237 | self.path = patchdir or os.path.join(path, "patches") |
|
237 | try: | |
|
238 | fh = open(os.path.join(path, '.queue')) | |||
|
239 | curpath = os.path.join(path, fh.read().rstrip()) | |||
|
240 | except IOError: | |||
|
241 | curpath = os.path.join(path, 'patches') | |||
|
242 | self.path = patchdir or curpath | |||
238 | self.opener = util.opener(self.path) |
|
243 | self.opener = util.opener(self.path) | |
239 | self.ui = ui |
|
244 | self.ui = ui | |
240 | self.applied_dirty = 0 |
|
245 | self.applied_dirty = 0 | |
@@ -2533,6 +2538,107 b' def finish(ui, repo, *revrange, **opts):' | |||||
2533 | q.save_dirty() |
|
2538 | q.save_dirty() | |
2534 | return 0 |
|
2539 | return 0 | |
2535 |
|
2540 | |||
|
2541 | def qqueue(ui, repo, name=None, **opts): | |||
|
2542 | '''manage multiple patch queues | |||
|
2543 | ||||
|
2544 | Supports switching between different patch queues, as well as creating | |||
|
2545 | new patch queues and deleting existing ones. | |||
|
2546 | ||||
|
2547 | Omitting a queue name or specifying -l/--list will show you the registered | |||
|
2548 | queues - by default the "normal" patches queue is registered. The currently | |||
|
2549 | active queue will be marked with "(active)". | |||
|
2550 | ||||
|
2551 | To create a new queue, use -c/--create. The queue is automatically made | |||
|
2552 | active, except in the case where there are applied patches from the | |||
|
2553 | currently active queue in the repository. Then the queue will only be | |||
|
2554 | created and switching will fail. | |||
|
2555 | ||||
|
2556 | To delete an existing queue, use --delete. You cannot delete the currently | |||
|
2557 | active queue. | |||
|
2558 | ''' | |||
|
2559 | ||||
|
2560 | q = repo.mq | |||
|
2561 | ||||
|
2562 | _defaultqueue = 'patches' | |||
|
2563 | _allqueues = '.queues' | |||
|
2564 | _activequeue = '.queue' | |||
|
2565 | ||||
|
2566 | def _getcurrent(): | |||
|
2567 | return os.path.basename(q.path) | |||
|
2568 | ||||
|
2569 | def _noqueues(): | |||
|
2570 | try: | |||
|
2571 | fh = repo.opener(_allqueues, 'r') | |||
|
2572 | fh.close() | |||
|
2573 | except IOError: | |||
|
2574 | return True | |||
|
2575 | ||||
|
2576 | return False | |||
|
2577 | ||||
|
2578 | def _getqueues(): | |||
|
2579 | current = _getcurrent() | |||
|
2580 | ||||
|
2581 | try: | |||
|
2582 | fh = repo.opener(_allqueues, 'r') | |||
|
2583 | queues = [queue.strip() for queue in fh if queue.strip()] | |||
|
2584 | if current not in queues: | |||
|
2585 | queues.append(current) | |||
|
2586 | except IOError: | |||
|
2587 | queues = [_defaultqueue] | |||
|
2588 | ||||
|
2589 | return sorted(queues) | |||
|
2590 | ||||
|
2591 | def _setactive(name): | |||
|
2592 | if q.applied: | |||
|
2593 | raise util.Abort(_('patches applied - cannot set new queue active')) | |||
|
2594 | ||||
|
2595 | fh = repo.opener(_activequeue, 'w') | |||
|
2596 | fh.write(name) | |||
|
2597 | fh.close() | |||
|
2598 | ||||
|
2599 | def _addqueue(name): | |||
|
2600 | fh = repo.opener(_allqueues, 'a') | |||
|
2601 | fh.write('%s\n' % (name,)) | |||
|
2602 | fh.close() | |||
|
2603 | ||||
|
2604 | if not name or opts.get('list'): | |||
|
2605 | current = _getcurrent() | |||
|
2606 | for queue in _getqueues(): | |||
|
2607 | ui.write('%s' % (queue,)) | |||
|
2608 | if queue == current: | |||
|
2609 | ui.write(_(' (active)\n')) | |||
|
2610 | else: | |||
|
2611 | ui.write('\n') | |||
|
2612 | return | |||
|
2613 | ||||
|
2614 | existing = _getqueues() | |||
|
2615 | ||||
|
2616 | if name not in existing and opts.get('delete'): | |||
|
2617 | raise util.Abort(_('cannot delete queue that does not exist')) | |||
|
2618 | elif name not in existing and not opts.get('create'): | |||
|
2619 | raise util.Abort(_('use --create to create a new queue')) | |||
|
2620 | ||||
|
2621 | if opts.get('create'): | |||
|
2622 | if _noqueues(): | |||
|
2623 | _addqueue(_defaultqueue) | |||
|
2624 | _addqueue(name) | |||
|
2625 | _setactive(name) | |||
|
2626 | elif opts.get('delete'): | |||
|
2627 | current = _getcurrent() | |||
|
2628 | ||||
|
2629 | if name == current: | |||
|
2630 | raise util.Abort(_('cannot delete currently active queue')) | |||
|
2631 | ||||
|
2632 | fh = repo.opener('.queues.new', 'w') | |||
|
2633 | for queue in existing: | |||
|
2634 | if queue == name: | |||
|
2635 | continue | |||
|
2636 | fh.write('%s\n' % (queue,)) | |||
|
2637 | fh.close() | |||
|
2638 | util.rename(repo.join('.queues.new'), repo.join(_allqueues)) | |||
|
2639 | else: | |||
|
2640 | _setactive(name) | |||
|
2641 | ||||
2536 | def reposetup(ui, repo): |
|
2642 | def reposetup(ui, repo): | |
2537 | class mqrepo(repo.__class__): |
|
2643 | class mqrepo(repo.__class__): | |
2538 | @util.propertycache |
|
2644 | @util.propertycache | |
@@ -2839,6 +2945,14 b' cmdtable = {' | |||||
2839 | (finish, |
|
2945 | (finish, | |
2840 | [('a', 'applied', None, _('finish all applied changesets'))], |
|
2946 | [('a', 'applied', None, _('finish all applied changesets'))], | |
2841 | _('hg qfinish [-a] [REV]...')), |
|
2947 | _('hg qfinish [-a] [REV]...')), | |
|
2948 | 'qqueue': | |||
|
2949 | (qqueue, | |||
|
2950 | [ | |||
|
2951 | ('l', 'list', False, _('list all available queues')), | |||
|
2952 | ('c', 'create', False, _('create new queue')), | |||
|
2953 | ('', 'delete', False, _('delete reference to queue')), | |||
|
2954 | ], | |||
|
2955 | _('[OPTION] [QUEUE]')), | |||
2842 | } |
|
2956 | } | |
2843 |
|
2957 | |||
2844 | colortable = {'qguard.negative': 'red', |
|
2958 | colortable = {'qguard.negative': 'red', |
@@ -49,6 +49,7 b' list of commands:' | |||||
49 | qpop pop the current patch off the stack |
|
49 | qpop pop the current patch off the stack | |
50 | qprev print the name of the previous patch |
|
50 | qprev print the name of the previous patch | |
51 | qpush push the next patch onto the stack |
|
51 | qpush push the next patch onto the stack | |
|
52 | qqueue manage multiple patch queues | |||
52 | qrefresh update the current patch |
|
53 | qrefresh update the current patch | |
53 | qrename rename a patch |
|
54 | qrename rename a patch | |
54 | qselect set or print guarded patches to push |
|
55 | qselect set or print guarded patches to push |
General Comments 0
You need to be logged in to leave comments.
Login now