/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 bzrlib/patch.py

  • Committer: Martin Pool
  • Date: 2005-09-06 02:26:28 UTC
  • Revision ID: mbp@sourcefrog.net-20050906022628-66d65f0feb4a9e80
- implement version 5 xml storage, and tests

  This stores files identified by the version that introduced the 
  text, and the version that introduced the name.  Entry kinds are
  given by the xml tag not an explicit kind field.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import os
 
2
from subprocess import Popen, PIPE
 
3
"""
 
4
Diff and patch functionality
 
5
"""
 
6
__docformat__ = "restructuredtext"
 
7
 
 
8
def write_to_cmd(args, input=""):
 
9
    process = Popen(args, bufsize=len(input), stdin=PIPE, stdout=PIPE,
 
10
                    stderr=PIPE, close_fds=True)
 
11
    stdout, stderr = process.communicate(input)
 
12
    status = process.wait()
 
13
    if status < 0:
 
14
        raise Exception("%s killed by signal %i" (args[0], -status))
 
15
    return stdout, stderr, status
 
16
    
 
17
 
 
18
def patch(patch_contents, filename, output_filename=None, reverse=False):
 
19
    """Apply a patch to a file, to produce another output file.  This is should
 
20
    be suitable for our limited purposes.
 
21
 
 
22
    :param patch_contents: The contents of the patch to apply
 
23
    :type patch_contents: str
 
24
    :param filename: the name of the file to apply the patch to
 
25
    :type filename: str
 
26
    :param output_filename: The filename to produce.  If None, file is \
 
27
    modified in-place
 
28
    :type output_filename: str or NoneType
 
29
    :param reverse: If true, apply the patch in reverse
 
30
    :type reverse: bool
 
31
    :return: 0 on success, 1 if some hunks failed
 
32
    """
 
33
    args = ["patch", "-f", "-s", "--posix", "--binary"]
 
34
    if reverse:
 
35
        args.append("--reverse")
 
36
    if output_filename is not None:
 
37
        args.extend(("-o", output_filename))
 
38
    args.append(filename)
 
39
    stdout, stderr, status = write_to_cmd(args, patch_contents)
 
40
    return status 
 
41
 
 
42
 
 
43
def diff3(out_file, mine_path, older_path, yours_path):
 
44
    def add_label(args, label):
 
45
        args.extend(("-L", label))
 
46
    args = ['diff3', "-E", "--merge"]
 
47
    add_label(args, "TREE")
 
48
    add_label(args, "ANCESTOR")
 
49
    add_label(args, "MERGE-SOURCE")
 
50
    args.extend((mine_path, older_path, yours_path))
 
51
    output, stderr, status = write_to_cmd(args)
 
52
    if status not in (0, 1):
 
53
        raise Exception(stderr)
 
54
    file(out_file, "wb").write(output)
 
55
    return status