OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 # Copyright (C) 2008 Evan Martin <martine@danga.com> | 6 # Copyright (C) 2008 Evan Martin <martine@danga.com> |
7 | 7 |
8 """A git-command for integrating reviews on Rietveld.""" | 8 """A git-command for integrating reviews on Rietveld.""" |
9 | 9 |
10 import difflib | 10 import difflib |
11 from distutils.version import LooseVersion | |
M-A Ruel
2013/07/09 13:27:15
I don't think this exists on Windows.
tapted
2013/07/10 01:11:52
All my tests seem happy. I think this is just part
| |
11 import json | 12 import json |
12 import logging | 13 import logging |
13 import optparse | 14 import optparse |
14 import os | 15 import os |
15 import re | 16 import re |
16 import stat | 17 import stat |
17 import sys | 18 import sys |
18 import textwrap | 19 import textwrap |
19 import urllib2 | 20 import urllib2 |
20 import urlparse | 21 import urlparse |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
77 try: | 78 try: |
78 out, code = subprocess2.communicate(['git', '--no-pager'] + args, | 79 out, code = subprocess2.communicate(['git', '--no-pager'] + args, |
79 stdout=subprocess2.PIPE) | 80 stdout=subprocess2.PIPE) |
80 return code, out[0] | 81 return code, out[0] |
81 except ValueError: | 82 except ValueError: |
82 # When the subprocess fails, it returns None. That triggers a ValueError | 83 # When the subprocess fails, it returns None. That triggers a ValueError |
83 # when trying to unpack the return value into (out, code). | 84 # when trying to unpack the return value into (out, code). |
84 return 1, '' | 85 return 1, '' |
85 | 86 |
86 | 87 |
88 def IsGitVersionAtLeast(min_version): | |
89 PREFIX='git version ' | |
90 version = RunGit(['--version']).strip() | |
91 return (version.startswith(PREFIX) and | |
92 LooseVersion(version[len(PREFIX):]) >= LooseVersion(min_version)) | |
93 | |
94 | |
87 def usage(more): | 95 def usage(more): |
88 def hook(fn): | 96 def hook(fn): |
89 fn.usage_more = more | 97 fn.usage_more = more |
90 return fn | 98 return fn |
91 return hook | 99 return hook |
92 | 100 |
93 | 101 |
94 def ask_for_data(prompt): | 102 def ask_for_data(prompt): |
95 try: | 103 try: |
96 return raw_input(prompt) | 104 return raw_input(prompt) |
(...skipping 1595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1692 | 1700 |
1693 | 1701 |
1694 @usage('<patch url or issue id>') | 1702 @usage('<patch url or issue id>') |
1695 def CMDpatch(parser, args): | 1703 def CMDpatch(parser, args): |
1696 """patch in a code review""" | 1704 """patch in a code review""" |
1697 parser.add_option('-b', dest='newbranch', | 1705 parser.add_option('-b', dest='newbranch', |
1698 help='create a new branch off trunk for the patch') | 1706 help='create a new branch off trunk for the patch') |
1699 parser.add_option('-f', action='store_true', dest='force', | 1707 parser.add_option('-f', action='store_true', dest='force', |
1700 help='with -b, clobber any existing branch') | 1708 help='with -b, clobber any existing branch') |
1701 parser.add_option('--reject', action='store_true', dest='reject', | 1709 parser.add_option('--reject', action='store_true', dest='reject', |
1702 help='allow failed patches and spew .rej files') | 1710 help='failed patches spew .rej files rather than ' |
1711 'attempting a 3-way merge') | |
1703 parser.add_option('-n', '--no-commit', action='store_true', dest='nocommit', | 1712 parser.add_option('-n', '--no-commit', action='store_true', dest='nocommit', |
1704 help="don't commit after patch applies") | 1713 help="don't commit after patch applies") |
1705 (options, args) = parser.parse_args(args) | 1714 (options, args) = parser.parse_args(args) |
1706 if len(args) != 1: | 1715 if len(args) != 1: |
1707 parser.print_help() | 1716 parser.print_help() |
1708 return 1 | 1717 return 1 |
1709 issue_arg = args[0] | 1718 issue_arg = args[0] |
1710 | 1719 |
1711 # TODO(maruel): Use apply_issue.py | 1720 # TODO(maruel): Use apply_issue.py |
1712 # TODO(ukai): use gerrit-cherry-pick for gerrit repository? | 1721 # TODO(ukai): use gerrit-cherry-pick for gerrit repository? |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1750 ['sed', '-e', 's|^--- a/|--- |; s|^+++ b/|+++ |'], stdin=patch_data) | 1759 ['sed', '-e', 's|^--- a/|--- |; s|^+++ b/|+++ |'], stdin=patch_data) |
1751 except subprocess2.CalledProcessError: | 1760 except subprocess2.CalledProcessError: |
1752 DieWithError('Git patch mungling failed.') | 1761 DieWithError('Git patch mungling failed.') |
1753 logging.info(patch_data) | 1762 logging.info(patch_data) |
1754 # We use "git apply" to apply the patch instead of "patch" so that we can | 1763 # We use "git apply" to apply the patch instead of "patch" so that we can |
1755 # pick up file adds. | 1764 # pick up file adds. |
1756 # The --index flag means: also insert into the index (so we catch adds). | 1765 # The --index flag means: also insert into the index (so we catch adds). |
1757 cmd = ['git', '--no-pager', 'apply', '--index', '-p0'] | 1766 cmd = ['git', '--no-pager', 'apply', '--index', '-p0'] |
1758 if options.reject: | 1767 if options.reject: |
1759 cmd.append('--reject') | 1768 cmd.append('--reject') |
1769 elif IsGitVersionAtLeast('1.7.12'): | |
1770 cmd.append('--3way') | |
1760 try: | 1771 try: |
1761 subprocess2.check_call(cmd, stdin=patch_data, stdout=subprocess2.VOID) | 1772 subprocess2.check_call(cmd, stdin=patch_data, stdout=subprocess2.VOID) |
1762 except subprocess2.CalledProcessError: | 1773 except subprocess2.CalledProcessError: |
1763 DieWithError('Failed to apply the patch') | 1774 DieWithError('Failed to apply the patch') |
1764 | 1775 |
1765 # If we had an issue, commit the current state and register the issue. | 1776 # If we had an issue, commit the current state and register the issue. |
1766 if not options.nocommit: | 1777 if not options.nocommit: |
1767 RunGit(['commit', '-m', 'patch from issue %s' % issue]) | 1778 RunGit(['commit', '-m', 'patch from issue %s' % issue]) |
1768 cl = Changelist() | 1779 cl = Changelist() |
1769 cl.SetIssue(issue) | 1780 cl.SetIssue(issue) |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2142 GenUsage(parser, 'help') | 2153 GenUsage(parser, 'help') |
2143 return CMDhelp(parser, argv) | 2154 return CMDhelp(parser, argv) |
2144 | 2155 |
2145 | 2156 |
2146 if __name__ == '__main__': | 2157 if __name__ == '__main__': |
2147 # These affect sys.stdout so do it outside of main() to simplify mocks in | 2158 # These affect sys.stdout so do it outside of main() to simplify mocks in |
2148 # unit testing. | 2159 # unit testing. |
2149 fix_encoding.fix_encoding() | 2160 fix_encoding.fix_encoding() |
2150 colorama.init() | 2161 colorama.init() |
2151 sys.exit(main(sys.argv[1:])) | 2162 sys.exit(main(sys.argv[1:])) |
OLD | NEW |