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