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() |