# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kfogel@red-bean.com-20090115201644-f1p6k3kmwltyoex8 # target_branch: http://bazaar-vcs.org/bzr/bzr.dev # testament_sha1: 90321e857058f498f04c4f22741e266ed8757242 # timestamp: 2009-01-15 15:21:15 -0500 # base_revision_id: pqm@pqm.ubuntu.com-20090115163104-30i51kcr1zepm2f7 # # Begin patch === modified file 'bzrlib/status.py' --- bzrlib/status.py 2009-01-14 03:57:48 +0000 +++ bzrlib/status.py 2009-01-15 19:09:24 +0000 @@ -103,7 +103,8 @@ old.lock_read() new.lock_read() try: - _raise_if_nonexistent(specific_files, old, new) + specific_files, nonexistents \ + = _filter_nonexistent(specific_files, old, new) want_unversioned = not versioned if short: changes = new.iter_changes(old, show_unchanged, specific_files, @@ -137,6 +138,19 @@ else: prefix = ' ' to_file.write("%s %s\n" % (prefix, conflict)) + # Show files that were requested but don't exist (and are + # not versioned). We don't involve delta in this; these + # paths are really the province of just the status + # command, since they have more to do with how it was + # invoked than with the tree it's operating on. + if nonexistents and not short: + to_file.write("nonexistent:\n") + for nonexistent in nonexistents: + if short: + prefix = 'X ' + else: + prefix = ' ' + to_file.write("%s %s\n" % (prefix, nonexistent)) if (new_is_working_tree and show_pending): show_pending_merges(new, to_file, short, verbose=verbose) finally: @@ -254,22 +268,24 @@ to_file.write(sub_prefix + log_message + '\n') -def _raise_if_nonexistent(paths, old_tree, new_tree): - """Complain if paths are not in either inventory or tree. - - It's OK with the files exist in either tree's inventory, or - if they exist in the tree but are not versioned. - +def _filter_nonexistent(orig_paths, old_tree, new_tree): + """Convert orig_paths to two lists and return them. + + The first is orig_paths paths minus the items in the second list, + and the second list is paths that are not in either inventory or + tree (they don't qualify if they exist in the tree's inventory, or + if they exist in the tree but are not versioned.) + + If either of the two lists is empty, return it as an empty list. + This can be used by operations such as bzr status that can accept unknown or ignored files. """ - mutter("check paths: %r", paths) - if not paths: - return - s = old_tree.filter_unversioned_files(paths) + mutter("check paths: %r", orig_paths) + if not orig_paths: + return orig_paths, [] + s = old_tree.filter_unversioned_files(orig_paths) s = new_tree.filter_unversioned_files(s) - s = [path for path in s if not new_tree.has_filename(path)] - if s: - raise errors.PathsDoNotExist(sorted(s)) - - + nonexistent = [path for path in s if not new_tree.has_filename(path)] + remaining = [path for path in orig_paths if not path in nonexistent] + return remaining, nonexistent === modified file 'bzrlib/tests/blackbox/test_status.py' --- bzrlib/tests/blackbox/test_status.py 2009-01-14 03:57:48 +0000 +++ bzrlib/tests/blackbox/test_status.py 2009-01-15 20:16:44 +0000 @@ -223,12 +223,6 @@ wt, short=True) tof = StringIO() - self.assertRaises(errors.PathsDoNotExist, - show_tree_status, - wt, specific_files=['bye.c','test.c','absent.c'], - to_file=tof) - - tof = StringIO() show_tree_status(wt, specific_files=['directory'], to_file=tof) tof.seek(0) self.assertEquals(tof.readlines(), @@ -286,10 +280,10 @@ def test_status_nonexistent_file(self): # files that don't exist in either the basis tree or working tree - # should give an error + # should say so wt = self.make_branch_and_tree('.') - out, err = self.run_bzr('status does-not-exist', retcode=3) - self.assertContainsRe(err, r'do not exist.*does-not-exist') + out, err = self.run_bzr('status does-not-exist') + self.assertContainsRe(out, r'nonexistent.*\n.*does-not-exist') def test_status_out_of_date(self): """Simulate status of out-of-date tree after remote push""" # Begin bundle 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 KcKEgni524A=