OLD | NEW |
1 # Copyright 2009 Google Inc. All Rights Reserved. | 1 # Copyright 2009 Google Inc. All Rights Reserved. |
2 # | 2 # |
3 # Licensed under the Apache License, Version 2.0 (the "License"); | 3 # Licensed under the Apache License, Version 2.0 (the "License"); |
4 # you may not use this file except in compliance with the License. | 4 # you may not use this file except in compliance with the License. |
5 # You may obtain a copy of the License at | 5 # You may obtain a copy of the License at |
6 # | 6 # |
7 # http://www.apache.org/licenses/LICENSE-2.0 | 7 # http://www.apache.org/licenses/LICENSE-2.0 |
8 # | 8 # |
9 # Unless required by applicable law or agreed to in writing, software | 9 # Unless required by applicable law or agreed to in writing, software |
10 # distributed under the License is distributed on an "AS IS" BASIS, | 10 # distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 command, self.scm_name)) | 89 command, self.scm_name)) |
90 | 90 |
91 return getattr(self, command)(options, args, file_list) | 91 return getattr(self, command)(options, args, file_list) |
92 | 92 |
93 | 93 |
94 class GitWrapper(SCMWrapper): | 94 class GitWrapper(SCMWrapper): |
95 """Wrapper for Git""" | 95 """Wrapper for Git""" |
96 | 96 |
97 def cleanup(self, options, args, file_list): | 97 def cleanup(self, options, args, file_list): |
98 """Cleanup working copy.""" | 98 """Cleanup working copy.""" |
99 self._RunGit(['prune']) | 99 self._RunGit(['prune'], redirect_stdout=False) |
100 self._RunGit(['fsck']) | 100 self._RunGit(['fsck'], redirect_stdout=False) |
101 self._RunGit(['gc']) | 101 self._RunGit(['gc'], redirect_stdout=False) |
102 | 102 |
103 def diff(self, options, args, file_list): | 103 def diff(self, options, args, file_list): |
104 # NOTE: This function does not currently modify file_list. | 104 # NOTE: This function does not currently modify file_list. |
105 merge_base = self._RunGit(['merge-base', 'HEAD', 'origin']) | 105 merge_base = self._RunGit(['merge-base', 'HEAD', 'origin']) |
106 print self._RunGit(['diff', merge_base]) | 106 self._RunGit(['diff', merge_base], redirect_stdout=False) |
107 | 107 |
108 def export(self, options, args, file_list): | 108 def export(self, options, args, file_list): |
109 assert len(args) == 1 | 109 assert len(args) == 1 |
110 export_path = os.path.abspath(os.path.join(args[0], self.relpath)) | 110 export_path = os.path.abspath(os.path.join(args[0], self.relpath)) |
111 if not os.path.exists(export_path): | 111 if not os.path.exists(export_path): |
112 os.makedirs(export_path) | 112 os.makedirs(export_path) |
113 self._RunGit(['checkout-index', '-a', '--prefix=%s/' % export_path]) | 113 self._RunGit(['checkout-index', '-a', '--prefix=%s/' % export_path], |
| 114 redirect_stdout=False) |
114 | 115 |
115 def update(self, options, args, file_list): | 116 def update(self, options, args, file_list): |
116 """Runs git to update or transparently checkout the working copy. | 117 """Runs git to update or transparently checkout the working copy. |
117 | 118 |
118 All updated files will be appended to file_list. | 119 All updated files will be appended to file_list. |
119 | 120 |
120 Raises: | 121 Raises: |
121 Error: if can't get URL for relative path. | 122 Error: if can't get URL for relative path. |
122 """ | 123 """ |
123 | 124 |
124 if args: | 125 if args: |
125 raise gclient_utils.Error("Unsupported argument(s): %s" % ",".join(args)) | 126 raise gclient_utils.Error("Unsupported argument(s): %s" % ",".join(args)) |
126 | 127 |
127 components = self.url.split("@") | 128 components = self.url.split("@") |
128 url = components[0] | 129 url = components[0] |
129 revision = None | 130 revision = None |
130 if options.revision: | 131 if options.revision: |
131 revision = options.revision | 132 revision = options.revision |
132 elif len(components) == 2: | 133 elif len(components) == 2: |
133 revision = components[1] | 134 revision = components[1] |
134 | 135 |
135 if not os.path.exists(self.checkout_path): | 136 if not os.path.exists(self.checkout_path): |
136 self._RunGit(['clone', '-q', url, self.checkout_path], cwd=self._root_dir) | 137 self._RunGit(['clone', url, self.checkout_path], |
| 138 cwd=self._root_dir, redirect_stdout=False) |
137 if revision: | 139 if revision: |
138 self._RunGit(['reset', '--hard', revision]) | 140 self._RunGit(['reset', '--hard', revision], redirect_stdout=False) |
139 files = self._RunGit(['ls-files']).split() | 141 files = self._RunGit(['ls-files']).split() |
140 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) | 142 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) |
141 return | 143 return |
142 | 144 |
143 self._RunGit(['remote', 'update']) | 145 self._RunGit(['remote', 'update'], redirect_stdout=False) |
144 new_base = 'origin' | 146 new_base = 'origin' |
145 if revision: | 147 if revision: |
146 new_base = revision | 148 new_base = revision |
147 files = self._RunGit(['diff', new_base, '--name-only']).split() | 149 files = self._RunGit(['diff', new_base, '--name-only']).split() |
148 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) | 150 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) |
149 self._RunGit(['rebase', new_base]) | 151 self._RunGit(['rebase', new_base], redirect_stdout=False) |
150 | 152 |
151 def revert(self, options, args, file_list): | 153 def revert(self, options, args, file_list): |
152 """Reverts local modifications. | 154 """Reverts local modifications. |
153 | 155 |
154 All reverted files will be appended to file_list. | 156 All reverted files will be appended to file_list. |
155 """ | 157 """ |
156 path = os.path.join(self._root_dir, self.relpath) | 158 path = os.path.join(self._root_dir, self.relpath) |
157 if not os.path.isdir(path): | 159 if not os.path.isdir(path): |
158 # revert won't work if the directory doesn't exist. It needs to | 160 # revert won't work if the directory doesn't exist. It needs to |
159 # checkout instead. | 161 # checkout instead. |
160 print("\n_____ %s is missing, synching instead" % self.relpath) | 162 print("\n_____ %s is missing, synching instead" % self.relpath) |
161 # Don't reuse the args. | 163 # Don't reuse the args. |
162 return self.update(options, [], file_list) | 164 return self.update(options, [], file_list) |
163 merge_base = self._RunGit(['merge-base', 'HEAD', 'origin']) | 165 merge_base = self._RunGit(['merge-base', 'HEAD', 'origin']) |
164 files = self._RunGit(['diff', merge_base, '--name-only']).split() | 166 files = self._RunGit(['diff', merge_base, '--name-only']).split() |
165 print self._RunGit(['reset', '--hard', merge_base]) | 167 self._RunGit(['reset', '--hard', merge_base], redirect_stdout=False) |
166 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) | 168 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) |
167 | 169 |
168 def runhooks(self, options, args, file_list): | 170 def runhooks(self, options, args, file_list): |
169 self.status(options, args, file_list) | 171 self.status(options, args, file_list) |
170 | 172 |
171 def status(self, options, args, file_list): | 173 def status(self, options, args, file_list): |
172 """Display status information.""" | 174 """Display status information.""" |
173 if not os.path.isdir(self.checkout_path): | 175 if not os.path.isdir(self.checkout_path): |
174 print('\n________ couldn\'t run status in %s:\nThe directory ' | 176 print('\n________ couldn\'t run status in %s:\nThe directory ' |
175 'does not exist.' % checkout_path) | 177 'does not exist.' % checkout_path) |
176 else: | 178 else: |
177 merge_base = self._RunGit(['merge-base', 'HEAD', 'origin']) | 179 merge_base = self._RunGit(['merge-base', 'HEAD', 'origin']) |
178 print self._RunGit(['diff', '--name-status', merge_base]) | 180 self._RunGit(['diff', '--name-status', merge_base], redirect_stdout=False) |
179 files = self._RunGit(['diff', '--name-only', merge_base]).split() | 181 files = self._RunGit(['diff', '--name-only', merge_base]).split() |
180 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) | 182 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) |
181 | 183 |
182 def _RunGit(self, args, cwd=None, checkrc=True): | 184 def _RunGit(self, args, cwd=None, checkrc=True, redirect_stdout=True): |
| 185 stdout=None |
| 186 if redirect_stdout: |
| 187 stdout=subprocess.PIPE |
183 if cwd == None: | 188 if cwd == None: |
184 cwd = self.checkout_path | 189 cwd = self.checkout_path |
185 cmd = ['git'] | 190 cmd = ['git'] |
186 cmd.extend(args) | 191 cmd.extend(args) |
187 sp = subprocess.Popen(cmd, cwd=cwd, stdout=subprocess.PIPE) | 192 sp = subprocess.Popen(cmd, cwd=cwd, stdout=stdout) |
188 if checkrc and sp.returncode: | 193 if checkrc and sp.returncode: |
189 raise gclient_utils.Error('git command %s returned %d' % | 194 raise gclient_utils.Error('git command %s returned %d' % |
190 (args[0], sp.returncode)) | 195 (args[0], sp.returncode)) |
191 return sp.communicate()[0].strip() | 196 output = sp.communicate()[0] |
| 197 if output != None: |
| 198 return output.strip() |
192 | 199 |
193 | 200 |
194 class SVNWrapper(SCMWrapper): | 201 class SVNWrapper(SCMWrapper): |
195 """ Wrapper for SVN """ | 202 """ Wrapper for SVN """ |
196 | 203 |
197 def cleanup(self, options, args, file_list): | 204 def cleanup(self, options, args, file_list): |
198 """Cleanup working copy.""" | 205 """Cleanup working copy.""" |
199 command = ['cleanup'] | 206 command = ['cleanup'] |
200 command.extend(args) | 207 command.extend(args) |
201 RunSVN(command, os.path.join(self._root_dir, self.relpath)) | 208 RunSVN(command, os.path.join(self._root_dir, self.relpath)) |
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 # Col 3 | 769 # Col 3 |
763 if wc_status[0].getAttribute('copied') == 'true': | 770 if wc_status[0].getAttribute('copied') == 'true': |
764 statuses[3] = '+' | 771 statuses[3] = '+' |
765 # Col 4 | 772 # Col 4 |
766 if wc_status[0].getAttribute('switched') == 'true': | 773 if wc_status[0].getAttribute('switched') == 'true': |
767 statuses[4] = 'S' | 774 statuses[4] = 'S' |
768 # TODO(maruel): Col 5 and 6 | 775 # TODO(maruel): Col 5 and 6 |
769 item = (''.join(statuses), file) | 776 item = (''.join(statuses), file) |
770 results.append(item) | 777 results.append(item) |
771 return results | 778 return results |
OLD | NEW |