Merge lp:~jelmer/debian/sid/bzr-git/lintian-fixes into lp:~debian-bazaar/debian/sid/bzr-git/unstable
- Sid (98)
- lintian-fixes
- Merge into unstable
Status: | Rejected |
---|---|
Rejected by: | Jelmer Vernooij |
Proposed branch: | lp:~jelmer/debian/sid/bzr-git/lintian-fixes |
Merge into: | lp:~debian-bazaar/debian/sid/bzr-git/unstable |
Diff against target: |
16937 lines (+25/-16471) 83 files modified
.pc/.quilt_patches (+0/-1) .pc/.quilt_series (+0/-1) .pc/.version (+0/-1) .testr.conf (+0/-4) COPYING (+0/-340) HACKING (+0/-2) INSTALL (+0/-10) Makefile (+0/-70) NEWS (+0/-591) README (+0/-9) TODO (+0/-2) __init__.py (+0/-475) branch.py (+0/-1165) bzr-receive-pack (+0/-15) bzr-upload-pack (+0/-15) cache.py (+0/-1013) commands.py (+0/-351) commit.py (+0/-233) config.py (+0/-63) debian/bzr-builddeb.conf (+0/-2) debian/changelog (+10/-0) debian/compat (+0/-1) debian/control (+9/-16) debian/copyright (+0/-7) debian/manpages (+0/-1) debian/pycompat (+0/-1) debian/rules (+5/-18) debian/source/format (+1/-1) debian/upstream/metadata (+0/-3) debian/upstream/signing-key.asc (+0/-366) debian/watch (+0/-3) dir.py (+0/-546) directory.py (+0/-31) errors.py (+0/-73) fetch.py (+0/-895) filegraph.py (+0/-88) git-remote-bzr (+0/-49) git-remote-bzr.1 (+0/-33) git_remote_helper.py (+0/-207) help.py (+0/-35) hg.py (+0/-81) info.py (+0/-20) mapping.py (+0/-663) notes/git-serve.txt (+0/-16) notes/mapping.txt (+0/-44) notes/roundtripping.txt (+0/-10) object_store.py (+0/-785) po/bzr-git.pot (+0/-73) pristine_tar.py (+0/-107) push.py (+0/-362) refs.py (+0/-186) remote.py (+0/-561) repository.py (+0/-585) revspec.py (+0/-129) roundtrip.py (+0/-174) send.py (+0/-187) server.py (+0/-178) setup.py (+0/-45) tests/__init__.py (+0/-218) tests/test_blackbox.py (+0/-279) tests/test_branch.py (+0/-282) tests/test_builder.py (+0/-258) tests/test_cache.py (+0/-181) tests/test_dir.py (+0/-84) tests/test_fetch.py (+0/-475) tests/test_git_remote_helper.py (+0/-142) tests/test_mapping.py (+0/-388) tests/test_object_store.py (+0/-209) tests/test_pristine_tar.py (+0/-104) tests/test_push.py (+0/-118) tests/test_refs.py (+0/-37) tests/test_remote.py (+0/-66) tests/test_repository.py (+0/-245) tests/test_revspec.py (+0/-31) tests/test_roundtrip.py (+0/-113) tests/test_server.py (+0/-83) tests/test_transportgit.py (+0/-62) tests/test_unpeel_map.py (+0/-51) tests/test_workingtree.py (+0/-34) transportgit.py (+0/-648) tree.py (+0/-408) unpeel_map.py (+0/-96) workingtree.py (+0/-916) |
To merge this branch: | bzr merge lp:~jelmer/debian/sid/bzr-git/lintian-fixes |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Debian/Ubuntu Bazaar Maintainers | Pending | ||
Review via email: mp+361711@code.launchpad.net |
Commit message
Fix some issues reported by lintian
Description of the change
Fix some issues reported by lintian
* Bump debhelper from old 9 to 10.
* Re-export upstream signing key without extra signatures.
This merge proposal was created automatically by the Janitor bot
(https:/
You can follow up to this merge proposal as you normally would.
Build and test logs for this branch can be found at
https:/
- 181. By Jelmer Vernooij
-
Merge new upstream.
- 182. By Jelmer Vernooij
-
Bump debhelper from old 9 to 10.
Fixes lintian: package-
uses-old- debhelper- compat- version
See https://lintian. debian. org/tags/ package- uses-old- debhelper- compat- version. html for more details. - 183. By Jelmer Vernooij
-
Re-export upstream signing key without extra signatures.
Fixes lintian: public-
upstream- key-not- minimal
See https://lintian. debian. org/tags/ public- upstream- key-not- minimal. html for more details. - 184. By Jelmer Vernooij
-
releasing package bzr-git version 0.6.13+bzr1650-1
- 185. By Jelmer Vernooij
-
Add debian/
upstream/ metadata. - 186. By Jelmer Vernooij
-
releasing package bzr-git version 0.6.13+bzr1650-2
- 187. By Jelmer Vernooij
-
Make the package a transitional package to upgrade to brz.
- 188. By Jelmer Vernooij
-
Fix debian/rules.
- 189. By Jelmer Vernooij
-
Move transitional package bzr-git to oldlibs/optional per policy 4.0.1.
Fixes lintian: transitional-
package- should- be-oldlibs- optional
See https://lintian. debian. org/tags/ transitional- package- should- be-oldlibs- optional. html for more details. - 190. By Jelmer Vernooij
-
Add missing dependency on quilt.
Fixes lintian: quilt-series-
but-no- build-dep
See https://lintian. debian. org/tags/ quilt-series- but-no- build-dep. html for more details. - 191. By Jelmer Vernooij
-
Add missing dependency on quilt.
Fixes lintian: quilt-series-
but-no- build-dep
See https://lintian. debian. org/tags/ quilt-series- but-no- build-dep. html for more details.
Unmerged revisions
- 191. By Jelmer Vernooij
-
Add missing dependency on quilt.
Fixes lintian: quilt-series-
but-no- build-dep
See https://lintian. debian. org/tags/ quilt-series- but-no- build-dep. html for more details. - 190. By Jelmer Vernooij
-
Add missing dependency on quilt.
Fixes lintian: quilt-series-
but-no- build-dep
See https://lintian. debian. org/tags/ quilt-series- but-no- build-dep. html for more details. - 189. By Jelmer Vernooij
-
Move transitional package bzr-git to oldlibs/optional per policy 4.0.1.
Fixes lintian: transitional-
package- should- be-oldlibs- optional
See https://lintian. debian. org/tags/ transitional- package- should- be-oldlibs- optional. html for more details.
Preview Diff
1 | === removed directory '.pc' |
2 | === removed file '.pc/.quilt_patches' |
3 | --- .pc/.quilt_patches 2013-05-23 21:05:21 +0000 |
4 | +++ .pc/.quilt_patches 1970-01-01 00:00:00 +0000 |
5 | @@ -1,1 +0,0 @@ |
6 | -debian/patches |
7 | |
8 | === removed file '.pc/.quilt_series' |
9 | --- .pc/.quilt_series 2013-05-23 21:05:21 +0000 |
10 | +++ .pc/.quilt_series 1970-01-01 00:00:00 +0000 |
11 | @@ -1,1 +0,0 @@ |
12 | -series |
13 | |
14 | === removed file '.pc/.version' |
15 | --- .pc/.version 2013-05-23 21:05:21 +0000 |
16 | +++ .pc/.version 1970-01-01 00:00:00 +0000 |
17 | @@ -1,1 +0,0 @@ |
18 | -2 |
19 | |
20 | === removed file '.pc/applied-patches' |
21 | === removed file '.testr.conf' |
22 | --- .testr.conf 2011-02-16 15:32:18 +0000 |
23 | +++ .testr.conf 1970-01-01 00:00:00 +0000 |
24 | @@ -1,4 +0,0 @@ |
25 | -[DEFAULT] |
26 | -test_command=BZR_PLUGINS_AT=git@`pwd` bzr selftest ^bzrlib.plugins.git. Git --subunit $IDOPTION $LISTOPT |
27 | -test_id_option=--load-list $IDFILE |
28 | -test_list_option=--list |
29 | |
30 | === removed file 'COPYING' |
31 | --- COPYING 2006-07-15 12:25:27 +0000 |
32 | +++ COPYING 1970-01-01 00:00:00 +0000 |
33 | @@ -1,340 +0,0 @@ |
34 | - GNU GENERAL PUBLIC LICENSE |
35 | - Version 2, June 1991 |
36 | - |
37 | - Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
38 | - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
39 | - Everyone is permitted to copy and distribute verbatim copies |
40 | - of this license document, but changing it is not allowed. |
41 | - |
42 | - Preamble |
43 | - |
44 | - The licenses for most software are designed to take away your |
45 | -freedom to share and change it. By contrast, the GNU General Public |
46 | -License is intended to guarantee your freedom to share and change free |
47 | -software--to make sure the software is free for all its users. This |
48 | -General Public License applies to most of the Free Software |
49 | -Foundation's software and to any other program whose authors commit to |
50 | -using it. (Some other Free Software Foundation software is covered by |
51 | -the GNU Library General Public License instead.) You can apply it to |
52 | -your programs, too. |
53 | - |
54 | - When we speak of free software, we are referring to freedom, not |
55 | -price. Our General Public Licenses are designed to make sure that you |
56 | -have the freedom to distribute copies of free software (and charge for |
57 | -this service if you wish), that you receive source code or can get it |
58 | -if you want it, that you can change the software or use pieces of it |
59 | -in new free programs; and that you know you can do these things. |
60 | - |
61 | - To protect your rights, we need to make restrictions that forbid |
62 | -anyone to deny you these rights or to ask you to surrender the rights. |
63 | -These restrictions translate to certain responsibilities for you if you |
64 | -distribute copies of the software, or if you modify it. |
65 | - |
66 | - For example, if you distribute copies of such a program, whether |
67 | -gratis or for a fee, you must give the recipients all the rights that |
68 | -you have. You must make sure that they, too, receive or can get the |
69 | -source code. And you must show them these terms so they know their |
70 | -rights. |
71 | - |
72 | - We protect your rights with two steps: (1) copyright the software, and |
73 | -(2) offer you this license which gives you legal permission to copy, |
74 | -distribute and/or modify the software. |
75 | - |
76 | - Also, for each author's protection and ours, we want to make certain |
77 | -that everyone understands that there is no warranty for this free |
78 | -software. If the software is modified by someone else and passed on, we |
79 | -want its recipients to know that what they have is not the original, so |
80 | -that any problems introduced by others will not reflect on the original |
81 | -authors' reputations. |
82 | - |
83 | - Finally, any free program is threatened constantly by software |
84 | -patents. We wish to avoid the danger that redistributors of a free |
85 | -program will individually obtain patent licenses, in effect making the |
86 | -program proprietary. To prevent this, we have made it clear that any |
87 | -patent must be licensed for everyone's free use or not licensed at all. |
88 | - |
89 | - The precise terms and conditions for copying, distribution and |
90 | -modification follow. |
91 | - |
92 | |
93 | - GNU GENERAL PUBLIC LICENSE |
94 | - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
95 | - |
96 | - 0. This License applies to any program or other work which contains |
97 | -a notice placed by the copyright holder saying it may be distributed |
98 | -under the terms of this General Public License. The "Program", below, |
99 | -refers to any such program or work, and a "work based on the Program" |
100 | -means either the Program or any derivative work under copyright law: |
101 | -that is to say, a work containing the Program or a portion of it, |
102 | -either verbatim or with modifications and/or translated into another |
103 | -language. (Hereinafter, translation is included without limitation in |
104 | -the term "modification".) Each licensee is addressed as "you". |
105 | - |
106 | -Activities other than copying, distribution and modification are not |
107 | -covered by this License; they are outside its scope. The act of |
108 | -running the Program is not restricted, and the output from the Program |
109 | -is covered only if its contents constitute a work based on the |
110 | -Program (independent of having been made by running the Program). |
111 | -Whether that is true depends on what the Program does. |
112 | - |
113 | - 1. You may copy and distribute verbatim copies of the Program's |
114 | -source code as you receive it, in any medium, provided that you |
115 | -conspicuously and appropriately publish on each copy an appropriate |
116 | -copyright notice and disclaimer of warranty; keep intact all the |
117 | -notices that refer to this License and to the absence of any warranty; |
118 | -and give any other recipients of the Program a copy of this License |
119 | -along with the Program. |
120 | - |
121 | -You may charge a fee for the physical act of transferring a copy, and |
122 | -you may at your option offer warranty protection in exchange for a fee. |
123 | - |
124 | - 2. You may modify your copy or copies of the Program or any portion |
125 | -of it, thus forming a work based on the Program, and copy and |
126 | -distribute such modifications or work under the terms of Section 1 |
127 | -above, provided that you also meet all of these conditions: |
128 | - |
129 | - a) You must cause the modified files to carry prominent notices |
130 | - stating that you changed the files and the date of any change. |
131 | - |
132 | - b) You must cause any work that you distribute or publish, that in |
133 | - whole or in part contains or is derived from the Program or any |
134 | - part thereof, to be licensed as a whole at no charge to all third |
135 | - parties under the terms of this License. |
136 | - |
137 | - c) If the modified program normally reads commands interactively |
138 | - when run, you must cause it, when started running for such |
139 | - interactive use in the most ordinary way, to print or display an |
140 | - announcement including an appropriate copyright notice and a |
141 | - notice that there is no warranty (or else, saying that you provide |
142 | - a warranty) and that users may redistribute the program under |
143 | - these conditions, and telling the user how to view a copy of this |
144 | - License. (Exception: if the Program itself is interactive but |
145 | - does not normally print such an announcement, your work based on |
146 | - the Program is not required to print an announcement.) |
147 | - |
148 | |
149 | -These requirements apply to the modified work as a whole. If |
150 | -identifiable sections of that work are not derived from the Program, |
151 | -and can be reasonably considered independent and separate works in |
152 | -themselves, then this License, and its terms, do not apply to those |
153 | -sections when you distribute them as separate works. But when you |
154 | -distribute the same sections as part of a whole which is a work based |
155 | -on the Program, the distribution of the whole must be on the terms of |
156 | -this License, whose permissions for other licensees extend to the |
157 | -entire whole, and thus to each and every part regardless of who wrote it. |
158 | - |
159 | -Thus, it is not the intent of this section to claim rights or contest |
160 | -your rights to work written entirely by you; rather, the intent is to |
161 | -exercise the right to control the distribution of derivative or |
162 | -collective works based on the Program. |
163 | - |
164 | -In addition, mere aggregation of another work not based on the Program |
165 | -with the Program (or with a work based on the Program) on a volume of |
166 | -a storage or distribution medium does not bring the other work under |
167 | -the scope of this License. |
168 | - |
169 | - 3. You may copy and distribute the Program (or a work based on it, |
170 | -under Section 2) in object code or executable form under the terms of |
171 | -Sections 1 and 2 above provided that you also do one of the following: |
172 | - |
173 | - a) Accompany it with the complete corresponding machine-readable |
174 | - source code, which must be distributed under the terms of Sections |
175 | - 1 and 2 above on a medium customarily used for software interchange; or, |
176 | - |
177 | - b) Accompany it with a written offer, valid for at least three |
178 | - years, to give any third party, for a charge no more than your |
179 | - cost of physically performing source distribution, a complete |
180 | - machine-readable copy of the corresponding source code, to be |
181 | - distributed under the terms of Sections 1 and 2 above on a medium |
182 | - customarily used for software interchange; or, |
183 | - |
184 | - c) Accompany it with the information you received as to the offer |
185 | - to distribute corresponding source code. (This alternative is |
186 | - allowed only for noncommercial distribution and only if you |
187 | - received the program in object code or executable form with such |
188 | - an offer, in accord with Subsection b above.) |
189 | - |
190 | -The source code for a work means the preferred form of the work for |
191 | -making modifications to it. For an executable work, complete source |
192 | -code means all the source code for all modules it contains, plus any |
193 | -associated interface definition files, plus the scripts used to |
194 | -control compilation and installation of the executable. However, as a |
195 | -special exception, the source code distributed need not include |
196 | -anything that is normally distributed (in either source or binary |
197 | -form) with the major components (compiler, kernel, and so on) of the |
198 | -operating system on which the executable runs, unless that component |
199 | -itself accompanies the executable. |
200 | - |
201 | -If distribution of executable or object code is made by offering |
202 | -access to copy from a designated place, then offering equivalent |
203 | -access to copy the source code from the same place counts as |
204 | -distribution of the source code, even though third parties are not |
205 | -compelled to copy the source along with the object code. |
206 | - |
207 | |
208 | - 4. You may not copy, modify, sublicense, or distribute the Program |
209 | -except as expressly provided under this License. Any attempt |
210 | -otherwise to copy, modify, sublicense or distribute the Program is |
211 | -void, and will automatically terminate your rights under this License. |
212 | -However, parties who have received copies, or rights, from you under |
213 | -this License will not have their licenses terminated so long as such |
214 | -parties remain in full compliance. |
215 | - |
216 | - 5. You are not required to accept this License, since you have not |
217 | -signed it. However, nothing else grants you permission to modify or |
218 | -distribute the Program or its derivative works. These actions are |
219 | -prohibited by law if you do not accept this License. Therefore, by |
220 | -modifying or distributing the Program (or any work based on the |
221 | -Program), you indicate your acceptance of this License to do so, and |
222 | -all its terms and conditions for copying, distributing or modifying |
223 | -the Program or works based on it. |
224 | - |
225 | - 6. Each time you redistribute the Program (or any work based on the |
226 | -Program), the recipient automatically receives a license from the |
227 | -original licensor to copy, distribute or modify the Program subject to |
228 | -these terms and conditions. You may not impose any further |
229 | -restrictions on the recipients' exercise of the rights granted herein. |
230 | -You are not responsible for enforcing compliance by third parties to |
231 | -this License. |
232 | - |
233 | - 7. If, as a consequence of a court judgment or allegation of patent |
234 | -infringement or for any other reason (not limited to patent issues), |
235 | -conditions are imposed on you (whether by court order, agreement or |
236 | -otherwise) that contradict the conditions of this License, they do not |
237 | -excuse you from the conditions of this License. If you cannot |
238 | -distribute so as to satisfy simultaneously your obligations under this |
239 | -License and any other pertinent obligations, then as a consequence you |
240 | -may not distribute the Program at all. For example, if a patent |
241 | -license would not permit royalty-free redistribution of the Program by |
242 | -all those who receive copies directly or indirectly through you, then |
243 | -the only way you could satisfy both it and this License would be to |
244 | -refrain entirely from distribution of the Program. |
245 | - |
246 | -If any portion of this section is held invalid or unenforceable under |
247 | -any particular circumstance, the balance of the section is intended to |
248 | -apply and the section as a whole is intended to apply in other |
249 | -circumstances. |
250 | - |
251 | -It is not the purpose of this section to induce you to infringe any |
252 | -patents or other property right claims or to contest validity of any |
253 | -such claims; this section has the sole purpose of protecting the |
254 | -integrity of the free software distribution system, which is |
255 | -implemented by public license practices. Many people have made |
256 | -generous contributions to the wide range of software distributed |
257 | -through that system in reliance on consistent application of that |
258 | -system; it is up to the author/donor to decide if he or she is willing |
259 | -to distribute software through any other system and a licensee cannot |
260 | -impose that choice. |
261 | - |
262 | -This section is intended to make thoroughly clear what is believed to |
263 | -be a consequence of the rest of this License. |
264 | - |
265 | |
266 | - 8. If the distribution and/or use of the Program is restricted in |
267 | -certain countries either by patents or by copyrighted interfaces, the |
268 | -original copyright holder who places the Program under this License |
269 | -may add an explicit geographical distribution limitation excluding |
270 | -those countries, so that distribution is permitted only in or among |
271 | -countries not thus excluded. In such case, this License incorporates |
272 | -the limitation as if written in the body of this License. |
273 | - |
274 | - 9. The Free Software Foundation may publish revised and/or new versions |
275 | -of the General Public License from time to time. Such new versions will |
276 | -be similar in spirit to the present version, but may differ in detail to |
277 | -address new problems or concerns. |
278 | - |
279 | -Each version is given a distinguishing version number. If the Program |
280 | -specifies a version number of this License which applies to it and "any |
281 | -later version", you have the option of following the terms and conditions |
282 | -either of that version or of any later version published by the Free |
283 | -Software Foundation. If the Program does not specify a version number of |
284 | -this License, you may choose any version ever published by the Free Software |
285 | -Foundation. |
286 | - |
287 | - 10. If you wish to incorporate parts of the Program into other free |
288 | -programs whose distribution conditions are different, write to the author |
289 | -to ask for permission. For software which is copyrighted by the Free |
290 | -Software Foundation, write to the Free Software Foundation; we sometimes |
291 | -make exceptions for this. Our decision will be guided by the two goals |
292 | -of preserving the free status of all derivatives of our free software and |
293 | -of promoting the sharing and reuse of software generally. |
294 | - |
295 | - NO WARRANTY |
296 | - |
297 | - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
298 | -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
299 | -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
300 | -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
301 | -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
302 | -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
303 | -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
304 | -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
305 | -REPAIR OR CORRECTION. |
306 | - |
307 | - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
308 | -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
309 | -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
310 | -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
311 | -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
312 | -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
313 | -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
314 | -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
315 | -POSSIBILITY OF SUCH DAMAGES. |
316 | - |
317 | - END OF TERMS AND CONDITIONS |
318 | - |
319 | |
320 | - How to Apply These Terms to Your New Programs |
321 | - |
322 | - If you develop a new program, and you want it to be of the greatest |
323 | -possible use to the public, the best way to achieve this is to make it |
324 | -free software which everyone can redistribute and change under these terms. |
325 | - |
326 | - To do so, attach the following notices to the program. It is safest |
327 | -to attach them to the start of each source file to most effectively |
328 | -convey the exclusion of warranty; and each file should have at least |
329 | -the "copyright" line and a pointer to where the full notice is found. |
330 | - |
331 | - <one line to give the program's name and a brief idea of what it does.> |
332 | - Copyright (C) <year> <name of author> |
333 | - |
334 | - This program is free software; you can redistribute it and/or modify |
335 | - it under the terms of the GNU General Public License as published by |
336 | - the Free Software Foundation; either version 2 of the License, or |
337 | - (at your option) any later version. |
338 | - |
339 | - This program is distributed in the hope that it will be useful, |
340 | - but WITHOUT ANY WARRANTY; without even the implied warranty of |
341 | - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
342 | - GNU General Public License for more details. |
343 | - |
344 | - You should have received a copy of the GNU General Public License |
345 | - along with this program; if not, write to the Free Software |
346 | - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
347 | - |
348 | - |
349 | -Also add information on how to contact you by electronic and paper mail. |
350 | - |
351 | -If the program is interactive, make it output a short notice like this |
352 | -when it starts in an interactive mode: |
353 | - |
354 | - Gnomovision version 69, Copyright (C) year name of author |
355 | - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
356 | - This is free software, and you are welcome to redistribute it |
357 | - under certain conditions; type `show c' for details. |
358 | - |
359 | -The hypothetical commands `show w' and `show c' should show the appropriate |
360 | -parts of the General Public License. Of course, the commands you use may |
361 | -be called something other than `show w' and `show c'; they could even be |
362 | -mouse-clicks or menu items--whatever suits your program. |
363 | - |
364 | -You should also get your employer (if you work as a programmer) or your |
365 | -school, if any, to sign a "copyright disclaimer" for the program, if |
366 | -necessary. Here is a sample; alter the names: |
367 | - |
368 | - Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
369 | - `Gnomovision' (which makes passes at compilers) written by James Hacker. |
370 | - |
371 | - <signature of Ty Coon>, 1 April 1989 |
372 | - Ty Coon, President of Vice |
373 | - |
374 | -This General Public License does not permit incorporating your program into |
375 | -proprietary programs. If your program is a subroutine library, you may |
376 | -consider it more useful to permit linking proprietary applications with the |
377 | -library. If this is what you want to do, use the GNU Library General |
378 | -Public License instead of this License. |
379 | |
380 | === removed file 'HACKING' |
381 | --- HACKING 2009-10-10 01:18:04 +0000 |
382 | +++ HACKING 1970-01-01 00:00:00 +0000 |
383 | @@ -1,2 +0,0 @@ |
384 | -Please refer to HACKING in the Bazaar source distribution for topics not |
385 | -covered here. |
386 | |
387 | === removed file 'INSTALL' |
388 | --- INSTALL 2011-06-11 23:05:01 +0000 |
389 | +++ INSTALL 1970-01-01 00:00:00 +0000 |
390 | @@ -1,10 +0,0 @@ |
391 | -You need the Dulwich Python module installed (or in PYTHONPATH) and a fairly |
392 | -recent version of bzr. |
393 | - |
394 | -You will also need either the python tdb or sqlite bindings; the latter are included |
395 | -with Python. |
396 | - |
397 | -For more information on Dulwich, see http://samba.org/~jelmer/dulwich/ |
398 | - |
399 | -Installing bzr-git can be done by putting it into the ~/.bazaar/plugins |
400 | -directory, and renaming its directory to "git". |
401 | |
402 | === removed file 'Makefile' |
403 | --- Makefile 2011-10-05 00:04:32 +0000 |
404 | +++ Makefile 1970-01-01 00:00:00 +0000 |
405 | @@ -1,70 +0,0 @@ |
406 | -DEBUGGER ?= |
407 | -BZR_OPTIONS ?= |
408 | -BZR ?= $(shell which bzr) |
409 | -PYTHON ?= $(shell which python) |
410 | -SETUP ?= ./setup.py |
411 | -PYDOCTOR ?= pydoctor |
412 | -CTAGS ?= ctags |
413 | -PYLINT ?= pylint |
414 | -RST2HTML ?= rst2html |
415 | -TESTS ?= -s bp.git |
416 | - |
417 | -all:: build |
418 | - |
419 | -build:: |
420 | - $(SETUP) build |
421 | - |
422 | -build-inplace:: |
423 | - |
424 | -install:: |
425 | - $(SETUP) install |
426 | - |
427 | -clean:: |
428 | - $(SETUP) clean |
429 | - rm -f *.so |
430 | - |
431 | -check:: build-inplace |
432 | - BZR_PLUGINS_AT=git@$(shell pwd) $(DEBUGGER) $(PYTHON) $(PYTHON_OPTIONS) $(BZR) $(BZR_OPTIONS) selftest $(TEST_OPTIONS) $(TESTS) |
433 | - |
434 | -check-all:: |
435 | - $(MAKE) check TESTS="^bzrlib.plugins.git. Git" |
436 | - |
437 | -check-verbose:: |
438 | - $(MAKE) check TEST_OPTIONS=-v |
439 | - |
440 | -check-one:: |
441 | - $(MAKE) check TEST_OPTIONS=--one |
442 | - |
443 | -check-random:: |
444 | - $(MAKE) check TEST_OPTIONS="--random=now --verbose --one" |
445 | - |
446 | -show-plugins:: |
447 | - BZR_PLUGINS_AT=git@$(shell pwd) $(BZR) plugins -v |
448 | - |
449 | -lint:: |
450 | - $(PYLINT) -f parseable *.py */*.py |
451 | - |
452 | -tags:: |
453 | - $(CTAGS) -R . |
454 | - |
455 | -ctags:: tags |
456 | - |
457 | -coverage:: |
458 | - $(MAKE) check BZR_OPTIONS="--coverage coverage" |
459 | - |
460 | -.PHONY: update-pot po/bzr-git.pot |
461 | -update-pot: po/bzr-git.pot |
462 | - |
463 | -TRANSLATABLE_PYFILES:=$(shell find . -name '*.py' \ |
464 | - | grep -v 'tests/' \ |
465 | - ) |
466 | - |
467 | -po/bzr-git.pot: $(PYFILES) $(DOCFILES) |
468 | - BZR_PLUGINS_AT=git@$(shell pwd) bzr export-pot \ |
469 | - --plugin=git > po/bzr-git.pot |
470 | - echo $(TRANSLATABLE_PYFILES) | xargs \ |
471 | - xgettext --package-name "bzr-git" \ |
472 | - --msgid-bugs-address "<bazaar@lists.canonical.com>" \ |
473 | - --copyright-holder "Canonical Ltd <canonical-bazaar@lists.canonical.com>" \ |
474 | - --from-code ISO-8859-1 --sort-by-file --join --add-comments=i18n: \ |
475 | - -d bzr-git -p po -o bzr-git.pot |
476 | |
477 | === removed file 'NEWS' |
478 | --- NEWS 2017-10-05 22:22:50 +0000 |
479 | +++ NEWS 1970-01-01 00:00:00 +0000 |
480 | @@ -1,591 +0,0 @@ |
481 | -0.6.13 UNRELEASED |
482 | - |
483 | - BUG FIXES |
484 | - |
485 | - * Fix compatibility with newer versions of Dulwich, which |
486 | - now require Repo._determine_file_mode. (Jelmer Vernooij) |
487 | - |
488 | - * "Support" empty repositories; print an appropriate error. |
489 | - (Jelmer Vernooij, #1219424) |
490 | - |
491 | - * Fix compatibility with and depend on dulwich 0.9.6. (William Grant) |
492 | - |
493 | - * Correctly handle all moves when converting bzr trees to git. |
494 | - (William Grant, #818318) |
495 | - |
496 | - * Fix compatibility with dulwich 0.14. (Jelmer Vernooij) |
497 | - |
498 | - FEATURES |
499 | - |
500 | - * Mark bzr 2.7 as supported. |
501 | - |
502 | - * Support 'HG:rename-source' fields. |
503 | - |
504 | - * Support HG extra 'amend_source'. |
505 | - |
506 | -0.6.12 2013-09-22 |
507 | - |
508 | - FEATURES |
509 | - |
510 | - * Support thin packs when pushing and fetching to/from remote |
511 | - repositories. (William Grant, #878085) |
512 | - |
513 | - CHANGES |
514 | - |
515 | - * Fix compatibility with and depend on dulwich 0.9.1. (Jelmer Vernooij) |
516 | - |
517 | -0.6.11 2013-08-04 |
518 | - |
519 | - BUG FIXES |
520 | - |
521 | - * Add support for Bazaar 2.6.0. (Jelmer Vernooij) |
522 | - |
523 | -0.6.10 2012-12-13 |
524 | - |
525 | - FEATURES |
526 | - |
527 | - * New command 'bzr git-push-pristine-tar', which pushes pristine tar deltas |
528 | - to a git repository. (Jelmer Vernooij) |
529 | - |
530 | - BUG FIXES |
531 | - |
532 | - * Implement ``GitRevisionTree.is_executable``. (Jelmer Vernooij) |
533 | - |
534 | -0.6.9 2012-05-29 |
535 | - |
536 | - BUG FIXES |
537 | - |
538 | - * ``bzr git-import`` only creates colocated branches now if |
539 | - the --colocated option is specified. (Jelmer Vernooij) |
540 | - |
541 | - * Convert `~` to `_` when pushing into git, as `~` is not allowed in |
542 | - refs. (Jelmer Vernooij) |
543 | - |
544 | - * Support optional timeout argument to ``bzr serve --git``. |
545 | - (Jelmer Vernooij) |
546 | - |
547 | - * Handle encoding better in working tree iter changes. |
548 | - (Jelmer Vernooij, #1019978) |
549 | - |
550 | -0.6.8 2012-03-28 |
551 | - |
552 | - BUG FIXES |
553 | - |
554 | - * Fixes duplicate tag warnings in 'git-remote-bzr' helper. |
555 | - (Jelmer Vernooij, #905275) |
556 | - |
557 | - * Don't suggest development-subtree when submodules are encountered. |
558 | - (Jelmer Vernooij, #951494) |
559 | - |
560 | - * Print proper error when encountering data that can't be roundtripped. |
561 | - (Jelmer Vernooij) |
562 | - |
563 | - * Ignore control directory filenames on Windows, too. |
564 | - (Jelmer Vernooij, #967054) |
565 | - |
566 | - * Fix 'Unable to obtain lock' error when dpushing from a bound branch. |
567 | - (Jelmer Vernooij, #949557) |
568 | - |
569 | - * Cope with commits with a completely empty tree. |
570 | - (Jelmer Vernooij, #933132) |
571 | - |
572 | - TESTS |
573 | - |
574 | - * Add test to verify that certain invalid timezones ("--700") are |
575 | - roundtripped correctly. (Jelmer Vernooij, #697828) |
576 | - |
577 | -0.6.7 2012-01-25 |
578 | - |
579 | - CHANGES |
580 | - |
581 | - * Switch to supporting bzr 2.5 only. (Jelmer Vernooij) |
582 | - |
583 | - PERFORMANCE |
584 | - |
585 | - * "git:" revision specifier now avoids full branch history |
586 | - access if it can. (Jelmer Vernooij) |
587 | - |
588 | - DOCUMENTATION |
589 | - |
590 | - * Added manual page for git-remote-bzr. (Jelmer Vernooij0 |
591 | - |
592 | - BUG FIXES |
593 | - |
594 | - * Support setting branch nicks. (Jelmer Vernooij, #731239) |
595 | - |
596 | - * Support Repository.set_make_working_trees(). (Jelmer Vernooij, #777065) |
597 | - |
598 | - FEATURES |
599 | - |
600 | - * Add 'github:' directory service. (Jelmer Vernooij) |
601 | - |
602 | -0.6.6 2011-12-15 |
603 | - |
604 | - BUG FIXES |
605 | - |
606 | - * Warn about ignoring path segment parameters when using bzr |
607 | - 2.4. (Jelmer Vernooij, #887785) |
608 | - |
609 | - * Don't request unpeeled objects, newer versions of github refuse it. |
610 | - (Jelmer Vernooij, #897951) |
611 | - |
612 | - * Specify proper number of arguments to action() handler. |
613 | - (Jelmer Vernooij, #894195) |
614 | - |
615 | - * Fix compatibility with beta 4 of bzr 2.5. |
616 | - (Jelmer Vernooij) |
617 | - |
618 | - FEATURES |
619 | - |
620 | - * New options '--git-receive-pack' and '--git-upload-pack' |
621 | - for 'bzr serve', providing support for inetd. |
622 | - (Jelmer Vernooij) |
623 | - |
624 | -0.6.5 2011-11-08 |
625 | - |
626 | - CHANGES |
627 | - |
628 | - * git-import no longer creates a deep hierarchy to store branches, |
629 | - instead it now strips the refs/heads/ prefix from ref names. |
630 | - (Jelmer Vernooij) |
631 | - |
632 | - * Bzr 2.3 is no longer supported. (Jelmer Vernooij) |
633 | - |
634 | - FIXES |
635 | - |
636 | - * Fix compatibility with bzr < 2.5 when used with remote repositories. |
637 | - (Jelmer Vernooij, #885566) |
638 | - |
639 | - * Fix git-import after branch refactoring. (Jelmer Vernooij, #886161) |
640 | - |
641 | - * git-import now creates colocated branches if the target bzrdir |
642 | - supports them. (Jelmer Vernooij) |
643 | - |
644 | -0.6.4 2011-11-03 |
645 | - |
646 | - FIXES |
647 | - |
648 | - * Fix and test fetching from "bzr serve --git". (Jelmer Vernooij) |
649 | - |
650 | - * Raise UnsupportedOperation for `Branch.revision_id_to_dotted_revno`, |
651 | - making it possible to run ``bzr tags`` against remote git repositories. |
652 | - (Jelmer Vernooij, #858942) |
653 | - |
654 | - * Fix compatibility with bzr < 2.5. (Jelmer Vernooij, #885566) |
655 | - |
656 | - FEATURES |
657 | - |
658 | - * Allow downloading branches over HTTP from loggerhead using the Git protocol. |
659 | - To enable, set 'http_git=True' in the branch configuration. |
660 | - (Jelmer Vernooij, #585822) |
661 | - |
662 | -0.6.3 2011-11-01 |
663 | - |
664 | - FIXES |
665 | - |
666 | - * Only actually fetch tags if "branch.fetch_tags" is set to true. |
667 | - (Jelmer Vernooij, #771184) |
668 | - |
669 | - * Add basic support for alternates. (Jelmer Vernooij) |
670 | - |
671 | - * Support addressing branches by ref where the name can't be mapped back to |
672 | - a branch. (Jelmer Vernooij, #829481) |
673 | - |
674 | - * Skip post commit hook when dulwich is not available. |
675 | - (Jelmer Vernooij, #853974) |
676 | - |
677 | - * Fix pushing from git repository to git repository. |
678 | - (Jelmer Vernooij, #731270) |
679 | - |
680 | - * Friendlier error message when HEAD can not be found in remote repository. |
681 | - (Jelmer Vernooij, #778920) |
682 | - |
683 | - * Support updating tags in remote branches. (Jelmer Vernooij, #706990) |
684 | - |
685 | - * Fix compatibility with tags API after changes in bzr. |
686 | - (Jelmer Vernooij, #861592) |
687 | - |
688 | - * Cope with tags pointing at trees when cloning local git repositories. |
689 | - (Jelmer Vernooij, #861973) |
690 | - |
691 | - * Remove pending entries when converting directory into tree reference. |
692 | - (Jelmer Vernooij, #871595) |
693 | - |
694 | - * Fix fetching into repositories with fallback repositories. |
695 | - (Jelmer Vernooij, #866028) |
696 | - |
697 | - FEATURES |
698 | - |
699 | - * Support the git http smart server protocol. (Jelmer Vernooij, #581933) |
700 | - |
701 | - * Support removal of remote branches. (Jelmer Vernooij, #855993) |
702 | - |
703 | - * Add i18n support. (Jelmer Vernooij) |
704 | - |
705 | - * Now includes git remote helper ``git-remote-bzr``. (Jelmer Vernooij) |
706 | - |
707 | -0.6.2 2011-08-07 |
708 | - |
709 | - FEATURES |
710 | - |
711 | - * Provide Repository.get_known_graph_ancestry(). (Jelmer Vernooij) |
712 | - |
713 | - * Provide Repository.get_file_graph(). (Jelmer Vernooij, #677363) |
714 | - |
715 | - * Provide GitRevisionTree.get_file_mtime(). (Jelmer Vernooij) |
716 | - |
717 | - * Provide GitRevisionTree.get_file_revision(). (Jelmer Vernooij, #780953) |
718 | - |
719 | - * Add post-commit hook to update the git cache. (Jelmer Vernooij, #814651) |
720 | - |
721 | - PERFORMANCE |
722 | - |
723 | - * Significantly improve performance of WorkingTree.extras(). |
724 | - (Jelmer Vernooij) |
725 | - |
726 | - CHANGES |
727 | - |
728 | - * Require Dulwich 0.8.0. (Jelmer Vernooij) |
729 | - |
730 | -0.6.1 2011-06-18 |
731 | - |
732 | - BUG FIXES |
733 | - |
734 | - * Support git repositories without a branches directory in their control |
735 | - directory. (Jelmer Vernooij, #780239) |
736 | - |
737 | - * Fix two mistakes in 'bzr help git'. (Jelmer Vernooij, #791047) |
738 | - |
739 | - * Now raises a proper exception when receiving an "Unknown repository" |
740 | - error from GitHub. (Jelmer Vernooij, #798295) |
741 | - |
742 | - * Support the new limit argument to InterBranch.fetch. (Jelmer Vernooij, #750175) |
743 | - |
744 | - * Support the new testament API that accepts a tree rather than an |
745 | - inventory. (Jelmer Vernooij, #762608) |
746 | - |
747 | - * Remove InterBranch.update_revisions. (Jelmer Vernooij, #771765) |
748 | - |
749 | - * Implement Repository.set_make_working_trees(). (Jelmer Vernooij, #777065) |
750 | - |
751 | -0.6.0 2011-04-12 |
752 | - |
753 | - BUG FIXES |
754 | - |
755 | - * Fix encoding handling in Git working trees. (Jelmer Vernooij, #393038) |
756 | - |
757 | - * Use transports internally in "bzr git-import". |
758 | - (Jelmer Vernooij, #733919) |
759 | - |
760 | - * Provide custom GitDir.sprout() implementation for compatibility with bzr 2.4. |
761 | - (Jelmer Vernooij, #717937) |
762 | - |
763 | - * Revisions attached to tags that are not in the tips ancestry are now fetched. |
764 | - (Jelmer Vernooij, #309682) |
765 | - |
766 | - * Fix recursion error merging tags for bound branches. |
767 | - (Jelmer Vernooij, #742833) |
768 | - |
769 | - * Fix fetching from remote git repositories during merge. |
770 | - (Jelmer Vernooij, #741760) |
771 | - |
772 | - * Properly raise RootMissing if no root is specified to an empty |
773 | - tree in the commit builder. (Jelmer Vernooij, #731360) |
774 | - |
775 | - * Return proper conflict list from WorkingTree.conflicts. (Jelmer Vernooij, #741397) |
776 | - |
777 | - * Fix dpush of certain branches. (Jelmer Vernooij, #705807) |
778 | - |
779 | - API COMPLETENESS |
780 | - |
781 | - * Implement LocalGitControlDir.clone_on_transport. (Jelmer Vernooij, #721899) |
782 | - |
783 | - COMPATIBILITY |
784 | - |
785 | - * Drop support for Bazaar < 2.3. (Jelmer Vernooij) |
786 | - |
787 | -0.5.4 2011-02-10 |
788 | - |
789 | - BUG FIXES |
790 | - |
791 | - * Fix test suite compatibility with Bazaar 2.2. (Max Bowsher, #707434) |
792 | - |
793 | - * Fix compatibility with older versions of python-tdb. |
794 | - (Jelmer Vernooij, #707735) |
795 | - |
796 | - * Fix 'bzr git-import' from remote repositories. (Jelmer Vernooij, #706990) |
797 | - |
798 | - * Cope with tags when doing local fetches. (Jelmer Vernooij, #675637) |
799 | - |
800 | -0.5.3 2011-01-21 |
801 | - |
802 | - BUG FIXES |
803 | - |
804 | - * Add in an empty git repository now works. (Jelmer Vernooij, #603823) |
805 | - |
806 | - * Support opening of repositories over HTTP where the HTTP server |
807 | - doesn't allow directory access. (Jelmer Vernooij, #617078) |
808 | - |
809 | - * Support non-ascii characters in tag names. (Jelmer Vernooij, #616995) |
810 | - |
811 | - * Mark as compatible with bzr 2.3, 2.4. (Jelmer Vernooij) |
812 | - |
813 | - * Cope with unknown refs. (Jelmer Vernooij, #666443) |
814 | - |
815 | - * Don't peel tags automatically when pushing back. |
816 | - (Jelmer Vernooij, #675231) |
817 | - |
818 | - * Fix `bzr-receive-pack` and `bzr-upload-pack`. (Jelmer Vernooij, #681193) |
819 | - |
820 | - FEATURES |
821 | - |
822 | - * Remove all remaining dependencies on C git. (Jelmer Vernooij, #348238) |
823 | - |
824 | - * Add some basic documentation in 'bzr help git'. (Jelmer Vernooij, #605394) |
825 | - |
826 | - * Add --signoff option to 'bzr git-apply'. (Jelmer Vernooij) |
827 | - |
828 | - * Add --force option to 'bzr git-apply'. (Jelmer Vernooij) |
829 | - |
830 | -0.5.2 2010-07-30 |
831 | - |
832 | - COMPATIBILITY |
833 | - |
834 | - * Drop support for Bazaar < 2.0. (Jelmer Vernooij) |
835 | - |
836 | - BUG FIXES |
837 | - |
838 | - * Cope with kind changes when generating git objects from Bazaar |
839 | - revisions that contain kind changes where a directory is changed |
840 | - into a file and its (file/symlink) children are removed |
841 | - (rather than moved). (#597758, Jelmer Vernooij) |
842 | - |
843 | - * Fix reading pack files over http. (#588724, Jelmer Vernooij) |
844 | - |
845 | - * Fix 'bzr status' after 'bzr add' in native git working trees. |
846 | - (#603800, Chadrik) |
847 | - |
848 | - * Provide VersionedFiles.get_annotator(). (#508288, Jelmer Vernooij) |
849 | - |
850 | - * Handle non-ascii characters in filenames. (#612291, Jelmer Vernooij) |
851 | - |
852 | - FEATURES |
853 | - |
854 | - * Support specifying alternative paths for git-upload-pack and |
855 | - git-receive-pack. (Ross Light, #585204) |
856 | - |
857 | -0.5.1 2010-05-22 |
858 | - |
859 | - BUG FIXES |
860 | - |
861 | - * Mark as compatible with Bazaar 2.2 (Jelmer Vernooij) |
862 | - |
863 | - * Use host specified rather than localhost in `bzr serve`. |
864 | - (David Coles, #543998) |
865 | - |
866 | - * Handle working trees without valid HEAD branch. |
867 | - (Jelmer Vernooij, #501385) |
868 | - |
869 | - * Default to non-bare repositories when initializing a control directory. |
870 | - (Jelmer Vernooij) |
871 | - |
872 | - * Cope with -0000 as timezone in Git commits. (Jelmer Vernooij, #539978) |
873 | - |
874 | - FEATURES |
875 | - |
876 | - * Support 'bzr diff --format=git'. (Jelmer Vernooij, #555994) |
877 | - |
878 | - PERFORMANCE |
879 | - |
880 | - * Avoid the use of InventoryDirectory.children. This speeds up |
881 | - imports significantly. (Jelmer Vernooij) |
882 | - |
883 | - * Use Bazaar index files to store the sha map and git objects to cache |
884 | - certain objects. (#520694, Jelmer Vernooij) |
885 | - |
886 | -0.5.0 2010-03-18 |
887 | - |
888 | - BUG FIXES |
889 | - |
890 | - * Fix compatibility with newer versions of Python2.6, which change the |
891 | - behaviour of urlparse.urlsplit. (Jelmer Vernooij, #561351) |
892 | - |
893 | - * Avoid storing texts of symlinks, which causes checksum errors in |
894 | - `bzr check`. (#512323, INADA Naoki, Jelmer Vernooij) |
895 | - |
896 | - * Support committing to a git branch from a bzr working tree. (#506174, |
897 | - Jelmer Vernooij) |
898 | - |
899 | - * Support executable symlinks. (#512871, INADA Naoki, Jelmer Vernooij) |
900 | - |
901 | - * When unpacking URLs, strip leftmost slash to match gits |
902 | - behaviour. (#445156, Jelmer Vernooij) |
903 | - |
904 | - * Support merging tags to a local Git repository. |
905 | - (#4445230, Jelmer Vernooij) |
906 | - |
907 | - * InterFromGitBranch.pull() supports an optional limit argument to limit |
908 | - how many revisions to import in one go. (Michael Hudson) |
909 | - |
910 | - * Cope with different encodings better, rather than just stripping out |
911 | - unknown characters. (#529460, Jelmer Vernooij) |
912 | - |
913 | - * Support ``run_hooks`` argument to ``InterGitRemoteLocalBranch.pull()``. |
914 | - (#524843, Jelmer Vernooij) |
915 | - |
916 | - * Properly ignore directories when creating bundles, deal with new files. |
917 | - (#456849, Jelmer Vernooij) |
918 | - |
919 | - PERFORMANCE |
920 | - |
921 | - * Don't import head revision twice when pulling from Git. |
922 | - (Jelmer Vernooij) |
923 | - |
924 | - |
925 | - FEATURES |
926 | - |
927 | - * Support (dumb) HTTP repositories. (#373688, Jelmer Vernooij) |
928 | - |
929 | - * Implement API for colocated branches. (#380871, Jelmer Vernooij) |
930 | - |
931 | -0.4.3 2010-01-19 |
932 | - |
933 | - BUG FIXES |
934 | - |
935 | - * Fix warning about unclosed files on Windows. (#441978, INADA Naoki) |
936 | - |
937 | - * Support creating working tree for existing repository. (Jelmer Vernooij) |
938 | - |
939 | - * Fix base url of Git branches - use the working tree path rather than |
940 | - the control directory path. (Jelmer Vernooij) |
941 | - |
942 | - * Fix fetching between git repositories. (#449507, Jelmer Vernooij) |
943 | - |
944 | - * Refuse pulling into non-rich-root branches rather than erroring |
945 | - out with an AttributeError. (#449507, Jelmer Vernooij) |
946 | - |
947 | - * Unquote paths extracted from URLs. (#445156, Jelmer Vernooij) |
948 | - |
949 | - PERFORMANCE |
950 | - |
951 | - * Improve performance of WorkingTree.extras() by not looking up the |
952 | - SHA1, kind and stat data of each file. (Jelmer Vernooij) |
953 | - |
954 | - * Provide custom InterTree for faster deltas between git working trees |
955 | - and revision trees. (Jelmer Vernooij) |
956 | - |
957 | - * Provide custom InterTree for faster deltas between git revision trees. |
958 | - (Jelmer Vernooij) |
959 | - |
960 | - * Fix several places where a lot of memory was being consumed, especially |
961 | - for repositories with a large number of revisions or big trees. |
962 | - (#486076, Jelmer Vernooij |
963 | - |
964 | - FEATURES |
965 | - |
966 | - * Support for parsing --HG-- metadata in git commit messages, for |
967 | - better interoperability with bzr-hg. |
968 | - |
969 | - * Submodules are now imported. This requires the use of the |
970 | - development-subtree format in bzrlib though. (#402814, Jelmer Vernooij) |
971 | - |
972 | -0.4.2 2009-10-01 |
973 | - |
974 | - BUG FIXES |
975 | - |
976 | - * Cope with ghosts a bit better during "bzr dpush". |
977 | - (Jelmer Vernooij) |
978 | - |
979 | - * Better error message when Dulwich is missing. (#427276, Jelmer Vernooij) |
980 | - |
981 | - * Support checkouts. (#427310, Jelmer Vernooij) |
982 | - |
983 | - * Don't break "bzr info -v" when Dulwich is not installed. (#429394, |
984 | - Jelmer Vernooij) |
985 | - |
986 | - * Mark as compatible with Bazaar 2.1. (Jelmer Vernooij) |
987 | - |
988 | - * Fix fetching of remote repositories on Windows. (INADA Naoki, |
989 | - Jelmer Vernooij, #382125) |
990 | - |
991 | - * Ignore directories in WorkingTree.extras(). (Jelmer Vernooij, #373902) |
992 | - |
993 | - FEATURES |
994 | - |
995 | - * New "git" format supported by "bzr send". All revisions |
996 | - are currently sent as one concatenated file, rather than |
997 | - as separate files because of limitations in Bazaar. |
998 | - (Jelmer Vernooij, Lukas Lalinsky) |
999 | - |
1000 | - PERFORMANCE |
1001 | - |
1002 | - * Avoid re-fetching basis inventory during fetch. |
1003 | - (Jelmer Vernooij) |
1004 | - |
1005 | -0.4.1 2009-07-24 |
1006 | - |
1007 | - BUG FIXES |
1008 | - |
1009 | - * Avoid "No such revision" error when encountering submodules. |
1010 | - (#400598) |
1011 | - |
1012 | - * Avoid creating empty trees in Git during dpush, as they are not |
1013 | - officially allowed. (#393706) |
1014 | - |
1015 | - FEATURES |
1016 | - |
1017 | - * Progress bars will now show results from the remote git server. |
1018 | - |
1019 | -0.4.0 2009-06-18 |
1020 | - |
1021 | - BUG FIXES |
1022 | - |
1023 | - * Fix handling of not-executable files becoming executable without any |
1024 | - other changes. (#382609) |
1025 | - |
1026 | - * XML-invalid characters are now no longer squashed if not required by |
1027 | - the target repository serializer format. The only non-XML based format |
1028 | - at the moment is the "2a" development format supported since bzr 1.16. |
1029 | - |
1030 | - * Unusual file modes that could be created in Git repositories using older |
1031 | - versions of Git are now stored in Bazaar revision properties. This means |
1032 | - it's now possible to import the Git repository and the Linux kernel repository. |
1033 | - |
1034 | - * Mark as compatible with bzr 1.16. |
1035 | - |
1036 | -0.3.2 2009-05-20 |
1037 | - |
1038 | - FEATURES |
1039 | - |
1040 | - * "bzr commit" in git working trees works to some extent. |
1041 | - |
1042 | - * "bzr push" from local git repositories to remote git repositories works. |
1043 | - |
1044 | -0.3.1 2009-05-13 |
1045 | - |
1046 | - FEATURES |
1047 | - |
1048 | - * Alternative (faster) storage for SHA map using the TDB library |
1049 | - (http://tdb.samba.org/). This will automatically be used if you have |
1050 | - TDB and its Python bindings installed. In all other situations the previous |
1051 | - (slower) Sqlite database format will be used. |
1052 | - |
1053 | - * Now warns when escaping XML-invalid characters to work around a bug in the |
1054 | - Bazaar revision serializer. |
1055 | - |
1056 | - * Now allows "unusual" file modes (100664, etc) but will warn the user about |
1057 | - them. |
1058 | - |
1059 | - BUG FIXES |
1060 | - |
1061 | - * Fixed git-import. |
1062 | - |
1063 | - * Fixed handling kind changes (tree -> blob) during fetch. |
1064 | - |
1065 | -0.3.0 2009-05-10 |
1066 | - |
1067 | - FEATURES |
1068 | - |
1069 | - * Support parsing .gitignore |
1070 | - |
1071 | - * Support dpushing to remote repositories. |
1072 | |
1073 | === removed file 'README' |
1074 | --- README 2011-01-06 12:59:22 +0000 |
1075 | +++ README 1970-01-01 00:00:00 +0000 |
1076 | @@ -1,9 +0,0 @@ |
1077 | -bzr-git, a plugin for bzr that adds git support. |
1078 | - |
1079 | -This was originally written as a proof of concept at Europython 2006 by |
1080 | -Robert Collins, using stgit's convenience methods for accessing gits head |
1081 | -and parsing git output. Later, it was adapted to use James Westby's Python |
1082 | -Git module (which had by then be renamed to "Dulwich") and extended to support |
1083 | -push and pull by Jelmer Vernooij. |
1084 | - |
1085 | -Please see INSTALL for installation instructions, and TODO for future plans. |
1086 | |
1087 | === removed file 'TODO' |
1088 | --- TODO 2011-01-06 12:59:22 +0000 |
1089 | +++ TODO 1970-01-01 00:00:00 +0000 |
1090 | @@ -1,2 +0,0 @@ |
1091 | -- "Roundtripping" push into git |
1092 | -- More tests |
1093 | |
1094 | === removed file '__init__.py' |
1095 | --- __init__.py 2017-06-11 02:17:08 +0000 |
1096 | +++ __init__.py 1970-01-01 00:00:00 +0000 |
1097 | @@ -1,475 +0,0 @@ |
1098 | -# Copyright (C) 2006-2009 Canonical Ltd |
1099 | - |
1100 | -# Authors: Robert Collins <robert.collins@canonical.com> |
1101 | -# Jelmer Vernooij <jelmer@samba.org> |
1102 | -# John Carr <john.carr@unrouted.co.uk> |
1103 | -# |
1104 | -# This program is free software; you can redistribute it and/or modify |
1105 | -# it under the terms of the GNU General Public License as published by |
1106 | -# the Free Software Foundation; either version 2 of the License, or |
1107 | -# (at your option) any later version. |
1108 | -# |
1109 | -# This program is distributed in the hope that it will be useful, |
1110 | -# but WITHOUT ANY WARRANTY; without even the implied warranty of |
1111 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1112 | -# GNU General Public License for more details. |
1113 | -# |
1114 | -# You should have received a copy of the GNU General Public License |
1115 | -# along with this program; if not, write to the Free Software |
1116 | -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
1117 | - |
1118 | - |
1119 | -"""A GIT branch and repository format implementation for bzr.""" |
1120 | - |
1121 | -from __future__ import absolute_import |
1122 | - |
1123 | -import os |
1124 | -import sys |
1125 | - |
1126 | -import bzrlib |
1127 | -import bzrlib.api |
1128 | - |
1129 | -from .info import ( |
1130 | - bzr_compatible_versions, |
1131 | - bzr_plugin_version as version_info, |
1132 | - dulwich_minimum_version, |
1133 | - ) |
1134 | - |
1135 | -if version_info[3] == 'final': |
1136 | - version_string = '%d.%d.%d' % version_info[:3] |
1137 | -else: |
1138 | - version_string = '%d.%d.%d%s%d' % version_info |
1139 | -__version__ = version_string |
1140 | - |
1141 | -bzrlib.api.require_any_api(bzrlib, bzr_compatible_versions) |
1142 | - |
1143 | -try: |
1144 | - from ...i18n import load_plugin_translations |
1145 | -except ImportError: # No translations for bzr < 2.5 |
1146 | - gettext = lambda x: x |
1147 | -else: |
1148 | - translation = load_plugin_translations("bzr-git") |
1149 | - gettext = translation.gettext |
1150 | - |
1151 | -from ... import ( |
1152 | - errors as bzr_errors, |
1153 | - trace, |
1154 | - ) |
1155 | - |
1156 | -from ...controldir import ( |
1157 | - ControlDirFormat, |
1158 | - Prober, |
1159 | - format_registry, |
1160 | - network_format_registry as controldir_network_format_registry, |
1161 | - ) |
1162 | - |
1163 | -from ...transport import ( |
1164 | - register_lazy_transport, |
1165 | - register_transport_proto, |
1166 | - transport_server_registry, |
1167 | - ) |
1168 | -from ...commands import ( |
1169 | - plugin_cmds, |
1170 | - ) |
1171 | - |
1172 | - |
1173 | -if getattr(sys, "frozen", None): |
1174 | - # allow import additional libs from ./_lib for bzr.exe only |
1175 | - sys.path.append(os.path.normpath( |
1176 | - os.path.join(os.path.dirname(__file__), '_lib'))) |
1177 | - |
1178 | - |
1179 | -def import_dulwich(): |
1180 | - try: |
1181 | - from dulwich import __version__ as dulwich_version |
1182 | - except ImportError: |
1183 | - raise bzr_errors.DependencyNotPresent("dulwich", |
1184 | - "bzr-git: Please install dulwich, https://launchpad.net/dulwich") |
1185 | - else: |
1186 | - if dulwich_version < dulwich_minimum_version: |
1187 | - raise bzr_errors.DependencyNotPresent("dulwich", |
1188 | - "bzr-git: Dulwich is too old; at least %d.%d.%d is required" % |
1189 | - dulwich_minimum_version) |
1190 | - |
1191 | - |
1192 | -_versions_checked = False |
1193 | -def lazy_check_versions(): |
1194 | - global _versions_checked |
1195 | - if _versions_checked: |
1196 | - return |
1197 | - import_dulwich() |
1198 | - _versions_checked = True |
1199 | - |
1200 | -format_registry.register_lazy('git', |
1201 | - "bzrlib.plugins.git.dir", "LocalGitControlDirFormat", |
1202 | - help='GIT repository.', native=False, experimental=False, |
1203 | - ) |
1204 | - |
1205 | -format_registry.register_lazy('git-bare', |
1206 | - "bzrlib.plugins.git.dir", "BareLocalGitControlDirFormat", |
1207 | - help='Bare GIT repository (no working tree).', native=False, |
1208 | - experimental=False, |
1209 | - ) |
1210 | - |
1211 | -from ...revisionspec import (RevisionSpec_dwim, revspec_registry) |
1212 | -revspec_registry.register_lazy("git:", "bzrlib.plugins.git.revspec", |
1213 | - "RevisionSpec_git") |
1214 | -RevisionSpec_dwim.append_possible_lazy_revspec( |
1215 | - "bzrlib.plugins.git.revspec", "RevisionSpec_git") |
1216 | - |
1217 | - |
1218 | -class LocalGitProber(Prober): |
1219 | - |
1220 | - def probe_transport(self, transport): |
1221 | - try: |
1222 | - external_url = transport.external_url() |
1223 | - except bzr_errors.InProcessTransport: |
1224 | - raise bzr_errors.NotBranchError(path=transport.base) |
1225 | - if (external_url.startswith("http:") or |
1226 | - external_url.startswith("https:")): |
1227 | - # Already handled by RemoteGitProber |
1228 | - raise bzr_errors.NotBranchError(path=transport.base) |
1229 | - from ... import urlutils |
1230 | - if urlutils.split(transport.base)[1] == ".git": |
1231 | - raise bzr_errors.NotBranchError(path=transport.base) |
1232 | - if not transport.has_any(['objects', '.git/objects']): |
1233 | - raise bzr_errors.NotBranchError(path=transport.base) |
1234 | - lazy_check_versions() |
1235 | - from .dir import ( |
1236 | - BareLocalGitControlDirFormat, |
1237 | - LocalGitControlDirFormat, |
1238 | - ) |
1239 | - if transport.has_any(['.git/objects']): |
1240 | - return LocalGitControlDirFormat() |
1241 | - if transport.has('info') and transport.has('objects'): |
1242 | - return BareLocalGitControlDirFormat() |
1243 | - raise bzr_errors.NotBranchError(path=transport.base) |
1244 | - |
1245 | - @classmethod |
1246 | - def known_formats(cls): |
1247 | - from .dir import ( |
1248 | - BareLocalGitControlDirFormat, |
1249 | - LocalGitControlDirFormat, |
1250 | - ) |
1251 | - return set([BareLocalGitControlDirFormat(), LocalGitControlDirFormat()]) |
1252 | - |
1253 | - |
1254 | -class RemoteGitProber(Prober): |
1255 | - |
1256 | - def probe_http_transport(self, transport): |
1257 | - from ... import urlutils |
1258 | - base_url, _ = urlutils.split_segment_parameters(transport.external_url()) |
1259 | - url = urlutils.join(base_url, "info/refs") + "?service=git-upload-pack" |
1260 | - from ...transport.http._urllib import HttpTransport_urllib, Request |
1261 | - if isinstance(transport, HttpTransport_urllib): |
1262 | - req = Request('GET', url, accepted_errors=[200, 403, 404, 405], |
1263 | - headers={"Content-Type": "application/x-git-upload-pack-request"}) |
1264 | - req.follow_redirections = True |
1265 | - resp = transport._perform(req) |
1266 | - if resp.code in (404, 405): |
1267 | - raise bzr_errors.NotBranchError(transport.base) |
1268 | - headers = resp.headers |
1269 | - refs_text = resp.read() |
1270 | - else: |
1271 | - try: |
1272 | - from ...transport.http._pycurl import PyCurlTransport |
1273 | - except bzr_errors.DependencyNotPresent: |
1274 | - raise bzr_errors.NotBranchError(transport.base) |
1275 | - else: |
1276 | - import pycurl |
1277 | - from cStringIO import StringIO |
1278 | - if isinstance(transport, PyCurlTransport): |
1279 | - conn = transport._get_curl() |
1280 | - conn.setopt(pycurl.URL, url) |
1281 | - conn.setopt(pycurl.FOLLOWLOCATION, 1) |
1282 | - transport._set_curl_options(conn) |
1283 | - conn.setopt(pycurl.HTTPGET, 1) |
1284 | - header = StringIO() |
1285 | - data = StringIO() |
1286 | - conn.setopt(pycurl.HEADERFUNCTION, header.write) |
1287 | - conn.setopt(pycurl.WRITEFUNCTION, data.write) |
1288 | - transport._curl_perform(conn, header, |
1289 | - ["Content-Type: application/x-git-upload-pack-request"]) |
1290 | - code = conn.getinfo(pycurl.HTTP_CODE) |
1291 | - if code in (404, 405): |
1292 | - raise bzr_errors.NotBranchError(transport.base) |
1293 | - if code != 200: |
1294 | - raise bzr_errors.InvalidHttpResponse(transport._path, |
1295 | - str(code)) |
1296 | - headers = transport._parse_headers(header) |
1297 | - else: |
1298 | - raise bzr_errors.NotBranchError(transport.base) |
1299 | - refs_text = data.getvalue() |
1300 | - ct = headers.getheader("Content-Type") |
1301 | - if ct is None: |
1302 | - raise bzr_errors.NotBranchError(transport.base) |
1303 | - if ct.startswith("application/x-git"): |
1304 | - from .remote import RemoteGitControlDirFormat |
1305 | - return RemoteGitControlDirFormat() |
1306 | - else: |
1307 | - from .dir import ( |
1308 | - BareLocalGitControlDirFormat, |
1309 | - ) |
1310 | - ret = BareLocalGitControlDirFormat() |
1311 | - ret._refs_text = refs_text |
1312 | - return ret |
1313 | - |
1314 | - def probe_transport(self, transport): |
1315 | - try: |
1316 | - external_url = transport.external_url() |
1317 | - except bzr_errors.InProcessTransport: |
1318 | - raise bzr_errors.NotBranchError(path=transport.base) |
1319 | - |
1320 | - if (external_url.startswith("http:") or |
1321 | - external_url.startswith("https:")): |
1322 | - return self.probe_http_transport(transport) |
1323 | - |
1324 | - if (not external_url.startswith("git://") and |
1325 | - not external_url.startswith("git+")): |
1326 | - raise bzr_errors.NotBranchError(transport.base) |
1327 | - |
1328 | - # little ugly, but works |
1329 | - from .remote import ( |
1330 | - GitSmartTransport, |
1331 | - RemoteGitControlDirFormat, |
1332 | - ) |
1333 | - if isinstance(transport, GitSmartTransport): |
1334 | - return RemoteGitControlDirFormat() |
1335 | - raise bzr_errors.NotBranchError(path=transport.base) |
1336 | - |
1337 | - @classmethod |
1338 | - def known_formats(cls): |
1339 | - from .remote import RemoteGitControlDirFormat |
1340 | - return set([RemoteGitControlDirFormat()]) |
1341 | - |
1342 | - |
1343 | -ControlDirFormat.register_prober(LocalGitProber) |
1344 | -ControlDirFormat._server_probers.append(RemoteGitProber) |
1345 | - |
1346 | -register_transport_proto('git://', |
1347 | - help="Access using the Git smart server protocol.") |
1348 | -register_transport_proto('git+ssh://', |
1349 | - help="Access using the Git smart server protocol over SSH.") |
1350 | - |
1351 | -register_lazy_transport("git://", __name__ + '.remote', |
1352 | - 'TCPGitSmartTransport') |
1353 | -register_lazy_transport("git+ssh://", __name__ + '.remote', |
1354 | - 'SSHGitSmartTransport') |
1355 | - |
1356 | - |
1357 | -plugin_cmds.register_lazy("cmd_git_import", [], __name__ + ".commands") |
1358 | -plugin_cmds.register_lazy("cmd_git_object", ["git-objects", "git-cat"], |
1359 | - __name__ + ".commands") |
1360 | -plugin_cmds.register_lazy("cmd_git_refs", [], __name__ + ".commands") |
1361 | -plugin_cmds.register_lazy("cmd_git_apply", [], __name__ + ".commands") |
1362 | -plugin_cmds.register_lazy("cmd_git_push_pristine_tar_deltas", |
1363 | - ['git-push-pristine-tar', 'git-push-pristine'], |
1364 | - __name__ + ".commands") |
1365 | - |
1366 | -def extract_git_foreign_revid(rev): |
1367 | - try: |
1368 | - foreign_revid = rev.foreign_revid |
1369 | - except AttributeError: |
1370 | - from .mapping import mapping_registry |
1371 | - foreign_revid, mapping = \ |
1372 | - mapping_registry.parse_revision_id(rev.revision_id) |
1373 | - return foreign_revid |
1374 | - else: |
1375 | - from .mapping import foreign_vcs_git |
1376 | - if rev.mapping.vcs == foreign_vcs_git: |
1377 | - return foreign_revid |
1378 | - else: |
1379 | - raise bzr_errors.InvalidRevisionId(rev.revision_id, None) |
1380 | - |
1381 | - |
1382 | -def update_stanza(rev, stanza): |
1383 | - mapping = getattr(rev, "mapping", None) |
1384 | - try: |
1385 | - git_commit = extract_git_foreign_revid(rev) |
1386 | - except bzr_errors.InvalidRevisionId: |
1387 | - pass |
1388 | - else: |
1389 | - stanza.add("git-commit", git_commit) |
1390 | - |
1391 | -from ...hooks import install_lazy_named_hook |
1392 | -install_lazy_named_hook("bzrlib.version_info_formats.format_rio", |
1393 | - "RioVersionInfoBuilder.hooks", "revision", update_stanza, |
1394 | - "git commits") |
1395 | - |
1396 | - |
1397 | -transport_server_registry.register_lazy('git', |
1398 | - __name__ + '.server', |
1399 | - 'serve_git', |
1400 | - 'Git Smart server protocol over TCP. (default port: 9418)') |
1401 | - |
1402 | -transport_server_registry.register_lazy('git-receive-pack', |
1403 | - __name__ + '.server', |
1404 | - 'serve_git_receive_pack', |
1405 | - help='Git Smart server receive pack command. (inetd mode only)') |
1406 | -transport_server_registry.register_lazy('git-upload-pack', |
1407 | - __name__ + 'git.server', |
1408 | - 'serve_git_upload_pack', |
1409 | - help='Git Smart server upload pack command. (inetd mode only)') |
1410 | - |
1411 | -from ...repository import ( |
1412 | - format_registry as repository_format_registry, |
1413 | - network_format_registry as repository_network_format_registry, |
1414 | - ) |
1415 | -repository_network_format_registry.register_lazy('git', |
1416 | - __name__ + '.repository', 'GitRepositoryFormat') |
1417 | - |
1418 | -register_extra_lazy_repository_format = getattr(repository_format_registry, |
1419 | - "register_extra_lazy") |
1420 | -register_extra_lazy_repository_format(__name__ + '.repository', |
1421 | - 'GitRepositoryFormat') |
1422 | - |
1423 | -from ...branch import ( |
1424 | - network_format_registry as branch_network_format_registry, |
1425 | - ) |
1426 | -branch_network_format_registry.register_lazy('git', |
1427 | - __name__ + '.branch', 'GitBranchFormat') |
1428 | - |
1429 | -from ...branch import ( |
1430 | - format_registry as branch_format_registry, |
1431 | - ) |
1432 | -branch_format_registry.register_extra_lazy( |
1433 | - __name__ + '.branch', |
1434 | - 'GitBranchFormat', |
1435 | - ) |
1436 | - |
1437 | -from ...workingtree import ( |
1438 | - format_registry as workingtree_format_registry, |
1439 | - ) |
1440 | -workingtree_format_registry.register_extra_lazy( |
1441 | - __name__ + '.workingtree', |
1442 | - 'GitWorkingTreeFormat', |
1443 | - ) |
1444 | - |
1445 | -controldir_network_format_registry.register_lazy('git', |
1446 | - __name__ + ".dir", "GitControlDirFormat") |
1447 | - |
1448 | - |
1449 | -try: |
1450 | - from ...registry import register_lazy |
1451 | -except ImportError: |
1452 | - from ...diff import format_registry as diff_format_registry |
1453 | - diff_format_registry.register_lazy('git', __name__ + '.send', |
1454 | - 'GitDiffTree', 'Git am-style diff format') |
1455 | - |
1456 | - from ...send import ( |
1457 | - format_registry as send_format_registry, |
1458 | - ) |
1459 | - send_format_registry.register_lazy('git', __name__ + '.send', |
1460 | - 'send_git', 'Git am-style diff format') |
1461 | - |
1462 | - from ...directory_service import directories |
1463 | - directories.register_lazy('github:', __name__ + '.directory', |
1464 | - 'GitHubDirectory', |
1465 | - 'GitHub directory.') |
1466 | - directories.register_lazy('git@github.com:', __name__ + '.directory', |
1467 | - 'GitHubDirectory', |
1468 | - 'GitHub directory.') |
1469 | - |
1470 | - from ...help_topics import ( |
1471 | - topic_registry, |
1472 | - ) |
1473 | - topic_registry.register_lazy('git', __name__ + '.help', 'help_git', |
1474 | - 'Using Bazaar with Git') |
1475 | - |
1476 | - from ...foreign import ( |
1477 | - foreign_vcs_registry, |
1478 | - ) |
1479 | - foreign_vcs_registry.register_lazy("git", |
1480 | - __name__ + ".mapping", "foreign_vcs_git", "Stupid content tracker") |
1481 | -else: |
1482 | - register_lazy("bzrlib.diff", "format_registry", |
1483 | - 'git', __name__ + '.send', 'GitDiffTree', |
1484 | - 'Git am-style diff format') |
1485 | - register_lazy("bzrlib.send", "format_registry", |
1486 | - 'git', __name__ + '.send', 'send_git', |
1487 | - 'Git am-style diff format') |
1488 | - register_lazy('bzrlib.directory_service', 'directories', 'github:', |
1489 | - __name__ + '.directory', 'GitHubDirectory', |
1490 | - 'GitHub directory.') |
1491 | - register_lazy('bzrlib.directory_service', 'directories', |
1492 | - 'git@github.com:', 'bzrlib.plugins.git.directory', |
1493 | - 'GitHubDirectory', 'GitHub directory.') |
1494 | - register_lazy('bzrlib.help_topics', 'topic_registry', |
1495 | - 'git', __name__ + '.help', 'help_git', |
1496 | - 'Using Bazaar with Git') |
1497 | - register_lazy('bzrlib.foreign', 'foreign_vcs_registry', "git", |
1498 | - __name__ + ".mapping", "foreign_vcs_git", "Stupid content tracker") |
1499 | - |
1500 | -def update_git_cache(repository, revid): |
1501 | - """Update the git cache after a local commit.""" |
1502 | - if getattr(repository, "_git", None) is not None: |
1503 | - return # No need to update cache for git repositories |
1504 | - |
1505 | - if not repository.control_transport.has("git"): |
1506 | - return # No existing cache, don't bother updating |
1507 | - try: |
1508 | - lazy_check_versions() |
1509 | - except bzr_errors.DependencyNotPresent, e: |
1510 | - # dulwich is probably missing. silently ignore |
1511 | - trace.mutter("not updating git map for %r: %s", |
1512 | - repository, e) |
1513 | - |
1514 | - from .object_store import BazaarObjectStore |
1515 | - store = BazaarObjectStore(repository) |
1516 | - store.lock_write() |
1517 | - try: |
1518 | - try: |
1519 | - parent_revisions = set(repository.get_parent_map([revid])[revid]) |
1520 | - except KeyError: |
1521 | - # Isn't this a bit odd - how can a revision that was just committed be missing? |
1522 | - return |
1523 | - missing_revisions = store._missing_revisions(parent_revisions) |
1524 | - if not missing_revisions: |
1525 | - # Only update if the cache was up to date previously |
1526 | - store._update_sha_map_revision(revid) |
1527 | - finally: |
1528 | - store.unlock() |
1529 | - |
1530 | - |
1531 | -def post_commit_update_cache(local_branch, master_branch, old_revno, old_revid, |
1532 | - new_revno, new_revid): |
1533 | - if local_branch is not None: |
1534 | - update_git_cache(local_branch.repository, new_revid) |
1535 | - update_git_cache(master_branch.repository, new_revid) |
1536 | - |
1537 | - |
1538 | -def loggerhead_git_hook(branch_app, environ): |
1539 | - branch = branch_app.branch |
1540 | - config_stack = branch.get_config_stack() |
1541 | - if config_stack.get('http_git'): |
1542 | - return None |
1543 | - from .server import git_http_hook |
1544 | - return git_http_hook(branch, environ['REQUEST_METHOD'], |
1545 | - environ['PATH_INFO']) |
1546 | - |
1547 | -install_lazy_named_hook("bzrlib.branch", |
1548 | - "Branch.hooks", "post_commit", post_commit_update_cache, |
1549 | - "git cache") |
1550 | -install_lazy_named_hook("bzrlib.plugins.loggerhead.apps.branch", |
1551 | - "BranchWSGIApp.hooks", "controller", |
1552 | - loggerhead_git_hook, "git support") |
1553 | - |
1554 | - |
1555 | -from ...config import ( |
1556 | - option_registry, |
1557 | - Option, |
1558 | - bool_from_store, |
1559 | - ) |
1560 | - |
1561 | -option_registry.register( |
1562 | - Option('git.http', |
1563 | - default=None, from_unicode=bool_from_store, invalid='warning', |
1564 | - help='''\ |
1565 | -Allow fetching of Git packs over HTTP. |
1566 | - |
1567 | -This enables support for fetching Git packs over HTTP in Loggerhead. |
1568 | -''')) |
1569 | - |
1570 | -def test_suite(): |
1571 | - from . import tests |
1572 | - return tests.test_suite() |
1573 | |
1574 | === removed file 'branch.py' |
1575 | --- branch.py 2017-06-05 23:51:37 +0000 |
1576 | +++ branch.py 1970-01-01 00:00:00 +0000 |
1577 | @@ -1,1165 +0,0 @@ |
1578 | -# Copyright (C) 2007,2012 Canonical Ltd |
1579 | -# Copyright (C) 2009-2012 Jelmer Vernooij <jelmer@samba.org> |
1580 | -# |
1581 | -# This program is free software; you can redistribute it and/or modify |
1582 | -# it under the terms of the GNU General Public License as published by |
1583 | -# the Free Software Foundation; either version 2 of the License, or |
1584 | -# (at your option) any later version. |
1585 | -# |
1586 | -# This program is distributed in the hope that it will be useful, |
1587 | -# but WITHOUT ANY WARRANTY; without even the implied warranty of |
1588 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1589 | -# GNU General Public License for more details. |
1590 | -# |
1591 | -# You should have received a copy of the GNU General Public License |
1592 | -# along with this program; if not, write to the Free Software |
1593 | -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
1594 | - |
1595 | -"""An adapter between a Git Branch and a Bazaar Branch""" |
1596 | - |
1597 | -from __future__ import absolute_import |
1598 | - |
1599 | -from cStringIO import StringIO |
1600 | -from collections import defaultdict |
1601 | - |
1602 | -from dulwich.objects import ( |
1603 | - ZERO_SHA, |
1604 | - ) |
1605 | -from dulwich.repo import check_ref_format |
1606 | - |
1607 | -from ... import ( |
1608 | - branch, |
1609 | - bzrdir, |
1610 | - config, |
1611 | - errors, |
1612 | - repository as _mod_repository, |
1613 | - revision, |
1614 | - tag, |
1615 | - transport, |
1616 | - urlutils, |
1617 | - ) |
1618 | -from ...decorators import ( |
1619 | - needs_read_lock, |
1620 | - ) |
1621 | -from ...revision import ( |
1622 | - NULL_REVISION, |
1623 | - ) |
1624 | -from ...trace import ( |
1625 | - is_quiet, |
1626 | - mutter, |
1627 | - warning, |
1628 | - ) |
1629 | - |
1630 | -from .config import ( |
1631 | - GitBranchConfig, |
1632 | - GitBranchStack, |
1633 | - ) |
1634 | -from .errors import ( |
1635 | - NoPushSupport, |
1636 | - NoSuchRef, |
1637 | - ) |
1638 | -from .refs import ( |
1639 | - is_tag, |
1640 | - ref_to_branch_name, |
1641 | - ref_to_tag_name, |
1642 | - tag_name_to_ref, |
1643 | - ) |
1644 | -from .unpeel_map import ( |
1645 | - UnpeelMap, |
1646 | - ) |
1647 | - |
1648 | -from ...foreign import ForeignBranch |
1649 | - |
1650 | - |
1651 | -class GitPullResult(branch.PullResult): |
1652 | - """Result of a pull from a Git branch.""" |
1653 | - |
1654 | - def _lookup_revno(self, revid): |
1655 | - assert isinstance(revid, str), "was %r" % revid |
1656 | - # Try in source branch first, it'll be faster |
1657 | - self.target_branch.lock_read() |
1658 | - try: |
1659 | - return self.target_branch.revision_id_to_revno(revid) |
1660 | - finally: |
1661 | - self.target_branch.unlock() |
1662 | - |
1663 | - @property |
1664 | - def old_revno(self): |
1665 | - return self._lookup_revno(self.old_revid) |
1666 | - |
1667 | - @property |
1668 | - def new_revno(self): |
1669 | - return self._lookup_revno(self.new_revid) |
1670 | - |
1671 | - |
1672 | -class GitTags(tag.BasicTags): |
1673 | - """Ref-based tag dictionary.""" |
1674 | - |
1675 | - def __init__(self, branch): |
1676 | - self.branch = branch |
1677 | - self.repository = branch.repository |
1678 | - |
1679 | - def get_refs_container(self): |
1680 | - raise NotImplementedError(self.get_refs_container) |
1681 | - |
1682 | - def _iter_tag_refs(self, refs): |
1683 | - """Iterate over the tag refs. |
1684 | - |
1685 | - :param refs: Refs dictionary (name -> git sha1) |
1686 | - :return: iterator over (name, peeled_sha1, unpeeled_sha1, bzr_revid) |
1687 | - """ |
1688 | - for k, unpeeled in refs.as_dict().iteritems(): |
1689 | - try: |
1690 | - tag_name = ref_to_tag_name(k) |
1691 | - except (ValueError, UnicodeDecodeError): |
1692 | - continue |
1693 | - peeled = refs.get_peeled(k) |
1694 | - if peeled is None: |
1695 | - peeled = self.repository.bzrdir._git.object_store.peel_sha(unpeeled).id |
1696 | - assert type(tag_name) is unicode |
1697 | - yield (tag_name, peeled, unpeeled, |
1698 | - self.branch.lookup_foreign_revision_id(peeled)) |
1699 | - |
1700 | - def _merge_to_remote_git(self, target_repo, new_refs, overwrite=False): |
1701 | - updates = {} |
1702 | - conflicts = [] |
1703 | - def get_changed_refs(old_refs): |
1704 | - ret = dict(old_refs) |
1705 | - for k, v in new_refs.iteritems(): |
1706 | - if not is_tag(k): |
1707 | - continue |
1708 | - name = ref_to_tag_name(k) |
1709 | - if old_refs.get(k) == v: |
1710 | - pass |
1711 | - elif overwrite or not k in old_refs: |
1712 | - ret[k] = v |
1713 | - updates[name] = target_repo.lookup_foreign_revision_id(v) |
1714 | - else: |
1715 | - conflicts.append((name, v, old_refs[k])) |
1716 | - return ret |
1717 | - target_repo.bzrdir.send_pack(get_changed_refs, lambda have, want: []) |
1718 | - return updates, conflicts |
1719 | - |
1720 | - def _merge_to_local_git(self, target_repo, refs, overwrite=False): |
1721 | - conflicts = [] |
1722 | - updates = {} |
1723 | - for k, unpeeled in refs.as_dict().iteritems(): |
1724 | - if not is_tag(k): |
1725 | - continue |
1726 | - name = ref_to_tag_name(k) |
1727 | - peeled = self.repository.bzrdir.get_peeled(k) |
1728 | - if target_repo._git.refs.get(k) == unpeeled: |
1729 | - pass |
1730 | - elif overwrite or not k in target_repo._git.refs: |
1731 | - target_repo._git.refs[k] = unpeeled or peeled |
1732 | - updates[name] = target_repo.lookup_foreign_revision_id(peeled) |
1733 | - else: |
1734 | - conflicts.append((name, peeled, target_repo._git.refs[k])) |
1735 | - return updates, conflicts |
1736 | - |
1737 | - def _merge_to_git(self, to_tags, refs, overwrite=False): |
1738 | - target_repo = to_tags.repository |
1739 | - if self.repository.has_same_location(target_repo): |
1740 | - return {}, [] |
1741 | - if getattr(target_repo, "_git", None): |
1742 | - return self._merge_to_local_git(target_repo, refs, overwrite) |
1743 | - else: |
1744 | - return self._merge_to_remote_git(target_repo, refs, overwrite) |
1745 | - |
1746 | - def _merge_to_non_git(self, to_tags, refs, overwrite=False): |
1747 | - unpeeled_map = defaultdict(set) |
1748 | - conflicts = [] |
1749 | - updates = {} |
1750 | - result = dict(to_tags.get_tag_dict()) |
1751 | - for n, peeled, unpeeled, bzr_revid in self._iter_tag_refs(refs): |
1752 | - if unpeeled is not None: |
1753 | - unpeeled_map[peeled].add(unpeeled) |
1754 | - if result.get(n) == bzr_revid: |
1755 | - pass |
1756 | - elif n not in result or overwrite: |
1757 | - result[n] = bzr_revid |
1758 | - updates[n] = bzr_revid |
1759 | - else: |
1760 | - conflicts.append((n, result[n], bzr_revid)) |
1761 | - to_tags._set_tag_dict(result) |
1762 | - if len(unpeeled_map) > 0: |
1763 | - map_file = UnpeelMap.from_repository(to_tags.branch.repository) |
1764 | - map_file.update(unpeeled_map) |
1765 | - map_file.save_in_repository(to_tags.branch.repository) |
1766 | - return updates, conflicts |
1767 | - |
1768 | - def merge_to(self, to_tags, overwrite=False, ignore_master=False, |
1769 | - source_refs=None): |
1770 | - """See Tags.merge_to.""" |
1771 | - if source_refs is None: |
1772 | - source_refs = self.get_refs_container() |
1773 | - if self == to_tags: |
1774 | - return {}, [] |
1775 | - if isinstance(to_tags, GitTags): |
1776 | - return self._merge_to_git(to_tags, source_refs, |
1777 | - overwrite=overwrite) |
1778 | - else: |
1779 | - if ignore_master: |
1780 | - master = None |
1781 | - else: |
1782 | - master = to_tags.branch.get_master_branch() |
1783 | - updates, conflicts = self._merge_to_non_git(to_tags, source_refs, |
1784 | - overwrite=overwrite) |
1785 | - if master is not None: |
1786 | - extra_updates, extra_conflicts = self.merge_to( |
1787 | - master.tags, overwrite=overwrite, |
1788 | - source_refs=source_refs, |
1789 | - ignore_master=ignore_master) |
1790 | - updates.update(extra_updates) |
1791 | - conflicts += extra_conflicts |
1792 | - return updates, conflicts |
1793 | - |
1794 | - def get_tag_dict(self): |
1795 | - ret = {} |
1796 | - refs = self.get_refs_container() |
1797 | - for (name, peeled, unpeeled, bzr_revid) in self._iter_tag_refs(refs): |
1798 | - ret[name] = bzr_revid |
1799 | - return ret |
1800 | - |
1801 | - |
1802 | -class LocalGitTagDict(GitTags): |
1803 | - """Dictionary with tags in a local repository.""" |
1804 | - |
1805 | - def __init__(self, branch): |
1806 | - super(LocalGitTagDict, self).__init__(branch) |
1807 | - self.refs = self.repository.bzrdir._git.refs |
1808 | - |
1809 | - def get_refs_container(self): |
1810 | - return self.refs |
1811 | - |
1812 | - def _set_tag_dict(self, to_dict): |
1813 | - extra = set(self.refs.allkeys()) |
1814 | - for k, revid in to_dict.iteritems(): |
1815 | - name = tag_name_to_ref(k) |
1816 | - if name in extra: |
1817 | - extra.remove(name) |
1818 | - self.set_tag(k, revid) |
1819 | - for name in extra: |
1820 | - if is_tag(name): |
1821 | - del self.repository._git[name] |
1822 | - |
1823 | - def set_tag(self, name, revid): |
1824 | - try: |
1825 | - git_sha, mapping = self.branch.lookup_bzr_revision_id(revid) |
1826 | - except errors.NoSuchRevision: |
1827 | - raise errors.GhostTagsNotSupported(self) |
1828 | - self.refs[tag_name_to_ref(name)] = git_sha |
1829 | - |
1830 | - |
1831 | -class DictTagDict(tag.BasicTags): |
1832 | - |
1833 | - def __init__(self, branch, tags): |
1834 | - super(DictTagDict, self).__init__(branch) |
1835 | - self._tags = tags |
1836 | - |
1837 | - def get_tag_dict(self): |
1838 | - return self._tags |
1839 | - |
1840 | - |
1841 | -class GitSymrefBranchFormat(branch.BranchFormat): |
1842 | - |
1843 | - def get_format_description(self): |
1844 | - return 'Git Symbolic Reference Branch' |
1845 | - |
1846 | - def network_name(self): |
1847 | - return "git" |
1848 | - |
1849 | - def get_reference(self, controldir, name=None): |
1850 | - return controldir.get_branch_reference(name) |
1851 | - |
1852 | - def set_reference(self, controldir, name, target): |
1853 | - return controldir.set_branch_reference(target, name) |
1854 | - |
1855 | - |
1856 | -class GitBranchFormat(branch.BranchFormat): |
1857 | - |
1858 | - def get_format_description(self): |
1859 | - return 'Git Branch' |
1860 | - |
1861 | - def network_name(self): |
1862 | - return "git" |
1863 | - |
1864 | - def supports_tags(self): |
1865 | - return True |
1866 | - |
1867 | - def supports_leaving_lock(self): |
1868 | - return False |
1869 | - |
1870 | - def supports_tags_referencing_ghosts(self): |
1871 | - return False |
1872 | - |
1873 | - def tags_are_versioned(self): |
1874 | - return False |
1875 | - |
1876 | - @property |
1877 | - def _matchingbzrdir(self): |
1878 | - from .dir import LocalGitControlDirFormat |
1879 | - return LocalGitControlDirFormat() |
1880 | - |
1881 | - def get_foreign_tests_branch_factory(self): |
1882 | - from .tests.test_branch import ForeignTestsBranchFactory |
1883 | - return ForeignTestsBranchFactory() |
1884 | - |
1885 | - def make_tags(self, branch): |
1886 | - try: |
1887 | - return branch.tags |
1888 | - except AttributeError: |
1889 | - pass |
1890 | - if getattr(branch.repository, "_git", None) is None: |
1891 | - from .remote import RemoteGitTagDict |
1892 | - return RemoteGitTagDict(branch) |
1893 | - else: |
1894 | - return LocalGitTagDict(branch) |
1895 | - |
1896 | - def initialize(self, a_bzrdir, name=None, repository=None, |
1897 | - append_revisions_only=None): |
1898 | - from .dir import LocalGitDir |
1899 | - if not isinstance(a_bzrdir, LocalGitDir): |
1900 | - raise errors.IncompatibleFormat(self, a_bzrdir._format) |
1901 | - return a_bzrdir.create_branch(repository=repository, name=name, |
1902 | - append_revisions_only=append_revisions_only) |
1903 | - |
1904 | - |
1905 | -class GitReadLock(object): |
1906 | - |
1907 | - def __init__(self, unlock): |
1908 | - self.unlock = unlock |
1909 | - |
1910 | - |
1911 | -class GitWriteLock(object): |
1912 | - |
1913 | - def __init__(self, unlock): |
1914 | - self.branch_token = None |
1915 | - self.unlock = unlock |
1916 | - |
1917 | - |
1918 | -class GitBranch(ForeignBranch): |
1919 | - """An adapter to git repositories for bzr Branch objects.""" |
1920 | - |
1921 | - @property |
1922 | - def control_transport(self): |
1923 | - return self.bzrdir.control_transport |
1924 | - |
1925 | - def __init__(self, bzrdir, repository, ref): |
1926 | - self.base = bzrdir.root_transport.base |
1927 | - self.repository = repository |
1928 | - self._format = GitBranchFormat() |
1929 | - self.bzrdir = bzrdir |
1930 | - self._lock_mode = None |
1931 | - self._lock_count = 0 |
1932 | - super(GitBranch, self).__init__(repository.get_mapping()) |
1933 | - self.ref = ref |
1934 | - try: |
1935 | - self.name = ref_to_branch_name(ref) |
1936 | - except ValueError: |
1937 | - self.name = None |
1938 | - self._head = None |
1939 | - |
1940 | - def _get_checkout_format(self, lightweight=False): |
1941 | - """Return the most suitable metadir for a checkout of this branch. |
1942 | - Weaves are used if this branch's repository uses weaves. |
1943 | - """ |
1944 | - return bzrdir.format_registry.make_bzrdir("default") |
1945 | - |
1946 | - def get_child_submit_format(self): |
1947 | - """Return the preferred format of submissions to this branch.""" |
1948 | - ret = self.get_config_stack().get("child_submit_format") |
1949 | - if ret is not None: |
1950 | - return ret |
1951 | - return "git" |
1952 | - |
1953 | - def get_config(self): |
1954 | - return GitBranchConfig(self) |
1955 | - |
1956 | - def get_config_stack(self): |
1957 | - return GitBranchStack(self) |
1958 | - |
1959 | - def _get_nick(self, local=False, possible_master_transports=None): |
1960 | - """Find the nick name for this branch. |
1961 | - |
1962 | - :return: Branch nick |
1963 | - """ |
1964 | - cs = self.repository._git.get_config_stack() |
1965 | - try: |
1966 | - return cs.get(("branch", self.name), "nick") |
1967 | - except KeyError: |
1968 | - pass |
1969 | - return self.name.encode('utf-8') or "HEAD" |
1970 | - |
1971 | - def _set_nick(self, nick): |
1972 | - cf = self.repository._git.get_config() |
1973 | - cf.set(("branch", self.name), "nick", nick) |
1974 | - f = StringIO() |
1975 | - cf.write_to_file(f) |
1976 | - self.bzrdir.control_transport.put_bytes('config', f.getvalue()) |
1977 | - |
1978 | - nick = property(_get_nick, _set_nick) |
1979 | - |
1980 | - def __repr__(self): |
1981 | - return "<%s(%r, %r)>" % (self.__class__.__name__, self.repository.base, |
1982 | - self.name) |
1983 | - |
1984 | - def generate_revision_history(self, revid, old_revid=None): |
1985 | - if revid == NULL_REVISION: |
1986 | - newhead = ZERO_SHA |
1987 | - else: |
1988 | - # FIXME: Check that old_revid is in the ancestry of revid |
1989 | - newhead, self.mapping = self.repository.lookup_bzr_revision_id(revid) |
1990 | - if self.mapping is None: |
1991 | - raise AssertionError |
1992 | - self._set_head(newhead) |
1993 | - |
1994 | - def lock_write(self, token=None): |
1995 | - if token is not None: |
1996 | - raise errors.TokenLockingNotSupported(self) |
1997 | - if self._lock_mode: |
1998 | - if self._lock_mode == 'r': |
1999 | - raise errors.ReadOnlyError(self) |
2000 | - self._lock_count += 1 |
2001 | - else: |
2002 | - self._lock_mode = 'w' |
2003 | - self._lock_count = 1 |
2004 | - self.repository.lock_write() |
2005 | - return GitWriteLock(self.unlock) |
2006 | - |
2007 | - def leave_lock_in_place(self): |
2008 | - raise NotImplementedError(self.leave_lock_in_place) |
2009 | - |
2010 | - def dont_leave_lock_in_place(self): |
2011 | - raise NotImplementedError(self.dont_leave_lock_in_place) |
2012 | - |
2013 | - def get_stacked_on_url(self): |
2014 | - # Git doesn't do stacking (yet...) |
2015 | - raise errors.UnstackableBranchFormat(self._format, self.base) |
2016 | - |
2017 | - def get_parent(self): |
2018 | - """See Branch.get_parent().""" |
2019 | - # FIXME: Set "origin" url from .git/config ? |
2020 | - return None |
2021 | - |
2022 | - def set_parent(self, url): |
2023 | - # FIXME: Set "origin" url in .git/config ? |
2024 | - pass |
2025 | - |
2026 | - def break_lock(self): |
2027 | - raise NotImplementedError(self.break_lock) |
2028 | - |
2029 | - def lock_read(self): |
2030 | - if self._lock_mode: |
2031 | - assert self._lock_mode in ('r', 'w') |
2032 | - self._lock_count += 1 |
2033 | - else: |
2034 | - self._lock_mode = 'r' |
2035 | - self._lock_count = 1 |
2036 | - self.repository.lock_read() |
2037 | - return GitReadLock(self.unlock) |
2038 | - |
2039 | - def peek_lock_mode(self): |
2040 | - return self._lock_mode |
2041 | - |
2042 | - def is_locked(self): |
2043 | - return (self._lock_mode is not None) |
2044 | - |
2045 | - def unlock(self): |
2046 | - """See Branch.unlock().""" |
2047 | - self._lock_count -= 1 |
2048 | - if self._lock_count == 0: |
2049 | - self._lock_mode = None |
2050 | - self._clear_cached_state() |
2051 | - self.repository.unlock() |
2052 | - |
2053 | - def get_physical_lock_status(self): |
2054 | - return False |
2055 | - |
2056 | - @needs_read_lock |
2057 | - def last_revision(self): |
2058 | - # perhaps should escape this ? |
2059 | - if self.head is None: |
2060 | - return revision.NULL_REVISION |
2061 | - return self.lookup_foreign_revision_id(self.head) |
2062 | - |
2063 | - def _basic_push(self, target, overwrite=False, stop_revision=None): |
2064 | - return branch.InterBranch.get(self, target)._basic_push( |
2065 | - overwrite, stop_revision) |
2066 | - |
2067 | - def lookup_foreign_revision_id(self, foreign_revid): |
2068 | - return self.repository.lookup_foreign_revision_id(foreign_revid, |
2069 | - self.mapping) |
2070 | - |
2071 | - def lookup_bzr_revision_id(self, revid): |
2072 | - return self.repository.lookup_bzr_revision_id( |
2073 | - revid, mapping=self.mapping) |
2074 | - |
2075 | - |
2076 | -class LocalGitBranch(GitBranch): |
2077 | - """A local Git branch.""" |
2078 | - |
2079 | - def __init__(self, bzrdir, repository, ref): |
2080 | - super(LocalGitBranch, self).__init__(bzrdir, repository, ref) |
2081 | - refs = bzrdir.get_refs_container() |
2082 | - if not (ref in refs or "HEAD" in refs): |
2083 | - raise errors.NotBranchError(self.base) |
2084 | - |
2085 | - def create_checkout(self, to_location, revision_id=None, lightweight=False, |
2086 | - accelerator_tree=None, hardlink=False): |
2087 | - if lightweight: |
2088 | - t = transport.get_transport(to_location) |
2089 | - t.ensure_base() |
2090 | - format = self._get_checkout_format(lightweight=True) |
2091 | - checkout = format.initialize_on_transport(t) |
2092 | - from_branch = branch.BranchReferenceFormat().initialize(checkout, |
2093 | - self) |
2094 | - tree = checkout.create_workingtree(revision_id, |
2095 | - from_branch=from_branch, hardlink=hardlink) |
2096 | - return tree |
2097 | - else: |
2098 | - return self._create_heavyweight_checkout(to_location, revision_id, |
2099 | - hardlink) |
2100 | - |
2101 | - def _create_heavyweight_checkout(self, to_location, revision_id=None, |
2102 | - hardlink=False): |
2103 | - """Create a new heavyweight checkout of this branch. |
2104 | - |
2105 | - :param to_location: URL of location to create the new checkout in. |
2106 | - :param revision_id: Revision that should be the tip of the checkout. |
2107 | - :param hardlink: Whether to hardlink |
2108 | - :return: WorkingTree object of checkout. |
2109 | - """ |
2110 | - checkout_branch = bzrdir.BzrDir.create_branch_convenience( |
2111 | - to_location, force_new_tree=False, |
2112 | - format=self._get_checkout_format(lightweight=False)) |
2113 | - checkout = checkout_branch.bzrdir |
2114 | - checkout_branch.bind(self) |
2115 | - # pull up to the specified revision_id to set the initial |
2116 | - # branch tip correctly, and seed it with history. |
2117 | - checkout_branch.pull(self, stop_revision=revision_id) |
2118 | - return checkout.create_workingtree(revision_id, hardlink=hardlink) |
2119 | - |
2120 | - def fetch(self, from_branch, last_revision=None, limit=None): |
2121 | - return branch.InterBranch.get(from_branch, self).fetch( |
2122 | - stop_revision=last_revision, limit=limit) |
2123 | - |
2124 | - def _gen_revision_history(self): |
2125 | - if self.head is None: |
2126 | - return [] |
2127 | - graph = self.repository.get_graph() |
2128 | - ret = list(graph.iter_lefthand_ancestry(self.last_revision(), |
2129 | - (revision.NULL_REVISION, ))) |
2130 | - ret.reverse() |
2131 | - return ret |
2132 | - |
2133 | - def _get_head(self): |
2134 | - try: |
2135 | - return self.repository._git.refs[self.ref or "HEAD"] |
2136 | - except KeyError: |
2137 | - return None |
2138 | - |
2139 | - def _read_last_revision_info(self): |
2140 | - last_revid = self.last_revision() |
2141 | - graph = self.repository.get_graph() |
2142 | - revno = graph.find_distance_to_null(last_revid, |
2143 | - [(revision.NULL_REVISION, 0)]) |
2144 | - return revno, last_revid |
2145 | - |
2146 | - def set_last_revision_info(self, revno, revision_id): |
2147 | - self.set_last_revision(revision_id) |
2148 | - self._last_revision_info_cache = revno, revision_id |
2149 | - |
2150 | - def set_last_revision(self, revid): |
2151 | - if not revid or not isinstance(revid, basestring): |
2152 | - raise errors.InvalidRevisionId(revision_id=revid, branch=self) |
2153 | - if revid == NULL_REVISION: |
2154 | - newhead = ZERO_SHA |
2155 | - else: |
2156 | - (newhead, self.mapping) = self.repository.lookup_bzr_revision_id(revid) |
2157 | - if self.mapping is None: |
2158 | - raise AssertionError |
2159 | - self._set_head(newhead) |
2160 | - |
2161 | - def _set_head(self, value): |
2162 | - self._head = value |
2163 | - self.repository._git.refs[self.ref or "HEAD"] = self._head |
2164 | - self._clear_cached_state() |
2165 | - |
2166 | - head = property(_get_head, _set_head) |
2167 | - |
2168 | - def get_push_location(self): |
2169 | - """See Branch.get_push_location.""" |
2170 | - push_loc = self.get_config_stack().get('push_location') |
2171 | - return push_loc |
2172 | - |
2173 | - def set_push_location(self, location): |
2174 | - """See Branch.set_push_location.""" |
2175 | - self.get_config().set_user_option('push_location', location, |
2176 | - store=config.STORE_LOCATION) |
2177 | - |
2178 | - def supports_tags(self): |
2179 | - return True |
2180 | - |
2181 | - |
2182 | -def _quick_lookup_revno(local_branch, remote_branch, revid): |
2183 | - assert isinstance(revid, str), "was %r" % revid |
2184 | - # Try in source branch first, it'll be faster |
2185 | - local_branch.lock_read() |
2186 | - try: |
2187 | - try: |
2188 | - return local_branch.revision_id_to_revno(revid) |
2189 | - except errors.NoSuchRevision: |
2190 | - graph = local_branch.repository.get_graph() |
2191 | - try: |
2192 | - return graph.find_distance_to_null(revid, |
2193 | - [(revision.NULL_REVISION, 0)]) |
2194 | - except errors.GhostRevisionsHaveNoRevno: |
2195 | - # FIXME: Check using graph.find_distance_to_null() ? |
2196 | - remote_branch.lock_read() |
2197 | - try: |
2198 | - return remote_branch.revision_id_to_revno(revid) |
2199 | - finally: |
2200 | - remote_branch.unlock() |
2201 | - finally: |
2202 | - local_branch.unlock() |
2203 | - |
2204 | - |
2205 | -class GitBranchPullResult(branch.PullResult): |
2206 | - |
2207 | - def __init__(self): |
2208 | - super(GitBranchPullResult, self).__init__() |
2209 | - self.new_git_head = None |
2210 | - self._old_revno = None |
2211 | - self._new_revno = None |
2212 | - |
2213 | - def report(self, to_file): |
2214 | - if not is_quiet(): |
2215 | - if self.old_revid == self.new_revid: |
2216 | - to_file.write('No revisions to pull.\n') |
2217 | - elif self.new_git_head is not None: |
2218 | - to_file.write('Now on revision %d (git sha: %s).\n' % |
2219 | - (self.new_revno, self.new_git_head)) |
2220 | - else: |
2221 | - to_file.write('Now on revision %d.\n' % (self.new_revno,)) |
2222 | - self._show_tag_conficts(to_file) |
2223 | - |
2224 | - def _lookup_revno(self, revid): |
2225 | - return _quick_lookup_revno(self.target_branch, self.source_branch, |
2226 | - revid) |
2227 | - |
2228 | - def _get_old_revno(self): |
2229 | - if self._old_revno is not None: |
2230 | - return self._old_revno |
2231 | - return self._lookup_revno(self.old_revid) |
2232 | - |
2233 | - def _set_old_revno(self, revno): |
2234 | - self._old_revno = revno |
2235 | - |
2236 | - old_revno = property(_get_old_revno, _set_old_revno) |
2237 | - |
2238 | - def _get_new_revno(self): |
2239 | - if self._new_revno is not None: |
2240 | - return self._new_revno |
2241 | - return self._lookup_revno(self.new_revid) |
2242 | - |
2243 | - def _set_new_revno(self, revno): |
2244 | - self._new_revno = revno |
2245 | - |
2246 | - new_revno = property(_get_new_revno, _set_new_revno) |
2247 | - |
2248 | - |
2249 | -class GitBranchPushResult(branch.BranchPushResult): |
2250 | - |
2251 | - def _lookup_revno(self, revid): |
2252 | - return _quick_lookup_revno(self.source_branch, self.target_branch, |
2253 | - revid) |
2254 | - |
2255 | - @property |
2256 | - def old_revno(self): |
2257 | - return self._lookup_revno(self.old_revid) |
2258 | - |
2259 | - @property |
2260 | - def new_revno(self): |
2261 | - new_original_revno = getattr(self, "new_original_revno", None) |
2262 | - if new_original_revno: |
2263 | - return new_original_revno |
2264 | - if getattr(self, "new_original_revid", None) is not None: |
2265 | - return self._lookup_revno(self.new_original_revid) |
2266 | - return self._lookup_revno(self.new_revid) |
2267 | - |
2268 | - |
2269 | -class InterFromGitBranch(branch.GenericInterBranch): |
2270 | - """InterBranch implementation that pulls from Git into bzr.""" |
2271 | - |
2272 | - @staticmethod |
2273 | - def _get_branch_formats_to_test(): |
2274 | - try: |
2275 | - default_format = branch.format_registry.get_default() |
2276 | - except AttributeError: |
2277 | - default_format = branch.BranchFormat._default_format |
2278 | - return [ |
2279 | - (GitBranchFormat(), GitBranchFormat()), |
2280 | - (GitBranchFormat(), default_format)] |
2281 | - |
2282 | - @classmethod |
2283 | - def _get_interrepo(self, source, target): |
2284 | - return _mod_repository.InterRepository.get(source.repository, target.repository) |
2285 | - |
2286 | - @classmethod |
2287 | - def is_compatible(cls, source, target): |
2288 | - if not isinstance(source, GitBranch): |
2289 | - return False |
2290 | - if isinstance(target, GitBranch): |
2291 | - # InterLocalGitRemoteGitBranch or InterToGitBranch should be used |
2292 | - return False |
2293 | - if getattr(cls._get_interrepo(source, target), "fetch_objects", None) is None: |
2294 | - # fetch_objects is necessary for this to work |
2295 | - return False |
2296 | - return True |
2297 | - |
2298 | - def fetch(self, stop_revision=None, fetch_tags=None, limit=None): |
2299 | - self.fetch_objects(stop_revision, fetch_tags=fetch_tags, limit=limit) |
2300 | - |
2301 | - def fetch_objects(self, stop_revision, fetch_tags, limit=None): |
2302 | - interrepo = self._get_interrepo(self.source, self.target) |
2303 | - if fetch_tags is None: |
2304 | - c = self.source.get_config_stack() |
2305 | - fetch_tags = c.get('branch.fetch_tags') |
2306 | - def determine_wants(heads): |
2307 | - if self.source.ref is not None and not self.source.ref in heads: |
2308 | - raise NoSuchRef(self.source.ref, self.source.user_url, heads.keys()) |
2309 | - |
2310 | - if stop_revision is None: |
2311 | - if self.source.ref is not None: |
2312 | - head = heads[self.source.ref] |
2313 | - else: |
2314 | - head = heads["HEAD"] |
2315 | - self._last_revid = self.source.lookup_foreign_revision_id(head) |
2316 | - else: |
2317 | - self._last_revid = stop_revision |
2318 | - real = interrepo.get_determine_wants_revids( |
2319 | - [self._last_revid], include_tags=fetch_tags) |
2320 | - return real(heads) |
2321 | - pack_hint, head, refs = interrepo.fetch_objects( |
2322 | - determine_wants, self.source.mapping, limit=limit) |
2323 | - if (pack_hint is not None and |
2324 | - self.target.repository._format.pack_compresses): |
2325 | - self.target.repository.pack(hint=pack_hint) |
2326 | - return head, refs |
2327 | - |
2328 | - def _update_revisions(self, stop_revision=None, overwrite=False): |
2329 | - head, refs = self.fetch_objects(stop_revision, fetch_tags=None) |
2330 | - if overwrite: |
2331 | - prev_last_revid = None |
2332 | - else: |
2333 | - prev_last_revid = self.target.last_revision() |
2334 | - self.target.generate_revision_history(self._last_revid, |
2335 | - prev_last_revid, self.source) |
2336 | - return head, refs |
2337 | - |
2338 | - def _basic_pull(self, stop_revision, overwrite, run_hooks, |
2339 | - _override_hook_target, _hook_master): |
2340 | - result = GitBranchPullResult() |
2341 | - result.source_branch = self.source |
2342 | - if _override_hook_target is None: |
2343 | - result.target_branch = self.target |
2344 | - else: |
2345 | - result.target_branch = _override_hook_target |
2346 | - self.source.lock_read() |
2347 | - try: |
2348 | - self.target.lock_write() |
2349 | - try: |
2350 | - # We assume that during 'pull' the target repository is closer than |
2351 | - # the source one. |
2352 | - (result.old_revno, result.old_revid) = \ |
2353 | - self.target.last_revision_info() |
2354 | - result.new_git_head, remote_refs = self._update_revisions( |
2355 | - stop_revision, overwrite=overwrite) |
2356 | - tags_ret = self.source.tags.merge_to( |
2357 | - self.target.tags, overwrite, ignore_master=True) |
2358 | - if isinstance(tags_ret, tuple): |
2359 | - result.tag_updates, result.tag_conflicts = tags_ret |
2360 | - else: |
2361 | - result.tag_conflicts = tags_ret |
2362 | - (result.new_revno, result.new_revid) = \ |
2363 | - self.target.last_revision_info() |
2364 | - if _hook_master: |
2365 | - result.master_branch = _hook_master |
2366 | - result.local_branch = result.target_branch |
2367 | - else: |
2368 | - result.master_branch = result.target_branch |
2369 | - result.local_branch = None |
2370 | - if run_hooks: |
2371 | - for hook in branch.Branch.hooks['post_pull']: |
2372 | - hook(result) |
2373 | - return result |
2374 | - finally: |
2375 | - self.target.unlock() |
2376 | - finally: |
2377 | - self.source.unlock() |
2378 | - |
2379 | - def pull(self, overwrite=False, stop_revision=None, |
2380 | - possible_transports=None, _hook_master=None, run_hooks=True, |
2381 | - _override_hook_target=None, local=False): |
2382 | - """See Branch.pull. |
2383 | - |
2384 | - :param _hook_master: Private parameter - set the branch to |
2385 | - be supplied as the master to pull hooks. |
2386 | - :param run_hooks: Private parameter - if false, this branch |
2387 | - is being called because it's the master of the primary branch, |
2388 | - so it should not run its hooks. |
2389 | - :param _override_hook_target: Private parameter - set the branch to be |
2390 | - supplied as the target_branch to pull hooks. |
2391 | - """ |
2392 | - # This type of branch can't be bound. |
2393 | - bound_location = self.target.get_bound_location() |
2394 | - if local and not bound_location: |
2395 | - raise errors.LocalRequiresBoundBranch() |
2396 | - master_branch = None |
2397 | - source_is_master = False |
2398 | - self.source.lock_read() |
2399 | - if bound_location: |
2400 | - # bound_location comes from a config file, some care has to be |
2401 | - # taken to relate it to source.user_url |
2402 | - normalized = urlutils.normalize_url(bound_location) |
2403 | - try: |
2404 | - relpath = self.source.user_transport.relpath(normalized) |
2405 | - source_is_master = (relpath == '') |
2406 | - except (errors.PathNotChild, errors.InvalidURL): |
2407 | - source_is_master = False |
2408 | - if not local and bound_location and not source_is_master: |
2409 | - # not pulling from master, so we need to update master. |
2410 | - master_branch = self.target.get_master_branch(possible_transports) |
2411 | - master_branch.lock_write() |
2412 | - try: |
2413 | - try: |
2414 | - if master_branch: |
2415 | - # pull from source into master. |
2416 | - master_branch.pull(self.source, overwrite, stop_revision, |
2417 | - run_hooks=False) |
2418 | - result = self._basic_pull(stop_revision, overwrite, run_hooks, |
2419 | - _override_hook_target, _hook_master=master_branch) |
2420 | - finally: |
2421 | - self.source.unlock() |
2422 | - finally: |
2423 | - if master_branch: |
2424 | - master_branch.unlock() |
2425 | - return result |
2426 | - |
2427 | - def _basic_push(self, overwrite=False, stop_revision=None): |
2428 | - result = branch.BranchPushResult() |
2429 | - result.source_branch = self.source |
2430 | - result.target_branch = self.target |
2431 | - result.old_revno, result.old_revid = self.target.last_revision_info() |
2432 | - result.new_git_head, remote_refs = self._update_revisions( |
2433 | - stop_revision, overwrite=overwrite) |
2434 | - tags_ret = self.source.tags.merge_to(self.target.tags, |
2435 | - overwrite) |
2436 | - if isinstance(tags_ret, tuple): |
2437 | - (result.tag_updates, result.tag_conflicts) = tags_ret |
2438 | - else: |
2439 | - result.tag_conflicts = tags_ret |
2440 | - result.new_revno, result.new_revid = self.target.last_revision_info() |
2441 | - return result |
2442 | - |
2443 | - |
2444 | -class InterGitBranch(branch.GenericInterBranch): |
2445 | - """InterBranch implementation that pulls between Git branches.""" |
2446 | - |
2447 | - def fetch(self, stop_revision=None, fetch_tags=None, limit=None): |
2448 | - raise NotImplementedError(self.fetch) |
2449 | - |
2450 | - |
2451 | -class InterLocalGitRemoteGitBranch(InterGitBranch): |
2452 | - """InterBranch that copies from a local to a remote git branch.""" |
2453 | - |
2454 | - @staticmethod |
2455 | - def _get_branch_formats_to_test(): |
2456 | - # FIXME |
2457 | - return [] |
2458 | - |
2459 | - @classmethod |
2460 | - def is_compatible(self, source, target): |
2461 | - from .remote import RemoteGitBranch |
2462 | - return (isinstance(source, LocalGitBranch) and |
2463 | - isinstance(target, RemoteGitBranch)) |
2464 | - |
2465 | - def _basic_push(self, overwrite=False, stop_revision=None): |
2466 | - result = GitBranchPushResult() |
2467 | - result.source_branch = self.source |
2468 | - result.target_branch = self.target |
2469 | - if stop_revision is None: |
2470 | - stop_revision = self.source.last_revision() |
2471 | - # FIXME: Check for diverged branches |
2472 | - def get_changed_refs(old_refs): |
2473 | - old_ref = old_refs.get(self.target.ref, ZERO_SHA) |
2474 | - result.old_revid = self.target.lookup_foreign_revision_id(old_ref) |
2475 | - refs = { self.target.ref: self.source.repository.lookup_bzr_revision_id(stop_revision)[0] } |
2476 | - result.new_revid = stop_revision |
2477 | - for name, sha in self.source.repository._git.refs.as_dict("refs/tags").iteritems(): |
2478 | - refs[tag_name_to_ref(name)] = sha |
2479 | - return refs |
2480 | - self.target.repository.send_pack(get_changed_refs, |
2481 | - self.source.repository._git.object_store.generate_pack_contents) |
2482 | - return result |
2483 | - |
2484 | - |
2485 | -class InterGitLocalGitBranch(InterGitBranch): |
2486 | - """InterBranch that copies from a remote to a local git branch.""" |
2487 | - |
2488 | - @staticmethod |
2489 | - def _get_branch_formats_to_test(): |
2490 | - # FIXME |
2491 | - return [] |
2492 | - |
2493 | - @classmethod |
2494 | - def is_compatible(self, source, target): |
2495 | - return (isinstance(source, GitBranch) and |
2496 | - isinstance(target, LocalGitBranch)) |
2497 | - |
2498 | - def fetch(self, stop_revision=None, fetch_tags=None, limit=None): |
2499 | - interrepo = _mod_repository.InterRepository.get(self.source.repository, |
2500 | - self.target.repository) |
2501 | - if stop_revision is None: |
2502 | - stop_revision = self.source.last_revision() |
2503 | - determine_wants = interrepo.get_determine_wants_revids( |
2504 | - [stop_revision], include_tags=fetch_tags) |
2505 | - interrepo.fetch_objects(determine_wants, limit=limit) |
2506 | - |
2507 | - def _basic_push(self, overwrite=False, stop_revision=None): |
2508 | - result = GitBranchPushResult() |
2509 | - result.source_branch = self.source |
2510 | - result.target_branch = self.target |
2511 | - result.old_revid = self.target.last_revision() |
2512 | - refs, stop_revision = self.update_refs(stop_revision) |
2513 | - self.target.generate_revision_history(stop_revision, result.old_revid) |
2514 | - tags_ret = self.source.tags.merge_to(self.target.tags, |
2515 | - source_refs=refs, overwrite=overwrite) |
2516 | - if isinstance(tags_ret, tuple): |
2517 | - (result.tag_updates, result.tag_conflicts) = tags_ret |
2518 | - else: |
2519 | - result.tag_conflicts = tags_ret |
2520 | - result.new_revid = self.target.last_revision() |
2521 | - return result |
2522 | - |
2523 | - def update_refs(self, stop_revision=None): |
2524 | - interrepo = _mod_repository.InterRepository.get(self.source.repository, |
2525 | - self.target.repository) |
2526 | - if stop_revision is None: |
2527 | - refs = interrepo.fetch(branches=["HEAD"]) |
2528 | - stop_revision = self.target.lookup_foreign_revision_id(refs["HEAD"]) |
2529 | - else: |
2530 | - refs = interrepo.fetch(revision_id=stop_revision) |
2531 | - return refs, stop_revision |
2532 | - |
2533 | - def pull(self, stop_revision=None, overwrite=False, |
2534 | - possible_transports=None, run_hooks=True,local=False): |
2535 | - # This type of branch can't be bound. |
2536 | - if local: |
2537 | - raise errors.LocalRequiresBoundBranch() |
2538 | - result = GitPullResult() |
2539 | - result.source_branch = self.source |
2540 | - result.target_branch = self.target |
2541 | - self.source.lock_read() |
2542 | - try: |
2543 | - self.target.lock_write() |
2544 | - try: |
2545 | - result.old_revid = self.target.last_revision() |
2546 | - refs, stop_revision = self.update_refs(stop_revision) |
2547 | - self.target.generate_revision_history(stop_revision, result.old_revid) |
2548 | - tags_ret = self.source.tags.merge_to(self.target.tags, |
2549 | - overwrite=overwrite, source_refs=refs) |
2550 | - if isinstance(tags_ret, tuple): |
2551 | - (result.tag_updates, result.tag_conflicts) = tags_ret |
2552 | - else: |
2553 | - result.tag_conflicts = tags_ret |
2554 | - result.new_revid = self.target.last_revision() |
2555 | - result.local_branch = None |
2556 | - result.master_branch = result.target_branch |
2557 | - if run_hooks: |
2558 | - for hook in branch.Branch.hooks['post_pull']: |
2559 | - hook(result) |
2560 | - finally: |
2561 | - self.target.unlock() |
2562 | - finally: |
2563 | - self.source.unlock() |
2564 | - return result |
2565 | - |
2566 | - |
2567 | -class InterToGitBranch(branch.GenericInterBranch): |
2568 | - """InterBranch implementation that pulls into a Git branch.""" |
2569 | - |
2570 | - def __init__(self, source, target): |
2571 | - super(InterToGitBranch, self).__init__(source, target) |
2572 | - self.interrepo = _mod_repository.InterRepository.get(source.repository, |
2573 | - target.repository) |
2574 | - |
2575 | - @staticmethod |
2576 | - def _get_branch_formats_to_test(): |
2577 | - try: |
2578 | - default_format = branch.format_registry.get_default() |
2579 | - except AttributeError: |
2580 | - default_format = branch.BranchFormat._default_format |
2581 | - return [(default_format, GitBranchFormat())] |
2582 | - |
2583 | - @classmethod |
2584 | - def is_compatible(self, source, target): |
2585 | - return (not isinstance(source, GitBranch) and |
2586 | - isinstance(target, GitBranch)) |
2587 | - |
2588 | - def _get_new_refs(self, stop_revision=None, fetch_tags=None): |
2589 | - assert self.source.is_locked() |
2590 | - if stop_revision is None: |
2591 | - (stop_revno, stop_revision) = self.source.last_revision_info() |
2592 | - else: |
2593 | - stop_revno = self.source.revision_id_to_revno(stop_revision) |
2594 | - assert type(stop_revision) is str |
2595 | - main_ref = self.target.ref or "refs/heads/master" |
2596 | - refs = { main_ref: (None, stop_revision) } |
2597 | - if fetch_tags is None: |
2598 | - c = self.source.get_config_stack() |
2599 | - fetch_tags = c.get('branch.fetch_tags') |
2600 | - for name, revid in self.source.tags.get_tag_dict().iteritems(): |
2601 | - if self.source.repository.has_revision(revid): |
2602 | - ref = tag_name_to_ref(name) |
2603 | - if not check_ref_format(ref): |
2604 | - warning("skipping tag with invalid characters %s (%s)", |
2605 | - name, ref) |
2606 | - continue |
2607 | - if fetch_tags: |
2608 | - # FIXME: Skip tags that are not in the ancestry |
2609 | - refs[ref] = (None, revid) |
2610 | - return refs, main_ref, (stop_revno, stop_revision) |
2611 | - |
2612 | - def _update_refs(self, result, old_refs, new_refs, overwrite): |
2613 | - mutter("updating refs. old refs: %r, new refs: %r", |
2614 | - old_refs, new_refs) |
2615 | - result.tag_updates = {} |
2616 | - result.tag_conflicts = [] |
2617 | - ret = dict(old_refs) |
2618 | - def ref_equals(refs, ref, git_sha, revid): |
2619 | - try: |
2620 | - value = refs[ref] |
2621 | - except KeyError: |
2622 | - return False |
2623 | - if (value[0] is not None and |
2624 | - git_sha is not None and |
2625 | - value[0] == git_sha): |
2626 | - return True |
2627 | - if (value[1] is not None and |
2628 | - revid is not None and |
2629 | - value[1] == revid): |
2630 | - return True |
2631 | - # FIXME: If one side only has the git sha available and the other only |
2632 | - # has the bzr revid, then this will cause us to show a tag as updated |
2633 | - # that hasn't actually been updated. |
2634 | - return False |
2635 | - # FIXME: Check for diverged branches |
2636 | - for ref, (git_sha, revid) in new_refs.iteritems(): |
2637 | - if ref_equals(ret, ref, git_sha, revid): |
2638 | - # Already up to date |
2639 | - if git_sha is None: |
2640 | - git_sha = old_refs[ref][0] |
2641 | - if revid is None: |
2642 | - revid = old_refs[ref][1] |
2643 | - ret[ref] = new_refs[ref] = (git_sha, revid) |
2644 | - elif ref not in ret or overwrite: |
2645 | - try: |
2646 | - tag_name = ref_to_tag_name(ref) |
2647 | - except ValueError: |
2648 | - pass |
2649 | - else: |
2650 | - result.tag_updates[tag_name] = revid |
2651 | - ret[ref] = (git_sha, revid) |
2652 | - else: |
2653 | - # FIXME: Check diverged |
2654 | - diverged = False |
2655 | - if diverged: |
2656 | - try: |
2657 | - name = ref_to_tag_name(ref) |
2658 | - except ValueError: |
2659 | - pass |
2660 | - else: |
2661 | - result.tag_conflicts.append((name, revid, ret[name][1])) |
2662 | - else: |
2663 | - ret[ref] = (git_sha, revid) |
2664 | - return ret |
2665 | - |
2666 | - def fetch(self, stop_revision=None, fetch_tags=None, lossy=False, limit=None): |
2667 | - assert limit is None |
2668 | - if stop_revision is None: |
2669 | - stop_revision = self.source.last_revision() |
2670 | - ret = [] |
2671 | - if fetch_tags: |
2672 | - for k, v in self.source.tags.get_tag_dict().iteritems(): |
2673 | - ret.append((None, v)) |
2674 | - ret.append((None, stop_revision)) |
2675 | - self.interrepo.fetch_objects(ret, lossy=lossy) |
2676 | - |
2677 | - def pull(self, overwrite=False, stop_revision=None, local=False, |
2678 | - possible_transports=None, run_hooks=True): |
2679 | - result = GitBranchPullResult() |
2680 | - result.source_branch = self.source |
2681 | - result.target_branch = self.target |
2682 | - self.source.lock_read() |
2683 | - try: |
2684 | - self.target.lock_write() |
2685 | - try: |
2686 | - new_refs, main_ref, stop_revinfo = self._get_new_refs( |
2687 | - stop_revision) |
2688 | - def update_refs(old_refs): |
2689 | - return self._update_refs(result, old_refs, new_refs, overwrite) |
2690 | - try: |
2691 | - result.revidmap, old_refs, new_refs = self.interrepo.fetch_refs( |
2692 | - update_refs, lossy=False) |
2693 | - except NoPushSupport: |
2694 | - raise errors.NoRoundtrippingSupport(self.source, self.target) |
2695 | - (old_sha1, result.old_revid) = old_refs.get(main_ref, (ZERO_SHA, NULL_REVISION)) |
2696 | - if result.old_revid is None: |
2697 | - result.old_revid = self.target.lookup_foreign_revision_id(old_sha1) |
2698 | - result.new_revid = new_refs[main_ref][1] |
2699 | - result.local_branch = None |
2700 | - result.master_branch = self.target |
2701 | - if run_hooks: |
2702 | - for hook in branch.Branch.hooks['post_pull']: |
2703 | - hook(result) |
2704 | - finally: |
2705 | - self.target.unlock() |
2706 | - finally: |
2707 | - self.source.unlock() |
2708 | - return result |
2709 | - |
2710 | - def push(self, overwrite=False, stop_revision=None, lossy=False, |
2711 | - _override_hook_source_branch=None): |
2712 | - result = GitBranchPushResult() |
2713 | - result.source_branch = self.source |
2714 | - result.target_branch = self.target |
2715 | - result.local_branch = None |
2716 | - result.master_branch = result.target_branch |
2717 | - self.source.lock_read() |
2718 | - try: |
2719 | - new_refs, main_ref, stop_revinfo = self._get_new_refs(stop_revision) |
2720 | - def update_refs(old_refs): |
2721 | - return self._update_refs(result, old_refs, new_refs, overwrite) |
2722 | - try: |
2723 | - result.revidmap, old_refs, new_refs = self.interrepo.fetch_refs( |
2724 | - update_refs, lossy=lossy) |
2725 | - except NoPushSupport: |
2726 | - raise errors.NoRoundtrippingSupport(self.source, self.target) |
2727 | - (old_sha1, result.old_revid) = old_refs.get(main_ref, (ZERO_SHA, NULL_REVISION)) |
2728 | - if result.old_revid is None: |
2729 | - result.old_revid = self.target.lookup_foreign_revision_id(old_sha1) |
2730 | - result.new_revid = new_refs[main_ref][1] |
2731 | - (result.new_original_revno, result.new_original_revid) = stop_revinfo |
2732 | - for hook in branch.Branch.hooks['post_push']: |
2733 | - hook(result) |
2734 | - finally: |
2735 | - self.source.unlock() |
2736 | - return result |
2737 | - |
2738 | - |
2739 | -branch.InterBranch.register_optimiser(InterGitLocalGitBranch) |
2740 | -branch.InterBranch.register_optimiser(InterFromGitBranch) |
2741 | -branch.InterBranch.register_optimiser(InterToGitBranch) |
2742 | -branch.InterBranch.register_optimiser(InterLocalGitRemoteGitBranch) |
2743 | |
2744 | === removed file 'bzr-receive-pack' |
2745 | --- bzr-receive-pack 2010-12-26 04:23:10 +0000 |
2746 | +++ bzr-receive-pack 1970-01-01 00:00:00 +0000 |
2747 | @@ -1,15 +0,0 @@ |
2748 | -#!/usr/bin/env python |
2749 | - |
2750 | -import bzrlib |
2751 | -from bzrlib.plugin import load_plugins |
2752 | -load_plugins() |
2753 | -from bzrlib.plugins.git.server import BzrBackend |
2754 | -from dulwich.server import ReceivePackHandler, serve_command |
2755 | -import sys, os |
2756 | - |
2757 | -if len(sys.argv) < 2: |
2758 | - print >>sys.stderr, "usage: %s <git-dir>" % os.path.basename(sys.argv[0]) |
2759 | - sys.exit(1) |
2760 | - |
2761 | -backend = BzrBackend(bzrlib.transport.get_transport("/")) |
2762 | -sys.exit(serve_command(ReceivePackHandler, backend=backend)) |
2763 | |
2764 | === removed file 'bzr-upload-pack' |
2765 | --- bzr-upload-pack 2010-12-26 04:23:10 +0000 |
2766 | +++ bzr-upload-pack 1970-01-01 00:00:00 +0000 |
2767 | @@ -1,15 +0,0 @@ |
2768 | -#!/usr/bin/env python |
2769 | - |
2770 | -import bzrlib |
2771 | -from bzrlib.plugin import load_plugins |
2772 | -load_plugins () |
2773 | -from bzrlib.plugins.git.server import BzrBackend |
2774 | -from dulwich.server import UploadPackHandler, serve_command |
2775 | -import sys, os |
2776 | - |
2777 | -if len(sys.argv) < 2: |
2778 | - print "usage: %s <git-dir>" % os.path.basename(sys.argv[0]) |
2779 | - sys.exit(1) |
2780 | - |
2781 | -backend = BzrBackend(bzrlib.transport.get_transport("/")) |
2782 | -sys.exit(serve_command(UploadPackHandler, backend=backend)) |
2783 | |
2784 | === removed file 'cache.py' |
2785 | --- cache.py 2019-02-08 17:04:59 +0000 |
2786 | +++ cache.py 1970-01-01 00:00:00 +0000 |
2787 | @@ -1,1013 +0,0 @@ |
2788 | -# Copyright (C) 2009 Jelmer Vernooij <jelmer@samba.org> |
2789 | -# |
2790 | -# This program is free software; you can redistribute it and/or modify |
2791 | -# it under the terms of the GNU General Public License as published by |
2792 | -# the Free Software Foundation; either version 2 of the License, or |
2793 | -# (at your option) any later version. |
2794 | -# |
2795 | -# This program is distributed in the hope that it will be useful, |
2796 | -# but WITHOUT ANY WARRANTY; without even the implied warranty of |
2797 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
2798 | -# GNU General Public License for more details. |
2799 | -# |
2800 | -# You should have received a copy of the GNU General Public License |
2801 | -# along with this program; if not, write to the Free Software |
2802 | -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
2803 | - |
2804 | -"""Map from Git sha's to Bazaar objects.""" |
2805 | - |
2806 | -from __future__ import absolute_import |
2807 | - |
2808 | -from dulwich.objects import ( |
2809 | - sha_to_hex, |
2810 | - hex_to_sha, |
2811 | - ) |
2812 | -import os |
2813 | -import threading |
2814 | - |
2815 | -from dulwich.objects import ( |
2816 | - ShaFile, |
2817 | - ) |
2818 | - |
2819 | -from ... import ( |
2820 | - btree_index as _mod_btree_index, |
2821 | - errors as bzr_errors, |
2822 | - index as _mod_index, |
2823 | - osutils, |
2824 | - registry, |
2825 | - trace, |
2826 | - versionedfile, |
2827 | - ) |
2828 | -from ...transport import ( |
2829 | - get_transport, |
2830 | - ) |
2831 | - |
2832 | - |
2833 | -def get_cache_dir(): |
2834 | - try: |
2835 | - from xdg.BaseDirectory import xdg_cache_home |
2836 | - except ImportError: |
2837 | - from ...config import config_dir |
2838 | - ret = os.path.join(config_dir(), "git") |
2839 | - else: |
2840 | - ret = os.path.join(xdg_cache_home, "bazaar", "git") |
2841 | - if not os.path.isdir(ret): |
2842 | - os.makedirs(ret) |
2843 | - return ret |
2844 | - |
2845 | - |
2846 | -def get_remote_cache_transport(repository): |
2847 | - """Retrieve the transport to use when accessing (unwritable) remote |
2848 | - repositories. |
2849 | - """ |
2850 | - uuid = getattr(repository, "uuid", None) |
2851 | - if uuid is None: |
2852 | - path = get_cache_dir() |
2853 | - else: |
2854 | - path = os.path.join(get_cache_dir(), uuid) |
2855 | - if not os.path.isdir(path): |
2856 | - os.mkdir(path) |
2857 | - return get_transport(path) |
2858 | - |
2859 | - |
2860 | -def check_pysqlite_version(sqlite3): |
2861 | - """Check that sqlite library is compatible. |
2862 | - |
2863 | - """ |
2864 | - if (sqlite3.sqlite_version_info[0] < 3 or |
2865 | - (sqlite3.sqlite_version_info[0] == 3 and |
2866 | - sqlite3.sqlite_version_info[1] < 3)): |
2867 | - trace.warning('Needs at least sqlite 3.3.x') |
2868 | - raise bzr_errors.BzrError("incompatible sqlite library") |
2869 | - |
2870 | -try: |
2871 | - try: |
2872 | - import sqlite3 |
2873 | - check_pysqlite_version(sqlite3) |
2874 | - except (ImportError, bzr_errors.BzrError), e: |
2875 | - from pysqlite2 import dbapi2 as sqlite3 |
2876 | - check_pysqlite_version(sqlite3) |
2877 | -except: |
2878 | - trace.warning('Needs at least Python2.5 or Python2.4 with the pysqlite2 ' |
2879 | - 'module') |
2880 | - raise bzr_errors.BzrError("missing sqlite library") |
2881 | - |
2882 | - |
2883 | -_mapdbs = threading.local() |
2884 | -def mapdbs(): |
2885 | - """Get a cache for this thread's db connections.""" |
2886 | - try: |
2887 | - return _mapdbs.cache |
2888 | - except AttributeError: |
2889 | - _mapdbs.cache = {} |
2890 | - return _mapdbs.cache |
2891 | - |
2892 | - |
2893 | -class GitShaMap(object): |
2894 | - """Git<->Bzr revision id mapping database.""" |
2895 | - |
2896 | - def lookup_git_sha(self, sha): |
2897 | - """Lookup a Git sha in the database. |
2898 | - :param sha: Git object sha |
2899 | - :return: list with (type, type_data) tuples with type_data: |
2900 | - commit: revid, tree_sha, verifiers |
2901 | - blob: fileid, revid |
2902 | - tree: fileid, revid |
2903 | - """ |
2904 | - raise NotImplementedError(self.lookup_git_sha) |
2905 | - |
2906 | - def lookup_blob_id(self, file_id, revision): |
2907 | - """Retrieve a Git blob SHA by file id. |
2908 | - |
2909 | - :param file_id: File id of the file/symlink |
2910 | - :param revision: revision in which the file was last changed. |
2911 | - """ |
2912 | - raise NotImplementedError(self.lookup_blob_id) |
2913 | - |
2914 | - def lookup_tree_id(self, file_id, revision): |
2915 | - """Retrieve a Git tree SHA by file id. |
2916 | - """ |
2917 | - raise NotImplementedError(self.lookup_tree_id) |
2918 | - |
2919 | - def lookup_commit(self, revid): |
2920 | - """Retrieve a Git commit SHA by Bazaar revision id. |
2921 | - """ |
2922 | - raise NotImplementedError(self.lookup_commit) |
2923 | - |
2924 | - def revids(self): |
2925 | - """List the revision ids known.""" |
2926 | - raise NotImplementedError(self.revids) |
2927 | - |
2928 | - def missing_revisions(self, revids): |
2929 | - """Return set of all the revisions that are not present.""" |
2930 | - present_revids = set(self.revids()) |
2931 | - if not isinstance(revids, set): |
2932 | - revids = set(revids) |
2933 | - return revids - present_revids |
2934 | - |
2935 | - def sha1s(self): |
2936 | - """List the SHA1s.""" |
2937 | - raise NotImplementedError(self.sha1s) |
2938 | - |
2939 | - def start_write_group(self): |
2940 | - """Start writing changes.""" |
2941 | - |
2942 | - def commit_write_group(self): |
2943 | - """Commit any pending changes.""" |
2944 | - |
2945 | - def abort_write_group(self): |
2946 | - """Abort any pending changes.""" |
2947 | - |
2948 | - |
2949 | -class ContentCache(object): |
2950 | - """Object that can cache Git objects.""" |
2951 | - |
2952 | - def add(self, object): |
2953 | - """Add an object.""" |
2954 | - raise NotImplementedError(self.add) |
2955 | - |
2956 | - def add_multi(self, objects): |
2957 | - """Add multiple objects.""" |
2958 | - for obj in objects: |
2959 | - self.add(obj) |
2960 | - |
2961 | - def __getitem__(self, sha): |
2962 | - """Retrieve an item, by SHA.""" |
2963 | - raise NotImplementedError(self.__getitem__) |
2964 | - |
2965 | - |
2966 | -class BzrGitCacheFormat(object): |
2967 | - """Bazaar-Git Cache Format.""" |
2968 | - |
2969 | - def get_format_string(self): |
2970 | - """Return a single-line unique format string for this cache format.""" |
2971 | - raise NotImplementedError(self.get_format_string) |
2972 | - |
2973 | - def open(self, transport): |
2974 | - """Open this format on a transport.""" |
2975 | - raise NotImplementedError(self.open) |
2976 | - |
2977 | - def initialize(self, transport): |
2978 | - """Create a new instance of this cache format at transport.""" |
2979 | - transport.put_bytes('format', self.get_format_string()) |
2980 | - |
2981 | - @classmethod |
2982 | - def from_transport(self, transport): |
2983 | - """Open a cache file present on a transport, or initialize one. |
2984 | - |
2985 | - :param transport: Transport to use |
2986 | - :return: A BzrGitCache instance |
2987 | - """ |
2988 | - try: |
2989 | - format_name = transport.get_bytes('format') |
2990 | - format = formats.get(format_name) |
2991 | - except bzr_errors.NoSuchFile: |
2992 | - format = formats.get('default') |
2993 | - format.initialize(transport) |
2994 | - return format.open(transport) |
2995 | - |
2996 | - @classmethod |
2997 | - def from_repository(cls, repository): |
2998 | - """Open a cache file for a repository. |
2999 | - |
3000 | - This will use the repository's transport to store the cache file, or |
3001 | - use the users global cache directory if the repository has no |
3002 | - transport associated with it. |
3003 | - |
3004 | - :param repository: Repository to open the cache for |
3005 | - :return: A `BzrGitCache` |
3006 | - """ |
3007 | - from ...transport.local import LocalTransport |
3008 | - repo_transport = getattr(repository, "_transport", None) |
3009 | - if (repo_transport is not None and |
3010 | - isinstance(repo_transport, LocalTransport)): |
3011 | - # Even if we don't write to this repo, we should be able |
3012 | - # to update its cache. |
3013 | - try: |
3014 | - repo_transport = remove_readonly_transport_decorator(repo_transport) |
3015 | - except bzr_errors.ReadOnlyError: |
3016 | - transport = None |
3017 | - else: |
3018 | - try: |
3019 | - repo_transport.mkdir('git') |
3020 | - except bzr_errors.FileExists: |
3021 | - pass |
3022 | - transport = repo_transport.clone('git') |
3023 | - else: |
3024 | - transport = None |
3025 | - if transport is None: |
3026 | - transport = get_remote_cache_transport(repository) |
3027 | - return cls.from_transport(transport) |
3028 | - |
3029 | - |
3030 | -class CacheUpdater(object): |
3031 | - """Base class for objects that can update a bzr-git cache.""" |
3032 | - |
3033 | - def add_object(self, obj, bzr_key_data, path): |
3034 | - """Add an object. |
3035 | - |
3036 | - :param obj: Object type ("commit", "blob" or "tree") |
3037 | - :param bzr_key_data: bzr key store data or testament_sha in case |
3038 | - of commit |
3039 | - :param path: Path of the object (optional) |
3040 | - """ |
3041 | - raise NotImplementedError(self.add_object) |
3042 | - |
3043 | - def finish(self): |
3044 | - raise NotImplementedError(self.finish) |
3045 | - |
3046 | - |
3047 | -class BzrGitCache(object): |
3048 | - """Caching backend.""" |
3049 | - |
3050 | - def __init__(self, idmap, content_cache, cache_updater_klass): |
3051 | - self.idmap = idmap |
3052 | - self.content_cache = content_cache |
3053 | - self._cache_updater_klass = cache_updater_klass |
3054 | - |
3055 | - def get_updater(self, rev): |
3056 | - """Update an object that implements the CacheUpdater interface for |
3057 | - updating this cache. |
3058 | - """ |
3059 | - return self._cache_updater_klass(self, rev) |
3060 | - |
3061 | - |
3062 | -DictBzrGitCache = lambda: BzrGitCache(DictGitShaMap(), None, DictCacheUpdater) |
3063 | - |
3064 | - |
3065 | -class DictCacheUpdater(CacheUpdater): |
3066 | - """Cache updater for dict-based caches.""" |
3067 | - |
3068 | - def __init__(self, cache, rev): |
3069 | - self.cache = cache |
3070 | - self.revid = rev.revision_id |
3071 | - self.parent_revids = rev.parent_ids |
3072 | - self._commit = None |
3073 | - self._entries = [] |
3074 | - |
3075 | - def add_object(self, obj, bzr_key_data, path): |
3076 | - if obj.type_name == "commit": |
3077 | - self._commit = obj |
3078 | - assert type(bzr_key_data) is dict |
3079 | - key = self.revid |
3080 | - type_data = (self.revid, self._commit.tree, bzr_key_data) |
3081 | - self.cache.idmap._by_revid[self.revid] = obj.id |
3082 | - elif obj.type_name in ("blob", "tree"): |
3083 | - if bzr_key_data is not None: |
3084 | - if obj.type_name == "blob": |
3085 | - revision = bzr_key_data[1] |
3086 | - else: |
3087 | - revision = self.revid |
3088 | - key = type_data = (bzr_key_data[0], revision) |
3089 | - self.cache.idmap._by_fileid.setdefault(type_data[1], {})[type_data[0]] = obj.id |
3090 | - else: |
3091 | - raise AssertionError |
3092 | - entry = (obj.type_name, type_data) |
3093 | - self.cache.idmap._by_sha.setdefault(obj.id, {})[key] = entry |
3094 | - |
3095 | - def finish(self): |
3096 | - if self._commit is None: |
3097 | - raise AssertionError("No commit object added") |
3098 | - return self._commit |
3099 | - |
3100 | - |
3101 | -class DictGitShaMap(GitShaMap): |
3102 | - """Git SHA map that uses a dictionary.""" |
3103 | - |
3104 | - def __init__(self): |
3105 | - self._by_sha = {} |
3106 | - self._by_fileid = {} |
3107 | - self._by_revid = {} |
3108 | - |
3109 | - def lookup_blob_id(self, fileid, revision): |
3110 | - return self._by_fileid[revision][fileid] |
3111 | - |
3112 | - def lookup_git_sha(self, sha): |
3113 | - for entry in self._by_sha[sha].itervalues(): |
3114 | - yield entry |
3115 | - |
3116 | - def lookup_tree_id(self, fileid, revision): |
3117 | - return self._by_fileid[revision][fileid] |
3118 | - |
3119 | - def lookup_commit(self, revid): |
3120 | - return self._by_revid[revid] |
3121 | - |
3122 | - def revids(self): |
3123 | - for key, entries in self._by_sha.iteritems(): |
3124 | - for (type, type_data) in entries.values(): |
3125 | - if type == "commit": |
3126 | - yield type_data[0] |
3127 | - |
3128 | - def sha1s(self): |
3129 | - return self._by_sha.iterkeys() |
3130 | - |
3131 | - |
3132 | -class SqliteCacheUpdater(CacheUpdater): |
3133 | - |
3134 | - def __init__(self, cache, rev): |
3135 | - self.cache = cache |
3136 | - self.db = self.cache.idmap.db |
3137 | - self.revid = rev.revision_id |
3138 | - self._commit = None |
3139 | - self._trees = [] |
3140 | - self._blobs = [] |
3141 | - |
3142 | - def add_object(self, obj, bzr_key_data, path): |
3143 | - if obj.type_name == "commit": |
3144 | - self._commit = obj |
3145 | - assert type(bzr_key_data) is dict |
3146 | - self._testament3_sha1 = bzr_key_data.get("testament3-sha1") |
3147 | - elif obj.type_name == "tree": |
3148 | - if bzr_key_data is not None: |
3149 | - self._trees.append((obj.id, bzr_key_data[0], self.revid)) |
3150 | - elif obj.type_name == "blob": |
3151 | - if bzr_key_data is not None: |
3152 | - self._blobs.append((obj.id, bzr_key_data[0], bzr_key_data[1])) |
3153 | - else: |
3154 | - raise AssertionError |
3155 | - |
3156 | - def finish(self): |
3157 | - if self._commit is None: |
3158 | - raise AssertionError("No commit object added") |
3159 | - self.db.executemany( |
3160 | - "replace into trees (sha1, fileid, revid) values (?, ?, ?)", |
3161 | - self._trees) |
3162 | - self.db.executemany( |
3163 | - "replace into blobs (sha1, fileid, revid) values (?, ?, ?)", |
3164 | - self._blobs) |
3165 | - self.db.execute( |
3166 | - "replace into commits (sha1, revid, tree_sha, testament3_sha1) values (?, ?, ?, ?)", |
3167 | - (self._commit.id, self.revid, self._commit.tree, self._testament3_sha1)) |
3168 | - return self._commit |
3169 | - |
3170 | - |
3171 | -SqliteBzrGitCache = lambda p: BzrGitCache(SqliteGitShaMap(p), None, SqliteCacheUpdater) |
3172 | - |
3173 | - |
3174 | -class SqliteGitCacheFormat(BzrGitCacheFormat): |
3175 | - |
3176 | - def get_format_string(self): |
3177 | - return 'bzr-git sha map version 1 using sqlite\n' |
3178 | - |
3179 | - def open(self, transport): |
3180 | - try: |
3181 | - basepath = transport.local_abspath(".") |
3182 | - except bzr_errors.NotLocalUrl: |
3183 | - basepath = get_cache_dir() |
3184 | - return SqliteBzrGitCache(os.path.join(basepath, "idmap.db")) |
3185 | - |
3186 | - |
3187 | -class SqliteGitShaMap(GitShaMap): |
3188 | - """Bazaar GIT Sha map that uses a sqlite database for storage.""" |
3189 | - |
3190 | - def __init__(self, path=None): |
3191 | - self.path = path |
3192 | - if path is None: |
3193 | - self.db = sqlite3.connect(":memory:") |
3194 | - else: |
3195 | - if not mapdbs().has_key(path): |
3196 | - mapdbs()[path] = sqlite3.connect(path) |
3197 | - self.db = mapdbs()[path] |
3198 | - self.db.text_factory = str |
3199 | - self.db.executescript(""" |
3200 | - create table if not exists commits( |
3201 | - sha1 text not null check(length(sha1) == 40), |
3202 | - revid text not null, |
3203 | - tree_sha text not null check(length(tree_sha) == 40) |
3204 | - ); |
3205 | - create index if not exists commit_sha1 on commits(sha1); |
3206 | - create unique index if not exists commit_revid on commits(revid); |
3207 | - create table if not exists blobs( |
3208 | - sha1 text not null check(length(sha1) == 40), |
3209 | - fileid text not null, |
3210 | - revid text not null |
3211 | - ); |
3212 | - create index if not exists blobs_sha1 on blobs(sha1); |
3213 | - create unique index if not exists blobs_fileid_revid on blobs(fileid, revid); |
3214 | - create table if not exists trees( |
3215 | - sha1 text unique not null check(length(sha1) == 40), |
3216 | - fileid text not null, |
3217 | - revid text not null |
3218 | - ); |
3219 | - create unique index if not exists trees_sha1 on trees(sha1); |
3220 | - create unique index if not exists trees_fileid_revid on trees(fileid, revid); |
3221 | -""") |
3222 | - try: |
3223 | - self.db.executescript( |
3224 | - "ALTER TABLE commits ADD testament3_sha1 TEXT;") |
3225 | - except sqlite3.OperationalError: |
3226 | - pass # Column already exists. |
3227 | - |
3228 | - def __repr__(self): |
3229 | - return "%s(%r)" % (self.__class__.__name__, self.path) |
3230 | - |
3231 | - def lookup_commit(self, revid): |
3232 | - cursor = self.db.execute("select sha1 from commits where revid = ?", |
3233 | - (revid,)) |
3234 | - row = cursor.fetchone() |
3235 | - if row is not None: |
3236 | - return row[0] |
3237 | - raise KeyError |
3238 | - |
3239 | - def commit_write_group(self): |
3240 | - self.db.commit() |
3241 | - |
3242 | - def lookup_blob_id(self, fileid, revision): |
3243 | - row = self.db.execute("select sha1 from blobs where fileid = ? and revid = ?", (fileid, revision)).fetchone() |
3244 | - if row is not None: |
3245 | - return row[0] |
3246 | - raise KeyError(fileid) |
3247 | - |
3248 | - def lookup_tree_id(self, fileid, revision): |
3249 | - row = self.db.execute("select sha1 from trees where fileid = ? and revid = ?", (fileid, revision)).fetchone() |
3250 | - if row is not None: |
3251 | - return row[0] |
3252 | - raise KeyError(fileid) |
3253 | - |
3254 | - def lookup_git_sha(self, sha): |
3255 | - """Lookup a Git sha in the database. |
3256 | - |
3257 | - :param sha: Git object sha |
3258 | - :return: (type, type_data) with type_data: |
3259 | - commit: revid, tree sha, verifiers |
3260 | - tree: fileid, revid |
3261 | - blob: fileid, revid |
3262 | - """ |
3263 | - found = False |
3264 | - cursor = self.db.execute("select revid, tree_sha, testament3_sha1 from commits where sha1 = ?", (sha,)) |
3265 | - for row in cursor.fetchall(): |
3266 | - found = True |
3267 | - if row[2] is not None: |
3268 | - verifiers = {"testament3-sha1": row[2]} |
3269 | - else: |
3270 | - verifiers = {} |
3271 | - yield ("commit", (row[0], row[1], verifiers)) |
3272 | - cursor = self.db.execute("select fileid, revid from blobs where sha1 = ?", (sha,)) |
3273 | - for row in cursor.fetchall(): |
3274 | - found = True |
3275 | - yield ("blob", row) |
3276 | - cursor = self.db.execute("select fileid, revid from trees where sha1 = ?", (sha,)) |
3277 | - for row in cursor.fetchall(): |
3278 | - found = True |
3279 | - yield ("tree", row) |
3280 | - if not found: |
3281 | - raise KeyError(sha) |
3282 | - |
3283 | - def revids(self): |
3284 | - """List the revision ids known.""" |
3285 | - return (row for (row,) in self.db.execute("select revid from commits")) |
3286 | - |
3287 | - def sha1s(self): |
3288 | - """List the SHA1s.""" |
3289 | - for table in ("blobs", "commits", "trees"): |
3290 | - for (sha,) in self.db.execute("select sha1 from %s" % table): |
3291 | - yield sha |
3292 | - |
3293 | - |
3294 | -class TdbCacheUpdater(CacheUpdater): |
3295 | - """Cache updater for tdb-based caches.""" |
3296 | - |
3297 | - def __init__(self, cache, rev): |
3298 | - self.cache = cache |
3299 | - self.db = cache.idmap.db |
3300 | - self.revid = rev.revision_id |
3301 | - self.parent_revids = rev.parent_ids |
3302 | - self._commit = None |
3303 | - self._entries = [] |
3304 | - |
3305 | - def add_object(self, obj, bzr_key_data, path): |
3306 | - sha = obj.sha().digest() |
3307 | - if obj.type_name == "commit": |
3308 | - self.db["commit\0" + self.revid] = "\0".join((sha, obj.tree)) |
3309 | - assert type(bzr_key_data) is dict, "was %r" % bzr_key_data |
3310 | - type_data = (self.revid, obj.tree) |
3311 | - try: |
3312 | - type_data += (bzr_key_data["testament3-sha1"],) |
3313 | - except KeyError: |
3314 | - pass |
3315 | - self._commit = obj |
3316 | - elif obj.type_name == "blob": |
3317 | - if bzr_key_data is None: |
3318 | - return |
3319 | - self.db["\0".join(("blob", bzr_key_data[0], bzr_key_data[1]))] = sha |
3320 | - type_data = bzr_key_data |
3321 | - elif obj.type_name == "tree": |
3322 | - if bzr_key_data is None: |
3323 | - return |
3324 | - (file_id, ) = bzr_key_data |
3325 | - type_data = (file_id, self.revid) |
3326 | - else: |
3327 | - raise AssertionError |
3328 | - entry = "\0".join((obj.type_name, ) + type_data) + "\n" |
3329 | - key = "git\0" + sha |
3330 | - try: |
3331 | - oldval = self.db[key] |
3332 | - except KeyError: |
3333 | - self.db[key] = entry |
3334 | - else: |
3335 | - if oldval[-1] != "\n": |
3336 | - self.db[key] = "".join([oldval, "\n", entry]) |
3337 | - else: |
3338 | - self.db[key] = "".join([oldval, entry]) |
3339 | - |
3340 | - def finish(self): |
3341 | - if self._commit is None: |
3342 | - raise AssertionError("No commit object added") |
3343 | - return self._commit |
3344 | - |
3345 | - |
3346 | -TdbBzrGitCache = lambda p: BzrGitCache(TdbGitShaMap(p), None, TdbCacheUpdater) |
3347 | - |
3348 | - |
3349 | -class TdbGitCacheFormat(BzrGitCacheFormat): |
3350 | - """Cache format for tdb-based caches.""" |
3351 | - |
3352 | - def get_format_string(self): |
3353 | - return 'bzr-git sha map version 3 using tdb\n' |
3354 | - |
3355 | - def open(self, transport): |
3356 | - try: |
3357 | - basepath = transport.local_abspath(".").encode(osutils._fs_enc) |
3358 | - except bzr_errors.NotLocalUrl: |
3359 | - basepath = get_cache_dir() |
3360 | - assert isinstance(basepath, str) |
3361 | - try: |
3362 | - return TdbBzrGitCache(os.path.join(basepath, "idmap.tdb")) |
3363 | - except ImportError: |
3364 | - raise ImportError( |
3365 | - "Unable to open existing bzr-git cache because 'tdb' is not " |
3366 | - "installed.") |
3367 | - |
3368 | - |
3369 | -class TdbGitShaMap(GitShaMap): |
3370 | - """SHA Map that uses a TDB database. |
3371 | - |
3372 | - Entries: |
3373 | - |
3374 | - "git <sha1>" -> "<type> <type-data1> <type-data2>" |
3375 | - "commit revid" -> "<sha1> <tree-id>" |
3376 | - "tree fileid revid" -> "<sha1>" |
3377 | - "blob fileid revid" -> "<sha1>" |
3378 | - """ |
3379 | - |
3380 | - TDB_MAP_VERSION = 3 |
3381 | - TDB_HASH_SIZE = 50000 |
3382 | - |
3383 | - def __init__(self, path=None): |
3384 | - import tdb |
3385 | - self.path = path |
3386 | - if path is None: |
3387 | - self.db = {} |
3388 | - else: |
3389 | - assert isinstance(path, str) |
3390 | - if not mapdbs().has_key(path): |
3391 | - mapdbs()[path] = tdb.Tdb(path, self.TDB_HASH_SIZE, tdb.DEFAULT, |
3392 | - os.O_RDWR|os.O_CREAT) |
3393 | - self.db = mapdbs()[path] |
3394 | - try: |
3395 | - if int(self.db["version"]) not in (2, 3): |
3396 | - trace.warning("SHA Map is incompatible (%s -> %d), rebuilding database.", |
3397 | - self.db["version"], self.TDB_MAP_VERSION) |
3398 | - self.db.clear() |
3399 | - except KeyError: |
3400 | - pass |
3401 | - self.db["version"] = str(self.TDB_MAP_VERSION) |
3402 | - |
3403 | - def start_write_group(self): |
3404 | - """Start writing changes.""" |
3405 | - self.db.transaction_start() |
3406 | - |
3407 | - def commit_write_group(self): |
3408 | - """Commit any pending changes.""" |
3409 | - self.db.transaction_commit() |
3410 | - |
3411 | - def abort_write_group(self): |
3412 | - """Abort any pending changes.""" |
3413 | - self.db.transaction_cancel() |
3414 | - |
3415 | - def __repr__(self): |
3416 | - return "%s(%r)" % (self.__class__.__name__, self.path) |
3417 | - |
3418 | - def lookup_commit(self, revid): |
3419 | - try: |
3420 | - return sha_to_hex(self.db["commit\0" + revid][:20]) |
3421 | - except KeyError: |
3422 | - raise KeyError("No cache entry for %r" % revid) |
3423 | - |
3424 | - def lookup_blob_id(self, fileid, revision): |
3425 | - return sha_to_hex(self.db["\0".join(("blob", fileid, revision))]) |
3426 | - |
3427 | - def lookup_git_sha(self, sha): |
3428 | - """Lookup a Git sha in the database. |
3429 | - |
3430 | - :param sha: Git object sha |
3431 | - :return: (type, type_data) with type_data: |
3432 | - commit: revid, tree sha |
3433 | - blob: fileid, revid |
3434 | - tree: fileid, revid |
3435 | - """ |
3436 | - if len(sha) == 40: |
3437 | - sha = hex_to_sha(sha) |
3438 | - value = self.db["git\0" + sha] |
3439 | - for data in value.splitlines(): |
3440 | - data = data.split("\0") |
3441 | - if data[0] == "commit": |
3442 | - if len(data) == 3: |
3443 | - yield (data[0], (data[1], data[2], {})) |
3444 | - else: |
3445 | - yield (data[0], (data[1], data[2], {"testament3-sha1": data[3]})) |
3446 | - elif data[0] in ("tree", "blob"): |
3447 | - yield (data[0], tuple(data[1:])) |
3448 | - else: |
3449 | - raise AssertionError("unknown type %r" % data[0]) |
3450 | - |
3451 | - def missing_revisions(self, revids): |
3452 | - ret = set() |
3453 | - for revid in revids: |
3454 | - if self.db.get("commit\0" + revid) is None: |
3455 | - ret.add(revid) |
3456 | - return ret |
3457 | - |
3458 | - def revids(self): |
3459 | - """List the revision ids known.""" |
3460 | - for key in self.db.iterkeys(): |
3461 | - if key.startswith("commit\0"): |
3462 | - yield key[7:] |
3463 | - |
3464 | - def sha1s(self): |
3465 | - """List the SHA1s.""" |
3466 | - for key in self.db.iterkeys(): |
3467 | - if key.startswith("git\0"): |
3468 | - yield sha_to_hex(key[4:]) |
3469 | - |
3470 | - |
3471 | -class VersionedFilesContentCache(ContentCache): |
3472 | - |
3473 | - def __init__(self, vf): |
3474 | - self._vf = vf |
3475 | - |
3476 | - def add(self, obj): |
3477 | - self._vf.insert_record_stream( |
3478 | - [versionedfile.ChunkedContentFactory((obj.id,), [], None, |
3479 | - obj.as_legacy_object_chunks())]) |
3480 | - |
3481 | - def __getitem__(self, sha): |
3482 | - stream = self._vf.get_record_stream([(sha,)], 'unordered', True) |
3483 | - entry = stream.next() |
3484 | - if entry.storage_kind == 'absent': |
3485 | - raise KeyError(sha) |
3486 | - return ShaFile._parse_legacy_object(entry.get_bytes_as('fulltext')) |
3487 | - |
3488 | - |
3489 | -class GitObjectStoreContentCache(ContentCache): |
3490 | - |
3491 | - def __init__(self, store): |
3492 | - self.store = store |
3493 | - |
3494 | - def add_multi(self, objs): |
3495 | - self.store.add_objects(objs) |
3496 | - |
3497 | - def add(self, obj, path): |
3498 | - self.store.add_object(obj) |
3499 | - |
3500 | - def __getitem__(self, sha): |
3501 | - return self.store[sha] |
3502 | - |
3503 | - |
3504 | -class IndexCacheUpdater(CacheUpdater): |
3505 | - |
3506 | - def __init__(self, cache, rev): |
3507 | - self.cache = cache |
3508 | - self.revid = rev.revision_id |
3509 | - self.parent_revids = rev.parent_ids |
3510 | - self._commit = None |
3511 | - self._entries = [] |
3512 | - self._cache_objs = set() |
3513 | - |
3514 | - def add_object(self, obj, bzr_key_data, path): |
3515 | - if obj.type_name == "commit": |
3516 | - self._commit = obj |
3517 | - assert type(bzr_key_data) is dict |
3518 | - self.cache.idmap._add_git_sha(obj.id, "commit", |
3519 | - (self.revid, obj.tree, bzr_key_data)) |
3520 | - self.cache.idmap._add_node(("commit", self.revid, "X"), |
3521 | - " ".join((obj.id, obj.tree))) |
3522 | - self._cache_objs.add((obj, path)) |
3523 | - elif obj.type_name == "blob": |
3524 | - self.cache.idmap._add_git_sha(obj.id, "blob", bzr_key_data) |
3525 | - self.cache.idmap._add_node(("blob", bzr_key_data[0], |
3526 | - bzr_key_data[1]), obj.id) |
3527 | - elif obj.type_name == "tree": |
3528 | - self.cache.idmap._add_git_sha(obj.id, "tree", |
3529 | - (bzr_key_data[0], self.revid)) |
3530 | - self._cache_objs.add((obj, path)) |
3531 | - else: |
3532 | - raise AssertionError |
3533 | - |
3534 | - def finish(self): |
3535 | - self.cache.content_cache.add_multi(self._cache_objs) |
3536 | - return self._commit |
3537 | - |
3538 | - |
3539 | -class IndexBzrGitCache(BzrGitCache): |
3540 | - |
3541 | - def __init__(self, transport=None): |
3542 | - mapper = versionedfile.ConstantMapper("trees") |
3543 | - shamap = IndexGitShaMap(transport.clone('index')) |
3544 | - #trees_store = knit.make_file_factory(True, mapper)(transport) |
3545 | - #content_cache = VersionedFilesContentCache(trees_store) |
3546 | - from .transportgit import TransportObjectStore |
3547 | - store = TransportObjectStore(transport.clone('objects')) |
3548 | - content_cache = GitObjectStoreContentCache(store) |
3549 | - super(IndexBzrGitCache, self).__init__(shamap, content_cache, |
3550 | - IndexCacheUpdater) |
3551 | - |
3552 | - |
3553 | -class IndexGitCacheFormat(BzrGitCacheFormat): |
3554 | - |
3555 | - def get_format_string(self): |
3556 | - return 'bzr-git sha map with git object cache version 1\n' |
3557 | - |
3558 | - def initialize(self, transport): |
3559 | - super(IndexGitCacheFormat, self).initialize(transport) |
3560 | - transport.mkdir('index') |
3561 | - transport.mkdir('objects') |
3562 | - from .transportgit import TransportObjectStore |
3563 | - TransportObjectStore.init(transport.clone('objects')) |
3564 | - |
3565 | - def open(self, transport): |
3566 | - return IndexBzrGitCache(transport) |
3567 | - |
3568 | - |
3569 | -class IndexGitShaMap(GitShaMap): |
3570 | - """SHA Map that uses the Bazaar APIs to store a cache. |
3571 | - |
3572 | - BTree Index file with the following contents: |
3573 | - |
3574 | - ("git", <sha1>) -> "<type> <type-data1> <type-data2>" |
3575 | - ("commit", <revid>) -> "<sha1> <tree-id>" |
3576 | - ("blob", <fileid>, <revid>) -> <sha1> |
3577 | - |
3578 | - """ |
3579 | - |
3580 | - def __init__(self, transport=None): |
3581 | - if transport is None: |
3582 | - self._transport = None |
3583 | - self._index = _mod_index.InMemoryGraphIndex(0, key_elements=3) |
3584 | - self._builder = self._index |
3585 | - else: |
3586 | - self._builder = None |
3587 | - self._transport = transport |
3588 | - self._index = _mod_index.CombinedGraphIndex([]) |
3589 | - for name in self._transport.list_dir("."): |
3590 | - if not name.endswith(".rix"): |
3591 | - continue |
3592 | - x = _mod_btree_index.BTreeGraphIndex(self._transport, name, |
3593 | - self._transport.stat(name).st_size) |
3594 | - self._index.insert_index(0, x) |
3595 | - |
3596 | - @classmethod |
3597 | - def from_repository(cls, repository): |
3598 | - transport = getattr(repository, "_transport", None) |
3599 | - if transport is not None: |
3600 | - try: |
3601 | - transport.mkdir('git') |
3602 | - except bzr_errors.FileExists: |
3603 | - pass |
3604 | - return cls(transport.clone('git')) |
3605 | - from ...transport import get_transport |
3606 | - return cls(get_transport(get_cache_dir())) |
3607 | - |
3608 | - def __repr__(self): |
3609 | - if self._transport is not None: |
3610 | - return "%s(%r)" % (self.__class__.__name__, self._transport.base) |
3611 | - else: |
3612 | - return "%s()" % (self.__class__.__name__) |
3613 | - |
3614 | - def repack(self): |
3615 | - assert self._builder is None |
3616 | - self.start_write_group() |
3617 | - for _, key, value in self._index.iter_all_entries(): |
3618 | - self._builder.add_node(key, value) |
3619 | - to_remove = [] |
3620 | - for name in self._transport.list_dir('.'): |
3621 | - if name.endswith('.rix'): |
3622 | - to_remove.append(name) |
3623 | - self.commit_write_group() |
3624 | - del self._index.indices[1:] |
3625 | - for name in to_remove: |
3626 | - self._transport.rename(name, name + '.old') |
3627 | - |
3628 | - def start_write_group(self): |
3629 | - assert self._builder is None |
3630 | - self._builder = _mod_btree_index.BTreeBuilder(0, key_elements=3) |
3631 | - self._name = osutils.sha() |
3632 | - |
3633 | - def commit_write_group(self): |
3634 | - assert self._builder is not None |
3635 | - stream = self._builder.finish() |
3636 | - name = self._name.hexdigest() + ".rix" |
3637 | - size = self._transport.put_file(name, stream) |
3638 | - index = _mod_btree_index.BTreeGraphIndex(self._transport, name, size) |
3639 | - self._index.insert_index(0, index) |
3640 | - self._builder = None |
3641 | - self._name = None |
3642 | - |
3643 | - def abort_write_group(self): |
3644 | - assert self._builder is not None |
3645 | - self._builder = None |
3646 | - self._name = None |
3647 | - |
3648 | - def _add_node(self, key, value): |
3649 | - try: |
3650 | - self._builder.add_node(key, value) |
3651 | - except bzr_errors.BadIndexDuplicateKey: |
3652 | - # Multiple bzr objects can have the same contents |
3653 | - return True |
3654 | - else: |
3655 | - return False |
3656 | - |
3657 | - def _get_entry(self, key): |
3658 | - entries = self._index.iter_entries([key]) |
3659 | - try: |
3660 | - return entries.next()[2] |
3661 | - except StopIteration: |
3662 | - if self._builder is None: |
3663 | - raise KeyError |
3664 | - entries = self._builder.iter_entries([key]) |
3665 | - try: |
3666 | - return entries.next()[2] |
3667 | - except StopIteration: |
3668 | - raise KeyError |
3669 | - |
3670 | - def _iter_entries_prefix(self, prefix): |
3671 | - for entry in self._index.iter_entries_prefix([prefix]): |
3672 | - yield (entry[1], entry[2]) |
3673 | - if self._builder is not None: |
3674 | - for entry in self._builder.iter_entries_prefix([prefix]): |
3675 | - yield (entry[1], entry[2]) |
3676 | - |
3677 | - def lookup_commit(self, revid): |
3678 | - return self._get_entry(("commit", revid, "X"))[:40] |
3679 | - |
3680 | - def _add_git_sha(self, hexsha, type, type_data): |
3681 | - if hexsha is not None: |
3682 | - self._name.update(hexsha) |
3683 | - if type == "commit": |
3684 | - td = (type_data[0], type_data[1]) |
3685 | - try: |
3686 | - td += (type_data[2]["testament3-sha1"],) |
3687 | - except KeyError: |
3688 | - pass |
3689 | - else: |
3690 | - td = type_data |
3691 | - self._add_node(("git", hexsha, "X"), " ".join((type,) + td)) |
3692 | - else: |
3693 | - # This object is not represented in Git - perhaps an empty |
3694 | - # directory? |
3695 | - self._name.update(type + " ".join(type_data)) |
3696 | - |
3697 | - def lookup_blob_id(self, fileid, revision): |
3698 | - return self._get_entry(("blob", fileid, revision)) |
3699 | - |
3700 | - def lookup_git_sha(self, sha): |
3701 | - if len(sha) == 20: |
3702 | - sha = sha_to_hex(sha) |
3703 | - found = False |
3704 | - for key, value in self._iter_entries_prefix(("git", sha, None)): |
3705 | - found = True |
3706 | - data = value.split(" ", 3) |
3707 | - if data[0] == "commit": |
3708 | - if data[3]: |
3709 | - verifiers = {"testament3-sha1": data[3]} |
3710 | - else: |
3711 | - verifiers = {} |
3712 | - yield ("commit", (data[1], data[2], verifiers)) |
3713 | - else: |
3714 | - yield (data[0], tuple(data[1:])) |
3715 | - if not found: |
3716 | - raise KeyError(sha) |
3717 | - |
3718 | - def revids(self): |
3719 | - """List the revision ids known.""" |
3720 | - for key, value in self._iter_entries_prefix(("commit", None, None)): |
3721 | - yield key[1] |
3722 | - |
3723 | - def missing_revisions(self, revids): |
3724 | - """Return set of all the revisions that are not present.""" |
3725 | - missing_revids = set(revids) |
3726 | - for _, key, value in self._index.iter_entries(( |
3727 | - ("commit", revid, "X") for revid in revids)): |
3728 | - missing_revids.remove(key[1]) |
3729 | - return missing_revids |
3730 | - |
3731 | - def sha1s(self): |
3732 | - """List the SHA1s.""" |
3733 | - for key, value in self._iter_entries_prefix(("git", None, None)): |
3734 | - yield key[1] |
3735 | - |
3736 | - |
3737 | -formats = registry.Registry() |
3738 | -formats.register(TdbGitCacheFormat().get_format_string(), |
3739 | - TdbGitCacheFormat()) |
3740 | -formats.register(SqliteGitCacheFormat().get_format_string(), |
3741 | - SqliteGitCacheFormat()) |
3742 | -formats.register(IndexGitCacheFormat().get_format_string(), |
3743 | - IndexGitCacheFormat()) |
3744 | -# In the future, this will become the default: |
3745 | -# formats.register('default', IndexGitCacheFormat()) |
3746 | -try: |
3747 | - import tdb |
3748 | -except ImportError: |
3749 | - formats.register('default', SqliteGitCacheFormat()) |
3750 | -else: |
3751 | - formats.register('default', TdbGitCacheFormat()) |
3752 | - |
3753 | - |
3754 | - |
3755 | -def migrate_ancient_formats(repo_transport): |
3756 | - # Migrate older cache formats |
3757 | - repo_transport = remove_readonly_transport_decorator(repo_transport) |
3758 | - has_sqlite = repo_transport.has("git.db") |
3759 | - has_tdb = repo_transport.has("git.tdb") |
3760 | - if not has_sqlite or has_tdb: |
3761 | - return |
3762 | - try: |
3763 | - repo_transport.mkdir("git") |
3764 | - except bzr_errors.FileExists: |
3765 | - return |
3766 | - # Prefer migrating git.db over git.tdb, since the latter may not |
3767 | - # be openable on some platforms. |
3768 | - if has_sqlite: |
3769 | - SqliteGitCacheFormat().initialize(repo_transport.clone("git")) |
3770 | - repo_transport.rename("git.db", "git/idmap.db") |
3771 | - elif has_tdb: |
3772 | - TdbGitCacheFormat().initialize(repo_transport.clone("git")) |
3773 | - repo_transport.rename("git.tdb", "git/idmap.tdb") |
3774 | - |
3775 | - |
3776 | -def remove_readonly_transport_decorator(transport): |
3777 | - if transport.is_readonly(): |
3778 | - try: |
3779 | - return transport._decorated |
3780 | - except AttributeError: |
3781 | - raise bzr_errors.ReadOnlyError(transport) |
3782 | - return transport |
3783 | - |
3784 | - |
3785 | -def from_repository(repository): |
3786 | - """Open a cache file for a repository. |
3787 | - |
3788 | - If the repository is remote and there is no transport available from it |
3789 | - this will use a local file in the users cache directory |
3790 | - (typically ~/.cache/bazaar/git/) |
3791 | - |
3792 | - :param repository: A repository object |
3793 | - """ |
3794 | - repo_transport = getattr(repository, "_transport", None) |
3795 | - if repo_transport is not None: |
3796 | - try: |
3797 | - migrate_ancient_formats(repo_transport) |
3798 | - except bzr_errors.ReadOnlyError: |
3799 | - pass # Not much we can do |
3800 | - return BzrGitCacheFormat.from_repository(repository) |
3801 | |
3802 | === removed file 'commands.py' |
3803 | --- commands.py 2017-06-05 23:51:37 +0000 |
3804 | +++ commands.py 1970-01-01 00:00:00 +0000 |
3805 | @@ -1,351 +0,0 @@ |
3806 | -# Copyright (C) 2006-2009 Canonical Ltd |
3807 | - |
3808 | -# Authors: Robert Collins <robert.collins@canonical.com> |
3809 | -# Jelmer Vernooij <jelmer@samba.org> |
3810 | -# John Carr <john.carr@unrouted.co.uk> |
3811 | -# |
3812 | -# This program is free software; you can redistribute it and/or modify |
3813 | -# it under the terms of the GNU General Public License as published by |
3814 | -# the Free Software Foundation; either version 2 of the License, or |
3815 | -# (at your option) any later version. |
3816 | -# |
3817 | -# This program is distributed in the hope that it will be useful, |
3818 | -# but WITHOUT ANY WARRANTY; without even the implied warranty of |
3819 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3820 | -# GNU General Public License for more details. |
3821 | -# |
3822 | -# You should have received a copy of the GNU General Public License |
3823 | -# along with this program; if not, write to the Free Software |
3824 | -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
3825 | - |
3826 | -"""Git-specific subcommands for Bazaar.""" |
3827 | - |
3828 | -from __future__ import absolute_import |
3829 | - |
3830 | -from ...commands import ( |
3831 | - Command, |
3832 | - display_command, |
3833 | - ) |
3834 | -from ...option import ( |
3835 | - Option, |
3836 | - ) |
3837 | - |
3838 | - |
3839 | -class cmd_git_import(Command): |
3840 | - """Import all branches from a git repository. |
3841 | - |
3842 | - """ |
3843 | - |
3844 | - takes_args = ["src_location", "dest_location?"] |
3845 | - |
3846 | - takes_options = [ |
3847 | - Option('colocated', help='Create colocated branches.'), |
3848 | - ] |
3849 | - |
3850 | - def _get_colocated_branch(self, target_bzrdir, name): |
3851 | - from ...errors import NotBranchError |
3852 | - try: |
3853 | - return target_bzrdir.open_branch(name=name) |
3854 | - except NotBranchError: |
3855 | - return target_bzrdir.create_branch(name=name) |
3856 | - |
3857 | - def _get_nested_branch(self, dest_transport, dest_format, name): |
3858 | - from ...bzrdir import BzrDir |
3859 | - from ...errors import NotBranchError |
3860 | - head_transport = dest_transport.clone(name) |
3861 | - try: |
3862 | - head_bzrdir = BzrDir.open_from_transport(head_transport) |
3863 | - except NotBranchError: |
3864 | - head_bzrdir = dest_format.initialize_on_transport_ex( |
3865 | - head_transport, create_prefix=True)[1] |
3866 | - try: |
3867 | - return head_bzrdir.open_branch() |
3868 | - except NotBranchError: |
3869 | - return head_bzrdir.create_branch() |
3870 | - |
3871 | - def run(self, src_location, dest_location=None, colocated=False): |
3872 | - import os |
3873 | - import urllib |
3874 | - from ... import ( |
3875 | - controldir, |
3876 | - trace, |
3877 | - ui, |
3878 | - urlutils, |
3879 | - ) |
3880 | - from ...bzrdir import ( |
3881 | - BzrDir, |
3882 | - ) |
3883 | - from ...errors import ( |
3884 | - BzrCommandError, |
3885 | - NoRepositoryPresent, |
3886 | - NotBranchError, |
3887 | - ) |
3888 | - from . import gettext |
3889 | - from ...repository import ( |
3890 | - InterRepository, |
3891 | - Repository, |
3892 | - ) |
3893 | - from ...transport import get_transport |
3894 | - from .branch import ( |
3895 | - GitBranch, |
3896 | - ) |
3897 | - from .refs import ( |
3898 | - ref_to_branch_name, |
3899 | - ) |
3900 | - from .repository import GitRepository |
3901 | - |
3902 | - dest_format = controldir.ControlDirFormat.get_default_format() |
3903 | - |
3904 | - if dest_location is None: |
3905 | - dest_location = os.path.basename(src_location.rstrip("/\\")) |
3906 | - |
3907 | - dest_transport = get_transport(dest_location) |
3908 | - |
3909 | - source_repo = Repository.open(src_location) |
3910 | - if not isinstance(source_repo, GitRepository): |
3911 | - raise BzrCommandError(gettext("%r is not a git repository") % src_location) |
3912 | - try: |
3913 | - target_bzrdir = BzrDir.open_from_transport(dest_transport) |
3914 | - except NotBranchError: |
3915 | - target_bzrdir = dest_format.initialize_on_transport_ex( |
3916 | - dest_transport, shared_repo=True)[1] |
3917 | - try: |
3918 | - target_repo = target_bzrdir.find_repository() |
3919 | - except NoRepositoryPresent: |
3920 | - target_repo = target_bzrdir.create_repository(shared=True) |
3921 | - |
3922 | - if not target_repo.supports_rich_root(): |
3923 | - raise BzrCommandError(gettext("Target repository doesn't support rich roots")) |
3924 | - |
3925 | - interrepo = InterRepository.get(source_repo, target_repo) |
3926 | - mapping = source_repo.get_mapping() |
3927 | - refs = interrepo.fetch() |
3928 | - refs_dict = refs.as_dict() |
3929 | - pb = ui.ui_factory.nested_progress_bar() |
3930 | - try: |
3931 | - for i, (name, sha) in enumerate(refs_dict.iteritems()): |
3932 | - try: |
3933 | - branch_name = ref_to_branch_name(name) |
3934 | - except ValueError: |
3935 | - # Not a branch, ignore |
3936 | - continue |
3937 | - pb.update(gettext("creating branches"), i, len(refs_dict)) |
3938 | - if getattr(target_bzrdir._format, "colocated_branches", False) and colocated: |
3939 | - if name == "HEAD": |
3940 | - branch_name = None |
3941 | - head_branch = self._get_colocated_branch(target_bzrdir, branch_name) |
3942 | - else: |
3943 | - head_branch = self._get_nested_branch(dest_transport, dest_format, branch_name) |
3944 | - revid = mapping.revision_id_foreign_to_bzr(sha) |
3945 | - source_branch = GitBranch(source_repo.bzrdir, source_repo, |
3946 | - sha) |
3947 | - source_branch.head = sha |
3948 | - if head_branch.last_revision() != revid: |
3949 | - head_branch.generate_revision_history(revid) |
3950 | - source_branch.tags.merge_to(head_branch.tags) |
3951 | - if not head_branch.get_parent(): |
3952 | - url = urlutils.join_segment_parameters( |
3953 | - source_branch.base, {"ref": urllib.quote(name, '')}) |
3954 | - head_branch.set_parent(url) |
3955 | - finally: |
3956 | - pb.finished() |
3957 | - trace.note(gettext( |
3958 | - "Use 'bzr checkout' to create a working tree in " |
3959 | - "the newly created branches.")) |
3960 | - |
3961 | - |
3962 | -class cmd_git_object(Command): |
3963 | - """List or display Git objects by SHA. |
3964 | - |
3965 | - Cat a particular object's Git representation if a SHA is specified. |
3966 | - List all available SHAs otherwise. |
3967 | - """ |
3968 | - |
3969 | - hidden = True |
3970 | - |
3971 | - aliases = ["git-objects", "git-cat"] |
3972 | - takes_args = ["sha1?"] |
3973 | - takes_options = [Option('directory', |
3974 | - short_name='d', |
3975 | - help='Location of repository.', type=unicode), |
3976 | - Option('pretty', help='Pretty-print objects.')] |
3977 | - encoding_type = 'exact' |
3978 | - |
3979 | - @display_command |
3980 | - def run(self, sha1=None, directory=".", pretty=False): |
3981 | - from ...errors import ( |
3982 | - BzrCommandError, |
3983 | - ) |
3984 | - from ...bzrdir import ( |
3985 | - BzrDir, |
3986 | - ) |
3987 | - from .object_store import ( |
3988 | - get_object_store, |
3989 | - ) |
3990 | - from . import gettext |
3991 | - bzrdir, _ = BzrDir.open_containing(directory) |
3992 | - repo = bzrdir.find_repository() |
3993 | - object_store = get_object_store(repo) |
3994 | - object_store.lock_read() |
3995 | - try: |
3996 | - if sha1 is not None: |
3997 | - try: |
3998 | - obj = object_store[str(sha1)] |
3999 | - except KeyError: |
4000 | - raise BzrCommandError(gettext("Object not found: %s") % sha1) |
4001 | - if pretty: |
4002 | - text = obj.as_pretty_string() |
4003 | - else: |
4004 | - text = obj.as_raw_string() |
4005 | - self.outf.write(text) |
4006 | - else: |
4007 | - for sha1 in object_store: |
4008 | - self.outf.write("%s\n" % sha1) |
4009 | - finally: |
4010 | - object_store.unlock() |
4011 | - |
4012 | - |
4013 | -class cmd_git_refs(Command): |
4014 | - """Output all of the virtual refs for a repository. |
4015 | - |
4016 | - """ |
4017 | - |
4018 | - hidden = True |
4019 | - |
4020 | - takes_args = ["location?"] |
4021 | - |
4022 | - @display_command |
4023 | - def run(self, location="."): |
4024 | - from ...bzrdir import ( |
4025 | - BzrDir, |
4026 | - ) |
4027 | - from .refs import ( |
4028 | - get_refs_container, |
4029 | - ) |
4030 | - from .object_store import ( |
4031 | - get_object_store, |
4032 | - ) |
4033 | - bzrdir, _ = BzrDir.open_containing(location) |
4034 | - repo = bzrdir.find_repository() |
4035 | - object_store = get_object_store(repo) |
4036 | - object_store.lock_read() |
4037 | - try: |
4038 | - refs = get_refs_container(bzrdir, object_store) |
4039 | - for k, v in refs.as_dict().iteritems(): |
4040 | - self.outf.write("%s -> %s\n" % (k, v)) |
4041 | - finally: |
4042 | - object_store.unlock() |
4043 | - |
4044 | - |
4045 | -class cmd_git_apply(Command): |
4046 | - """Apply a series of git-am style patches. |
4047 | - |
4048 | - This command will in the future probably be integrated into |
4049 | - "bzr pull". |
4050 | - """ |
4051 | - |
4052 | - takes_options = [ |
4053 | - Option('signoff', short_name='s', help='Add a Signed-off-by line.'), |
4054 | - Option('force', |
4055 | - help='Apply patches even if tree has uncommitted changes.') |
4056 | - ] |
4057 | - takes_args = ["patches*"] |
4058 | - |
4059 | - def _apply_patch(self, wt, f, signoff): |
4060 | - """Apply a patch. |
4061 | - |
4062 | - :param wt: A Bazaar working tree object. |
4063 | - :param f: Patch file to read. |
4064 | - :param signoff: Add Signed-Off-By flag. |
4065 | - """ |
4066 | - from . import gettext |
4067 | - from ...errors import BzrCommandError |
4068 | - from dulwich.patch import git_am_patch_split |
4069 | - import subprocess |
4070 | - (c, diff, version) = git_am_patch_split(f) |
4071 | - # FIXME: Cope with git-specific bits in patch |
4072 | - # FIXME: Add new files to working tree |
4073 | - p = subprocess.Popen(["patch", "-p1"], stdin=subprocess.PIPE, |
4074 | - cwd=wt.basedir) |
4075 | - p.communicate(diff) |
4076 | - exitcode = p.wait() |
4077 | - if exitcode != 0: |
4078 | - raise BzrCommandError(gettext("error running patch")) |
4079 | - message = c.message |
4080 | - if signoff: |
4081 | - signed_off_by = wt.branch.get_config().username() |
4082 | - message += "Signed-off-by: %s\n" % signed_off_by.encode('utf-8') |
4083 | - wt.commit(authors=[c.author], message=message) |
4084 | - |
4085 | - def run(self, patches_list=None, signoff=False, force=False): |
4086 | - from ...errors import UncommittedChanges |
4087 | - from ...workingtree import WorkingTree |
4088 | - if patches_list is None: |
4089 | - patches_list = [] |
4090 | - |
4091 | - tree, _ = WorkingTree.open_containing(".") |
4092 | - if tree.basis_tree().changes_from(tree).has_changed() and not force: |
4093 | - raise UncommittedChanges(tree) |
4094 | - tree.lock_write() |
4095 | - try: |
4096 | - for patch in patches_list: |
4097 | - f = open(patch, 'r') |
4098 | - try: |
4099 | - self._apply_patch(tree, f, signoff=signoff) |
4100 | - finally: |
4101 | - f.close() |
4102 | - finally: |
4103 | - tree.unlock() |
4104 | - |
4105 | - |
4106 | -class cmd_git_push_pristine_tar_deltas(Command): |
4107 | - """Push pristine tar deltas to a git repository.""" |
4108 | - |
4109 | - takes_options = [Option('directory', |
4110 | - short_name='d', |
4111 | - help='Location of repository.', type=unicode)] |
4112 | - takes_args = ['target', 'package'] |
4113 | - |
4114 | - def run(self, target, package, directory='.'): |
4115 | - from ...branch import Branch |
4116 | - from ...errors import ( |
4117 | - BzrCommandError, |
4118 | - NoSuchRevision, |
4119 | - ) |
4120 | - from ...trace import warning |
4121 | - from ...repository import Repository |
4122 | - from .object_store import get_object_store |
4123 | - from .pristine_tar import ( |
4124 | - revision_pristine_tar_data, |
4125 | - store_git_pristine_tar_data, |
4126 | - ) |
4127 | - source = Branch.open_containing(directory)[0] |
4128 | - target_bzr = Repository.open(target) |
4129 | - target = getattr(target_bzr, '_git', None) |
4130 | - git_store = get_object_store(source.repository) |
4131 | - self.add_cleanup(git_store.unlock) |
4132 | - git_store.lock_read() |
4133 | - if target is None: |
4134 | - raise BzrCommandError("Target not a git repository") |
4135 | - tag_dict = source.tags.get_tag_dict() |
4136 | - for name, revid in tag_dict.iteritems(): |
4137 | - try: |
4138 | - rev = source.repository.get_revision(revid) |
4139 | - except NoSuchRevision: |
4140 | - continue |
4141 | - try: |
4142 | - delta, kind = revision_pristine_tar_data(rev) |
4143 | - except KeyError: |
4144 | - continue |
4145 | - gitid = git_store._lookup_revision_sha1(revid) |
4146 | - if not (name.startswith('upstream/') or name.startswith('upstream-')): |
4147 | - warning("Unexpected pristine tar revision tagged %s. Ignoring.", |
4148 | - name) |
4149 | - continue |
4150 | - upstream_version = name[len("upstream/"):] |
4151 | - filename = '%s_%s.orig.tar.%s' % (package, upstream_version, kind) |
4152 | - if not gitid in target: |
4153 | - warning("base git id %s for %s missing in target repository", |
4154 | - gitid, filename) |
4155 | - store_git_pristine_tar_data(target, filename.encode('utf-8'), |
4156 | - delta, gitid) |
4157 | |
4158 | === removed file 'commit.py' |
4159 | --- commit.py 2017-06-01 21:50:27 +0000 |
4160 | +++ commit.py 1970-01-01 00:00:00 +0000 |
4161 | @@ -1,233 +0,0 @@ |
4162 | -# Copyright (C) 2009-2010 Jelmer Vernooij <jelmer@samba.org> |
4163 | -# |
4164 | -# This program is free software; you can redistribute it and/or modify |
4165 | -# it under the terms of the GNU General Public License as published by |
4166 | -# the Free Software Foundation; either version 2 of the License, or |
4167 | -# (at your option) any later version. |
4168 | -# |
4169 | -# This program is distributed in the hope that it will be useful, |
4170 | -# but WITHOUT ANY WARRANTY; without even the implied warranty of |
4171 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4172 | -# GNU General Public License for more details. |
4173 | -# |
4174 | -# You should have received a copy of the GNU General Public License |
4175 | -# along with this program; if not, write to the Free Software |
4176 | -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
4177 | - |
4178 | - |
4179 | -"""Support for committing in native Git working trees.""" |
4180 | - |
4181 | -from __future__ import absolute_import |
4182 | - |
4183 | -from dulwich.index import ( |
4184 | - commit_tree, |
4185 | - ) |
4186 | -import os |
4187 | -import stat |
4188 | - |
4189 | -from ... import ( |
4190 | - revision as _mod_revision, |
4191 | - ) |
4192 | -from ...errors import ( |
4193 | - RootMissing, |
4194 | - ) |
4195 | -from ...repository import ( |
4196 | - CommitBuilder, |
4197 | - ) |
4198 | - |
4199 | -from dulwich.objects import ( |
4200 | - S_IFGITLINK, |
4201 | - Blob, |
4202 | - Commit, |
4203 | - ) |
4204 | -from dulwich.repo import Repo |
4205 | - |
4206 | - |
4207 | -from .mapping import ( |
4208 | - entry_mode, |
4209 | - ) |
4210 | -from .roundtrip import ( |
4211 | - CommitSupplement, |
4212 | - inject_bzr_metadata, |
4213 | - ) |
4214 | - |
4215 | - |
4216 | -class GitCommitBuilder(CommitBuilder): |
4217 | - """Commit builder for Git repositories.""" |
4218 | - |
4219 | - supports_record_entry_contents = False |
4220 | - |
4221 | - def __init__(self, *args, **kwargs): |
4222 | - super(GitCommitBuilder, self).__init__(*args, **kwargs) |
4223 | - self._validate_revprops(self._revprops) |
4224 | - self.store = self.repository._git.object_store |
4225 | - self._blobs = {} |
4226 | - self._any_changes = False |
4227 | - self._will_record_deletes = False |
4228 | - self._override_fileids = {} |
4229 | - self._mapping = self.repository.get_mapping() |
4230 | - |
4231 | - def any_changes(self): |
4232 | - return self._any_changes |
4233 | - |
4234 | - def record_entry_contents(self, ie, parent_invs, path, tree, |
4235 | - content_summary): |
4236 | - raise NotImplementedError(self.record_entry_contents) |
4237 | - |
4238 | - def record_delete(self, kind, path, file_id): |
4239 | - assert type(path) == str |
4240 | - if kind != 'directory': |
4241 | - self._override_fileids[path] = None |
4242 | - self._blobs[path] = None |
4243 | - self._any_changes = True |
4244 | - |
4245 | - def record_iter_changes(self, workingtree, basis_revid, iter_changes): |
4246 | - def link_sha1(path, file_id): |
4247 | - blob = Blob() |
4248 | - blob.data = workingtree.get_symlink_target(file_id, path).encode("utf-8") |
4249 | - self.store.add_object(blob) |
4250 | - return blob.id |
4251 | - def text_sha1(path, file_id): |
4252 | - blob = Blob() |
4253 | - blob.data = workingtree.get_file_text(file_id, path) |
4254 | - self.store.add_object(blob) |
4255 | - return blob.id |
4256 | - def treeref_sha1(path, file_id): |
4257 | - return Repo.open(os.path.join(workingtree.basedir, path)).head() |
4258 | - seen_root = False |
4259 | - for (file_id, path, changed_content, versioned, parent, name, kind, |
4260 | - executable) in iter_changes: |
4261 | - if kind[1] in ("directory",): |
4262 | - if kind[0] in ("file", "symlink"): |
4263 | - self.record_delete(kind[0], path[0].encode("utf-8"), file_id) |
4264 | - if path[1] == "": |
4265 | - seen_root = True |
4266 | - continue |
4267 | - if path[1] is None: |
4268 | - self.record_delete(kind[0], path[0].encode("utf-8"), file_id) |
4269 | - continue |
4270 | - if kind[1] == "file": |
4271 | - mode = stat.S_IFREG |
4272 | - sha = text_sha1(path[1], file_id) |
4273 | - elif kind[1] == "symlink": |
4274 | - mode = stat.S_IFLNK |
4275 | - sha = link_sha1(path[1], file_id) |
4276 | - elif kind[1] == "tree-reference": |
4277 | - mode = S_IFGITLINK |
4278 | - sha = treeref_sha1(path[1], file_id) |
4279 | - else: |
4280 | - raise AssertionError("Unknown kind %r" % kind[1]) |
4281 | - if executable[1]: |
4282 | - mode |= 0111 |
4283 | - self._any_changes = True |
4284 | - encoded_new_path = path[1].encode("utf-8") |
4285 | - self._blobs[encoded_new_path] = (mode, sha) |
4286 | - file_sha1 = workingtree.get_file_sha1(file_id, path[1]) |
4287 | - if file_sha1 is None: |
4288 | - # File no longer exists |
4289 | - if path[0] is not None: |
4290 | - self.record_delete(kind[0], path[0].encode("utf-8"), file_id) |
4291 | - continue |
4292 | - _, st = workingtree.get_file_with_stat(file_id, path[1]) |
4293 | - yield file_id, path[1], (file_sha1, st) |
4294 | - self._override_fileids[encoded_new_path] = file_id |
4295 | - if not seen_root and len(self.parents) == 0: |
4296 | - raise RootMissing() |
4297 | - if getattr(workingtree, "basis_tree", False): |
4298 | - basis_tree = workingtree.basis_tree() |
4299 | - else: |
4300 | - if len(self.parents) == 0: |
4301 | - basis_revid = _mod_revision.NULL_REVISION |
4302 | - else: |
4303 | - basis_revid = self.parents[0] |
4304 | - basis_tree = self.repository.revision_tree(basis_revid) |
4305 | - # Fill in entries that were not changed |
4306 | - for path, entry in basis_tree.iter_entries_by_dir(): |
4307 | - if entry.kind not in ("file", "symlink", "tree-reference"): |
4308 | - continue |
4309 | - if not path in self._blobs: |
4310 | - if entry.kind == "symlink": |
4311 | - blob = Blob() |
4312 | - blob.data = basis_tree.get_symlink_target(entry.file_id, |
4313 | - path) |
4314 | - self._blobs[path.encode("utf-8")] = (entry_mode(entry), blob.id) |
4315 | - elif entry.kind == "file": |
4316 | - blob = Blob() |
4317 | - blob.data = basis_tree.get_file_text(entry.file_id, path) |
4318 | - self._blobs[path.encode("utf-8")] = (entry_mode(entry), blob.id) |
4319 | - else: |
4320 | - (mode, sha) = workingtree._lookup_entry(path.encode("utf-8"), update_index=True) |
4321 | - self._blobs[path.encode("utf-8")] = (sha, mode) |
4322 | - if not self._lossy and self._mapping.BZR_FILE_IDS_FILE is not None: |
4323 | - try: |
4324 | - fileid_map = dict(basis_tree._fileid_map.file_ids) |
4325 | - except AttributeError: |
4326 | - fileid_map = {} |
4327 | - for path, file_id in self._override_fileids.iteritems(): |
4328 | - assert type(path) == str |
4329 | - if file_id is None: |
4330 | - del fileid_map[path] |
4331 | - else: |
4332 | - assert type(file_id) == str |
4333 | - fileid_map[path] = file_id |
4334 | - if fileid_map: |
4335 | - fileid_blob = self._mapping.export_fileid_map(fileid_map) |
4336 | - self.store.add_object(fileid_blob) |
4337 | - self._blobs[self._mapping.BZR_FILE_IDS_FILE] = (stat.S_IFREG | 0644, fileid_blob.id) |
4338 | - else: |
4339 | - self._blobs[self._mapping.BZR_FILE_IDS_FILE] = None |
4340 | - self.new_inventory = None |
4341 | - |
4342 | - def get_basis_delta(self): |
4343 | - if not self._will_record_deletes: |
4344 | - raise AssertionError |
4345 | - # FIXME |
4346 | - return [] |
4347 | - |
4348 | - def finish_inventory(self): |
4349 | - # eliminate blobs that were removed |
4350 | - for path, entry in iter(self._blobs.items()): |
4351 | - if entry is None: |
4352 | - del self._blobs[path] |
4353 | - |
4354 | - def _iterblobs(self): |
4355 | - return ((path, sha, mode) for (path, (mode, sha)) in self._blobs.iteritems()) |
4356 | - |
4357 | - def commit(self, message): |
4358 | - self._validate_unicode_text(message, 'commit message') |
4359 | - c = Commit() |
4360 | - c.parents = [self.repository.lookup_bzr_revision_id(revid)[0] for revid in self.parents] |
4361 | - c.tree = commit_tree(self.store, self._iterblobs()) |
4362 | - c.committer = self._committer |
4363 | - c.author = self._revprops.get('author', self._committer) |
4364 | - if c.author != c.committer: |
4365 | - self._revprops.remove("author") |
4366 | - c.commit_time = int(self._timestamp) |
4367 | - c.author_time = int(self._timestamp) |
4368 | - c.commit_timezone = self._timezone |
4369 | - c.author_timezone = self._timezone |
4370 | - c.encoding = 'utf-8' |
4371 | - c.message = message.encode("utf-8") |
4372 | - if not self._lossy: |
4373 | - commit_supplement = CommitSupplement() |
4374 | - commit_supplement.revision_id = self._new_revision_id |
4375 | - commit_supplement.properties = self._revprops |
4376 | - commit_supplement.explicit_parent_ids = self.parents |
4377 | - if commit_supplement: |
4378 | - c.message = inject_bzr_metadata(c.message, commit_supplement, "utf-8") |
4379 | - |
4380 | - assert len(c.id) == 40 |
4381 | - if self._new_revision_id is None or self._lossy: |
4382 | - self._new_revision_id = self._mapping.revision_id_foreign_to_bzr(c.id) |
4383 | - self.store.add_object(c) |
4384 | - self.repository.commit_write_group() |
4385 | - return self._new_revision_id |
4386 | - |
4387 | - def abort(self): |
4388 | - self.repository.abort_write_group() |
4389 | - |
4390 | - def will_record_deletes(self): |
4391 | - self._will_record_deletes = True |
4392 | - |
4393 | - def revision_tree(self): |
4394 | - return self.repository.revision_tree(self._new_revision_id) |
4395 | |
4396 | === removed file 'config.py' |
4397 | --- config.py 2017-06-01 21:50:27 +0000 |
4398 | +++ config.py 1970-01-01 00:00:00 +0000 |
4399 | @@ -1,63 +0,0 @@ |
4400 | -# Copyright (C) 2009-2010 Jelmer Vernooij <jelmer@samba.org> |
4401 | -# |
4402 | -# This program is free software; you can redistribute it and/or modify |
4403 | -# it under the terms of the GNU General Public License as published by |
4404 | -# the Free Software Foundation; either version 2 of the License, or |
4405 | -# (at your option) any later version. |
4406 | -# |
4407 | -# This program is distributed in the hope that it will be useful, |
4408 | -# but WITHOUT ANY WARRANTY; without even the implied warranty of |
4409 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4410 | -# GNU General Public License for more details. |
4411 | -# |
4412 | -# You should have received a copy of the GNU General Public License |
4413 | -# along with this program; if not, write to the Free Software |
4414 | -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
4415 | - |
4416 | -"""Config file handling for Git.""" |
4417 | - |
4418 | -from __future__ import absolute_import |
4419 | - |
4420 | -from ... import ( |
4421 | - config, |
4422 | - ) |
4423 | - |
4424 | -class GitBranchConfig(config.BranchConfig): |
4425 | - """BranchConfig that uses locations.conf in place of branch.conf""" |
4426 | - |
4427 | - def __init__(self, branch): |
4428 | - super(GitBranchConfig, self).__init__(branch) |
4429 | - # do not provide a BranchDataConfig |
4430 | - self.option_sources = self.option_sources[0], self.option_sources[2] |
4431 | - |
4432 | - def __repr__(self): |
4433 | - return "<%s of %r>" % (self.__class__.__name__, self.branch) |
4434 | - |
4435 | - def set_user_option(self, name, value, store=config.STORE_BRANCH, |
4436 | - warn_masked=False): |
4437 | - """Force local to True""" |
4438 | - config.BranchConfig.set_user_option(self, name, value, |
4439 | - store=config.STORE_LOCATION, warn_masked=warn_masked) |
4440 | - |
4441 | - def _get_user_id(self): |
4442 | - # TODO: Read from ~/.gitconfig |
4443 | - return self._get_best_value('_get_user_id') |
4444 | - |
4445 | - |
4446 | -class GitBranchStack(config._CompatibleStack): |
4447 | - """GitBranch stack.""" |
4448 | - |
4449 | - def __init__(self, branch): |
4450 | - lstore = config.LocationStore() |
4451 | - loc_matcher = config.LocationMatcher(lstore, branch.base) |
4452 | - # FIXME: This should also be looking in .git/config for |
4453 | - # local git branches. |
4454 | - gstore = config.GlobalStore() |
4455 | - super(GitBranchStack, self).__init__( |
4456 | - [self._get_overrides, |
4457 | - loc_matcher.get_sections, |
4458 | - gstore.get_sections], |
4459 | - # All modifications go to the corresponding section in |
4460 | - # locations.conf |
4461 | - lstore, branch.base) |
4462 | - self.branch = branch |
4463 | |
4464 | === removed file 'debian/bzr-builddeb.conf' |
4465 | --- debian/bzr-builddeb.conf 2019-02-11 19:56:23 +0000 |
4466 | +++ debian/bzr-builddeb.conf 1970-01-01 00:00:00 +0000 |
4467 | @@ -1,2 +0,0 @@ |
4468 | -[HOOKS] |
4469 | -merge-upstream = ./debian/update-deps.py |
4470 | |
4471 | === modified file 'debian/changelog' |
4472 | --- debian/changelog 2019-02-11 19:56:59 +0000 |
4473 | +++ debian/changelog 2019-08-25 13:07:52 +0000 |
4474 | @@ -1,3 +1,13 @@ |
4475 | +bzr-git (0.6.13+bzr1650+brz) UNRELEASED; urgency=medium |
4476 | + |
4477 | + * Make the package a transitional package to upgrade to brz. |
4478 | + * Move transitional package bzr-git to oldlibs/optional per policy |
4479 | + 4.0.1. |
4480 | + * Add missing dependency on quilt. |
4481 | + * Add missing dependency on quilt. |
4482 | + |
4483 | + -- Jelmer Vernooij <jelmer@debian.org> Sun, 24 Feb 2019 00:32:01 +0000 |
4484 | + |
4485 | bzr-git (0.6.13+bzr1650-2) unstable; urgency=medium |
4486 | |
4487 | * Add debian/upstream/metadata. |
4488 | |
4489 | === removed file 'debian/compat' |
4490 | --- debian/compat 2019-02-08 17:09:32 +0000 |
4491 | +++ debian/compat 1970-01-01 00:00:00 +0000 |
4492 | @@ -1,1 +0,0 @@ |
4493 | -10 |
4494 | |
4495 | === modified file 'debian/control' |
4496 | --- debian/control 2019-02-08 17:09:32 +0000 |
4497 | +++ debian/control 2019-08-25 13:07:52 +0000 |
4498 | @@ -3,25 +3,18 @@ |
4499 | Priority: optional |
4500 | Maintainer: Debian Bazaar Maintainers <pkg-bazaar-maint@lists.alioth.debian.org> |
4501 | Uploaders: Andrew Starr-Bochicchio <asb@debian.org>, Jelmer Vernooij <jelmer@debian.org> |
4502 | -Build-Depends: debhelper (>= 10~), python (>= 2.6.6-3), python-tdb |
4503 | -Build-Depends-Indep: bzr (<< 2.8.0), bzr (>= 2.5~), bzr-fastimport (>= 0.12.0+bzr351), python-bzrlib.tests | bzr (<= 2.4.0~beta1-2), python-dulwich (>= 0.19.11~), python-fastimport, python-subunit, python-testtools (>= 0.9.2), python-unittest2 |
4504 | +Build-Depends: debhelper-compat (= 12), quilt, quilt |
4505 | Standards-Version: 4.1.1 |
4506 | Homepage: http://bazaar-vcs.org/BzrForeignBranches/Git |
4507 | -Vcs-Bzr: https://code.launchpad.net/~debian-bazaar/debian/sid/bzr-git/unstable |
4508 | -Vcs-Browser: https://code.launchpad.net/~debian-bazaar/debian/sid/bzr-git/unstable |
4509 | +Vcs-Bzr: https://code.launchpad.net/~debian-bazaar/debian/sid/bzr-git/experimental |
4510 | +Vcs-Browser: https://code.launchpad.net/~debian-bazaar/debian/sid/bzr-git/experimental |
4511 | |
4512 | Package: bzr-git |
4513 | Architecture: all |
4514 | -Depends: bzr (<< 2.8.0), bzr (>= 2.5~), python-dulwich (>= 0.19.11~), ${misc:Depends}, ${python:Depends} |
4515 | -Suggests: bzr-fastimport |
4516 | -Recommends: python-tdb |
4517 | -Enhances: bzr, git, loggerhead |
4518 | -Provides: git-remote-bzr |
4519 | -Description: Bazaar plugin providing Git integration |
4520 | - This is a plugin for Bazaar that adds the ability to use Git repositories, |
4521 | - both local and remote (git://, git+ssh:// and http://). It integrates with the |
4522 | - regular Bazaar UI, and provides a new Bazaar subcommand `git-import` which |
4523 | - imports all branches from a Git repository. |
4524 | +Depends: ${misc:Depends}, brz, python3-dulwich |
4525 | +Description: transitional dummy package |
4526 | + This is a transitional package, replacing the Bazaar packaging |
4527 | + with the Breezy packaging. |
4528 | . |
4529 | - An experimental remote helper for Git that can push to and |
4530 | - fetch from Bazaar branches is also provided. |
4531 | + It can be safely removed after an upgrade. |
4532 | +Section: oldlibs |
4533 | |
4534 | === modified file 'debian/copyright' |
4535 | --- debian/copyright 2018-09-20 17:32:54 +0000 |
4536 | +++ debian/copyright 2019-08-25 13:07:52 +0000 |
4537 | @@ -3,13 +3,6 @@ |
4538 | Upstream-Contact: Jelmer Vernooij <jelmer@samba.org> |
4539 | Source: http://launchpad.net/bzr-git/ |
4540 | |
4541 | -Files: * |
4542 | -Copyright: 2006-2012, Canonical Ltd. |
4543 | - 2008, John Carr |
4544 | - 2007, David Allouche <ddaa@ddaa.net> |
4545 | - 2007-2012, Jelmer Vernooij <jelmer@samba.org> |
4546 | -License: GPL-2+ |
4547 | - |
4548 | Files: debian/* |
4549 | Copyright: 2007-2012 Jelmer Vernooij <jelmer@debian.org> |
4550 | License: GPL-2+ |
4551 | |
4552 | === removed file 'debian/manpages' |
4553 | --- debian/manpages 2011-12-17 15:37:24 +0000 |
4554 | +++ debian/manpages 1970-01-01 00:00:00 +0000 |
4555 | @@ -1,1 +0,0 @@ |
4556 | -git-remote-bzr.1 |
4557 | |
4558 | === removed file 'debian/pycompat' |
4559 | --- debian/pycompat 2007-12-06 14:56:44 +0000 |
4560 | +++ debian/pycompat 1970-01-01 00:00:00 +0000 |
4561 | @@ -1,1 +0,0 @@ |
4562 | -2 |
4563 | |
4564 | === modified file 'debian/rules' |
4565 | --- debian/rules 2017-10-05 22:31:25 +0000 |
4566 | +++ debian/rules 2019-08-25 13:07:52 +0000 |
4567 | @@ -1,21 +1,8 @@ |
4568 | #!/usr/bin/make -f |
4569 | |
4570 | +override_dh_auto_build: |
4571 | + |
4572 | +override_dh_auto_install: |
4573 | + |
4574 | %: |
4575 | - dh $* --buildsystem=python_distutils --with python2 |
4576 | - |
4577 | -ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) |
4578 | -CONCURRENCY = BZR_CONCURRENCY=$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) |
4579 | -endif |
4580 | - |
4581 | -override_dh_auto_clean: |
4582 | - dh_auto_clean |
4583 | - find . -name "*.pyc" -print0 | xargs -0 rm -f |
4584 | - |
4585 | -ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS))) |
4586 | -override_dh_auto_test: |
4587 | - $(CONCURRENCY) BZR_PLUGINS_AT=git@$(CURDIR) /usr/bin/bzr selftest --parallel=fork \ |
4588 | - -v -s bp.git |
4589 | -endif |
4590 | - |
4591 | -override_dh_installchangelogs: |
4592 | - dh_installchangelogs NEWS |
4593 | + dh $* |
4594 | |
4595 | === modified file 'debian/source/format' |
4596 | --- debian/source/format 2010-02-04 01:29:52 +0000 |
4597 | +++ debian/source/format 2019-08-25 13:07:52 +0000 |
4598 | @@ -1,1 +1,1 @@ |
4599 | -3.0 (quilt) |
4600 | +3.0 (native) |
4601 | |
4602 | === removed directory 'debian/upstream' |
4603 | === removed file 'debian/upstream/metadata' |
4604 | --- debian/upstream/metadata 2019-02-11 19:56:23 +0000 |
4605 | +++ debian/upstream/metadata 1970-01-01 00:00:00 +0000 |
4606 | @@ -1,3 +0,0 @@ |
4607 | -Name: bzr-git |
4608 | -Repository: https://code.launchpad.net/~jelmer/bzr-git/trunk |
4609 | -Repository-Browse: https://code.launchpad.net/~jelmer/bzr-git/trunk |
4610 | |
4611 | === removed file 'debian/upstream/signing-key.asc' |
4612 | --- debian/upstream/signing-key.asc 2019-02-08 17:09:33 +0000 |
4613 | +++ debian/upstream/signing-key.asc 1970-01-01 00:00:00 +0000 |
4614 | @@ -1,366 +0,0 @@ |
4615 | ------BEGIN PGP PUBLIC KEY BLOCK----- |
4616 | - |
4617 | -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 |
4978 | -1rbNHrKsS3nj/fGQlg== |
4979 | -=udS2 |
4980 | ------END PGP PUBLIC KEY BLOCK----- |
4981 | |
4982 | === removed file 'debian/watch' |
4983 | --- debian/watch 2014-01-29 00:24:13 +0000 |
4984 | +++ debian/watch 1970-01-01 00:00:00 +0000 |
4985 | @@ -1,3 +0,0 @@ |
4986 | -version=3 |
4987 | -opts="pgpsigurlmangle=s/$/.asc/" \ |
4988 | - http://samba.org/~jelmer/bzr/bzr-git-(.*).tar.gz |
4989 | |
4990 | === removed file 'dir.py' |
4991 | --- dir.py 2017-06-05 23:51:37 +0000 |
4992 | +++ dir.py 1970-01-01 00:00:00 +0000 |
4993 | @@ -1,546 +0,0 @@ |
4994 | -# Copyright (C) 2007 Canonical Ltd |
4995 | -# Copyright (C) 2010 Jelmer Vernooij |
4996 | -# |
4997 | -# This program is free software; you can redistribute it and/or modify |
4998 | -# it under the terms of the GNU General Public License as published by |
4999 | -# the Free Software Foundation; either version 2 of the License, or |
5000 | -# (at your option) any later version. |