~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/changeset.py

[merge] robertc's integration, updated tests to check for retcode=3

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
#    You should have received a copy of the GNU General Public License
14
14
#    along with this program; if not, write to the Free Software
15
15
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
 
 
17
"""Represent and apply a changeset.
 
18
 
 
19
Conflicts in applying a changeset are represented as exceptions.
 
20
 
 
21
This only handles the in-memory objects representing changesets, which are
 
22
primarily used by the merge code. 
 
23
"""
 
24
 
16
25
import os.path
17
26
import errno
18
 
import patch
19
27
import stat
20
28
from tempfile import mkdtemp
21
29
from shutil import rmtree
22
 
from bzrlib.trace import mutter
 
30
from itertools import izip
 
31
 
 
32
from bzrlib.trace import mutter, warning
23
33
from bzrlib.osutils import rename, sha_file
24
34
import bzrlib
25
 
from itertools import izip
26
 
 
27
 
# XXX: mbp: I'm not totally convinced that we should handle conflicts
28
 
# as part of changeset application, rather than only in the merge
29
 
# operation.
30
 
 
31
 
"""Represent and apply a changeset
32
 
 
33
 
Conflicts in applying a changeset are represented as exceptions.
34
 
"""
35
35
 
36
36
__docformat__ = "restructuredtext"
37
37
 
441
441
        return out_path
442
442
 
443
443
    def apply(self, filename, conflict_handler, reverse=False):
 
444
        import bzrlib.patch
444
445
        temp_dir = mkdtemp(prefix="bzr-")
445
446
        try:
446
447
            new_file = filename+".new"
452
453
            else:
453
454
                base = other_file
454
455
                other = base_file
455
 
            status = patch.diff3(new_file, filename, base, other)
 
456
            status = bzrlib.patch.diff3(new_file, filename, base, other)
456
457
            if status == 0:
457
458
                os.chmod(new_file, os.stat(filename).st_mode)
458
459
                rename(new_file, filename)
772
773
        :type reverse: bool
773
774
        :rtype: str
774
775
        """
775
 
        mutter("Finding new path for %s" % self.summarize_name())
 
776
        mutter("Finding new path for %s", self.summarize_name())
776
777
        if reverse:
777
778
            parent = self.parent
778
779
            to_dir = self.dir
797
798
        if from_dir == to_dir:
798
799
            dir = os.path.dirname(id_map[self.id])
799
800
        else:
800
 
            mutter("path, new_path: %r %r" % (self.path, self.new_path))
 
801
            mutter("path, new_path: %r %r", self.path, self.new_path)
801
802
            parent_entry = changeset.entries[parent]
802
803
            dir = parent_entry.get_new_path(id_map, changeset, reverse)
803
804
        if from_name == to_name:
1208
1209
    #apply changes that don't affect filenames
1209
1210
    for entry in changeset.entries.itervalues():
1210
1211
        if not entry.is_creation_or_deletion() and not entry.is_boring():
 
1212
            if entry.id not in inventory:
 
1213
                warning("entry {%s} no longer present, can't be updated",
 
1214
                        entry.id)
 
1215
                continue
1211
1216
            path = os.path.join(dir, inventory[entry.id])
1212
1217
            entry.apply(path, conflict_handler, reverse)
1213
1218