Merge lp:~jelmer/debian/sid/bzr-git/lintian-fixes into lp:~debian-bazaar/debian/sid/bzr-git/unstable

Proposed by Jelmer Vernooij
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
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://janitor.debian.net/).

You can follow up to this merge proposal as you normally would.

Build and test logs for this branch can be found at
https://janitor.debian.net/pkg/bzr-git/logs/3f9366f2-bb2d-4b03-9f3e-76f03ed33152.

To post a comment you must log in.
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

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
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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
4725-lG0kNMteF/XoWgcAjsKxUJFIZzUBOEsekc5a1fNWByIgtwJ2nhjck//UvV9lpOCF
4726-21/fUFffl6ZqYxHNOBF1nJkJk+cberp4CMcm4eEID9EIbStpTXB5Lvhu0yOalkiA
4727-8rTp7i5QHD8j8SzNoHUcvhXYh5Nmtfg+sIhZ2brYj05xvu15xGxvkJ6XFwsvQsW4
4728-Wf7lu0VPKtuItCRKZWxtZXIgVmVybm9vaWogPGplbG1lckB2ZXJuc3Rvay5ubD6J
4729-AjcEEwEIACEFAkpQxCQCGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQAIBv
4730-K9cppFegjBAAg/53iphQm7csWtiU9+o85PfCiPzbVFKzEml16qtFWC27PSoxIbDO
4731-27JTpBMUsAtobE7/dXKSscIxr+Km/OIGNza55Yf1cH6mR+iEt3JprsJScYhQ+DDr
4732-XgW52zlzo20sitIOB+iABb/hQ9cZBTaPKIYqs/As38lfnJ582cNpIc57u69I+8Cr
4733-sFK/aaVS6/AXW0w6PT9jcr9lo1XJsuxFltqS061rjlUmcK1iVGpd/COguh1PsouX
4734-zTvjcuEy4K6Lfpn7cG//O/llke5F70H4f/BUIQH1EMaqkNuTTvGrzUyUMyXyV+YS
4735-x737jok5eyujaaO59qygKkl1MGKSr8+UzjCo2+NmJ5uxSY7Vex+o1p/epe6ZnpZE
4736-csmiF6dGgyC8sJnIMaHAH3iPtcHfsxFcyuEnpBsf6cs29ig10id6Q4atr55RYJEo
4737-2/WVZEjlk7pHUZ3TEp6pYxX1fj8SclbAcE2CBUIQ2ZkGZcQd4DG/BEqO89Jc3frV
4738-Mr+NfdjoB7USw4T68xN2wtAQhE19BpVOPGDcSUV4v3RsXTB4hDSwIHiMNJnZam7E
4739-/cqhUB9RTnXYdUQClFrNky0aYKoTlbHsWL4mm7RLZtHBSjhGTBWkGLiz4ufVqXG5
4740-no9cDCUquvjMvfobS7psPxCN5j1gblGbQmzgIOJfq64VDSfMpcMbL6y0JUplbG1l
4741-ciBWZXJub29paiA8amVsbWVyQGplbG1lci5jby51az6JAjcEEwEKACEFAlN1UIYC
4742-GwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQAIBvK9cppFeckA//YQtulXF0
4743-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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.
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches