fix "stg float -s FILE" for FILE != "-"
[stgit] / stgit / commands / float.py
1 __copyright__ = """
2 Copyright (C) 2006, Robin Rosenberg <robin.rosenberg@dewire.com>
3 Modified by Catalin Marinas
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License version 2 as
7 published by the Free Software Foundation.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 """
18
19 import re
20 import sys
21 from stgit.argparse import opt
22 from stgit.commands import common
23 from stgit.lib import transaction
24 from stgit import argparse
25
26 help = 'Push patches to the top, even if applied'
27 kind = 'stack'
28 usage = ['<patches>',
29 '-s <series>']
30 description = """
31 Push a patch or a range of patches to the top even if applied. The
32 necessary pop and push operations will be performed to accomplish
33 this. The '--series' option can be used to rearrange the (top) patches
34 as specified by the given series file (or the standard input)."""
35
36 args = [argparse.patch_range(argparse.applied_patches,
37 argparse.unapplied_patches)]
38 options = [
39 opt('-s', '--series', metavar = 'FILE',
40 short = 'Rearrange according to the series FILE')
41 ] + argparse.keep_option()
42
43 directory = common.DirectoryHasRepositoryLib()
44
45 def func(parser, options, args):
46 """Reorder patches to make the named patch the topmost one.
47 """
48 if options.series and args:
49 parser.error('<patches> cannot be used with --series')
50 elif not options.series and not args:
51 parser.error('incorrect number of arguments')
52
53 stack = directory.repository.current_stack
54
55 if options.series:
56 if options.series == '-':
57 f = sys.stdin
58 else:
59 f = file(options.series)
60
61 patches = []
62 for line in f:
63 patch = re.sub('#.*$', '', line).strip()
64 if patch:
65 patches.append(patch)
66 else:
67 patches = common.parse_patches(args, stack.patchorder.all)
68
69 if not patches:
70 raise common.CmdException('No patches to float')
71
72 applied = [p for p in stack.patchorder.applied if p not in patches] + \
73 patches
74 unapplied = [p for p in stack.patchorder.unapplied if not p in patches]
75
76 iw = stack.repository.default_iw
77 clean_iw = (not options.keep and iw) or None
78 trans = transaction.StackTransaction(stack, 'sink',
79 check_clean_iw = clean_iw)
80
81 try:
82 trans.reorder_patches(applied, unapplied, iw = iw)
83 except transaction.TransactionHalted:
84 pass
85 return trans.run(iw)