Merge lp:~jelmer/brz-git/check into lp:brz-git

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: 1930
Merge reported by: The Breezy Bot
Merged at revision: not available
Proposed branch: lp:~jelmer/brz-git/check
Merge into: lp:brz-git
Diff against target: 143 lines (+56/-18)
4 files modified
cache.py (+11/-14)
repository.py (+25/-4)
tests/test_blackbox.py (+10/-0)
workingtree.py (+10/-0)
To merge this branch: bzr merge lp:~jelmer/brz-git/check
Reviewer Review Type Date Requested Status
Jelmer Vernooij Approve
Review via email: mp+342837@code.launchpad.net

Commit message

Add really basic check implementation.

Description of the change

Add really basic check implementation.

To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) wrote :

Rubberstamp! Proposer approves of own proposal.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'cache.py'
2--- cache.py 2018-04-08 01:37:56 +0000
3+++ cache.py 2018-04-08 17:07:41 +0000
4@@ -862,12 +862,12 @@
5
6 def _add_node(self, key, value):
7 try:
8+ self._get_entry(key)
9+ except KeyError:
10 self._builder.add_node(key, value)
11- except _mod_index.BadIndexDuplicateKey:
12- # Multiple bzr objects can have the same contents
13+ return False
14+ else:
15 return True
16- else:
17- return False
18
19 def _get_entry(self, key):
20 entries = self._index.iter_entries([key])
21@@ -918,9 +918,12 @@
22 value = self._get_entry(("git", sha, "X"))
23 data = value.split(" ", 3)
24 if data[0] == "commit":
25- if data[3]:
26- verifiers = {"testament3-sha1": data[3]}
27- else:
28+ try:
29+ if data[3]:
30+ verifiers = {"testament3-sha1": data[3]}
31+ else:
32+ verifiers = {}
33+ except IndexError:
34 verifiers = {}
35 yield ("commit", (data[1], data[2], verifiers))
36 else:
37@@ -953,13 +956,7 @@
38 formats.register(IndexGitCacheFormat().get_format_string(),
39 IndexGitCacheFormat())
40 # In the future, this will become the default:
41-# formats.register('default', IndexGitCacheFormat())
42-try:
43- import tdb
44-except ImportError:
45- formats.register('default', SqliteGitCacheFormat())
46-else:
47- formats.register('default', TdbGitCacheFormat())
48+formats.register('default', IndexGitCacheFormat())
49
50
51
52
53=== modified file 'repository.py'
54--- repository.py 2018-03-30 21:45:13 +0000
55+++ repository.py 2018-04-08 17:07:41 +0000
56@@ -26,6 +26,7 @@
57 lock,
58 repository,
59 revision as _mod_revision,
60+ trace,
61 transactions,
62 ui,
63 version_info as breezy_version,
64@@ -93,17 +94,37 @@
65
66 def __init__(self, repository, check_repo=True):
67 self.repository = repository
68+ self.check_repo = check_repo
69 self.checked_rev_cnt = 0
70+ self.object_count = None
71+ self.problems = []
72
73 def check(self, callback_refs=None, check_repo=True):
74 if callback_refs is None:
75 callback_refs = {}
76- with self.repository.lock_read():
77- # TODO(jelmer): Check some things
78- pass
79+ with self.repository.lock_read(), ui.ui_factory.nested_progress_bar() as self.progress:
80+ shas = set(self.repository._git.object_store)
81+ self.object_count = len(shas)
82+ # TODO(jelmer): Check more things
83+ for i, sha in enumerate(shas):
84+ self.progress.update('checking objects', i, self.object_count)
85+ o = self.repository._git.object_store[sha]
86+ try:
87+ o.check()
88+ except Exception as e:
89+ self.problems.append((sha, e))
90+
91+ def _report_repo_results(self, verbose):
92+ trace.note('checked repository {0} format {1}'.format(
93+ self.repository.user_url,
94+ self.repository._format))
95+ trace.note('%6d objects', self.object_count)
96+ for sha, problem in self.problems:
97+ trace.note('%s: %s', sha, problem)
98
99 def report_results(self, verbose):
100- pass
101+ if self.check_repo:
102+ self._report_repo_results(verbose)
103
104
105 _optimisers_loaded = False
106
107=== modified file 'tests/test_blackbox.py'
108--- tests/test_blackbox.py 2018-03-21 03:06:49 +0000
109+++ tests/test_blackbox.py 2018-04-08 17:07:41 +0000
110@@ -287,3 +287,13 @@
111 self.build_tree_contents([("bzrb/foo", "hello from bzr")])
112 self.run_bzr(["commit", "-m", "msg", "bzrb"])
113 self.run_bzr(["dpush", "-d", "bzrb", "gitr"])
114+
115+ def test_check(self):
116+ r = GitRepo.init("gitr", mkdir=True)
117+ self.build_tree_contents([("gitr/foo", "hello from git")])
118+ r.stage("foo")
119+ r.do_commit("message", committer="Somebody <user@example.com>")
120+ out, err = self.run_bzr(["check", "gitr"])
121+ self.maxDiff = None
122+ self.assertMultiLineEqual(out, '')
123+ self.assertTrue(err.endswith, '3 objects\n')
124
125=== modified file 'workingtree.py'
126--- workingtree.py 2018-04-02 21:58:43 +0000
127+++ workingtree.py 2018-04-08 17:07:41 +0000
128@@ -1166,6 +1166,16 @@
129 show_base=show_base)
130 return count
131
132+ def _get_check_refs(self):
133+ """Return the references needed to perform a check of this tree.
134+
135+ The default implementation returns no refs, and is only suitable for
136+ trees that have no local caching and can commit on ghosts at any time.
137+
138+ :seealso: breezy.check for details about check_refs.
139+ """
140+ return []
141+
142
143 class GitWorkingTreeFormat(workingtree.WorkingTreeFormat):
144

Subscribers

People subscribed via source and target branches

to all changes: