/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to backend/init.py

  • Committer: Szilveszter Farkas (Phanatic)
  • Date: 2006-07-06 17:08:45 UTC
  • mto: (0.14.1 main) (93.1.1 win32.bialix)
  • mto: This revision was merged to the branch mainline in revision 83.
  • Revision ID: Szilveszter.Farkas@gmail.com-20060706170845-da015b629f5876a4
2006-07-06  Szilveszter Farkas <Szilveszter.Farkas@gmail.com>

    * I'm not dead :)
    * backend/errors.py: added some exceptions related to fileops.move()
    * backend/fileops.py: implemented move()
    * backend/info_helper.py: added diff_helper()
    * backend/info.py: implemented diff()

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic)
 
2
# Some parts of the code are:
 
3
# Copyright (C) 2005, 2006 by Canonical Ltd
 
4
 
 
5
# This program is free software; you can redistribute it and/or modify
 
6
# it under the terms of the GNU General Public License as published by
 
7
# the Free Software Foundation; either version 2 of the License, or
 
8
# (at your option) any later version.
 
9
 
 
10
# This program is distributed in the hope that it will be useful,
 
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
# GNU General Public License for more details.
 
14
 
 
15
# You should have received a copy of the GNU General Public License
 
16
# along with this program; if not, write to the Free Software
 
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
18
 
 
19
import errno
 
20
import os
 
21
 
 
22
import bzrlib
 
23
import bzrlib.bzrdir as bzrdir
 
24
import bzrlib.errors as errors
 
25
 
 
26
from bzrlib.branch import Branch
 
27
 
 
28
from errors import (AlreadyBranchError, BranchExistsWithoutWorkingTree,
 
29
                    NonExistingParent, NonExistingRevision,
 
30
                    NonExistingSource, TargetAlreadyExists)
 
31
 
 
32
def init(location):
 
33
    """ Initialize a directory.
 
34
    
 
35
    :param location: full path to the directory you want to be versioned
 
36
    """
 
37
    from bzrlib.builtins import get_format_type
 
38
 
 
39
    format = get_format_type('default')
 
40
 
 
41
    if not os.path.exists(location):
 
42
        os.mkdir(location)
 
43
 
 
44
    try:
 
45
        existing_bzrdir = bzrdir.BzrDir.open(location)
 
46
    except errors.NotBranchError:
 
47
        bzrdir.BzrDir.create_branch_convenience(location, format=format)
 
48
    else:
 
49
        if existing_bzrdir.has_branch():
 
50
            if existing_bzrdir.has_workingtree():
 
51
                raise AlreadyBranchError(location)
 
52
            else:
 
53
                raise BranchExistsWithoutWorkingTree(location)
 
54
        else:
 
55
            existing_bzrdir.create_branch()
 
56
            existing_bzrdir.create_workingtree()
 
57
 
 
58
def branch(from_location, to_location, revision=None):
 
59
    """ Create a branch from a local/remote location.
 
60
    
 
61
    :param from_location: the original location of the branch
 
62
    
 
63
    :param to_location: the directory where the branch should be created
 
64
    
 
65
    :param revision: if specified, the given revision will be branched
 
66
    
 
67
    :return: number of revisions branched
 
68
    """
 
69
    from bzrlib.transport import get_transport
 
70
 
 
71
    try:
 
72
        br_from = Branch.open(from_location)
 
73
    except OSError, e:
 
74
        if e.errno == errno.ENOENT:
 
75
            raise NonExistingSource(from_location)
 
76
        else:
 
77
            raise
 
78
 
 
79
    br_from.lock_read()
 
80
 
 
81
    try:
 
82
        basis_dir = None
 
83
        if revision is not None:
 
84
            revision_id = br_from.get_rev_id(revision)
 
85
        else:
 
86
            revision_id = None
 
87
 
 
88
        to_location = to_location + '/' + os.path.basename(from_location.rstrip("/\\"))
 
89
        name = None
 
90
        to_transport = get_transport(to_location)
 
91
 
 
92
        try:
 
93
            to_transport.mkdir('.')
 
94
        except errors.FileExists:
 
95
            raise TargetAlreadyExists(to_location)
 
96
        except errors.NoSuchFile:
 
97
            raise NonExistingParent(to_location)
 
98
 
 
99
        try:
 
100
            dir = br_from.bzrdir.sprout(to_transport.base, revision_id, basis_dir)
 
101
            branch = dir.open_branch()
 
102
        except errors.NoSuchRevision:
 
103
            to_transport.delete_tree('.')
 
104
            raise NonExistingRevision(from_location, revision[0])
 
105
 
 
106
        if name:
 
107
            branch.control_files.put_utf8('branch-name', name)
 
108
    finally:
 
109
        br_from.unlock()
 
110
        
 
111
    return branch.revno()
 
112
 
 
113
def checkout(branch_location, to_location, revision=None, lightweight=False):
 
114
    """ Create a new checkout of an existing branch.
 
115
    
 
116
    :param branch_location: the location of the branch you'd like to checkout
 
117
    
 
118
    :param to_location: the directory where the checkout should be created
 
119
    
 
120
    :param revision: the given revision will be checkout'ed (be aware!)
 
121
    
 
122
    :param lightweight: perform a lightweight checkout (be aware!)
 
123
    """
 
124
    source = Branch.open(branch_location)
 
125
    
 
126
    if revision is not None:
 
127
        revision_id = source.get_rev_id(revision)
 
128
    else:
 
129
        revision_id = None
 
130
 
 
131
    # if the source and to_location are the same, 
 
132
    # and there is no working tree,
 
133
    # then reconstitute a branch
 
134
    if (bzrlib.osutils.abspath(to_location) ==
 
135
        bzrlib.osutils.abspath(branch_location)):
 
136
        try:
 
137
            source.bzrdir.open_workingtree()
 
138
        except errors.NoWorkingTree:
 
139
            source.bzrdir.create_workingtree()
 
140
            return
 
141
 
 
142
    try:
 
143
        os.mkdir(to_location)
 
144
    except OSError, e:
 
145
        if e.errno == errno.EEXIST:
 
146
            raise TargetAlreadyExists(to_location)
 
147
        if e.errno == errno.ENOENT:
 
148
            raise NonExistingParent(to_location)
 
149
        else:
 
150
            raise
 
151
 
 
152
    old_format = bzrlib.bzrdir.BzrDirFormat.get_default_format()
 
153
    bzrlib.bzrdir.BzrDirFormat.set_default_format(bzrdir.BzrDirMetaFormat1())
 
154
 
 
155
    try:
 
156
        if lightweight:
 
157
            checkout = bzrdir.BzrDirMetaFormat1().initialize(to_location)
 
158
            bzrlib.branch.BranchReferenceFormat().initialize(checkout, source)
 
159
        else:
 
160
            checkout_branch = bzrlib.bzrdir.BzrDir.create_branch_convenience(
 
161
                to_location, force_new_tree=False)
 
162
            checkout = checkout_branch.bzrdir
 
163
            checkout_branch.bind(source)
 
164
            if revision_id is not None:
 
165
                rh = checkout_branch.revision_history()
 
166
                checkout_branch.set_revision_history(rh[:rh.index(revision_id) + 1])
 
167
 
 
168
        checkout.create_workingtree(revision_id)
 
169
    finally:
 
170
        bzrlib.bzrdir.BzrDirFormat.set_default_format(old_format)