Hidden patches are only listed with 'series' -a or -i options.
Signed-off-by: Catalin Marinas <catalin.marinas@gmail.com>
float
fold
goto
+ hide
id
import
init
top
unapplied
uncommit
+ unhide
"
# The path to .git, or empty if we're not in a repository.
# stack commands
float) _stg_patches $command _all_patches ;;
goto) _stg_patches $command _all_other_patches ;;
+ hide) _stg_patches $command _all_patches ;;
pop) _stg_patches $command _applied_patches ;;
push) _stg_patches $command _unapplied_patches ;;
series) _stg_patches $command _all_patches ;;
+ unhide) _stg_patches $command _all_patches ;;
# patch commands
delete) _stg_patches $command _all_patches ;;
export) _stg_patches $command _applied_patches ;;
--- /dev/null
+__copyright__ = """
+Copyright (C) 2007, Catalin Marinas <catalin.marinas@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License version 2 as
+published by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+"""
+
+import sys, os
+from optparse import OptionParser, make_option
+
+from stgit.commands.common import *
+from stgit.utils import *
+from stgit import stack, git
+
+
+help = 'hide a patch in the series'
+usage = """%prog [options] [<patch-range>]
+
+Hide a range of patches or the current one so that they are no longer
+shown in the plain 'series' command output."""
+
+options = [make_option('-b', '--branch',
+ help = 'use BRANCH instead of the default one')]
+
+def func(parser, options, args):
+ """Hide a range of patch in the series
+ """
+ if not args:
+ patches = [crt_series.get_current()]
+ else:
+ applied = crt_series.get_applied()
+ unapplied = crt_series.get_unapplied()
+ patches = parse_patches(args, applied + unapplied, len(applied))
+
+ patches = [p for p in patches if p not in crt_series.get_hidden()]
+
+ for patch in patches:
+ crt_series.hide_patch(patch)
+ print 'Patch "%s" hidden' % patch
Show all the patches in the series or just those in the given
range. The applied patches are prefixed with a '+' and the unapplied
ones with a '-'. The current patch is prefixed with a '>'. Empty
-patches are prefixed with a '0'."""
+patches are prefixed with a '0'. The '*' postfix is appended to hidden
+patches."""
options = [make_option('-b', '--branch',
help = 'use BRANCH instead of the default one'),
+ make_option('-a', '--all',
+ help = 'show all patches, including the hidden ones',
+ action = 'store_true'),
+ make_option('-i', '--invisible',
+ help = 'show the hidden patches only',
+ action = 'store_true'),
make_option('-m', '--missing', metavar = 'BRANCH',
help = 'show patches in BRANCH missing in current'),
make_option('-c', '--count',
descr_lines = descr.split('\n')
return descr_lines[0].rstrip()
-def __print_patch(patch, branch_str, prefix, empty_prefix, length, options):
+def __print_patch(patch, hidden, branch_str, prefix, empty_prefix, length,
+ options):
+ """Print a patch name, description and various markers.
+ """
if options.noprefix:
prefix = ''
elif options.empty and crt_series.empty_patch(patch):
prefix = empty_prefix
patch_str = patch + branch_str
+ if not options.noprefix and patch in hidden:
+ patch_str += '*'
if options.description:
- print prefix + patch_str.ljust(length) + ' | ' \
+ print prefix + patch_str.ljust(length) + ' | ' \
+ __get_description(patch)
else:
print prefix + patch_str
else:
show_patches = applied + unapplied
+ # missing filtering
+ show_patches = [p for p in show_patches if p not in cmp_patches]
+
+ # hidden patches filtering
+ hidden = crt_series.get_hidden()
+ if options.invisible:
+ show_patches = [p for p in show_patches if p in hidden]
+ elif not options.all:
+ show_patches = [p for p in show_patches if p not in hidden]
+
# filter the patches
- applied = [p for p in applied
- if p in show_patches and p not in cmp_patches]
- unapplied = [p for p in unapplied
- if p in show_patches and p not in cmp_patches]
+ applied = [p for p in applied if p in show_patches]
+ unapplied = [p for p in unapplied if p in show_patches]
if options.short:
if len(applied) > 5:
max_len = 0
if len(patches) > 0:
max_len = max([len(i + branch_str) for i in patches])
+ max_len += 1
if len(applied) > 0:
- for p in applied [0:-1]:
- __print_patch(p, branch_str, '+ ', '0 ', max_len, options)
+ current = crt_series.get_current()
+ if applied[-1] == current:
+ del applied[-1]
+ else:
+ current = None
+
+ for p in applied:
+ __print_patch(p, hidden, branch_str, '+ ', '0 ', max_len,
+ options)
- __print_patch(applied[-1], branch_str, '> ', '0>', max_len,
- options)
+ if current:
+ __print_patch(current, hidden, branch_str, '> ', '0>', max_len,
+ options)
for p in unapplied:
- __print_patch(p, branch_str, '- ', '0 ', max_len, options)
+ __print_patch(p, hidden, branch_str, '- ', '0 ', max_len, options)
--- /dev/null
+__copyright__ = """
+Copyright (C) 2007, Catalin Marinas <catalin.marinas@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License version 2 as
+published by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+"""
+
+import sys, os
+from optparse import OptionParser, make_option
+
+from stgit.commands.common import *
+from stgit.utils import *
+from stgit import stack, git
+
+
+help = 'unhide a hidden patch in the series'
+usage = """%prog [options] [<patch-range>]
+
+Unhide a hidden range of patches or the current one if hidden so that
+they are shown in the plain 'series' command output."""
+
+options = [make_option('-b', '--branch',
+ help = 'use BRANCH instead of the default one')]
+
+def func(parser, options, args):
+ """Unhide a range of patches in the series
+ """
+ if not args:
+ patches = [crt_series.get_current()]
+ else:
+ applied = crt_series.get_applied()
+ unapplied = crt_series.get_unapplied()
+ patches = parse_patches(args, applied + unapplied, len(applied))
+
+ patches = [p for p in patches if p in crt_series.get_hidden()]
+
+ for patch in patches:
+ crt_series.unhide_patch(patch)
+ print 'Patch "%s" unhidden' % patch
'float': 'float',
'fold': 'fold',
'goto': 'goto',
+ 'hide': 'hide',
'id': 'id',
'import': 'imprt',
'init': 'init',
'sync': 'sync',
'top': 'top',
'unapplied': 'unapplied',
- 'uncommit': 'uncommit'
+ 'uncommit': 'uncommit',
+ 'unhide': 'unhide'
})
# classification: repository, stack, patch, working copy
'commit',
'float',
'goto',
+ 'hide',
'init',
'pop',
'push',
'series',
'top',
'unapplied',
- 'uncommit'
+ 'uncommit',
+ 'unhide'
)
patchcommands = (
'delete',
self.__applied_file = os.path.join(self._dir(), 'applied')
self.__unapplied_file = os.path.join(self._dir(), 'unapplied')
+ self.__hidden_file = os.path.join(self._dir(), 'hidden')
self.__current_file = os.path.join(self._dir(), 'current')
self.__descr_file = os.path.join(self._dir(), 'description')
f.close()
return names
+ def get_hidden(self):
+ if not os.path.isfile(self.__hidden_file):
+ return []
+ f = file(self.__hidden_file)
+ names = [line.strip() for line in f.readlines()]
+ f.close()
+ return names
+
def get_base_file(self):
self.__begin_stack_check()
return self.__base_file
"""
return name in self.get_unapplied()
+ def patch_hidden(self, name):
+ """Return true if the patch is hidden.
+ """
+ return name in self.get_hidden()
+
def patch_exists(self, name):
"""Return true if there is a patch with the given name, false
otherwise."""
os.remove(self.__applied_file)
if os.path.exists(self.__unapplied_file):
os.remove(self.__unapplied_file)
+ if os.path.exists(self.__hidden_file):
+ os.remove(self.__hidden_file)
if os.path.exists(self.__current_file):
os.remove(self.__current_file)
if os.path.exists(self.__descr_file):
f = file(self.__unapplied_file, 'w+')
f.writelines([line + '\n' for line in unapplied])
f.close()
+
+ if self.patch_hidden(name):
+ self.unhide_patch(name)
+
self.__begin_stack_check()
def forward_patches(self, names):
if newname in applied or newname in unapplied:
raise StackException, 'Patch "%s" already exists' % newname
+ if self.patch_hidden(oldname):
+ self.unhide_patch(oldname)
+ self.hide_patch(newname)
+
if oldname in unapplied:
Patch(oldname, self.__patch_dir, self.__refs_dir).rename(newname)
unapplied[unapplied.index(oldname)] = newname
cache_update = False, tree_id = top.get_tree(),
allowempty = True)
patch.set_log(log)
+
+ def hide_patch(self, name):
+ """Add the patch to the hidden list.
+ """
+ if not self.patch_exists(name):
+ raise StackException, 'Unknown patch "%s"' % name
+ elif self.patch_hidden(name):
+ raise StackException, 'Patch "%s" already hidden' % name
+
+ append_string(self.__hidden_file, name)
+
+ def unhide_patch(self, name):
+ """Add the patch to the hidden list.
+ """
+ if not self.patch_exists(name):
+ raise StackException, 'Unknown patch "%s"' % name
+ hidden = self.get_hidden()
+ if not name in hidden:
+ raise StackException, 'Patch "%s" not hidden' % name
+
+ hidden.remove(name)
+
+ f = file(self.__hidden_file, 'w+')
+ f.writelines([line + '\n' for line in hidden])
+ f.close()