| Index: git_freezer.py
|
| diff --git a/git_freezer.py b/git_freezer.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..6e28b3e342b066f582fd46c48153f90a8038ebf9
|
| --- /dev/null
|
| +++ b/git_freezer.py
|
| @@ -0,0 +1,73 @@
|
| +#!/usr/local/bin/python
|
| +import sys
|
| +import re
|
| +import optparse
|
| +
|
| +import subcommand
|
| +import subprocess2
|
| +
|
| +from git_common import run, stream
|
| +
|
| +FREEZE = 'FREEZE'
|
| +SECTIONS = {
|
| + 'indexed': 'soft',
|
| + 'unindexed': 'mixed'
|
| +}
|
| +MATCHER = re.compile(r'%s.(%s)' % (FREEZE, '|'.join(SECTIONS)))
|
| +
|
| +
|
| +def freeze():
|
| + took_action = False
|
| +
|
| + try:
|
| + run('commit', '-m', FREEZE + '.indexed')
|
| + took_action = True
|
| + except subprocess2.CalledProcessError:
|
| + pass
|
| +
|
| + try:
|
| + run('add', '-A')
|
| + run('commit', '-m', FREEZE + '.unindexed')
|
| + took_action = True
|
| + except subprocess2.CalledProcessError:
|
| + pass
|
| +
|
| + if not took_action:
|
| + return 'Nothing to freeze.'
|
| +
|
| +
|
| +def thaw():
|
| + took_action = False
|
| + for sha in (s.strip() for s in stream('rev-list', 'HEAD').xreadlines()):
|
| + msg = run('show', '--format=%f%b', '-s', 'HEAD')
|
| + match = MATCHER.match(msg)
|
| + if not match:
|
| + if not took_action:
|
| + return 'Nothing to thaw.'
|
| + break
|
| +
|
| + run('reset', '--' + SECTIONS[match.group(1)], sha)
|
| + took_action = True
|
| +
|
| +
|
| +def CMDfreeze(parser, args): # pragma: no cover
|
| + """Freeze a branch's changes."""
|
| + parser.parse_args(args)
|
| + return freeze()
|
| +
|
| +
|
| +def CMDthaw(parser, args): # pragma: no cover
|
| + """Returns a frozen branch to the state before it was frozen."""
|
| + parser.parse_args(args)
|
| + return thaw()
|
| +
|
| +
|
| +def main(): # pragma: no cover
|
| + dispatcher = subcommand.CommandDispatcher(__name__)
|
| + ret = dispatcher.execute(optparse.OptionParser(), sys.argv[1:])
|
| + if ret:
|
| + print ret
|
| +
|
| +
|
| +if __name__ == '__main__': # pragma: no cover
|
| + main()
|
|
|