/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to branch.py

  • Committer: James Westby
  • Date: 2007-03-25 11:45:49 UTC
  • mto: (0.215.1 trunk)
  • mto: This revision was merged to the branch mainline in revision 6960.
  • Revision ID: jw+debian@jameswestby.net-20070325114549-jl2t51a668wssrhb
Start the python-git project.

Aims to give an interface to git repos that doesn't call out to git directly.
Probably going to be pure python.

Currently can read blobs, trees and commits from the files. It reads both
legacy and new headers. However it is untested for anything but the simple
case.

Can also understand a little about the repository format.

The testsuite uses the nosetests program from Turbogears, as I got annoyed
trying to set up unittest.

Open up a repo by passing it the path to the .git dir. You can then ask for
HEAD with repo.head() or a ref with repo.ref(name). Both return the SHA id
they currently point to. You can then grab this object with
repo.get_object(sha).

For the actual objects the ShaFile.from_file(filename) will return the object
stored in the file whatever it is. To ensure you get the correct type then
call {Blob,Tree,Commit}.from_file(filename). I will add repo methods to do
this for you with file lookup soon.

There is also support for creating blobs. Blob.from_string(string) will create
a blob object from the string. You can then call blob.sha() to get the sha
object for this blob, and hexdigest() on that will get its ID. There is
currently no method that allows you to write it out though.

Everything is currently done with assertions, where much of it should probably
be exceptions. This was merely done for expediency. If you hit an assertion,
it either means you have done something wrong, there is corruption, or
you are trying an unsupported operation.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007 Canonical Ltd
2
 
#
3
 
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License as published by
5
 
# the Free Software Foundation; either version 2 of the License, or
6
 
# (at your option) any later version.
7
 
#
8
 
# This program is distributed in the hope that it will be useful,
9
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 
# GNU General Public License for more details.
12
 
#
13
 
# You should have received a copy of the GNU General Public License
14
 
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
 
 
17
 
"""An adapter between a Git Branch and a Bazaar Branch"""
18
 
 
19
 
from bzrlib import (
20
 
    branch,
21
 
    config,
22
 
    revision,
23
 
    tag,
24
 
    )
25
 
from bzrlib.decorators import needs_read_lock
26
 
 
27
 
from bzrlib.plugins.git.foreign import ForeignBranch
28
 
from bzrlib.plugins.git.mapping import default_mapping
29
 
 
30
 
class GitTagDict(tag.BasicTags):
31
 
 
32
 
    def __init__(self, branch):
33
 
        self.branch = branch
34
 
        self.repository = branch.repository
35
 
 
36
 
    def get_tag_dict(self):
37
 
        ret = {}
38
 
        for tag in self.repository._git.tags:
39
 
            ret[tag.name] = self.branch.mapping.revision_id_foreign_to_bzr(tag.ref)
40
 
        return ret
41
 
 
42
 
    def set_tag(self, name, revid):
43
 
        raise NotImplementedError(self.set_tag)
44
 
 
45
 
 
46
 
class GitBranchConfig(config.BranchConfig):
47
 
    """BranchConfig that uses locations.conf in place of branch.conf"""
48
 
 
49
 
    def __init__(self, branch):
50
 
        config.BranchConfig.__init__(self, branch)
51
 
        # do not provide a BranchDataConfig
52
 
        self.option_sources = self.option_sources[0], self.option_sources[2]
53
 
 
54
 
    def set_user_option(self, name, value, local=False):
55
 
        """Force local to True"""
56
 
        config.BranchConfig.set_user_option(self, name, value, local=True)
57
 
 
58
 
 
59
 
class GitBranchFormat(branch.BranchFormat):
60
 
 
61
 
    def get_format_description(self):
62
 
        return 'Git Branch'
63
 
 
64
 
    def supports_tags(self):
65
 
        return True
66
 
 
67
 
 
68
 
class GitBranch(ForeignBranch):
69
 
    """An adapter to git repositories for bzr Branch objects."""
70
 
 
71
 
    def __init__(self, bzrdir, repository, name, head, lockfiles):
72
 
        self.repository = repository
73
 
        super(GitBranch, self).__init__(default_mapping)
74
 
        self.control_files = lockfiles
75
 
        self.bzrdir = bzrdir
76
 
        self.name = name
77
 
        self.head = head
78
 
        self.base = bzrdir.transport.base
79
 
        self._format = GitBranchFormat()
80
 
 
81
 
    def lock_write(self):
82
 
        self.control_files.lock_write()
83
 
 
84
 
    def get_stacked_on_url(self):
85
 
        # Git doesn't do stacking (yet...)
86
 
        return None
87
 
 
88
 
    def get_parent(self):
89
 
        """See Branch.get_parent()."""
90
 
        return None
91
 
 
92
 
    def lock_read(self):
93
 
        self.control_files.lock_read()
94
 
 
95
 
    def unlock(self):
96
 
        self.control_files.unlock()
97
 
 
98
 
    def get_physical_lock_status(self):
99
 
        return False
100
 
 
101
 
 
102
 
class LocalGitBranch(GitBranch):
103
 
 
104
 
    @needs_read_lock
105
 
    def last_revision(self):
106
 
        # perhaps should escape this ?
107
 
        if self.head is None:
108
 
            return revision.NULL_REVISION
109
 
        return self.mapping.revision_id_foreign_to_bzr(self.head)
110
 
 
111
 
    def _make_tags(self):
112
 
        return GitTagDict(self)
113
 
 
114
 
    def _gen_revision_history(self):
115
 
        if self.head is None:
116
 
            return []
117
 
        ret = list(self.repository.iter_reverse_revision_history(self.last_revision()))
118
 
        ret.reverse()
119
 
        return ret
120
 
 
121
 
    def get_config(self):
122
 
        return GitBranchConfig(self)
123
 
 
124
 
    def get_push_location(self):
125
 
        """See Branch.get_push_location."""
126
 
        push_loc = self.get_config().get_user_option('push_location')
127
 
        return push_loc
128
 
 
129
 
    def set_push_location(self, location):
130
 
        """See Branch.set_push_location."""
131
 
        self.get_config().set_user_option('push_location', location,
132
 
                                          local=True)
133
 
 
134
 
    def supports_tags(self):
135
 
        return True
136
 
 
137
 
    def sprout(self, to_bzrdir, revision_id=None):
138
 
        """See Branch.sprout()."""
139
 
        result = to_bzrdir.create_branch()
140
 
        self.copy_content_into(result, revision_id=revision_id)
141
 
        result.set_parent(self.bzrdir.root_transport.base)
142
 
        return result
143