/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: Michael Ellerman
  • Date: 2006-05-31 08:44:29 UTC
  • mto: (1711.2.63 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1792.
  • Revision ID: michael@ellerman.id.au-20060531084429-35e5429abda9f560
Add optional location to ancestry and fix behaviour for checkouts.

This adds an optional location parameter to the ancestry command. It also
changes the behaviour of ancestry on checkouts such that if they have
been created with a subset of the branch history, only the subset is
shown by 'bzr ancestry'. Tests for all of that as well.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
2
 
#
3
 
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License as published by
5
 
# the Free Software Foundation; either version 2 of the License, or
6
 
# (at your option) any later version.
7
 
#
8
 
# This program is distributed in the hope that it will be useful,
9
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 
# GNU General Public License for more details.
12
 
#
13
 
# You should have received a copy of the GNU General Public License
14
 
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
 
 
17
 
 
18
1
import errno
19
2
import os
20
3
from subprocess import Popen, PIPE
21
4
 
22
5
from bzrlib.errors import NoDiff3
23
6
from bzrlib.textfile import check_text_path
24
 
 
25
 
"""Diff and patch functionality"""
26
 
 
 
7
"""
 
8
Diff and patch functionality
 
9
"""
27
10
__docformat__ = "restructuredtext"
28
11
 
29
 
 
30
 
_do_close_fds = True
31
 
if os.name == 'nt':
32
 
    _do_close_fds = False
33
 
 
34
 
 
35
12
def write_to_cmd(args, input=""):
36
 
    """Spawn a process, and wait for the result
37
 
 
38
 
    If the process is killed, an exception is raised
39
 
 
40
 
    :param args: The command line, the first entry should be the program name
41
 
    :param input: [optional] The text to send the process on stdin
42
 
    :return: (stdout, stderr, status)
43
 
    """
44
 
    process = Popen(args, bufsize=len(input), stdin=PIPE, stdout=PIPE,
45
 
                    stderr=PIPE, close_fds=_do_close_fds)
 
13
    if os.name != 'nt':
 
14
        process = Popen(args, bufsize=len(input), stdin=PIPE, stdout=PIPE,
 
15
                        stderr=PIPE, close_fds=True)
 
16
    else:
 
17
        process = Popen(args, bufsize=len(input), stdin=PIPE, stdout=PIPE,
 
18
                        stderr=PIPE)
 
19
 
46
20
    stdout, stderr = process.communicate(input)
47
21
    status = process.wait()
48
22
    if status < 0:
49
23
        raise Exception("%s killed by signal %i" (args[0], -status))
50
24
    return stdout, stderr, status
51
 
 
 
25
    
52
26
 
53
27
def patch(patch_contents, filename, output_filename=None, reverse=False):
54
28
    """Apply a patch to a file, to produce another output file.  This is should
72
46
        args.extend(("-o", output_filename))
73
47
    args.append(filename)
74
48
    stdout, stderr, status = write_to_cmd(args, patch_contents)
75
 
    return status
 
49
    return status 
76
50
 
77
51
 
78
52
def diff3(out_file, mine_path, older_path, yours_path):
95
69
            raise
96
70
    if status not in (0, 1):
97
71
        raise Exception(stderr)
98
 
    f = open(out_file, 'wb')
99
 
    try:
100
 
        f.write(output)
101
 
    finally:
102
 
        f.close()
 
72
    file(out_file, "wb").write(output)
103
73
    return status