OLD | NEW |
1 #!/bin/sh | 1 #!/usr/bin/env python |
2 | 2 |
3 ## repo default configuration | 3 ## repo default configuration |
4 ## | 4 ## |
5 REPO_URL='https://chromium.googlesource.com/external/repo' | 5 REPO_URL='https://chromium.googlesource.com/external/repo' |
6 REPO_REV='stable' | 6 REPO_REV='stable' |
7 | 7 |
8 # Copyright (C) 2008 Google Inc. | 8 # Copyright (C) 2008 Google Inc. |
9 # | 9 # |
10 # Licensed under the Apache License, Version 2.0 (the "License"); | 10 # Licensed under the Apache License, Version 2.0 (the "License"); |
11 # you may not use this file except in compliance with the License. | 11 # you may not use this file except in compliance with the License. |
12 # You may obtain a copy of the License at | 12 # You may obtain a copy of the License at |
13 # | 13 # |
14 # http://www.apache.org/licenses/LICENSE-2.0 | 14 # http://www.apache.org/licenses/LICENSE-2.0 |
15 # | 15 # |
16 # Unless required by applicable law or agreed to in writing, software | 16 # Unless required by applicable law or agreed to in writing, software |
17 # distributed under the License is distributed on an "AS IS" BASIS, | 17 # distributed under the License is distributed on an "AS IS" BASIS, |
18 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 18 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
19 # See the License for the specific language governing permissions and | 19 # See the License for the specific language governing permissions and |
20 # limitations under the License. | 20 # limitations under the License. |
21 | 21 |
22 magic='--calling-python-from-/bin/sh--' | |
23 """exec" python -E "$0" "$@" """#$magic" | |
24 if __name__ == '__main__': | |
25 import sys | |
26 if sys.argv[-1] == '#%s' % magic: | |
27 del sys.argv[-1] | |
28 del magic | |
29 | |
30 # increment this whenever we make important changes to this script | 22 # increment this whenever we make important changes to this script |
31 VERSION = (1, 18) | 23 VERSION = (1, 21) |
32 | 24 |
33 # increment this if the MAINTAINER_KEYS block is modified | 25 # increment this if the MAINTAINER_KEYS block is modified |
34 KEYRING_VERSION = (1,2) | 26 KEYRING_VERSION = (1, 3) |
35 MAINTAINER_KEYS = """ | 27 MAINTAINER_KEYS = """ |
36 | 28 |
37 Repo Maintainer <repo@android.kernel.org> | 29 Repo Maintainer <repo@android.kernel.org> |
38 -----BEGIN PGP PUBLIC KEY BLOCK----- | 30 -----BEGIN PGP PUBLIC KEY BLOCK----- |
39 Version: GnuPG v1.4.2.2 (GNU/Linux) | 31 Version: GnuPG v1.4.2.2 (GNU/Linux) |
40 | 32 |
41 mQGiBEj3ugERBACrLJh/ZPyVSKeClMuznFIrsQ+hpNnmJGw1a9GXKYKk8qHPhAZf | 33 mQGiBEj3ugERBACrLJh/ZPyVSKeClMuznFIrsQ+hpNnmJGw1a9GXKYKk8qHPhAZf |
42 WKtrBqAVMNRLhL85oSlekRz98u41H5si5zcuv+IXJDF5MJYcB8f22wAy15lUqPWi | 34 WKtrBqAVMNRLhL85oSlekRz98u41H5si5zcuv+IXJDF5MJYcB8f22wAy15lUqPWi |
43 VCkk1l8qqLiuW0fo+ZkPY5qOgrvc0HW1SmdH649uNwqCbcKb6CxaTxzhOwCgj3AP | 35 VCkk1l8qqLiuW0fo+ZkPY5qOgrvc0HW1SmdH649uNwqCbcKb6CxaTxzhOwCgj3AP |
44 xI1WfzLqdJjsm1Nq98L0cLcD/iNsILCuw44PRds3J75YP0pze7YF/6WFMB6QSFGu | 36 xI1WfzLqdJjsm1Nq98L0cLcD/iNsILCuw44PRds3J75YP0pze7YF/6WFMB6QSFGu |
(...skipping 28 matching lines...) Expand all Loading... |
73 HTHs37+/QLMomGEGKZMWi0dShU2J5mNRQu3Hhxl3hHDVbt5CeJBb26aQcQrFz69W | 65 HTHs37+/QLMomGEGKZMWi0dShU2J5mNRQu3Hhxl3hHDVbt5CeJBb26aQcQrFz69W |
74 zE3GNvmJosh6leayjtI9P2A6iEkEGBECAAkFAkj3uiACGwwACgkQFlMNXpIPXGWp | 66 zE3GNvmJosh6leayjtI9P2A6iEkEGBECAAkFAkj3uiACGwwACgkQFlMNXpIPXGWp |
75 TACbBS+Up3RpfYVfd63c1cDdlru13pQAn3NQy/SN858MkxN+zym86UBgOad2 | 67 TACbBS+Up3RpfYVfd63c1cDdlru13pQAn3NQy/SN858MkxN+zym86UBgOad2 |
76 =CMiZ | 68 =CMiZ |
77 -----END PGP PUBLIC KEY BLOCK----- | 69 -----END PGP PUBLIC KEY BLOCK----- |
78 | 70 |
79 Conley Owens <cco3@android.com> | 71 Conley Owens <cco3@android.com> |
80 -----BEGIN PGP PUBLIC KEY BLOCK----- | 72 -----BEGIN PGP PUBLIC KEY BLOCK----- |
81 Version: GnuPG v1.4.11 (GNU/Linux) | 73 Version: GnuPG v1.4.11 (GNU/Linux) |
82 | 74 |
83 mQENBFBiLPwBCACvISTASOgFXwADw2GYRH2I2z9RvYkYoZ6ThTTNlMXbbYYKO2Wo | 75 mQENBFHRvc8BCADFg45Xx/y6QDC+T7Y/gGc7vx0ww7qfOwIKlAZ9xG3qKunMxo+S |
84 a9LQDNW0TbCEekg5UKk0FD13XOdWaqUt4Gtuvq9c43GRSjMO6NXH+0BjcQ8vUtY2 | 76 hPCnzEl3cq+6I1Ww/ndop/HB3N3toPXRCoN8Vs4/Hc7by+SnaLFnacrm+tV5/OgT |
85 /W4CYUevwdo4nQ1+1zsOCu1XYe/CReXq0fdugv3hgmRmh3sz1soo37Q44W2frxxg | 77 V37Lzt8lhay1Kl+YfpFwHYYpIEBLFV9knyfRXS/428W2qhdzYfvB15/AasRmwmor |
86 U7Rz3Da4FjgAL0RQ8qndD+LwRHXTY7H7wYM8V/3cYFZV7pSodd75q3MAXYQLf0ZV | 78 py4NIzSs8UD/SPr1ihqNCdZM76+MQyN5HMYXW/ALZXUFG0pwluHFA7hrfPG74i8C |
87 QR1XATu5l1QnXrxgHvz7MmDwb1D+jX3YPKnZveaukigQ6hDHdiVcePBiGXmk8LZC | 79 zMiP7qvMWIl/r/jtzHioH1dRKgbod+LZsrDJ8mBaqsZaDmNJMhss9g76XvfMyLra |
88 2jQkdXeF7Su1ZYpr2nnEHLJ6vOLcCpPGb8gDABEBAAG0H0NvbmxleSBPd2VucyA8 | 80 9DI9/iFuBpGzeqBv0hwOGQspLRrEoyTeR6n1ABEBAAG0H0NvbmxleSBPd2VucyA8 |
89 Y2NvM0BhbmRyb2lkLmNvbT6JATgEEwECACIFAlBiLPwCGwMGCwkIBwMCBhUIAgkK | 81 Y2NvM0BhbmRyb2lkLmNvbT6JATgEEwECACIFAlHRvc8CGwMGCwkIBwMCBhUIAgkK |
90 CwQWAgMBAh4BAheAAAoJEBkmlFUziHGkHVkH/2Hks2Cif5i2xPtv2IFZcjL42joU | 82 CwQWAgMBAh4BAheAAAoJEGe35EhpKzgsP6AIAJKJmNtn4l7hkYHKHFSo3egb6RjQ |
91 T7lO5XFqUYS9ZNHpGa/V0eiPt7rHoO16glR83NZtwlrq2cSN89i9HfOhMYV/qLu8 | 83 zEIP3MFTcu8HFX1kF1ZFbrp7xqurLaE53kEkKuAAvjJDAgI8mcZHP1JyplubqjQA |
92 fLCHcV2muw+yCB5s5bxnI5UkToiNZyBNqFkcOt/Kbj9Hpy68A1kmc6myVEaUYebq | 84 xvv84gK+OGP3Xk+QK1ZjUQSbjOpjEiSZpRhWcHci3dgOUH4blJfByHw25hlgHowd |
93 2Chx/f3xuEthan099t746v1K+/6SvQGDNctHuaMr9cWdxZtHjdRf31SQRc99Phe5 | 85 a/2PrNKZVcJ92YienaxxGjcXEUcd0uYEG2+rwllQigFcnMFDhr9B71MfalRHjFKE |
94 w+ZGR/ebxNDKRK9mKgZT8wVFHlXerJsRqWIqtx1fsW1UgLgbpcpe2MChm6B5wTu0 | 86 fmdoypqLrri61YBc59P88Rw2/WUpTQjgNubSqa3A2+CKdaRyaRw+2fdF4TdR0h8W |
95 s1ltzox3l4q71FyRRPUJxXyvGkDLZWpK7EpiHSCOYq/KP3HkKeXU3xqHpcG5AQ0E | 87 zbg+lbaPtJHsV+3mJC7fq26MiJDRJa5ZztpMn8su20gbLgi2ShBOaHAYDDi5AQ0E |
96 UGIs/AEIAKzO/7lO9cB6dshmZYo8Vy/b7aGicThE+ChcDSfhvyOXVdEM2GKAjsR+ | 88 UdG9zwEIAMoOBq+QLNozAhxOOl5GL3StTStGRgPRXINfmViTsihrqGCWBBUfXlUE |
97 rlBWbTFX3It301p2HwZPFEi9nEvJxVlqqBiW0bPmNMkDRR55l2vbWg35wwkg6RyE | 89 OytC0mYcrDUQev/8ToVoyqw+iGSwDkcSXkrEUCKFtHV/GECWtk1keyHgR10YKI1R |
98 Bc5/TQjhXI2w8IvlimoGoUff4t3JmMOnWrnKSvL+5iuRj12p9WmanCHzw3Ee7ztf | 90 mquSXoubWGqPeG1PAI74XWaRx8UrL8uCXUtmD8Q5J7mDjKR5NpxaXrwlA0bKsf2E |
99 /aU/q+FTpr3DLerb6S8xbv86ySgnJT6o5CyL2DCWRtnYQyGVi0ZmLzEouAYiO0hs | 91 Gp9tu1kKauuToZhWHMRMqYSOGikQJwWSFYKT1KdNcOXLQF6+bfoJ6sjVYdwfmNQL |
100 z0AAu28Mj+12g2WwePRz6gfM9rHtI37ylYW3oT/9M9mO9ei/Bc/1D7Dz6qNV+0vg | 92 Ixn8QVhoTDedcqClSWB17VDEFDFa7MmqXZz2qtM3X1R/MUMHqPtegQzBGNhRdnI2 |
101 uSVJxM2Bl6GalHPZLhHntFEdIA6EdoUAEQEAAYkBHwQYAQIACQUCUGIs/AIbDAAK | 93 V45+1Nnx/uuCxDbeI4RbHzujnxDiq70AEQEAAYkBHwQYAQIACQUCUdG9zwIbDAAK |
102 CRAZJpRVM4hxpNfkB/0W/hP5WK/NETXBlWXXW7JPaWO2c5kGwD0lnj5RRmridyo1 | 94 CRBnt+RIaSs4LNVeB/0Y2pZ8I7gAAcEM0Xw8drr4omg2fUoK1J33ozlA/RxeA/lJ |
103 vbm5PdM91jOsDQYqRu6YOoYBnDnEhB2wL2bPh34HWwwrA+LwB8hlcAV2z1bdwyfl | 95 I3KnyCDTpXuIeBKPGkdL8uMATC9Z8DnBBajRlftNDVZS3Hz4G09G9QpMojvJkFJV |
104 3R823fReKN3QcvLHzmvZPrF4Rk97M9UIyKS0RtnfTWykRgDWHIsrtQPoNwsXrWoT | 96 By+01Flw/X+eeN8NpqSuLV4W+AjEO8at/VvgKr1AFvBRdZ7GkpI1o6DgPe7ZqX+1 |
105 9LrM2v+1+9mp3vuXnE473/NHxmiWEQH9Ez+O/mOxQ7rSOlqGRiKq/IBZCfioJOtV | 97 dzQZt3e13W0rVBb/bUgx9iSLoeWP3aq/k+/GRGOR+S6F6BBSl0SQ2EF2+dIywb1x |
106 fTQeIu/yASZnsLBqr6SJEGwYBoWcyjG++k4fyw8ocOAo4uGDYbxgN7yYfNQ0OH7o | 98 JuinEP+AwLAUZ1Bsx9ISC0Agpk2VeHXPL3FGhroEmoMvBzO0kTFGyoeT7PR/BfKv |
107 V6pfUgqKLWa/aK7/N1ZHnPdFLD8Xt0Dmy4BPwrKC | 99 +H/g3HsL2LOB9uoIm8/5p2TTU5ttYCXMHhQZ81AY |
108 =O7am | 100 =AUp4 |
109 -----END PGP PUBLIC KEY BLOCK----- | 101 -----END PGP PUBLIC KEY BLOCK----- |
110 | 102 |
111 Stefan Zager <szager@chromium.org> | 103 Stefan Zager <szager@chromium.org> |
112 -----BEGIN PGP PUBLIC KEY BLOCK----- | 104 -----BEGIN PGP PUBLIC KEY BLOCK----- |
113 Version: GnuPG v1.4.11 (GNU/Linux) | 105 Version: GnuPG v1.4.11 (GNU/Linux) |
114 | 106 |
115 mQINBFIJOcgBEADwZIq4GRGoO1RJFKlrtVK501cwT5H+Acbizc9N5RxTkFmqxDjb | 107 mQINBFIJOcgBEADwZIq4GRGoO1RJFKlrtVK501cwT5H+Acbizc9N5RxTkFmqxDjb |
116 9ApUaPW6S1b8+nrzE9P1Ri5erfzipuStfaZ/Wl3mP1JjKulibddmgnPOEbAJ673k | 108 9ApUaPW6S1b8+nrzE9P1Ri5erfzipuStfaZ/Wl3mP1JjKulibddmgnPOEbAJ673k |
117 Vj85RUO4rt2oZAHnZN3D3gFJzVY8JVlZ47Enj9fTqzcW78FVsPCpIT9P2LpTLWeE | 109 Vj85RUO4rt2oZAHnZN3D3gFJzVY8JVlZ47Enj9fTqzcW78FVsPCpIT9P2LpTLWeE |
118 jX9Cjxeimy6VvyJstIcDLYhlpUN5UWen79L4LFAkHf3luLuU4W3p9NriqUsy5UG2 | 110 jX9Cjxeimy6VvyJstIcDLYhlpUN5UWen79L4LFAkHf3luLuU4W3p9NriqUsy5UG2 |
(...skipping 15 matching lines...) Expand all Loading... |
134 pPi02FS/HahYpLC3J66REAeNyofgVXau6WQsHrHMGsBTL9aAr0nrCrkF4Nyyc2Jd | 126 pPi02FS/HahYpLC3J66REAeNyofgVXau6WQsHrHMGsBTL9aAr0nrCrkF4Nyyc2Jd |
135 do6nYuljuUhORqbEECmmBM2eBtkL6Ac92D6WMBIwBOC5tCNHO2YFIvi8Y8EuE8sc | 127 do6nYuljuUhORqbEECmmBM2eBtkL6Ac92D6WMBIwBOC5tCNHO2YFIvi8Y8EuE8sc |
136 1zB5U5Ai4SIu2icRAhzAhCRaUq02cMWuELKH6Vuh9nzgEefFWty6vPbKEyZLu19D | 128 1zB5U5Ai4SIu2icRAhzAhCRaUq02cMWuELKH6Vuh9nzgEefFWty6vPbKEyZLu19D |
137 B80aqP1cTN88FjtKQ/eTF29TUB6AefUeBS17e2e3WUMy4nc8tduuOFYfiHP40ScP | 129 B80aqP1cTN88FjtKQ/eTF29TUB6AefUeBS17e2e3WUMy4nc8tduuOFYfiHP40ScP |
138 wOoatwfzpiTIPGbocUEPL+pS0O/Xy8SINxFMCud3zA== | 130 wOoatwfzpiTIPGbocUEPL+pS0O/Xy8SINxFMCud3zA== |
139 =Vd2S | 131 =Vd2S |
140 -----END PGP PUBLIC KEY BLOCK----- | 132 -----END PGP PUBLIC KEY BLOCK----- |
141 """ | 133 """ |
142 | 134 |
143 GIT = 'git' # our git command | 135 GIT = 'git' # our git command |
144 MIN_GIT_VERSION = (1, 5, 4) # minimum supported git version | 136 MIN_GIT_VERSION = (1, 7, 2) # minimum supported git version |
145 repodir = '.repo' # name of repo's private directory | 137 repodir = '.repo' # name of repo's private directory |
146 S_repo = 'repo' # special repo repository | 138 S_repo = 'repo' # special repo repository |
147 S_manifests = 'manifests' # special manifest repository | 139 S_manifests = 'manifests' # special manifest repository |
148 REPO_MAIN = S_repo + '/main.py' # main script | 140 REPO_MAIN = S_repo + '/main.py' # main script |
| 141 MIN_PYTHON_VERSION = (2, 6) # minimum supported python version |
149 | 142 |
150 | 143 |
| 144 import errno |
151 import optparse | 145 import optparse |
152 import os | 146 import os |
153 import re | 147 import re |
| 148 import stat |
154 import subprocess | 149 import subprocess |
155 import sys | 150 import sys |
156 import urllib2 | 151 |
| 152 if sys.version_info[0] == 3: |
| 153 import urllib.request |
| 154 import urllib.error |
| 155 else: |
| 156 import imp |
| 157 import urllib2 |
| 158 urllib = imp.new_module('urllib') |
| 159 urllib.request = urllib2 |
| 160 urllib.error = urllib2 |
| 161 |
| 162 |
| 163 def _print(*objects, **kwargs): |
| 164 sep = kwargs.get('sep', ' ') |
| 165 end = kwargs.get('end', '\n') |
| 166 out = kwargs.get('file', sys.stdout) |
| 167 out.write(sep.join(objects) + end) |
| 168 |
| 169 |
| 170 # Python version check |
| 171 ver = sys.version_info |
| 172 if ver[0] == 3: |
| 173 _print('warning: Python 3 support is currently experimental. YMMV.\n' |
| 174 'Please use Python 2.6 - 2.7 instead.', |
| 175 file=sys.stderr) |
| 176 if (ver[0], ver[1]) < MIN_PYTHON_VERSION: |
| 177 _print('error: Python version %s unsupported.\n' |
| 178 'Please use Python 2.6 - 2.7 instead.' |
| 179 % sys.version.split(' ')[0], file=sys.stderr) |
| 180 sys.exit(1) |
157 | 181 |
158 home_dot_repo = os.path.expanduser('~/.repoconfig') | 182 home_dot_repo = os.path.expanduser('~/.repoconfig') |
159 gpg_dir = os.path.join(home_dot_repo, 'gnupg') | 183 gpg_dir = os.path.join(home_dot_repo, 'gnupg') |
160 | 184 |
161 extra_args = [] | 185 extra_args = [] |
162 init_optparse = optparse.OptionParser(usage="repo init -u url [options]") | 186 init_optparse = optparse.OptionParser(usage="repo init -u url [options]") |
163 | 187 |
164 # Logging | 188 # Logging |
165 group = init_optparse.add_option_group('Logging options') | 189 group = init_optparse.add_option_group('Logging options') |
166 group.add_option('-q', '--quiet', | 190 group.add_option('-q', '--quiet', |
167 dest="quiet", action="store_true", default=False, | 191 dest="quiet", action="store_true", default=False, |
168 help="be quiet") | 192 help="be quiet") |
169 | 193 |
170 # Manifest | 194 # Manifest |
171 group = init_optparse.add_option_group('Manifest options') | 195 group = init_optparse.add_option_group('Manifest options') |
172 group.add_option('-u', '--manifest-url', | 196 group.add_option('-u', '--manifest-url', |
173 dest='manifest_url', | 197 dest='manifest_url', |
174 help='manifest repository location', metavar='URL') | 198 help='manifest repository location', metavar='URL') |
175 group.add_option('-b', '--manifest-branch', | 199 group.add_option('-b', '--manifest-branch', |
176 dest='manifest_branch', | 200 dest='manifest_branch', |
177 help='manifest branch or revision', metavar='REVISION') | 201 help='manifest branch or revision', metavar='REVISION') |
178 group.add_option('-m', '--manifest-name', | 202 group.add_option('-m', '--manifest-name', |
179 dest='manifest_name', | 203 dest='manifest_name', |
180 help='initial manifest file', metavar='NAME.xml') | 204 help='initial manifest file', metavar='NAME.xml') |
181 group.add_option('--mirror', | 205 group.add_option('--mirror', |
182 dest='mirror', action='store_true', | 206 dest='mirror', action='store_true', |
183 help='mirror the forrest') | 207 help='create a replica of the remote repositories ' |
| 208 'rather than a client working directory') |
184 group.add_option('--reference', | 209 group.add_option('--reference', |
185 dest='reference', | 210 dest='reference', |
186 help='location of mirror directory', metavar='DIR') | 211 help='location of mirror directory', metavar='DIR') |
187 group.add_option('--depth', type='int', default=None, | 212 group.add_option('--depth', type='int', default=None, |
188 dest='depth', | 213 dest='depth', |
189 help='create a shallow clone with given depth; see git clone') | 214 help='create a shallow clone with given depth; see git clone') |
| 215 group.add_option('--archive', |
| 216 dest='archive', action='store_true', |
| 217 help='checkout an archive instead of a git repository for ' |
| 218 'each project. See git archive.') |
190 group.add_option('-g', '--groups', | 219 group.add_option('-g', '--groups', |
191 dest='groups', default='default', | 220 dest='groups', default='default', |
192 help='restrict manifest projects to ones with a specified group
', | 221 help='restrict manifest projects to ones with specified ' |
| 222 'group(s) [default|all|G1,G2,G3|G4,-G5,-G6]', |
193 metavar='GROUP') | 223 metavar='GROUP') |
194 group.add_option('-p', '--platform', | 224 group.add_option('-p', '--platform', |
195 dest='platform', default="auto", | 225 dest='platform', default="auto", |
196 help='restrict manifest projects to ones with a specified ' | 226 help='restrict manifest projects to ones with a specified ' |
197 'platform group [auto|all|none|linux|darwin|...]', | 227 'platform group [auto|all|none|linux|darwin|...]', |
198 metavar='PLATFORM') | 228 metavar='PLATFORM') |
199 | 229 |
200 | 230 |
201 # Tool | 231 # Tool |
202 group = init_optparse.add_option_group('repo Version options') | 232 group = init_optparse.add_option_group('repo Version options') |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 extra_args.append('--repo-url=%s' % url) | 265 extra_args.append('--repo-url=%s' % url) |
236 | 266 |
237 branch = opt.repo_branch | 267 branch = opt.repo_branch |
238 if not branch: | 268 if not branch: |
239 branch = REPO_REV | 269 branch = REPO_REV |
240 extra_args.append('--repo-branch=%s' % branch) | 270 extra_args.append('--repo-branch=%s' % branch) |
241 | 271 |
242 if branch.startswith('refs/heads/'): | 272 if branch.startswith('refs/heads/'): |
243 branch = branch[len('refs/heads/'):] | 273 branch = branch[len('refs/heads/'):] |
244 if branch.startswith('refs/'): | 274 if branch.startswith('refs/'): |
245 print >>sys.stderr, "fatal: invalid branch name '%s'" % branch | 275 _print("fatal: invalid branch name '%s'" % branch, file=sys.stderr) |
246 raise CloneFailure() | 276 raise CloneFailure() |
247 | 277 |
248 if not os.path.isdir(repodir): | 278 try: |
249 try: | 279 os.mkdir(repodir) |
250 os.mkdir(repodir) | 280 except OSError as e: |
251 except OSError as e: | 281 if e.errno != errno.EEXIST: |
252 print >>sys.stderr, \ | 282 _print('fatal: cannot make %s directory: %s' |
253 'fatal: cannot make %s directory: %s' % ( | 283 % (repodir, e.strerror), file=sys.stderr) |
254 repodir, e.strerror) | 284 # Don't raise CloneFailure; that would delete the |
255 # Don't faise CloneFailure; that would delete the | |
256 # name. Instead exit immediately. | 285 # name. Instead exit immediately. |
257 # | 286 # |
258 sys.exit(1) | 287 sys.exit(1) |
259 | 288 |
260 _CheckGitVersion() | 289 _CheckGitVersion() |
261 try: | 290 try: |
262 if NeedSetupGnuPG(): | 291 if NeedSetupGnuPG(): |
263 can_verify = SetupGnuPG(opt.quiet) | 292 can_verify = SetupGnuPG(opt.quiet) |
264 else: | 293 else: |
265 can_verify = True | 294 can_verify = True |
266 | 295 |
267 dst = os.path.abspath(os.path.join(repodir, S_repo)) | 296 dst = os.path.abspath(os.path.join(repodir, S_repo)) |
268 _Clone(url, dst, opt.quiet) | 297 _Clone(url, dst, opt.quiet) |
269 | 298 |
270 if can_verify and not opt.no_repo_verify: | 299 if can_verify and not opt.no_repo_verify: |
271 rev = _Verify(dst, branch, opt.quiet) | 300 rev = _Verify(dst, branch, opt.quiet) |
272 else: | 301 else: |
273 rev = 'refs/remotes/origin/%s^0' % branch | 302 rev = 'refs/remotes/origin/%s^0' % branch |
274 | 303 |
275 _Checkout(dst, branch, rev, opt.quiet) | 304 _Checkout(dst, branch, rev, opt.quiet) |
276 except CloneFailure: | 305 except CloneFailure: |
277 if opt.quiet: | 306 if opt.quiet: |
278 print >>sys.stderr, \ | 307 _print('fatal: repo init failed; run without --quiet to see why', |
279 'fatal: repo init failed; run without --quiet to see why' | 308 file=sys.stderr) |
280 raise | 309 raise |
281 | 310 |
282 | 311 |
| 312 def ParseGitVersion(ver_str): |
| 313 if not ver_str.startswith('git version '): |
| 314 return None |
| 315 |
| 316 num_ver_str = ver_str[len('git version '):].strip().split('-')[0] |
| 317 to_tuple = [] |
| 318 for num_str in num_ver_str.split('.')[:3]: |
| 319 if num_str.isdigit(): |
| 320 to_tuple.append(int(num_str)) |
| 321 else: |
| 322 to_tuple.append(0) |
| 323 return tuple(to_tuple) |
| 324 |
| 325 |
283 def _CheckGitVersion(): | 326 def _CheckGitVersion(): |
284 cmd = [GIT, '--version'] | 327 cmd = [GIT, '--version'] |
285 try: | 328 try: |
286 proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) | 329 proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) |
287 except OSError as e: | 330 except OSError as e: |
288 print >>sys.stderr | 331 _print(file=sys.stderr) |
289 print >>sys.stderr, "fatal: '%s' is not available" % GIT | 332 _print("fatal: '%s' is not available" % GIT, file=sys.stderr) |
290 print >>sys.stderr, 'fatal: %s' % e | 333 _print('fatal: %s' % e, file=sys.stderr) |
291 print >>sys.stderr | 334 _print(file=sys.stderr) |
292 print >>sys.stderr, 'Please make sure %s is installed'\ | 335 _print('Please make sure %s is installed and in your path.' % GIT, |
293 ' and in your path.' % GIT | 336 file=sys.stderr) |
294 raise CloneFailure() | 337 raise CloneFailure() |
295 | 338 |
296 ver_str = proc.stdout.read().strip() | 339 ver_str = proc.stdout.read().strip() |
297 proc.stdout.close() | 340 proc.stdout.close() |
298 proc.wait() | 341 proc.wait() |
299 | 342 |
300 if not ver_str.startswith('git version '): | 343 ver_act = ParseGitVersion(ver_str) |
301 print >>sys.stderr, 'error: "%s" unsupported' % ver_str | 344 if ver_act is None: |
| 345 _print('error: "%s" unsupported' % ver_str, file=sys.stderr) |
302 raise CloneFailure() | 346 raise CloneFailure() |
303 | 347 |
304 ver_str = ver_str[len('git version '):].strip() | |
305 ver_act = tuple(map(lambda x: int(x), ver_str.split('.')[0:3])) | |
306 if ver_act < MIN_GIT_VERSION: | 348 if ver_act < MIN_GIT_VERSION: |
307 need = '.'.join(map(lambda x: str(x), MIN_GIT_VERSION)) | 349 need = '.'.join(map(str, MIN_GIT_VERSION)) |
308 print >>sys.stderr, 'fatal: git %s or later required' % need | 350 _print('fatal: git %s or later required' % need, file=sys.stderr) |
309 raise CloneFailure() | 351 raise CloneFailure() |
310 | 352 |
311 | 353 |
312 def NeedSetupGnuPG(): | 354 def NeedSetupGnuPG(): |
313 if not os.path.isdir(home_dot_repo): | 355 if not os.path.isdir(home_dot_repo): |
314 return True | 356 return True |
315 | 357 |
316 kv = os.path.join(home_dot_repo, 'keyring-version') | 358 kv = os.path.join(home_dot_repo, 'keyring-version') |
317 if not os.path.exists(kv): | 359 if not os.path.exists(kv): |
318 return True | 360 return True |
319 | 361 |
320 kv = open(kv).read() | 362 kv = open(kv).read() |
321 if not kv: | 363 if not kv: |
322 return True | 364 return True |
323 | 365 |
324 kv = tuple(map(lambda x: int(x), kv.split('.'))) | 366 kv = tuple(map(int, kv.split('.'))) |
325 if kv < KEYRING_VERSION: | 367 if kv < KEYRING_VERSION: |
326 return True | 368 return True |
327 return False | 369 return False |
328 | 370 |
329 | 371 |
330 def SetupGnuPG(quiet): | 372 def SetupGnuPG(quiet): |
331 if not os.path.isdir(home_dot_repo): | 373 try: |
332 try: | 374 os.mkdir(home_dot_repo) |
333 os.mkdir(home_dot_repo) | 375 except OSError as e: |
334 except OSError as e: | 376 if e.errno != errno.EEXIST: |
335 print >>sys.stderr, \ | 377 _print('fatal: cannot make %s directory: %s' |
336 'fatal: cannot make %s directory: %s' % ( | 378 % (home_dot_repo, e.strerror), file=sys.stderr) |
337 home_dot_repo, e.strerror) | |
338 sys.exit(1) | 379 sys.exit(1) |
339 | 380 |
340 if not os.path.isdir(gpg_dir): | 381 try: |
341 try: | 382 os.mkdir(gpg_dir, stat.S_IRWXU) |
342 os.mkdir(gpg_dir, 0700) | 383 except OSError as e: |
343 except OSError as e: | 384 if e.errno != errno.EEXIST: |
344 print >>sys.stderr, \ | 385 _print('fatal: cannot make %s directory: %s' % (gpg_dir, e.strerror), |
345 'fatal: cannot make %s directory: %s' % ( | 386 file=sys.stderr) |
346 gpg_dir, e.strerror) | |
347 sys.exit(1) | 387 sys.exit(1) |
348 | 388 |
349 env = os.environ.copy() | 389 env = os.environ.copy() |
350 env['GNUPGHOME'] = gpg_dir.encode() | 390 env['GNUPGHOME'] = gpg_dir.encode() |
351 | 391 |
352 cmd = ['gpg', '--import'] | 392 cmd = ['gpg', '--import'] |
353 try: | 393 try: |
354 proc = subprocess.Popen(cmd, | 394 proc = subprocess.Popen(cmd, |
355 env = env, | 395 env = env, |
356 stdin = subprocess.PIPE) | 396 stdin = subprocess.PIPE) |
357 except OSError as e: | 397 except OSError as e: |
358 if not quiet: | 398 if not quiet: |
359 print >>sys.stderr, 'warning: gpg (GnuPG) is not available.' | 399 _print('warning: gpg (GnuPG) is not available.', file=sys.stderr) |
360 print >>sys.stderr, 'warning: Installing it is strongly encouraged.' | 400 _print('warning: Installing it is strongly encouraged.', file=sys.stderr) |
361 print >>sys.stderr | 401 _print(file=sys.stderr) |
362 return False | 402 return False |
363 | 403 |
364 proc.stdin.write(MAINTAINER_KEYS) | 404 proc.stdin.write(MAINTAINER_KEYS) |
365 proc.stdin.close() | 405 proc.stdin.close() |
366 | 406 |
367 if proc.wait() != 0: | 407 if proc.wait() != 0: |
368 print >>sys.stderr, 'fatal: registering repo maintainer keys failed' | 408 _print('fatal: registering repo maintainer keys failed', file=sys.stderr) |
369 sys.exit(1) | 409 sys.exit(1) |
370 print | 410 _print() |
371 | 411 |
372 fd = open(os.path.join(home_dot_repo, 'keyring-version'), 'w') | 412 fd = open(os.path.join(home_dot_repo, 'keyring-version'), 'w') |
373 fd.write('.'.join(map(lambda x: str(x), KEYRING_VERSION)) + '\n') | 413 fd.write('.'.join(map(str, KEYRING_VERSION)) + '\n') |
374 fd.close() | 414 fd.close() |
375 return True | 415 return True |
376 | 416 |
377 | 417 |
378 def _SetConfig(local, name, value): | 418 def _SetConfig(local, name, value): |
379 """Set a git configuration option to the specified value. | 419 """Set a git configuration option to the specified value. |
380 """ | 420 """ |
381 cmd = [GIT, 'config', name, value] | 421 cmd = [GIT, 'config', name, value] |
382 if subprocess.Popen(cmd, cwd = local).wait() != 0: | 422 if subprocess.Popen(cmd, cwd = local).wait() != 0: |
383 raise CloneFailure() | 423 raise CloneFailure() |
384 | 424 |
385 | 425 |
386 def _InitHttp(): | 426 def _InitHttp(): |
387 handlers = [] | 427 handlers = [] |
388 | 428 |
389 mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() | 429 mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() |
390 try: | 430 try: |
391 import netrc | 431 import netrc |
392 n = netrc.netrc() | 432 n = netrc.netrc() |
393 for host in n.hosts: | 433 for host in n.hosts: |
394 p = n.hosts[host] | 434 p = n.hosts[host] |
395 mgr.add_password(p[1], 'http://%s/' % host, p[0], p[2]) | 435 mgr.add_password(p[1], 'http://%s/' % host, p[0], p[2]) |
396 mgr.add_password(p[1], 'https://%s/' % host, p[0], p[2]) | 436 mgr.add_password(p[1], 'https://%s/' % host, p[0], p[2]) |
397 except: | 437 except: |
398 pass | 438 pass |
399 handlers.append(urllib2.HTTPBasicAuthHandler(mgr)) | 439 handlers.append(urllib.request.HTTPBasicAuthHandler(mgr)) |
400 handlers.append(urllib2.HTTPDigestAuthHandler(mgr)) | 440 handlers.append(urllib.request.HTTPDigestAuthHandler(mgr)) |
401 | 441 |
402 if 'http_proxy' in os.environ: | 442 if 'http_proxy' in os.environ: |
403 url = os.environ['http_proxy'] | 443 url = os.environ['http_proxy'] |
404 handlers.append(urllib2.ProxyHandler({'http': url, 'https': url})) | 444 handlers.append(urllib.request.ProxyHandler({'http': url, 'https': url})) |
405 if 'REPO_CURL_VERBOSE' in os.environ: | 445 if 'REPO_CURL_VERBOSE' in os.environ: |
406 handlers.append(urllib2.HTTPHandler(debuglevel=1)) | 446 handlers.append(urllib.request.HTTPHandler(debuglevel=1)) |
407 handlers.append(urllib2.HTTPSHandler(debuglevel=1)) | 447 handlers.append(urllib.request.HTTPSHandler(debuglevel=1)) |
408 urllib2.install_opener(urllib2.build_opener(*handlers)) | 448 urllib.request.install_opener(urllib.request.build_opener(*handlers)) |
409 | 449 |
410 def _Fetch(url, local, src, quiet): | 450 def _Fetch(url, local, src, quiet): |
411 if not quiet: | 451 if not quiet: |
412 print >>sys.stderr, 'Get %s' % url | 452 _print('Get %s' % url, file=sys.stderr) |
413 | 453 |
414 cmd = [GIT, 'fetch'] | 454 cmd = [GIT, 'fetch'] |
415 if quiet: | 455 if quiet: |
416 cmd.append('--quiet') | 456 cmd.append('--quiet') |
417 err = subprocess.PIPE | 457 err = subprocess.PIPE |
418 else: | 458 else: |
419 err = None | 459 err = None |
420 cmd.append(src) | 460 cmd.append(src) |
421 cmd.append('+refs/heads/*:refs/remotes/origin/*') | 461 cmd.append('+refs/heads/*:refs/remotes/origin/*') |
422 cmd.append('refs/tags/*:refs/tags/*') | 462 cmd.append('refs/tags/*:refs/tags/*') |
(...skipping 24 matching lines...) Expand all Loading... |
447 break | 487 break |
448 proc.stdout.close() | 488 proc.stdout.close() |
449 proc.wait() | 489 proc.wait() |
450 | 490 |
451 if not url.startswith('http:') and not url.startswith('https:'): | 491 if not url.startswith('http:') and not url.startswith('https:'): |
452 return False | 492 return False |
453 | 493 |
454 dest = open(os.path.join(local, '.git', 'clone.bundle'), 'w+b') | 494 dest = open(os.path.join(local, '.git', 'clone.bundle'), 'w+b') |
455 try: | 495 try: |
456 try: | 496 try: |
457 r = urllib2.urlopen(url) | 497 r = urllib.request.urlopen(url) |
458 except urllib2.HTTPError as e: | 498 except urllib.error.HTTPError as e: |
459 if e.code == 404: | 499 if e.code in [403, 404]: |
460 return False | 500 return False |
461 print >>sys.stderr, 'fatal: Cannot get %s' % url | 501 _print('fatal: Cannot get %s' % url, file=sys.stderr) |
462 print >>sys.stderr, 'fatal: HTTP error %s' % e.code | 502 _print('fatal: HTTP error %s' % e.code, file=sys.stderr) |
463 raise CloneFailure() | 503 raise CloneFailure() |
464 except urllib2.URLError as e: | 504 except urllib.error.URLError as e: |
465 print >>sys.stderr, 'fatal: Cannot get %s' % url | 505 _print('fatal: Cannot get %s' % url, file=sys.stderr) |
466 print >>sys.stderr, 'fatal: error %s' % e.reason | 506 _print('fatal: error %s' % e.reason, file=sys.stderr) |
467 raise CloneFailure() | 507 raise CloneFailure() |
468 try: | 508 try: |
469 if not quiet: | 509 if not quiet: |
470 print >>sys.stderr, 'Get %s' % url | 510 _print('Get %s' % url, file=sys.stderr) |
471 while True: | 511 while True: |
472 buf = r.read(8192) | 512 buf = r.read(8192) |
473 if buf == '': | 513 if buf == '': |
474 return True | 514 return True |
475 dest.write(buf) | 515 dest.write(buf) |
476 finally: | 516 finally: |
477 r.close() | 517 r.close() |
478 finally: | 518 finally: |
479 dest.close() | 519 dest.close() |
480 | 520 |
481 def _ImportBundle(local): | 521 def _ImportBundle(local): |
482 path = os.path.join(local, '.git', 'clone.bundle') | 522 path = os.path.join(local, '.git', 'clone.bundle') |
483 try: | 523 try: |
484 _Fetch(local, local, path, True) | 524 _Fetch(local, local, path, True) |
485 finally: | 525 finally: |
486 os.remove(path) | 526 os.remove(path) |
487 | 527 |
488 def _Clone(url, local, quiet): | 528 def _Clone(url, local, quiet): |
489 """Clones a git repository to a new subdirectory of repodir | 529 """Clones a git repository to a new subdirectory of repodir |
490 """ | 530 """ |
491 try: | 531 try: |
492 os.mkdir(local) | 532 os.mkdir(local) |
493 except OSError as e: | 533 except OSError as e: |
494 print >>sys.stderr, \ | 534 _print('fatal: cannot make %s directory: %s' % (local, e.strerror), |
495 'fatal: cannot make %s directory: %s' \ | 535 file=sys.stderr) |
496 % (local, e.strerror) | |
497 raise CloneFailure() | 536 raise CloneFailure() |
498 | 537 |
499 cmd = [GIT, 'init', '--quiet'] | 538 cmd = [GIT, 'init', '--quiet'] |
500 try: | 539 try: |
501 proc = subprocess.Popen(cmd, cwd = local) | 540 proc = subprocess.Popen(cmd, cwd = local) |
502 except OSError as e: | 541 except OSError as e: |
503 print >>sys.stderr | 542 _print(file=sys.stderr) |
504 print >>sys.stderr, "fatal: '%s' is not available" % GIT | 543 _print("fatal: '%s' is not available" % GIT, file=sys.stderr) |
505 print >>sys.stderr, 'fatal: %s' % e | 544 _print('fatal: %s' % e, file=sys.stderr) |
506 print >>sys.stderr | 545 _print(file=sys.stderr) |
507 print >>sys.stderr, 'Please make sure %s is installed'\ | 546 _print('Please make sure %s is installed and in your path.' % GIT, |
508 ' and in your path.' % GIT | 547 file=sys.stderr) |
509 raise CloneFailure() | 548 raise CloneFailure() |
510 if proc.wait() != 0: | 549 if proc.wait() != 0: |
511 print >>sys.stderr, 'fatal: could not create %s' % local | 550 _print('fatal: could not create %s' % local, file=sys.stderr) |
512 raise CloneFailure() | 551 raise CloneFailure() |
513 | 552 |
514 _InitHttp() | 553 _InitHttp() |
515 _SetConfig(local, 'remote.origin.url', url) | 554 _SetConfig(local, 'remote.origin.url', url) |
516 _SetConfig(local, 'remote.origin.fetch', | 555 _SetConfig(local, 'remote.origin.fetch', |
517 '+refs/heads/*:refs/remotes/origin/*') | 556 '+refs/heads/*:refs/remotes/origin/*') |
518 if _DownloadBundle(url, local, quiet): | 557 if _DownloadBundle(url, local, quiet): |
519 _ImportBundle(local) | 558 _ImportBundle(local) |
520 else: | 559 else: |
521 _Fetch(url, local, 'origin', quiet) | 560 _Fetch(url, local, 'origin', quiet) |
522 | 561 |
523 | 562 |
524 def _Verify(cwd, branch, quiet): | 563 def _Verify(cwd, branch, quiet): |
525 """Verify the branch has been signed by a tag. | 564 """Verify the branch has been signed by a tag. |
526 """ | 565 """ |
527 cmd = [GIT, 'describe', 'origin/%s' % branch] | 566 cmd = [GIT, 'describe', 'origin/%s' % branch] |
528 proc = subprocess.Popen(cmd, | 567 proc = subprocess.Popen(cmd, |
529 stdout=subprocess.PIPE, | 568 stdout=subprocess.PIPE, |
530 stderr=subprocess.PIPE, | 569 stderr=subprocess.PIPE, |
531 cwd = cwd) | 570 cwd = cwd) |
532 cur = proc.stdout.read().strip() | 571 cur = proc.stdout.read().strip() |
533 proc.stdout.close() | 572 proc.stdout.close() |
534 | 573 |
535 proc.stderr.read() | 574 proc.stderr.read() |
536 proc.stderr.close() | 575 proc.stderr.close() |
537 | 576 |
538 if proc.wait() != 0 or not cur: | 577 if proc.wait() != 0 or not cur: |
539 print >>sys.stderr | 578 _print(file=sys.stderr) |
540 print >>sys.stderr,\ | 579 _print("fatal: branch '%s' has not been signed" % branch, file=sys.stderr) |
541 "fatal: branch '%s' has not been signed" \ | |
542 % branch | |
543 raise CloneFailure() | 580 raise CloneFailure() |
544 | 581 |
545 m = re.compile(r'^(.*)-[0-9]{1,}-g[0-9a-f]{1,}$').match(cur) | 582 m = re.compile(r'^(.*)-[0-9]{1,}-g[0-9a-f]{1,}$').match(cur) |
546 if m: | 583 if m: |
547 cur = m.group(1) | 584 cur = m.group(1) |
548 if not quiet: | 585 if not quiet: |
549 print >>sys.stderr | 586 _print(file=sys.stderr) |
550 print >>sys.stderr, \ | 587 _print("info: Ignoring branch '%s'; using tagged release '%s'" |
551 "info: Ignoring branch '%s'; using tagged release '%s'" \ | 588 % (branch, cur), file=sys.stderr) |
552 % (branch, cur) | 589 _print(file=sys.stderr) |
553 print >>sys.stderr | |
554 | 590 |
555 env = os.environ.copy() | 591 env = os.environ.copy() |
556 env['GNUPGHOME'] = gpg_dir.encode() | 592 env['GNUPGHOME'] = gpg_dir.encode() |
557 | 593 |
558 cmd = [GIT, 'tag', '-v', cur] | 594 cmd = [GIT, 'tag', '-v', cur] |
559 proc = subprocess.Popen(cmd, | 595 proc = subprocess.Popen(cmd, |
560 stdout = subprocess.PIPE, | 596 stdout = subprocess.PIPE, |
561 stderr = subprocess.PIPE, | 597 stderr = subprocess.PIPE, |
562 cwd = cwd, | 598 cwd = cwd, |
563 env = env) | 599 env = env) |
564 out = proc.stdout.read() | 600 out = proc.stdout.read() |
565 proc.stdout.close() | 601 proc.stdout.close() |
566 | 602 |
567 err = proc.stderr.read() | 603 err = proc.stderr.read() |
568 proc.stderr.close() | 604 proc.stderr.close() |
569 | 605 |
570 if proc.wait() != 0: | 606 if proc.wait() != 0: |
571 print >>sys.stderr | 607 _print(file=sys.stderr) |
572 print >>sys.stderr, out | 608 _print(out, file=sys.stderr) |
573 print >>sys.stderr, err | 609 _print(err, file=sys.stderr) |
574 print >>sys.stderr | 610 _print(file=sys.stderr) |
575 raise CloneFailure() | 611 raise CloneFailure() |
576 return '%s^0' % cur | 612 return '%s^0' % cur |
577 | 613 |
578 | 614 |
579 def _Checkout(cwd, branch, rev, quiet): | 615 def _Checkout(cwd, branch, rev, quiet): |
580 """Checkout an upstream branch into the repository and track it. | 616 """Checkout an upstream branch into the repository and track it. |
581 """ | 617 """ |
582 cmd = [GIT, 'update-ref', 'refs/heads/default', rev] | 618 cmd = [GIT, 'update-ref', 'refs/heads/default', rev] |
583 if subprocess.Popen(cmd, cwd = cwd).wait() != 0: | 619 if subprocess.Popen(cmd, cwd = cwd).wait() != 0: |
584 raise CloneFailure() | 620 raise CloneFailure() |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 | 654 |
619 class _Options: | 655 class _Options: |
620 help = False | 656 help = False |
621 | 657 |
622 | 658 |
623 def _ParseArguments(args): | 659 def _ParseArguments(args): |
624 cmd = None | 660 cmd = None |
625 opt = _Options() | 661 opt = _Options() |
626 arg = [] | 662 arg = [] |
627 | 663 |
628 for i in xrange(0, len(args)): | 664 for i in range(len(args)): |
629 a = args[i] | 665 a = args[i] |
630 if a == '-h' or a == '--help': | 666 if a == '-h' or a == '--help': |
631 opt.help = True | 667 opt.help = True |
632 | 668 |
633 elif not a.startswith('-'): | 669 elif not a.startswith('-'): |
634 cmd = a | 670 cmd = a |
635 arg = args[i + 1:] | 671 arg = args[i + 1:] |
636 break | 672 break |
637 return cmd, opt, arg | 673 return cmd, opt, arg |
638 | 674 |
639 | 675 |
640 def _Usage(): | 676 def _Usage(): |
641 print >>sys.stderr,\ | 677 _print( |
642 """usage: repo COMMAND [ARGS] | 678 """usage: repo COMMAND [ARGS] |
643 | 679 |
644 repo is not yet installed. Use "repo init" to install it here. | 680 repo is not yet installed. Use "repo init" to install it here. |
645 | 681 |
646 The most commonly used repo commands are: | 682 The most commonly used repo commands are: |
647 | 683 |
648 init Install repo in the current working directory | 684 init Install repo in the current working directory |
649 help Display detailed help on a command | 685 help Display detailed help on a command |
650 | 686 |
651 For access to the full online help, install repo ("repo init"). | 687 For access to the full online help, install repo ("repo init"). |
652 """ | 688 """, file=sys.stderr) |
653 sys.exit(1) | 689 sys.exit(1) |
654 | 690 |
655 | 691 |
656 def _Help(args): | 692 def _Help(args): |
657 if args: | 693 if args: |
658 if args[0] == 'init': | 694 if args[0] == 'init': |
659 init_optparse.print_help() | 695 init_optparse.print_help() |
660 sys.exit(0) | 696 sys.exit(0) |
661 else: | 697 else: |
662 print >>sys.stderr,\ | 698 _print("error: '%s' is not a bootstrap command.\n" |
663 "error: '%s' is not a bootstrap command.\n"\ | 699 ' For access to online help, install repo ("repo init").' |
664 ' For access to online help, install repo ("repo init").'\ | 700 % args[0], file=sys.stderr) |
665 % args[0] | |
666 else: | 701 else: |
667 _Usage() | 702 _Usage() |
668 sys.exit(1) | 703 sys.exit(1) |
669 | 704 |
670 | 705 |
671 def _NotInstalled(): | 706 def _NotInstalled(): |
672 print >>sys.stderr,\ | 707 _print('error: repo is not installed. Use "repo init" to install it here.', |
673 'error: repo is not installed. Use "repo init" to install it here.' | 708 file=sys.stderr) |
674 sys.exit(1) | 709 sys.exit(1) |
675 | 710 |
676 | 711 |
677 def _NoCommands(cmd): | 712 def _NoCommands(cmd): |
678 print >>sys.stderr,\ | 713 _print("""error: command '%s' requires repo to be installed first. |
679 """error: command '%s' requires repo to be installed first. | 714 Use "repo init" to install it here.""" % cmd, file=sys.stderr) |
680 Use "repo init" to install it here.""" % cmd | |
681 sys.exit(1) | 715 sys.exit(1) |
682 | 716 |
683 | 717 |
684 def _RunSelf(wrapper_path): | 718 def _RunSelf(wrapper_path): |
685 my_dir = os.path.dirname(wrapper_path) | 719 my_dir = os.path.dirname(wrapper_path) |
686 my_main = os.path.join(my_dir, 'main.py') | 720 my_main = os.path.join(my_dir, 'main.py') |
687 my_git = os.path.join(my_dir, '.git') | 721 my_git = os.path.join(my_dir, '.git') |
688 | 722 |
689 if os.path.isfile(my_main) and os.path.isdir(my_git): | 723 if os.path.isfile(my_main) and os.path.isdir(my_git): |
690 for name in ['git_config.py', | 724 for name in ['git_config.py', |
(...skipping 16 matching lines...) Expand all Loading... |
707 'HEAD'], | 741 'HEAD'], |
708 stdout = subprocess.PIPE, | 742 stdout = subprocess.PIPE, |
709 stderr = subprocess.PIPE) | 743 stderr = subprocess.PIPE) |
710 REPO_REV = proc.stdout.read().strip() | 744 REPO_REV = proc.stdout.read().strip() |
711 proc.stdout.close() | 745 proc.stdout.close() |
712 | 746 |
713 proc.stderr.read() | 747 proc.stderr.read() |
714 proc.stderr.close() | 748 proc.stderr.close() |
715 | 749 |
716 if proc.wait() != 0: | 750 if proc.wait() != 0: |
717 print >>sys.stderr, 'fatal: %s has no current branch' % gitdir | 751 _print('fatal: %s has no current branch' % gitdir, file=sys.stderr) |
718 sys.exit(1) | 752 sys.exit(1) |
719 | 753 |
720 | 754 |
721 def main(orig_args): | 755 def main(orig_args): |
722 repo_main, rel_repo_dir = _FindRepo() | 756 repo_main, rel_repo_dir = _FindRepo() |
723 cmd, opt, args = _ParseArguments(orig_args) | 757 cmd, opt, args = _ParseArguments(orig_args) |
724 | 758 |
725 wrapper_path = os.path.abspath(__file__) | 759 wrapper_path = os.path.abspath(__file__) |
726 my_main, my_git = _RunSelf(wrapper_path) | 760 my_main, my_git = _RunSelf(wrapper_path) |
727 | 761 |
(...skipping 20 matching lines...) Expand all Loading... |
748 repo_main, rel_repo_dir = _FindRepo() | 782 repo_main, rel_repo_dir = _FindRepo() |
749 else: | 783 else: |
750 _NoCommands(cmd) | 784 _NoCommands(cmd) |
751 | 785 |
752 if cmd == 'sync' and NeedSetupGnuPG(): | 786 if cmd == 'sync' and NeedSetupGnuPG(): |
753 SetupGnuPG(False) | 787 SetupGnuPG(False) |
754 | 788 |
755 if my_main: | 789 if my_main: |
756 repo_main = my_main | 790 repo_main = my_main |
757 | 791 |
758 ver_str = '.'.join(map(lambda x: str(x), VERSION)) | 792 ver_str = '.'.join(map(str, VERSION)) |
759 me = [repo_main, | 793 me = [sys.executable, repo_main, |
760 '--repo-dir=%s' % rel_repo_dir, | 794 '--repo-dir=%s' % rel_repo_dir, |
761 '--wrapper-version=%s' % ver_str, | 795 '--wrapper-version=%s' % ver_str, |
762 '--wrapper-path=%s' % wrapper_path, | 796 '--wrapper-path=%s' % wrapper_path, |
763 '--'] | 797 '--'] |
764 me.extend(orig_args) | 798 me.extend(orig_args) |
765 me.extend(extra_args) | 799 me.extend(extra_args) |
766 try: | 800 try: |
767 os.execv(repo_main, me) | 801 os.execv(sys.executable, me) |
768 except OSError as e: | 802 except OSError as e: |
769 print >>sys.stderr, "fatal: unable to start %s" % repo_main | 803 _print("fatal: unable to start %s" % repo_main, file=sys.stderr) |
770 print >>sys.stderr, "fatal: %s" % e | 804 _print("fatal: %s" % e, file=sys.stderr) |
771 sys.exit(148) | 805 sys.exit(148) |
772 | 806 |
773 | 807 |
774 if __name__ == '__main__': | 808 if __name__ == '__main__': |
775 main(sys.argv[1:]) | 809 main(sys.argv[1:]) |
OLD | NEW |