#! /usr/bin/env python import bzrlib.branch # TODO: When I changed these tests to import bzr2p4 rather than forking, I # started getting errors about permission problems removing test directories. # I suspect that bzr2p4 is leaking file handles and that they were formerly # cleaned up with the forked process exited. from bzrlib.plugins.bzrp4 import bzr2p4 from bzrlib.plugins.bzrp4.tests import TestCaseForTwoVcs from bzrlib.plugins.bzrp4.tests.p4_for_test import P4ForTest import os import os.path from P4 import P4, P4Exception import re import shutil import stat import unittest class TestBzr2P4Blackbox(TestCaseForTwoVcs): def __init__(self, method_name): TestCaseForTwoVcs.__init__(self, method_name) self.p4client_name = 'TestBzr2P4Blackbox' self.bzr_branch_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), '..') def setUp(self): TestCaseForTwoVcs.setUp(self) self.p4fortest = P4ForTest() self.p4_compatible_cwd = os.getcwd() self.p4d_workdir = os.path.join(self.p4_compatible_cwd, 'p4d') os.mkdir(self.p4d_workdir) self.p4_client_workdir = os.path.join(self.p4_compatible_cwd, 'p4') os.mkdir(self.p4_client_workdir) self.bzr_client_workdir = os.path.join(self.p4_compatible_cwd, 'bzr') # bzr branch will create bzr_client_workdir self.p4fortest.p4.port = 'rsh:%s -r %s -L log -vserver=3 -i' % ('p4d', self.p4d_workdir) self.p4fortest.create_client( self.p4client_name, self.p4_client_workdir) self.p4fortest.p4.cwd = self.p4_client_workdir def tearDown(self): self.p4fortest.destroy_client() TestCaseForTwoVcs.tearDown(self) def test_fixture__client_exists(self): self.p4fortest.p4.connect() self.assertEquals( self.p4client_name, self.p4fortest.p4.run_clients()[0]['client']) self.p4fortest.p4.disconnect() def test_bzr2p4__syncs_self_to_p4(self): os.environ['P4CLIENT'] = self.p4client_name self.p4fortest.p4.client = self.p4client_name self.p4fortest.p4.connect() try: os.environ['P4PORT'] = self.p4fortest.p4.port bzr2p4.main(['-q', self.bzr_branch_path, self.p4_client_workdir]) self.run_bzr( ['branch', self.bzr_branch_path, self.bzr_client_workdir]) self.assertBzrBranchAndP4DepotEqual() finally: self.p4fortest.p4.disconnect() def test_bzr2p4__rename_a_to_b_and_add_new_a(self): relative_path = os.path.basename(self.bzr_client_workdir) tree = self.make_branch_and_tree(relative_path) files = self.build_tree([relative_path + '/a']) tree.add(['a']) tree.commit('message') tree.rename_one('a', 'b') files2 = self.build_tree([relative_path + '/a']) tree.add(['a']) tree.commit('message') # Exercise bzr2p4. os.environ['P4CLIENT'] = self.p4client_name self.p4fortest.p4.client = self.p4client_name os.environ['P4PORT'] = self.p4fortest.p4.port bzr2p4.main(['-q', self.bzr_client_workdir, self.p4_client_workdir]) # Verify it works. self.p4fortest.p4.connect() try: self.assertBzrBranchAndP4DepotEqual() finally: self.p4fortest.p4.disconnect() def test_bzr2p4__delete_a_and_rename_b_to_a(self): relative_path = os.path.basename(self.bzr_client_workdir) tree = self.make_branch_and_tree(relative_path) files = self.build_tree([relative_path + '/a', relative_path + '/b']) tree.add(['a', 'b']) tree.commit('message') tree.remove(['a'], keep_files=False) tree.rename_one('b', 'a') tree.commit('message') # Exercise bzr2p4. os.environ['P4CLIENT'] = self.p4client_name self.p4fortest.p4.client = self.p4client_name os.environ['P4PORT'] = self.p4fortest.p4.port bzr2p4.main(['-q', self.bzr_client_workdir, self.p4_client_workdir]) # Verify it works. self.p4fortest.p4.connect() try: self.assertBzrBranchAndP4DepotEqual() finally: self.p4fortest.p4.disconnect() def test_bzr2p4__migrate__leading(self): relative_path = os.path.basename(self.bzr_client_workdir) tree = self.make_branch_and_tree(relative_path) rev_1_files = self.build_tree([relative_path + '/a']) tree.add(['a']) tree.commit('rev 1') rev_2_files = self.build_tree([relative_path + '/b']) tree.add(['b']) tree.commit('rev 2') # Exercise bzr2p4. os.environ['P4CLIENT'] = self.p4client_name self.p4fortest.p4.client = self.p4client_name os.environ['P4PORT'] = self.p4fortest.p4.port bzr2p4.main(['-r', '1..1', '-q', self.bzr_client_workdir, self.p4_client_workdir]) # Verify it works. self.p4fortest.p4.connect() try: self.assertBzrBranchAndP4DepotRangeEqual(1, 1) self.assertEquals( '1', self.p4fortest.p4.run_changes('-m', '1')[0]['change']) finally: self.p4fortest.p4.disconnect() def test_bzr2p4__migrate__trailing(self): relative_path = os.path.basename(self.bzr_client_workdir) tree = self.make_branch_and_tree(relative_path) rev_1_files = self.build_tree([relative_path + '/a']) tree.add(['a']) tree.commit('rev 1') rev_2_files = self.build_tree([relative_path + '/b']) tree.add(['b']) tree.commit('rev 2') # Exercise bzr2p4. os.environ['P4CLIENT'] = self.p4client_name self.p4fortest.p4.client = self.p4client_name os.environ['P4PORT'] = self.p4fortest.p4.port bzr2p4.main(['-r', '1..1', '-q', self.bzr_client_workdir, self.p4_client_workdir]) # Make it look like the next migration is the first to this client # workspace. os.remove(self.p4_client_workdir + '/.bzr2p4.revdb') bzr2p4.main(['-r', '2..2', '-q', self.bzr_client_workdir, self.p4_client_workdir]) # Verify it works. self.p4fortest.p4.connect() try: self.assertBzrBranchAndP4DepotRangeEqual(2, 2) self.assertEquals( '2', self.p4fortest.p4.run_changes('-m', '1')[0]['change']) finally: self.p4fortest.p4.disconnect() def test_bzr2p4__migrate__depot_newer_than_parent_of_start(self): relative_path = os.path.basename(self.bzr_client_workdir) tree = self.make_branch_and_tree(relative_path) rev_1_files = self.build_tree([relative_path + '/a']) tree.add(['a']) tree.commit('rev 1') rev_2_files = self.build_tree([relative_path + '/b']) tree.add(['b']) tree.commit('rev 2') # Exercise bzr2p4. os.environ['P4CLIENT'] = self.p4client_name self.p4fortest.p4.client = self.p4client_name os.environ['P4PORT'] = self.p4fortest.p4.port bzr2p4.main(['-r', '1..1', '-q', self.bzr_client_workdir, self.p4_client_workdir]) # Make it look like the next migration is the first to this client # workspace. os.remove(self.p4_client_workdir + '/.bzr2p4.revdb') self.p4fortest.p4.connect() try: self.p4fortest.add_file('c', 'c contents') self.p4fortest.submit('Perforce change 2') # Watch out! bzr2p4 doesn't protect you from submitting # revisions when there are newer revisions in the depot. # self.assertRaises( # Exception, # bzr2p4.main, # ['-r', '2..2', # '-q', # self.bzr_client_workdir, self.p4_client_workdir]) bzr2p4.main( ['-r', '2..2', '-q', self.bzr_client_workdir, self.p4_client_workdir]) finally: self.p4fortest.p4.disconnect() def test_bzr2p4__migrate__parent_of_start_not_in_depot(self): relative_path = os.path.basename(self.bzr_client_workdir) tree = self.make_branch_and_tree(relative_path) rev_1_files = self.build_tree([relative_path + '/a']) tree.add(['a']) tree.commit('rev 1') rev_2_files = self.build_tree([relative_path + '/b']) tree.add(['b']) tree.commit('rev 2') rev_3_files = self.build_tree([relative_path + '/c']) tree.add(['c']) tree.commit('rev 3') # Exercise bzr2p4. os.environ['P4CLIENT'] = self.p4client_name self.p4fortest.p4.client = self.p4client_name os.environ['P4PORT'] = self.p4fortest.p4.port bzr2p4.main(['-r', '1..1', '-q', self.bzr_client_workdir, self.p4_client_workdir]) # Make it look like the next migration is the first to this client # workspace. os.remove(self.p4_client_workdir + '/.bzr2p4.revdb') # Watch out! bzr2p4 doesn't protect you from submitting a revision # whose parent isn't in the depot. # self.assertRaises( # Exception, # bzr2p4.main, # ['-r', '3..3', # '-q', # self.bzr_client_workdir, self.p4_client_workdir]) bzr2p4.main( ['-r', '3..3', '-q', self.bzr_client_workdir, self.p4_client_workdir]) def assertBzrBranchAndP4DepotEqual(self): self.assertBzrBranchAndP4DepotRangeEqual(None, None) def assertBzrBranchAndP4DepotRangeEqual(self, start_revision, end_revision): bzr_revision_iter = self._bzr_iter_revisions_range( start_revision, end_revision) p4_change_iter = reversed(self.p4fortest.p4.run_changes( *self._p4_changes_args(start_revision, end_revision))) # avoid warnings about files already up to date self.p4fortest.p4.run_sync('...@0') try: while True: bzr_revision = bzr_revision_iter.next() try: p4_change = p4_change_iter.next() while (_is_incomplete_change(p4_change['desc'])): p4_change = p4_change_iter.next() except Exception, e: raise e self.assertBzrAndP4RevisionEqual( bzr_revision, p4_change['change']) except StopIteration, e: self.assertRaises(StopIteration, p4_change_iter.next) def _p4_changes_args(self, start_revision, end_revision): args = ['-l'] if (None != start_revision and None != end_revision): args.append('@%d,%d' % (start_revision, end_revision)) return args def _bzr_iter_revisions(self): self._bzr_iter_revisions_range(None, None) def _bzr_iter_revisions_range(self, start_revision, end_revision): branch = bzrlib.branch.Branch.open(self.bzr_client_workdir) branch.lock_read() revisions = [tuple[0] for tuple in bzrlib.log.calculate_view_revisions( branch, start_revision, end_revision, 'reverse', None, True)] revisions.reverse() branch.unlock() return iter(revisions) def assertBzrAndP4RevisionEqual(self, bzr_revision_id, p4_change): self.p4fortest.p4.run_sync('...@' + p4_change) self.run_bzr( ['revert', '-r', 'revid:%s' % bzr_revision_id, self.bzr_client_workdir]) self.assertDirectoriesEqualModIgnored( self.bzr_client_workdir, self.p4_client_workdir, ['.bzr'], ['.bzr2p4', '.bzr2p4.log', '.bzr2p4.revdb']) # TODO: Verify that change descriptions are the same in # Perforce and Bazaar. def _is_incomplete_change(description): matches = re.finditer('bzr: .+, part (?P<part>\d+) of (?P<whole>\d+)', description) match = None # Examine the last match. for match in matches: pass if None == match: return False return int(match.group('part')) < int(match.group('whole')) if __name__ == '__main__': unittest.main()
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#8 | 7420 | Matt McClure |
Adds two tests that document missing error checking that makes bzr2p4 a bit dangerous for a user who isn't careful. bzr: revno 238, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Fri 2009-09-25 09:25:06 -0400 |
||
#7 | 7418 | Matt McClure |
Removes empty TODO test cases. bzr: revno 236, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Fri 2009-09-25 07:52:52 -0400 |
||
#6 | 7410 | Matt McClure |
Migrates trailing revision ranges from Bazaar to Perforce. bzr: revno 231, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Thu 2009-09-24 17:27:33 -0400 |
||
#5 | 7409 | Matt McClure |
Start of a scratch fix for migrating a revision range that is not the beginning of a branch. I observed that it doesn't work in trying to use bzr2p4 to migrate a range from this branch to Perforce. bzr: revno 230, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Thu 2009-09-24 13:28:38 -0400 |
||
#4 | 7407 | Matt McClure |
Parameterizes bzr2p4 by a revision range. bzr: revno 228, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Thu 2009-09-24 12:15:49 -0400 |
||
#3 | 7356 | Matt McClure | Uses rsh P4PORT so that there's no need to explicitly start and stop a p4d server for the tests. | ||
#2 | 7351 | Matt McClure | Updates bzrp4 to pass tests with Bazaar revno 4615. | ||
#1 | 7119 | Matt McClure | Improves the test coverage reporting by importing python modules rather than forking processes. | ||
//guest/matt_mcclure/bzrp4/trunk/tests/test_dogfood.py | |||||
#41 | 7100 | Matt McClure |
Fixes a bug. The recognition of partial Bazaar revisions in Perforce relied on the false assumption that there would be only one comment line that matched the partial revision pattern. The new code looks for the last match. |
||
#40 | 7095 | Matt McClure |
Tests that bzr2p4 plays revisions into Perforce in the order that 'bzr log' displays them. bzr: revno 94.1.2, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Mon 2008-12-29 20:44:06 -0500 |
||
#39 | 7092 | Matt McClure |
Converts all source files to UNIX line endings. bzr: revno 88.2.25, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-12-27 14:36:39 -0500 |
||
#38 | 7084 | Matt McClure |
Changes the Bazaar comment addendums to prefix all lines with 'bzr: '. bzr: revno 88.2.17, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Fri 2008-12-19 13:34:21 -0500 |
||
#37 | 7081 | Matt McClure |
Appends Bazaar author, date, and revision number to the Perforce changelist. bzr: revno 88.2.14, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Mon 2008-12-15 21:33:24 -0500 |
||
#36 | 7078 | Matt McClure |
Adds a 'bzr' note to each change description. bzr: revno 88.2.11, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sun 2008-12-14 15:25:54 -0500 |
||
#35 | 7073 | Matt McClure |
Removes three print/debug statements. bzr: revno 88.2.6, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Mon 2008-12-01 21:32:14 -0500 |
||
#34 | 7071 | Matt McClure |
Quiets bzr2p4 in tests. bzr: revno 88.2.4, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Mon 2008-12-01 21:21:53 -0500 |
||
#33 | 7006 | Matt McClure |
Merges mainline changes into feature branch. bzr: revno 69.2.3, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-08-23 13:40:15 -0400 |
||
#32 | 7003 | Matt McClure |
Snapshot. bzr: revno 69.2.1, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sun 2008-08-10 10:47:26 -0400 |
||
#31 | 6979 | Matt McClure |
Cleans up and refactors a bit. bzr: revno 71.1.6, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sun 2008-08-17 00:28:26 -0400 |
||
#30 | 6978 | Matt McClure |
Handles verification of split Bazaar revisions better. bzr: revno 71.1.5, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-08-16 23:40:38 -0400 |
||
#29 | 6974 | Matt McClure |
Adds a failing test that isolates a problem I first observed in the bzr2p4 dogfood test. bzr: revno 71.1.1, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Tue 2008-08-12 21:24:33 -0400 |
||
#28 | 6972 | Matt McClure |
Uses two-phase migration from Bazaar to Perforce when a Bazaar revision contains a rename and an add of the renamed file. bzr: revno 69.1.2, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sun 2008-08-10 21:51:14 -0400 |
||
#27 | 6971 | Matt McClure |
Begins to add a test that renames a to b and adds a new b in a single commit. The bzr2p4.py tool currently fails on such a case. bzr: revno 69.1.1, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sun 2008-08-10 12:17:37 -0400 |
||
#26 | 6968 | Matt McClure |
This change is very much a work in progress. See the diff to remember what I was doing. bzr: revno 68, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-08-09 11:59:00 -0400 |
||
#25 | 6964 | Matt McClure |
I can run the tests from any working directory now. bzr: revno 64, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-08-09 08:59:35 -0400 |
||
#24 | 6960 | Matt McClure |
Migrates branches with merge revisions, so that test_dogfood passes. bzr: revno 60, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sun 2008-08-03 14:46:27 -0400 |
||
#23 | 6954 | Matt McClure |
Cleans up. bzr: revno 55, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-08-02 11:37:57 -0400 |
||
#22 | 6953 | Matt McClure |
TestDogFood works from a Cygwin shell, assuming you're using Cygwin p4. bzr: revno 54, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-08-02 11:24:59 -0400 |
||
#21 | 6951 | Matt McClure |
Extracts a method to verify Bazaar branch and Perforce depot are equal. bzr: revno 52, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-08-02 09:37:34 -0400 |
||
#20 | 6950 | Matt McClure |
Removes parameters. Bazaar work happens in bzr_client_workdir instead of a subdirectory. bzr: revno 51, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-08-02 09:01:31 -0400 |
||
#19 | 6949 | Matt McClure |
Extracts a method and moves variable initializations closer to their first use. bzr: revno 50, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-08-02 08:45:23 -0400 |
||
#18 | 6948 | Matt McClure |
Does Perforce work in the root of the client workspace/depot instead of a subdirectory. bzr: revno 49, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-08-02 08:19:19 -0400 |
||
#17 | 6947 | Matt McClure |
Continues to simplify test_dogfood.py by taking more advantage of encapsulated functionality in p4_for_test.py. bzr: revno 48, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Tue 2008-07-22 19:50:09 -0400 |
||
#16 | 6946 | Matt McClure |
Reuses some code from P4ForTest. bzr: revno 47, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Mon 2008-07-21 18:26:02 -0400 |
||
#15 | 6941 | Matt McClure |
Copies a few changes for the better from test_git_p4.py. bzr: revno 42, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sun 2008-07-20 08:49:41 -0400 |
||
#14 | 6940 | Matt McClure |
Refactors: adds a parameters and renames assertDirectoriesEqualModIgnored(). The test_git_p4.py tests pass on Windows and Cygwin. The test_dogfood.py tests pass on Windows, but not on Cygwin yet. bzr: revno 41, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-07-19 07:55:59 -0400 |
||
#13 | 6936 | Matt McClure |
Extracts a base class from some of the copied common code in test_dogfood.py and test_git_p4.py. bzr: revno 37, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sun 2008-07-13 14:33:20 -0400 |
||
#12 | 6932 | Matt McClure |
Uses TestCaseInTempDir's temporary directory more. Creates subdirectories of the temp directory instead of creating new temporary directories. Invokes the base class's tearDown(). bzr: revno 33, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-07-12 15:12:31 -0400 |
||
#11 | 6929 | Matt McClure |
Takes some advantage of TestCaseInTempDir's creation of a temp directory. bzr: revno 30, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sun 2008-07-06 08:43:22 -0400 |
||
#10 | 6928 | Matt McClure |
Removed unnecessary parameter. bzr: revno 29, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-07-05 09:11:10 -0400 |
||
#9 | 6927 | Matt McClure |
Refactored. Extracted a method that compares files. bzr: revno 28, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-07-05 09:00:14 -0400 |
||
#8 | 6926 | Matt McClure |
Verifies that files are equal. bzr: revno 27, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sat 2008-07-05 08:41:34 -0400 |
||
#7 | 6925 | Matt McClure |
Verifies that directory entries match for each corresponding revision in Perforce and Bazaar. bzr: revno 26, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Fri 2008-07-04 17:14:30 -0400 |
||
#6 | 6924 | Matt McClure |
Syncs to each Bazaar revision. bzr: revno 25, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Fri 2008-07-04 10:42:29 -0400 |
||
#5 | 6923 | Matt McClure |
Syncs to each Perforce revision: a start toward verification of each revision in Perforce against its Bazaar counterpart. bzr: revno 24, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Fri 2008-07-04 07:33:10 -0400 |
||
#4 | 6922 | Matt McClure |
Doesn't require P4CLIENT in the environment anymore. bzr: revno 23, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Thu 2008-07-03 17:14:10 -0400 |
||
#3 | 6921 | Matt McClure |
Passes dog food test by making client working directory deletable during teardown. bzr: revno 22, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Thu 2008-07-03 16:57:40 -0400 |
||
#2 | 6920 | Matt McClure |
Writes the entire revision contents instead of using patch. The dog food test almost passes now. It fails because Perforce has made all files read-only in the client directory before the test tear down attempts to remove the directory tree. bzr: revno 21, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sun 2008-06-29 21:05:41 -0400 |
||
#1 | 6919 | Matt McClure |
I'm in the middle of implementing a "dog food" test that syncs bzr2p4 to Perforce. It doesn't work yet. Patch fails to apply some hunks. I think the trouble is CRLF line endings. I tried giving the --binary option to patch, and that made it fail on an earlier revision containing a Perforce keyword expansion. I'm considering abandoning the use of patch even before getting the dog food test to pass. I could bzr checkout or bzr cat to the staging directory instead of relying on patch to apply the diff. bzr: revno 20, part 1 of 1 bzr: author Matt McClure <mlm@aya.yale.edu> bzr: committed Sun 2008-06-29 19:57:41 -0400 |