Show More
@@ -97,6 +97,8 b' safetext = st.text(st.characters(' | |||||
97 | lambda s: s.encode('utf-8') |
|
97 | lambda s: s.encode('utf-8') | |
98 | ) |
|
98 | ) | |
99 |
|
99 | |||
|
100 | extensions = st.sampled_from(('shelve', 'mq', 'blackbox',)) | |||
|
101 | ||||
100 | @contextmanager |
|
102 | @contextmanager | |
101 | def acceptableerrors(*args): |
|
103 | def acceptableerrors(*args): | |
102 | """Sometimes we know an operation we're about to perform might fail, and |
|
104 | """Sometimes we know an operation we're about to perform might fail, and | |
@@ -151,15 +153,15 b' class verifyingstatemachine(RuleBasedSta' | |||||
151 | os.chdir(testtmp) |
|
153 | os.chdir(testtmp) | |
152 | self.log = [] |
|
154 | self.log = [] | |
153 | self.failed = False |
|
155 | self.failed = False | |
|
156 | self.configperrepo = {} | |||
|
157 | self.all_extensions = set() | |||
|
158 | self.non_skippable_extensions = set() | |||
154 |
|
159 | |||
155 | self.mkdirp("repos") |
|
160 | self.mkdirp("repos") | |
156 | self.cd("repos") |
|
161 | self.cd("repos") | |
157 | self.mkdirp("repo1") |
|
162 | self.mkdirp("repo1") | |
158 | self.cd("repo1") |
|
163 | self.cd("repo1") | |
159 | self.hg("init") |
|
164 | self.hg("init") | |
160 | self.extensions = {} |
|
|||
161 | self.all_extensions = set() |
|
|||
162 | self.non_skippable_extensions = set() |
|
|||
163 |
|
165 | |||
164 | def teardown(self): |
|
166 | def teardown(self): | |
165 | """On teardown we clean up after ourselves as usual, but we also |
|
167 | """On teardown we clean up after ourselves as usual, but we also | |
@@ -190,29 +192,32 b' class verifyingstatemachine(RuleBasedSta' | |||||
190 | e = None |
|
192 | e = None | |
191 | if not self.failed: |
|
193 | if not self.failed: | |
192 | try: |
|
194 | try: | |
193 | for ext in ( |
|
|||
194 | self.all_extensions - self.non_skippable_extensions |
|
|||
195 | ): |
|
|||
196 | try: |
|
|||
197 | os.environ["SKIP_EXTENSION"] = ext |
|
|||
198 | output = subprocess.check_output([ |
|
|||
199 | runtests, path, "--local", |
|
|||
200 | ], stderr=subprocess.STDOUT) |
|
|||
201 | assert "Ran 1 test" in output, output |
|
|||
202 | finally: |
|
|||
203 | del os.environ["SKIP_EXTENSION"] |
|
|||
204 | output = subprocess.check_output([ |
|
195 | output = subprocess.check_output([ | |
205 | runtests, path, "--local", "--pure" |
|
196 | runtests, path, "--local", "--pure" | |
206 | ], stderr=subprocess.STDOUT) |
|
197 | ], stderr=subprocess.STDOUT) | |
207 | assert "Ran 1 test" in output, output |
|
198 | assert "Ran 1 test" in output, output | |
|
199 | for ext in ( | |||
|
200 | self.all_extensions - self.non_skippable_extensions | |||
|
201 | ): | |||
|
202 | tf = os.path.join(testtmp, "test-generated-no-%s.t" % ( | |||
|
203 | ext, | |||
|
204 | )) | |||
|
205 | with open(tf, 'w') as o: | |||
|
206 | for l in ttest.splitlines(): | |||
|
207 | if l.startswith(" $ hg"): | |||
|
208 | l = l.replace( | |||
|
209 | "--config %s=" % ( | |||
|
210 | extensionconfigkey(ext),), "") | |||
|
211 | o.write(l + os.linesep) | |||
|
212 | with open(tf, 'r') as r: | |||
|
213 | t = r.read() | |||
|
214 | assert ext not in t, t | |||
|
215 | output = subprocess.check_output([ | |||
|
216 | runtests, tf, "--local", | |||
|
217 | ], stderr=subprocess.STDOUT) | |||
|
218 | assert "Ran 1 test" in output, output | |||
208 | except subprocess.CalledProcessError as e: |
|
219 | except subprocess.CalledProcessError as e: | |
209 | note(e.output) |
|
220 | note(e.output) | |
210 | finally: |
|
|||
211 | os.unlink(path) |
|
|||
212 | try: |
|
|||
213 | os.unlink(path + ".err") |
|
|||
214 | except OSError: |
|
|||
215 | pass |
|
|||
216 | if self.failed or e is not None: |
|
221 | if self.failed or e is not None: | |
217 | with open(savefile, "wb") as o: |
|
222 | with open(savefile, "wb") as o: | |
218 | o.write(ttest) |
|
223 | o.write(ttest) | |
@@ -244,7 +249,11 b' class verifyingstatemachine(RuleBasedSta' | |||||
244 | self.log.append("$ cd -- %s" % (pipes.quote(path),)) |
|
249 | self.log.append("$ cd -- %s" % (pipes.quote(path),)) | |
245 |
|
250 | |||
246 | def hg(self, *args): |
|
251 | def hg(self, *args): | |
247 | self.command("hg", *args) |
|
252 | extra_flags = [] | |
|
253 | for key, value in self.config.items(): | |||
|
254 | extra_flags.append("--config") | |||
|
255 | extra_flags.append("%s=%s" % (key, value)) | |||
|
256 | self.command("hg", *(tuple(extra_flags) + args)) | |||
248 |
|
257 | |||
249 | def command(self, *args): |
|
258 | def command(self, *args): | |
250 | self.log.append("$ " + ' '.join(map(pipes.quote, args))) |
|
259 | self.log.append("$ " + ' '.join(map(pipes.quote, args))) | |
@@ -384,6 +393,10 b' class verifyingstatemachine(RuleBasedSta' | |||||
384 | def currentrepo(self): |
|
393 | def currentrepo(self): | |
385 | return os.path.basename(os.getcwd()) |
|
394 | return os.path.basename(os.getcwd()) | |
386 |
|
395 | |||
|
396 | @property | |||
|
397 | def config(self): | |||
|
398 | return self.configperrepo.setdefault(self.currentrepo, {}) | |||
|
399 | ||||
387 | @rule( |
|
400 | @rule( | |
388 | target=repos, |
|
401 | target=repos, | |
389 | source=repos, |
|
402 | source=repos, | |
@@ -489,32 +502,20 b' class verifyingstatemachine(RuleBasedSta' | |||||
489 |
|
502 | |||
490 | # Section: Extension management |
|
503 | # Section: Extension management | |
491 | def hasextension(self, extension): |
|
504 | def hasextension(self, extension): | |
492 | repo = self.currentrepo |
|
505 | return extensionconfigkey(extension) in self.config | |
493 | return repo in self.extensions and extension in self.extensions[repo] |
|
|||
494 |
|
506 | |||
495 | def commandused(self, extension): |
|
507 | def commandused(self, extension): | |
496 | assert extension in self.all_extensions |
|
508 | assert extension in self.all_extensions | |
497 | self.non_skippable_extensions.add(extension) |
|
509 | self.non_skippable_extensions.add(extension) | |
498 |
|
510 | |||
499 |
@rule(extension= |
|
511 | @rule(extension=extensions) | |
500 | 'shelve', 'mq', 'blackbox', |
|
|||
501 | ))) |
|
|||
502 | def addextension(self, extension): |
|
512 | def addextension(self, extension): | |
503 | self.all_extensions.add(extension) |
|
513 | self.all_extensions.add(extension) | |
504 | extensions = self.extensions.setdefault(self.currentrepo, set()) |
|
514 | self.config[extensionconfigkey(extension)] = "" | |
505 | if extension in extensions: |
|
515 | ||
506 | return |
|
516 | @rule(extension=extensions) | |
507 | extensions.add(extension) |
|
517 | def removeextension(self, extension): | |
508 | if not os.path.exists(hgrc): |
|
518 | self.config.pop(extensionconfigkey(extension), None) | |
509 | self.command("touch", hgrc) |
|
|||
510 | with open(hgrc, 'a') as o: |
|
|||
511 | line = "[extensions]\n%s=\n" % (extension,) |
|
|||
512 | o.write(line) |
|
|||
513 | for l in line.splitlines(): |
|
|||
514 | self.log.append(( |
|
|||
515 | '$ if test "$SKIP_EXTENSION" != "%s" ; ' |
|
|||
516 | 'then echo %r >> %s; fi') % ( |
|
|||
517 | extension, l, hgrc,)) |
|
|||
518 |
|
519 | |||
519 | # Section: Commands from the shelve extension |
|
520 | # Section: Commands from the shelve extension | |
520 | @rule() |
|
521 | @rule() | |
@@ -548,6 +549,9 b' class writeonlydatabase(ExampleDatabase)' | |||||
548 | def close(self): |
|
549 | def close(self): | |
549 | self.underlying.close() |
|
550 | self.underlying.close() | |
550 |
|
551 | |||
|
552 | def extensionconfigkey(extension): | |||
|
553 | return "extensions." + extension | |||
|
554 | ||||
551 | settings.register_profile( |
|
555 | settings.register_profile( | |
552 | 'default', settings( |
|
556 | 'default', settings( | |
553 | timeout=300, |
|
557 | timeout=300, |
General Comments 0
You need to be logged in to leave comments.
Login now