The patches looks good to me, but I'm not an expert in the Windows world.
On Sun, 2017-12-17 at 17:25 -0500, Matt Harbison wrote: > # HG changeset patch > # User Matt Harbison <matt_harbi...@yahoo.com> > # Date 1513537609 18000 > # Sun Dec 17 14:06:49 2017 -0500 > # Node ID f59e9334c838da4834a043d109ddfad1f7bfa8ea > # Parent 5185939f98c5c5e4383eebfa9694a522e6279648 > run-tests: use context managers for file descriptors > > I've seen the following error a few times recently when running the > tests with > `yes | ./run-tests.py --local -j9 -i`: > > Errored test-add.t: Traceback (most recent call last): > File "./run-tests.py", line 821, in run > self.runTest() > File "./run-tests.py", line 910, in runTest > if self._result.addOutputMismatch(self, ret, out, self._refout): > File "./run-tests.py", line 1774, in addOutputMismatch > rename(test.errpath, test.path) > File "./run-tests.py", line 571, in rename > os.remove(src) > WindowsError: [Error 32] The process cannot access the file because > it is being > used by another process: > 'c:\\Users\\Matt\\projects\\hg\\tests\\test-add.t.err' > > This change doesn't fix the problem, but it seems like a simple > enough > improvement. > > diff --git a/tests/run-tests.py b/tests/run-tests.py > --- a/tests/run-tests.py > +++ b/tests/run-tests.py > @@ -901,10 +901,9 @@ > # Diff generation may rely on written .err file. > if (ret != 0 or out != self._refout) and not > self._skipped \ > and not self._debug: > - f = open(self.errpath, 'wb') > - for line in out: > - f.write(line) > - f.close() > + with open(self.errpath, 'wb') as f: > + for line in out: > + f.write(line) > > # The result object handles diff calculation for us. > if self._result.addOutputMismatch(self, ret, out, > self._refout): > @@ -941,10 +940,9 @@ > > if (self._ret != 0 or self._out != self._refout) and not > self._skipped \ > and not self._debug and self._out: > - f = open(self.errpath, 'wb') > - for line in self._out: > - f.write(line) > - f.close() > + with open(self.errpath, 'wb') as f: > + for line in self._out: > + f.write(line) > > vlog("# Ret was:", self._ret, '(%s)' % self.name) > > @@ -1087,32 +1085,31 @@ > > def _createhgrc(self, path): > """Create an hgrc file for this test.""" > - hgrc = open(path, 'wb') > - hgrc.write(b'[ui]\n') > - hgrc.write(b'slash = True\n') > - hgrc.write(b'interactive = False\n') > - hgrc.write(b'mergemarkers = detailed\n') > - hgrc.write(b'promptecho = True\n') > - hgrc.write(b'[defaults]\n') > - hgrc.write(b'[devel]\n') > - hgrc.write(b'all-warnings = true\n') > - hgrc.write(b'default-date = 0 0\n') > - hgrc.write(b'[largefiles]\n') > - hgrc.write(b'usercache = %s\n' % > - (os.path.join(self._testtmp, > b'.cache/largefiles'))) > - hgrc.write(b'[lfs]\n') > - hgrc.write(b'usercache = %s\n' % > - (os.path.join(self._testtmp, b'.cache/lfs'))) > - hgrc.write(b'[web]\n') > - hgrc.write(b'address = localhost\n') > - hgrc.write(b'ipv6 = %s\n' % > str(self._useipv6).encode('ascii')) > - > - for opt in self._extraconfigopts: > - section, key = opt.encode('utf-8').split(b'.', 1) > - assert b'=' in key, ('extra config opt %s must ' > - 'have an = for assignment' % opt) > - hgrc.write(b'[%s]\n%s\n' % (section, key)) > - hgrc.close() > + with open(path, 'wb') as hgrc: > + hgrc.write(b'[ui]\n') > + hgrc.write(b'slash = True\n') > + hgrc.write(b'interactive = False\n') > + hgrc.write(b'mergemarkers = detailed\n') > + hgrc.write(b'promptecho = True\n') > + hgrc.write(b'[defaults]\n') > + hgrc.write(b'[devel]\n') > + hgrc.write(b'all-warnings = true\n') > + hgrc.write(b'default-date = 0 0\n') > + hgrc.write(b'[largefiles]\n') > + hgrc.write(b'usercache = %s\n' % > + (os.path.join(self._testtmp, > b'.cache/largefiles'))) > + hgrc.write(b'[lfs]\n') > + hgrc.write(b'usercache = %s\n' % > + (os.path.join(self._testtmp, b'.cache/lfs'))) > + hgrc.write(b'[web]\n') > + hgrc.write(b'address = localhost\n') > + hgrc.write(b'ipv6 = %s\n' % > str(self._useipv6).encode('ascii')) > + > + for opt in self._extraconfigopts: > + section, key = opt.encode('utf-8').split(b'.', 1) > + assert b'=' in key, ('extra config opt %s must ' > + 'have an = for assignment' % > opt) > + hgrc.write(b'[%s]\n%s\n' % (section, key)) > > def fail(self, msg): > # unittest differentiates between errored and failed. > @@ -1232,9 +1229,8 @@ > return os.path.join(self._testdir, self.bname) > > def _run(self, env): > - f = open(self.path, 'rb') > - lines = f.readlines() > - f.close() > + with open(self.path, 'rb') as f: > + lines = f.readlines() > > # .t file is both reference output and the test input, keep > reference > # output updated with the the test input. This avoids some > race > @@ -1246,10 +1242,9 @@ > > # Write out the generated script. > fname = b'%s.sh' % self._testtmp > - f = open(fname, 'wb') > - for l in script: > - f.write(l) > - f.close() > + with open(fname, 'wb') as f: > + for l in script: > + f.write(l) > > cmd = b'%s "%s"' % (self._shell, fname) > vlog("# Running", cmd) > @@ -1884,9 +1879,8 @@ > continue > > if self._keywords: > - f = open(test.path, 'rb') > - t = f.read().lower() + test.bname.lower() > - f.close() > + with open(test.path, 'rb') as f: > + t = f.read().lower() + test.bname.lower() > ignored = False > for k in self._keywords.lower().split(): > if k not in t: > @@ -2822,13 +2816,12 @@ > if e.errno != errno.ENOENT: > raise > else: > - f = open(installerrs, 'rb') > - for line in f: > - if PYTHON3: > - sys.stdout.buffer.write(line) > - else: > - sys.stdout.write(line) > - f.close() > + with open(installerrs, 'rb') as f: > + for line in f: > + if PYTHON3: > + sys.stdout.buffer.write(line) > + else: > + sys.stdout.write(line) > sys.exit(1) > os.chdir(self._testdir) > > @@ -2836,28 +2829,24 @@ > > if self.options.py3k_warnings and not > self.options.anycoverage: > vlog("# Updating hg command to enable Py3k Warnings > switch") > - f = open(os.path.join(self._bindir, 'hg'), 'rb') > - lines = [line.rstrip() for line in f] > - lines[0] += ' -3' > - f.close() > - f = open(os.path.join(self._bindir, 'hg'), 'wb') > - for line in lines: > - f.write(line + '\n') > - f.close() > + with open(os.path.join(self._bindir, 'hg'), 'rb') as f: > + lines = [line.rstrip() for line in f] > + lines[0] += ' -3' > + with open(os.path.join(self._bindir, 'hg'), 'wb') as f: > + for line in lines: > + f.write(line + '\n') > > hgbat = os.path.join(self._bindir, b'hg.bat') > if os.path.isfile(hgbat): > # hg.bat expects to be put in bin/scripts while run- > tests.py > # installation layout put it in bin/ directly. Fix it > - f = open(hgbat, 'rb') > - data = f.read() > - f.close() > + with open(hgbat, 'rb') as f: > + data = f.read() > if b'"%~dp0..\python" "%~dp0hg" %*' in data: > data = data.replace(b'"%~dp0..\python" "%~dp0hg" > %*', > b'"%~dp0python" "%~dp0hg" %*') > - f = open(hgbat, 'wb') > - f.write(data) > - f.close() > + with open(hgbat, 'wb') as f: > + f.write(data) > else: > print('WARNING: cannot fix hg.bat reference to > python.exe') > > _______________________________________________ > Mercurial-devel mailing list > Mercurial-devel@mercurial-scm.org > https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel _______________________________________________ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel