source: tailor/vcpx/bzrng.py @ 878

Revision 878, 5.6 KB checked in by Jelmer Vernooij <jelmer@…>, 8 years ago (diff)

bzrng-source-rename-fix

Line 
1# -*- mode: python; coding: utf-8 -*-
2# :Progetto: vcpx -- bazaar-ng support using the bzrlib instead of the frontend
3# :Creato:   Fri Aug 19 01:06:08 CEST 2005
4# :Autore:   Johan Rydberg <jrydberg@gnu.org>
5#            Jelmer Vernooij <jelmer@samba.org>
6# :Licenza:  GNU General Public License
7#
8
9"""
10This module implements the backends for Bazaar-NG.
11"""
12
13__docformat__ = 'reStructuredText'
14
15from source import UpdatableSourceWorkingDir
16from target import SyncronizableTargetWorkingDir, TargetInitializationFailure
17from bzrlib.branch import Branch
18from bzrlib.errors import BzrError
19from bzrlib.osutils import compact_date, rand_bytes
20from binascii import hexlify
21import os
22import os.path
23import re
24
25class BzrngWorkingDir(UpdatableSourceWorkingDir, SyncronizableTargetWorkingDir):
26    ## UpdatableSourceWorkingDir
27
28    def _changesetFromRevision(self, parent, revision):
29        """
30        Generate changeset for the given BzrNg revision
31        """
32        from changes import ChangesetEntry, Changeset
33        from datetime import datetime
34        r = parent.get_revision(revision)
35           
36        deltatree = parent.get_revision_delta(parent.revision_id_to_revno(revision))
37        entries = []
38
39        for delta in deltatree.added:
40            e = ChangesetEntry(delta[0])
41            e.action_kind = ChangesetEntry.ADDED
42            entries.append(e)
43           
44        for delta in deltatree.removed:
45            e = ChangesetEntry(delta[0])
46            e.action_kind = ChangesetEntry.DELETED
47            entries.append(e)
48           
49        for delta in deltatree.renamed:
50            e = ChangesetEntry(delta[1])
51            e.action_kind = ChangesetEntry.RENAMED
52            e.old_name = delta[0]
53            entries.append(e)
54
55        for delta in deltatree.modified:
56            e = ChangesetEntry(delta[0])
57            e.action_kind = ChangesetEntry.UPDATED
58            entries.append(e)
59
60        return Changeset(r.revision_id, 
61                              datetime.fromtimestamp(r.timestamp),
62                              r.committer, 
63                              r.message,
64                              entries)
65   
66    def _getUpstreamChangesets(self, sincerev):
67        """
68        See what other revisions exist upstream and return them
69        """
70        parent = Branch.open(self.repository.repository)
71
72        revisions = self._b.missing_revisions(parent)
73
74        changesets = [self._changesetFromRevision(parent, ri) for ri in revisions]
75       
76        return changesets
77
78    def _applyChangeset(self, changeset):
79        """
80        Apply given remote revision to workingdir
81        """
82        self._b.append_revision(changeset.revision)
83        return [] # No conflicts for now
84
85    def _checkoutUpstreamRevision(self, revision):
86        """
87        Initial checkout, equivalent of 'bzr branch -r ... '
88        """
89        from bzrlib.clone import copy_branch
90
91        parent = Branch.open(self.repository.repository)
92
93        if revision == "INITIAL":
94            self._b = copy_branch(parent, self.basedir, parent.get_rev_id(1))
95        else:
96            self._b = copy_branch(parent, self.basedir, revision)
97
98        return self._changesetFromRevision(parent, parent.last_revision())
99
100    ## SyncronizableTargetWorkingDir
101   
102    def _addPathnames(self, entries):
103        # This method may get invoked several times with the same
104        # entries; and Branch.add complains if a file is already
105        # versioned.  So go through the list and sort out entries that
106        # is already versioned, since there is no need to add them.
107        # Do not try to catch any errors from Branch.add, since the
108        # they are _real_ errors.
109        new_entries = []
110        for e in entries:
111            if not self._b.inventory.has_filename(e):
112                new_entries.extend([e])
113
114        if len(new_entries) == 0:
115            return
116        self._b.add(new_entries)
117
118    def _commit(self, date, author, patchname, changelog=None, entries=None):
119        from time import mktime
120
121        logmessage = []
122        if patchname:
123            logmessage.append(patchname)
124        if changelog:
125            logmessage.append(changelog)
126        if logmessage:
127            logmessage = '\n'.join(logmessage)
128        else:
129            logmessage = "Empty changelog"
130        timestamp = int(mktime(date.timetuple()))
131
132        # Guess sane email address
133        email = re.search("<(.*@.*)>", author)
134        if email: 
135            email = email.group(1)
136        else:
137            email = author
138
139        revision_id = "%s-%s-%s" % (email, compact_date(timestamp),
140                                    hexlify(rand_bytes(8)))
141        self._b.commit(logmessage, committer=author,
142                       specific_files=entries, rev_id=revision_id,
143                       verbose=self.repository.project.verbose,
144                       timestamp=timestamp)
145
146    def _removePathnames(self, entries):
147        """Remove a sequence of entries"""
148
149        self._b.remove(entries)
150
151    def _renamePathname(self, oldentry, newentry):
152        """Rename an entry"""
153
154        # bzr does the rename itself as well
155        os.rename(os.path.join(self.basedir, newentry), os.path.join(self.basedir, oldentry))
156
157        self._b.rename_one(oldentry, newentry)
158
159    def _prepareTargetRepository(self):
160        """
161        Create the base directory if it doesn't exist, and the
162        repository as well in the new working directory.
163        """
164
165        from os.path import join, exists
166
167        if not exists(join(self.basedir, self.repository.METADIR)):
168            self._b = Branch.initialize(self.basedir)
169        else:
170            self._b = Branch.open(self.basedir)
Note: See TracBrowser for help on using the repository browser.