~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/changeset.py

Merge from mpool.

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)
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