/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-08-24 08:59:32 UTC
  • Revision ID: mbp@sourcefrog.net-20050824085932-c61f1f1f1c930e13
- Add a simple UIFactory 

  The idea of this is to let a client of bzrlib set some 
  policy about how output is displayed.

  In this revision all that's done is that progress bars
  are constructed by a policy established by the application
  rather than being randomly constructed in the library 
  or passed down the calls.  This avoids progress bars
  popping up while running the test suite and cleans up
  some code.

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