# HG changeset patch # User Sofia Carrillo # Date 1527815094 25200 # Node ID 4146b1ddbb34d890b76e47584c93232171180fee # Parent 3c3e0c0568805b099539b497d2a9f1e9f261c81b Bug 1463834 - vendored hglib, updated to python-hglib r=davehunt diff --git a/Pipfile b/Pipfile --- a/Pipfile +++ b/Pipfile @@ -7,11 +7,12 @@ name = "pypi" [packages] pipenv = "==2018.5.18" virtualenv = "==15.2.0" six = "==1.10.0" attrs = "==18.1.0" pytest = "==3.2.5" jsmin = "==2.1.0" +python-hglib = "==2.4" [requires] python_version = "2.7" diff --git a/Pipfile.lock b/Pipfile.lock --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,12 +1,12 @@ { "_meta": { "hash": { - "sha256": "706dd858cb4e07dbccf7f3e6f129ac5b50c9906bcd6083e4fb09e9869b379d5e" + "sha256": "695978bb529a1cffb6f329519ce6fe68adbee73d9f05595dbefb2b9d0ebe4177" }, "pipfile-spec": 6, "requires": { "python_version": "2.7" }, "sources": [ { "name": "pypi", @@ -56,16 +56,23 @@ "pytest": { "hashes": [ "sha256:241d7e7798d79192a123ceaf64c602b4d233eacf6d6e42ae27caa97f498b7dc6", "sha256:6d5bd4f7113b444c55a3bbb5c738a3dd80d43563d063fc42dcb0aaefbdd78b81" ], "index": "pypi", "version": "==3.2.5" }, + "python-hglib": { + "hashes": [ + "sha256:693d6ed92a6566e78802c7a03c256cda33d08c63ad3f00fcfa11379b184b9462" + ], + "index": "pypi", + "version": "==2.4" + }, "six": { "hashes": [ "sha256:0ff78c403d9bccf5a425a6d31a12aa6b47f1c21ca4dc2573a7e2f32a97335eb1", "sha256:105f8d68616f8248e24bf0e9372ef04d3cc10104f1980f54d57b2ce73a5ad56a" ], "index": "pypi", "version": "==1.10.0" }, diff --git a/build/virtualenv_packages.txt b/build/virtualenv_packages.txt --- a/build/virtualenv_packages.txt +++ b/build/virtualenv_packages.txt @@ -9,17 +9,17 @@ mozilla.pth:third_party/python/attrs/src mozilla.pth:third_party/python/blessings mozilla.pth:third_party/python/compare-locales mozilla.pth:third_party/python/configobj mozilla.pth:third_party/python/cram mozilla.pth:third_party/python/dlmanager mozilla.pth:third_party/python/fluent mozilla.pth:third_party/python/futures mozilla.pth:third_party/python/gyp/pylib -mozilla.pth:third_party/python/hglib +mozilla.pth:third_party/python/python-hglib mozilla.pth:third_party/python/jsmin optional:setup.py:third_party/python/psutil:build_ext:--inplace mozilla.pth:third_party/python/psutil mozilla.pth:third_party/python/pylru mozilla.pth:third_party/python/which mozilla.pth:third_party/python/pystache mozilla.pth:third_party/python/pyyaml/lib mozilla.pth:third_party/python/requests diff --git a/third_party/python/py/.hgtags b/third_party/python/py/.hgtags new file mode 100644 --- /dev/null +++ b/third_party/python/py/.hgtags @@ -0,0 +1,68 @@ +52c6d9e78777a5a34e813123997dfc614a1a4767 1.0.0b3 +1c7aaa8c61f3b0945921a9acc7beb184201aed4b 1.0.0b4 +1c7aaa8c61f3b0945921a9acc7beb184201aed4b 1.0.0b4 +0000000000000000000000000000000000000000 1.0.0b4 +0000000000000000000000000000000000000000 1.0.0b4 +8cd6eb91eba313b012d6e568f37d844dc0751f2e 1.0.0b4 +8cd6eb91eba313b012d6e568f37d844dc0751f2e 1.0.0b4 +0000000000000000000000000000000000000000 1.0.0b4 +2cc0507f117ffe721dff7ee026648cfce00ec92f 1.0.0b6 +86f1e1b6e49bf5882a809f11edd1dbb08162cdad 1.0.0b8 +86f1e1b6e49bf5882a809f11edd1dbb08162cdad 1.0.0b8 +c63f35c266cbb26dad6b87b5e115d65685adf448 1.0.0b8 +c63f35c266cbb26dad6b87b5e115d65685adf448 1.0.0b8 +0eaa0fdf2ba0163cf534dc2eff4ba2e5fc66c261 1.0.0b8 +e2a60653cb490aeed81bbbd83c070b99401c211c 1.0.0b9 +5ea0cdf7854c3d4278d36eda94a2b68483a0e211 1.0.0 +5ea0cdf7854c3d4278d36eda94a2b68483a0e211 1.0.0 +7acde360d94b6a2690ce3d03ff39301da84c0a2b 1.0.0 +6bd221981ac99103002c1cb94fede400d23a96a1 1.0.1 +4816e8b80602a3fd3a0a120333ad85fbe7d8bab4 1.0.2 +60c44bdbf093285dc69d5462d4dbb4acad325ca6 1.1.0 +319187fcda66714c5eb1353492babeec3d3c826f 1.1.1 +4fc5212f7626a56b9eb6437b5c673f56dd7eb942 1.2.0 +c143a8c8840a1c68570890c8ac6165bbf92fd3c6 1.2.1 +eafd3c256e8732dfb0a4d49d051b5b4339858926 1.3.0 +d5eacf390af74553227122b85e20345d47b2f9e6 1.3.1 +d5eacf390af74553227122b85e20345d47b2f9e6 1.3.1 +8b8e7c25a13cf863f01b2dd955978285ae9daf6a 1.3.1 +3bff44b188a7ec1af328d977b9d39b6757bb38df 1.3.2 +c59d3fa8681a5b5966b8375b16fccd64a3a8dbeb 1.3.3 +79ef6377705184c55633d456832eea318fedcf61 1.3.4 +79ef6377705184c55633d456832eea318fedcf61 1.3.4 +90fffd35373e9f125af233f78b19416f0938d841 1.3.4 +5346ab41b059c95a48cbe1e8a7bae96ce6e0da27 1.4.0 +1f3125cba7976538952be268f107c1d0c36c5ce8 1.4.1 +04ab22db4ff737cf31e91d75a0f5d7077f324167 1.4.2 +9950bf9d684a984d511795013421c89c5cf88bef 1.4.3 +d9951e3bdbc765e73835ae13012f6a074d13d8bf 1.4.4 +b827dd156a36753e32c7f3f15ce82d6fe9e356c8 1.4.6 +f15726f9e5a67cc6221c499affa4840e9d591763 1.4.7 +abfabd07a1d328f13c730e8a50d80d2e470afd3b 1.4.9 +7f37ee0aff9be4b839d6759cfee336f60e8393a4 1.4.10 +fe4593263efa10ea7ba014db6e3379e0b82368a2 1.4.11 +f07af25a26786e4825b5170e17ad693245cb3426 1.4.12 +d3730d84ba7eda92fd3469a3f63fd6d8cb22c975 1.4.13 +12c1ae8e7c5345721e9ec9f8e27b1e36c07f74dc 1.4.14 +12c1ae8e7c5345721e9ec9f8e27b1e36c07f74dc 1.4.14 +0000000000000000000000000000000000000000 1.4.14 +0000000000000000000000000000000000000000 1.4.14 +1497e2efd0f8c73a0e3d529debf0c489e4cd6cab 1.4.14 +e065014c1ce8ad110a381e9baaaa5d647ba7ac6b 1.4.15 +e9e5b38f53dc35b35aa1f9ee9a9be9bbd2d2c3b1 1.4.16 +c603503945f52b78522d96a423605cbc953236d3 1.4.17 +c59201105a29801cc858eb9160b7a19791b91a35 1.4.18 +284cc172e294d48edc840012e1451c32c3963d92 1.4.19 +a3e0626aa0c5aecf271367dc77e476ab216ea3c8 1.4.20 +5e48016c4a3af8e7358a1267d33d021e71765bed 1.4.21 +01ae2cfcc61c4fcb3aa5031349adb5b467c31018 1.4.23 +5ffd982f4dff60b588f309cd9bdc61036547282a 1.4.24 +dc9ffbcaf1f7d72e96be3f68c11deebb7e7193c5 1.4.25 +6de1a44bf75de7af4fcae947c235e9072bbdbb9a 1.4.26 +7d650ba2657890a2253c8c4a83f170febebd90fa 1.4.27 +7d650ba2657890a2253c8c4a83f170febebd90fa 1.4.27 +1810003dec63dd1b506a23849861fffa5bc3ba13 1.4.27 +ba08706f08ddea1b77a426f00dfe2bdc244345e8 1.4.28 +4e8054ada63f3327bcf759ae7cd36c7c8652bc9b 1.4.29 +366ab346610c6de8aaa7617e24011794b40236c6 1.4.30 +657380e439f9b7e04918cb162cb2e46388244b42 1.4.31 diff --git a/third_party/python/python-hglib/.hgignore b/third_party/python/python-hglib/.hgignore new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/.hgignore @@ -0,0 +1,12 @@ +syntax: glob + +dist +MANIFEST +MANIFEST.in +*.pyc +*.orig +*.rej +*~ +*.swp +*.noseids +build diff --git a/third_party/python/hglib/LICENSE b/third_party/python/python-hglib/LICENSE rename from third_party/python/hglib/LICENSE rename to third_party/python/python-hglib/LICENSE diff --git a/third_party/python/python-hglib/Makefile b/third_party/python/python-hglib/Makefile new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/Makefile @@ -0,0 +1,17 @@ +PYTHON=python +help: + @echo 'Commonly used make targets:' + @echo ' tests - run all tests in the automatic test suite' + +all: help + +.PHONY: tests + +MANIFEST.in: + hg manifest | sed -e 's/^/include /' > MANIFEST.in + +dist: MANIFEST.in + TAR_OPTIONS="--owner=root --group=root --mode=u+w,go-w,a+rX-s" $(PYTHON) setup.py -q sdist + +tests: + $(PYTHON) test.py --with-doctest diff --git a/third_party/python/python-hglib/PKG-INFO b/third_party/python/python-hglib/PKG-INFO new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/PKG-INFO @@ -0,0 +1,26 @@ +Metadata-Version: 1.1 +Name: python-hglib +Version: 2.4 +Summary: Mercurial Python library +Home-page: http://selenic.com/repo/python-hglib +Author: Idan Kamara +Author-email: idankk86@gmail.com +License: MIT +Description: python-hglib + ============ + + python-hglib is a library with a fast, convenient interface to Mercurial. + It uses Mercurial's command server for communication with hg. + + Installation is standard: + + $ python setup.py install + +Platform: UNKNOWN +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2.4 +Classifier: Programming Language :: Python :: 2.5 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.4 diff --git a/third_party/python/python-hglib/README b/third_party/python/python-hglib/README new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/README @@ -0,0 +1,9 @@ +python-hglib +============ + +python-hglib is a library with a fast, convenient interface to Mercurial. +It uses Mercurial's command server for communication with hg. + +Installation is standard: + + $ python setup.py install diff --git a/third_party/python/python-hglib/examples/stats.py b/third_party/python/python-hglib/examples/stats.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/examples/stats.py @@ -0,0 +1,35 @@ +# stats - get stats on the given repo + +import sys +import hglib + +# figure out what repo path to use +repo = '.' +if len(sys.argv) > 1: + repo = sys.argv[1] + +# connect to hg +client = hglib.open(repo) + +# gather some stats +revs = int(client.tip().rev) +files = len(list(client.manifest())) +heads = len(client.heads()) +branches = len(client.branches()) +tags = len(client.tags()) - 1 # don't count tip + +authors = {} +for e in client.log(): + authors[e.author] = True + +merges = 0 +for e in client.log(onlymerges=True): + merges += 1 + +print "%d revisions" % revs +print "%d merges" % merges +print "%d files" % files +print "%d heads" % heads +print "%d branches" % branches +print "%d tags" % tags +print "%d authors" % len(authors) diff --git a/third_party/python/hglib/hglib/__init__.py b/third_party/python/python-hglib/hglib/__init__.py rename from third_party/python/hglib/hglib/__init__.py rename to third_party/python/python-hglib/hglib/__init__.py diff --git a/third_party/python/hglib/hglib/client.py b/third_party/python/python-hglib/hglib/client.py rename from third_party/python/hglib/hglib/client.py rename to third_party/python/python-hglib/hglib/client.py diff --git a/third_party/python/hglib/hglib/context.py b/third_party/python/python-hglib/hglib/context.py rename from third_party/python/hglib/hglib/context.py rename to third_party/python/python-hglib/hglib/context.py diff --git a/third_party/python/hglib/hglib/error.py b/third_party/python/python-hglib/hglib/error.py rename from third_party/python/hglib/hglib/error.py rename to third_party/python/python-hglib/hglib/error.py diff --git a/third_party/python/hglib/hglib/merge.py b/third_party/python/python-hglib/hglib/merge.py rename from third_party/python/hglib/hglib/merge.py rename to third_party/python/python-hglib/hglib/merge.py diff --git a/third_party/python/hglib/hglib/templates.py b/third_party/python/python-hglib/hglib/templates.py rename from third_party/python/hglib/hglib/templates.py rename to third_party/python/python-hglib/hglib/templates.py diff --git a/third_party/python/hglib/hglib/util.py b/third_party/python/python-hglib/hglib/util.py rename from third_party/python/hglib/hglib/util.py rename to third_party/python/python-hglib/hglib/util.py diff --git a/third_party/python/hglib/setup.py b/third_party/python/python-hglib/setup.py rename from third_party/python/hglib/setup.py rename to third_party/python/python-hglib/setup.py diff --git a/third_party/python/python-hglib/test.py b/third_party/python/python-hglib/test.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/test.py @@ -0,0 +1,7 @@ +#!/usr/bin/env python + +import nose +from tests import with_hg + +if __name__ == '__main__': + nose.main(addplugins=[with_hg.WithHgPlugin()]) diff --git a/third_party/python/python-hglib/tests/__init__.py b/third_party/python/python-hglib/tests/__init__.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/__init__.py @@ -0,0 +1,22 @@ +import os, tempfile, sys, shutil + +def setUp(): + os.environ['LANG'] = os.environ['LC_ALL'] = os.environ['LANGUAGE'] = 'C' + os.environ["EMAIL"] = "Foo Bar " + os.environ['CDPATH'] = '' + os.environ['COLUMNS'] = '80' + os.environ['GREP_OPTIONS'] = '' + os.environ['http_proxy'] = '' + + os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"' + os.environ["HGMERGE"] = "internal:merge" + os.environ["HGUSER"] = "test" + os.environ["HGENCODING"] = "ascii" + os.environ["HGENCODINGMODE"] = "strict" + tmpdir = tempfile.mkdtemp('', 'python-hglib.') + os.environ["HGTMP"] = os.path.realpath(tmpdir) + os.environ["HGRCPATH"] = os.pathsep + +def tearDown(self): + os.chdir('..') + shutil.rmtree(os.environ["HGTMP"]) diff --git a/third_party/python/python-hglib/tests/common.py b/third_party/python/python-hglib/tests/common.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/common.py @@ -0,0 +1,49 @@ +import os, sys, tempfile, shutil +import unittest + +import hglib +from hglib import client + +def resultappender(list): + def decorator(f): + def decorated(*args, **kwargs): + list.append(args[0]) + return f(*args, **kwargs) + return decorated + return decorator + +class basetest(unittest.TestCase): + def setUp(self): + self._testtmp = os.environ["TESTTMP"] = os.environ["HOME"] = \ + os.path.join(os.environ["HGTMP"], self.__class__.__name__) + + self.clients = [] + self._oldopen = hglib.client.hgclient.open + # hglib.open = resultappender(self.clients)(hglib.open) + c = hglib.client.hgclient + c.open = resultappender(self.clients)(c.open) + + os.mkdir(self._testtmp) + os.chdir(self._testtmp) + # until we can run norepo commands in the cmdserver + os.system('hg init') + self.client = hglib.open() + + def tearDown(self): + # on Windows we cannot rmtree before closing all instances + # because of used files + hglib.client.hgclient.open = self._oldopen + for client in self.clients: + if client.server is not None: + client.close() + os.chdir('..') + try: + shutil.rmtree(self._testtmp) + except AttributeError: + pass # if our setUp was overriden + + def append(self, path, *args): + f = open(path, 'ab') + for a in args: + f.write(a.encode('latin-1')) + f.close() diff --git a/third_party/python/python-hglib/tests/test-annotate.py b/third_party/python/python-hglib/tests/test-annotate.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-annotate.py @@ -0,0 +1,32 @@ +from tests import common +from hglib.util import b + +class test_annotate(common.basetest): + def test_basic(self): + self.append('a', 'a\n') + rev, node0 = self.client.commit(b('first'), addremove=True) + self.append('a', 'a\n') + rev, node1 = self.client.commit(b('second')) + + self.assertEquals(list(self.client.annotate(b('a'))), + [(b('0'), b('a')), (b('1'), b('a'))]) + self.assertEquals(list( + self.client.annotate( + b('a'), user=True, file=True, + number=True, changeset=True, line=True, verbose=True)), + [(b('test 0 ') + node0[:12] + b(' a:1'), b('a')), + (b('test 1 ') + node1[:12] + b(' a:2'), b('a'))]) + + def test_files(self): + self.append('a', 'a\n') + rev, node0 = self.client.commit(b('first'), addremove=True) + self.append('b', 'b\n') + rev, node1 = self.client.commit(b('second'), addremove=True) + self.assertEquals(list(self.client.annotate([b('a'), b('b')])), + [(b('0'), b('a')), (b('1'), b('b'))]) + + def test_two_colons(self): + self.append('a', 'a: b\n') + self.client.commit(b('first'), addremove=True) + self.assertEquals(list(self.client.annotate(b('a'))), + [(b('0'), b('a: b'))]) diff --git a/third_party/python/python-hglib/tests/test-bookmarks.py b/third_party/python/python-hglib/tests/test-bookmarks.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-bookmarks.py @@ -0,0 +1,26 @@ +from tests import common +from hglib.util import b + +class test_bookmarks(common.basetest): + def test_empty(self): + self.assertEquals(self.client.bookmarks(), ([], -1)) + + def test_basic(self): + self.append('a', 'a') + rev0, node0 = self.client.commit(b('first'), addremove=True) + self.append('a', 'a') + rev1, node1 = self.client.commit(b('second')) + + self.client.bookmark(b('zero'), rev0) + self.assertEquals(self.client.bookmarks(), + ([(b('zero'), rev0, node0[:12])], -1)) + + self.client.bookmark(b('one'), rev1) + self.assertEquals(self.client.bookmarks()[0], + [(b('one'), rev1, node1[:12]), + (b('zero'), rev0, node0[:12])]) + + #def test_spaces(self): + # self.client.bookmark('s pace', self.rev0) + # self.assertEquals(self.client.bookmarks(), + # ([('s pace', 0, self.rev0.node[:12])], -1)) diff --git a/third_party/python/python-hglib/tests/test-branch.py b/third_party/python/python-hglib/tests/test-branch.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-branch.py @@ -0,0 +1,46 @@ +from tests import common +import hglib +from hglib.util import b + +class test_branch(common.basetest): + def test_empty(self): + self.assertEquals(self.client.branch(), b('default')) + + def test_basic(self): + self.assertEquals(self.client.branch(b('foo')), b('foo')) + self.append('a', 'a') + rev, node = self.client.commit(b('first'), addremove=True) + + rev = self.client.log(node)[0] + + self.assertEquals(rev.branch, b('foo')) + self.assertEquals(self.client.branches(), + [(rev.branch, int(rev.rev), rev.node[:12])]) + + def test_reset_with_name(self): + self.assertRaises(ValueError, self.client.branch, b('foo'), clean=True) + + def test_reset(self): + self.client.branch(b('foo')) + self.assertEquals(self.client.branch(clean=True), b('default')) + + def test_exists(self): + self.append('a', 'a') + self.client.commit(b('first'), addremove=True) + self.client.branch(b('foo')) + self.append('a', 'a') + self.client.commit(b('second')) + self.assertRaises(hglib.error.CommandError, + self.client.branch, b('default')) + + def test_force(self): + self.append('a', 'a') + self.client.commit(b('first'), addremove=True) + self.client.branch(b('foo')) + self.append('a', 'a') + self.client.commit(b('second')) + + self.assertRaises(hglib.error.CommandError, + self.client.branch, b('default')) + self.assertEquals(self.client.branch(b('default'), force=True), + b('default')) diff --git a/third_party/python/python-hglib/tests/test-branches.py b/third_party/python/python-hglib/tests/test-branches.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-branches.py @@ -0,0 +1,25 @@ +from tests import common +import hglib +from hglib.util import b + +class test_branches(common.basetest): + def test_empty(self): + self.assertEquals(self.client.branches(), []) + + def test_basic(self): + self.append('a', 'a') + rev0 = self.client.commit(b('first'), addremove=True) + self.client.branch(b('foo')) + self.append('a', 'a') + rev1 = self.client.commit(b('second')) + branches = self.client.branches() + + expected = [] + for r, n in (rev1, rev0): + r = self.client.log(r)[0] + expected.append((r.branch, int(r.rev), r.node[:12])) + + self.assertEquals(branches, expected) + + def test_active_closed(self): + pass diff --git a/third_party/python/python-hglib/tests/test-bundle.py b/third_party/python/python-hglib/tests/test-bundle.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-bundle.py @@ -0,0 +1,18 @@ +from tests import common +from hglib.util import b + +class test_bundle(common.basetest): + def test_no_changes(self): + self.append('a', 'a') + rev, node0 = self.client.commit(b('first'), addremove=True) + self.assertFalse(self.client.bundle(b('bundle'), destrepo=b('.'))) + + def test_basic(self): + self.append('a', 'a') + rev, node0 = self.client.commit(b('first'), addremove=True) + self.client.clone(dest=b('other')) + + self.append('a', 'a') + rev, node1 = self.client.commit(b('second')) + + self.assertTrue(self.client.bundle(b('bundle'), destrepo=b('other'))) diff --git a/third_party/python/python-hglib/tests/test-commit.py b/third_party/python/python-hglib/tests/test-commit.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-commit.py @@ -0,0 +1,62 @@ +from tests import common +import hglib, datetime +from hglib.util import b + +class test_commit(common.basetest): + def test_user(self): + self.append('a', 'a') + rev, node = self.client.commit(b('first'), addremove=True, + user=b('foo')) + rev = self.client.log(node)[0] + self.assertEquals(rev.author, b('foo')) + + def test_no_user(self): + self.append('a', 'a') + self.assertRaises(hglib.error.CommandError, + self.client.commit, b('first'), user=b('')) + + def test_close_branch(self): + self.append('a', 'a') + rev0, node0 = self.client.commit(b('first'), addremove=True) + self.client.branch(b('foo')) + self.append('a', 'a') + rev1, node1 = self.client.commit(b('second')) + revclose = self.client.commit(b('closing foo'), closebranch=True) + rev0, rev1, revclose = self.client.log([node0, node1, revclose[1]]) + + self.assertEquals(self.client.branches(), + [(rev0.branch, int(rev0.rev), rev0.node[:12])]) + + self.assertEquals(self.client.branches(closed=True), + [(revclose.branch, int(revclose.rev), + revclose.node[:12]), + (rev0.branch, int(rev0.rev), rev0.node[:12])]) + + def test_message_logfile(self): + self.assertRaises(ValueError, self.client.commit, b('foo'), + logfile=b('bar')) + self.assertRaises(ValueError, self.client.commit) + + def test_date(self): + self.append('a', 'a') + now = datetime.datetime.now().replace(microsecond=0) + rev0, node0 = self.client.commit( + b('first'), addremove=True, + date=now.isoformat(' ').encode('latin-1')) + + self.assertEquals(now, self.client.tip().date) + + def test_amend(self): + self.append('a', 'a') + now = datetime.datetime.now().replace(microsecond=0) + rev0, node0 = self.client.commit( + b('first'), addremove=True, + date=now.isoformat(' ').encode('latin-1')) + + self.assertEquals(now, self.client.tip().date) + + self.append('a', 'a') + rev1, node1 = self.client.commit(amend=True) + self.assertEquals(now, self.client.tip().date) + self.assertNotEquals(node0, node1) + self.assertEqual(1, len(self.client.log())) diff --git a/third_party/python/python-hglib/tests/test-config.py b/third_party/python/python-hglib/tests/test-config.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-config.py @@ -0,0 +1,37 @@ +from tests import common +import os, hglib +from hglib.util import b + +class test_config(common.basetest): + def setUp(self): + common.basetest.setUp(self) + f = open('.hg/hgrc', 'a') + f.write('[section]\nkey=value\n') + f.close() + self.client = hglib.open() + + def test_basic(self): + config = self.client.config() + + self.assertTrue( + (b('section'), b('key'), b('value')) in self.client.config()) + + self.assertTrue([(b('section'), b('key'), b('value'))], + self.client.config(b('section'))) + self.assertTrue([(b('section'), b('key'), b('value'))], + self.client.config([b('section'), b('foo')])) + self.assertRaises(hglib.error.CommandError, + self.client.config, [b('a.b'), b('foo')]) + + def test_show_source(self): + config = self.client.config(showsource=True) + + self.assertTrue((os.path.abspath(b('.hg/hgrc')) + b(':2'), + b('section'), b('key'), b('value')) in config) + +class test_config_arguments(common.basetest): + def test_basic(self): + client = hglib.open(configs=[b('diff.unified=5'), b('a.b=foo')]) + self.assertEqual(client.config(b('a')), [(b('a'), b('b'), b('foo'))]) + self.assertEqual(client.config(b('diff')), + [(b('diff'), b('unified'), b('5'))]) diff --git a/third_party/python/python-hglib/tests/test-copy.py b/third_party/python/python-hglib/tests/test-copy.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-copy.py @@ -0,0 +1,23 @@ +from tests import common +import hglib +from hglib.util import b + +class test_copy(common.basetest): + def test_basic(self): + self.append('a', 'a') + self.client.commit(b('first'), addremove=True) + + self.assertTrue(self.client.copy(b('a'), b('b'))) + self.assertEquals(self.client.status(), [(b('A'), b('b'))]) + self.append('c', 'a') + self.assertTrue(self.client.copy(b('a'), b('c'), after=True)) + self.assertEquals(self.client.status(), + [(b('A'), b('b')), (b('A'), b('c'))]) + + # hg returns 0 even if there were warnings + #def test_warnings(self): + # self.append('a', 'a') + # self.client.commit('first', addremove=True) + + # self.assertTrue(self.client.copy('a', 'b')) + # self.assertFalse(self.client.copy('a', 'b')) diff --git a/third_party/python/python-hglib/tests/test-diff.py b/third_party/python/python-hglib/tests/test-diff.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-diff.py @@ -0,0 +1,47 @@ +from tests import common +from hglib.util import b + +class test_diff(common.basetest): + def test_basic(self): + self.append('a', 'a\n') + self.client.add(b('a')) + diff1 = b("""diff -r 000000000000 a +--- /dev/null ++++ b/a +@@ -0,0 +1,1 @@ ++a +""") + self.assertEquals(diff1, self.client.diff(nodates=True)) + self.assertEquals(diff1, self.client.diff([b('a')], nodates=True)) + rev0, node0 = self.client.commit(b('first')) + diff2 = b("""diff -r 000000000000 -r """) + node0[:12] + b(""" a +--- /dev/null ++++ b/a +@@ -0,0 +1,1 @@ ++a +""") + self.assertEquals(diff2, self.client.diff(change=rev0, nodates=True)) + self.append('a', 'a\n') + rev1, node1 = self.client.commit(b('second')) + diff3 = b("""diff -r """) + node0[:12] + b(""" a +--- a/a ++++ b/a +@@ -1,1 +1,2 @@ + a ++a +""") + self.assertEquals(diff3, self.client.diff(revs=[rev0], nodates=True)) + diff4 = b("""diff -r """) + node0[:12] + b(" -r ") + node1[:12] + b( + """ a +--- a/a ++++ b/a +@@ -1,1 +1,2 @@ + a ++a +""") + self.assertEquals(diff4, self.client.diff(revs=[rev0, rev1], + nodates=True)) + + def test_basic_plain(self): + open('.hg/hgrc', 'a').write('[defaults]\ndiff=--git\n') + self.test_basic() diff --git a/third_party/python/python-hglib/tests/test-encoding.py b/third_party/python/python-hglib/tests/test-encoding.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-encoding.py @@ -0,0 +1,8 @@ +from tests import common +import hglib +from hglib.util import b + +class test_encoding(common.basetest): + def test_basic(self): + self.client = hglib.open(encoding='utf-8') + self.assertEquals(self.client.encoding, b('utf-8')) diff --git a/third_party/python/python-hglib/tests/test-forget.py b/third_party/python/python-hglib/tests/test-forget.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-forget.py @@ -0,0 +1,14 @@ +from tests import common +from hglib.util import b + +class test_forget(common.basetest): + def test_basic(self): + self.append('a', 'a') + self.client.add([b('a')]) + self.assertTrue(self.client.forget(b('a'))) + + def test_warnings(self): + self.assertFalse(self.client.forget(b('a'))) + self.append('a', 'a') + self.client.add([b('a')]) + self.assertFalse(self.client.forget([b('a'), b('b')])) diff --git a/third_party/python/python-hglib/tests/test-grep.py b/third_party/python/python-hglib/tests/test-grep.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-grep.py @@ -0,0 +1,45 @@ +from tests import common +from hglib.util import b + +class test_grep(common.basetest): + def test_basic(self): + self.append('a', 'a\n') + self.append('b', 'ab\n') + self.client.commit(b('first'), addremove=True) + + # no match + self.assertEquals(list(self.client.grep(b('c'))), []) + + self.assertEquals(list(self.client.grep(b('a'))), + [(b('a'), b('0'), b('a')), (b('b'), b('0'), b('ab'))]) + self.assertEquals(list(self.client.grep(b('a'), b('a'))), + [(b('a'), b('0'), b('a'))]) + + self.assertEquals(list(self.client.grep(b('b'))), + [(b('b'), b('0'), b('ab'))]) + + def test_options(self): + self.append('a', 'a\n') + self.append('b', 'ab\n') + rev, node = self.client.commit(b('first'), addremove=True) + + self.assertEquals([(b('a'), b('0'), b('+'), b('a')), + (b('b'), b('0'), b('+'), b('ab'))], + list(self.client.grep(b('a'), all=True))) + + self.assertEquals([(b('a'), b('0')), (b('b'), b('0'))], + list(self.client.grep(b('a'), fileswithmatches=True))) + + self.assertEquals([(b('a'), b('0'), b('1'), b('a')), + (b('b'), b('0'), b('1'), b('ab'))], + list(self.client.grep(b('a'), line=True))) + + self.assertEquals([(b('a'), b('0'), b('test'), b('a')), + (b('b'), b('0'), b('test'), b('ab'))], + list(self.client.grep(b('a'), user=True))) + + self.assertEquals([(b('a'), b('0'), b('1'), b('+'), b('test')), + (b('b'), b('0'), b('1'), b('+'), b('test'))], + list(self.client.grep(b('a'), all=True, user=True, + line=True, + fileswithmatches=True))) diff --git a/third_party/python/python-hglib/tests/test-heads.py b/third_party/python/python-hglib/tests/test-heads.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-heads.py @@ -0,0 +1,17 @@ +from tests import common +from hglib.util import b + +class test_heads(common.basetest): + def test_empty(self): + self.assertEquals(self.client.heads(), []) + + def test_basic(self): + self.append('a', 'a') + rev, node0 = self.client.commit(b('first'), addremove=True) + self.assertEquals(self.client.heads(), [self.client.tip()]) + + self.client.branch(b('foo')) + self.append('a', 'a') + rev, node1 = self.client.commit(b('second')) + + self.assertEquals(self.client.heads(node0, topological=True), []) diff --git a/third_party/python/python-hglib/tests/test-hglib.py b/third_party/python/python-hglib/tests/test-hglib.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-hglib.py @@ -0,0 +1,25 @@ +from tests import common +import hglib + +class test_hglib(common.basetest): + def setUp(self): + pass + + def test_close_fds(self): + """A weird Python bug that has something to do to inherited file + descriptors, see http://bugs.python.org/issue12786 + """ + common.basetest.setUp(self) + client2 = hglib.open() + self.client.close() + + def test_open_nonexistent(self): + # setup stuff necessary for basetest.tearDown() + self.clients = [] + self._oldopen = hglib.client.hgclient.open + try: + self.clients.append(hglib.open('inexistent')) + # hg 3.5 can't report error (fixed by 7332bf4ae959) + #self.fail('ServerError not raised') + except hglib.error.ServerError as inst: + self.assertTrue('inexistent' in str(inst)) diff --git a/third_party/python/python-hglib/tests/test-import.py b/third_party/python/python-hglib/tests/test-import.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-import.py @@ -0,0 +1,38 @@ +import os +from tests import common +from hglib.util import b, BytesIO + +patch = b(""" +# HG changeset patch +# User test +# Date 0 0 +# Node ID c103a3dec114d882c98382d684d8af798d09d857 +# Parent 0000000000000000000000000000000000000000 +1 + +diff -r 000000000000 -r c103a3dec114 a +--- /dev/null Thu Jan 01 00:00:00 1970 +0000 ++++ b/a Thu Jan 01 00:00:00 1970 +0000 +@@ -0,0 +1,1 @@ ++1 +""") + +class test_import(common.basetest): + def test_basic_cstringio(self): + self.client.import_(BytesIO(patch)) + self.assertEquals(self.client.cat([b('a')]), b('1\n')) + + def test_basic_file(self): + f = open('patch', 'wb') + f.write(patch) + f.close() + + # --no-commit + self.client.import_([b('patch')], nocommit=True) + self.assertEquals(open('a').read(), '1\n') + + self.client.update(clean=True) + os.remove('a') + + self.client.import_([b('patch')]) + self.assertEquals(self.client.cat([b('a')]), b('1\n')) diff --git a/third_party/python/python-hglib/tests/test-init.py b/third_party/python/python-hglib/tests/test-init.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-init.py @@ -0,0 +1,15 @@ +from tests import common +import hglib, shutil +from hglib.util import b + +class test_init(common.basetest): + def test_exists(self): + self.assertRaises(hglib.error.CommandError, hglib.init) + + def test_basic(self): + self.client.close() + self.client = None + shutil.rmtree('.hg') + + self.client = hglib.init().open() + self.assertTrue(self.client.root().endswith(b('test_init'))) diff --git a/third_party/python/python-hglib/tests/test-log.py b/third_party/python/python-hglib/tests/test-log.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-log.py @@ -0,0 +1,30 @@ +from tests import common +import hglib +from hglib.util import b + +class test_log(common.basetest): + def test_basic(self): + self.append('a', 'a') + rev0, node0 = self.client.commit(b('first'), addremove=True) + self.append('a', 'a') + rev1, node1 = self.client.commit(b('second')) + + revs = self.client.log() + revs.reverse() + + self.assertTrue(len(revs) == 2) + self.assertEquals(revs[1].node, node1) + + self.assertEquals(revs[0], self.client.log(b('0'))[0]) + self.assertEquals(self.client.log(), self.client.log(files=[b('a')])) + + self.assertEquals(self.client.log(), self.client.log(hidden=True)) + + # def test_errors(self): + # self.assertRaisesRegexp(CommandError, 'abort: unknown revision', + # self.client.log, 'foo') + # self.append('a', 'a') + # self.client.commit('first', addremove=True) + # self.assertRaisesRegexp(CommandError, + # 'abort: unknown revision', + # self.client.log, 'bar') diff --git a/third_party/python/python-hglib/tests/test-manifest.py b/third_party/python/python-hglib/tests/test-manifest.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-manifest.py @@ -0,0 +1,27 @@ +from tests import common +import hglib, os, stat +from hglib.util import b + +class test_manifest(common.basetest): + def test_basic(self): + self.append('a', 'a') + files = [b('a')] + manifest = [(b('047b75c6d7a3ef6a2243bd0e99f94f6ea6683597'), b('644'), + False, False, b('a'))] + + if os.name == 'posix': + self.append('b', 'b') + os.chmod('b', os.stat('b')[0] | stat.S_IEXEC) + os.symlink('b', 'c') + + files.extend([b('b'), b('c')]) + manifest.extend([(b('62452855512f5b81522aa3895892760bb8da9f3f'), + b('755'), True, False, b('b')), + (b('62452855512f5b81522aa3895892760bb8da9f3f'), + b('644'), False, True, b('c'))]) + + self.client.commit(b('first'), addremove=True) + + self.assertEquals(list(self.client.manifest(all=True)), files) + + self.assertEquals(list(self.client.manifest()), manifest) diff --git a/third_party/python/python-hglib/tests/test-merge.py b/third_party/python/python-hglib/tests/test-merge.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-merge.py @@ -0,0 +1,78 @@ +from tests import common +import hglib +from hglib.util import b + +class test_merge(common.basetest): + def setUp(self): + common.basetest.setUp(self) + + self.append('a', 'a') + rev, self.node0 = self.client.commit(b('first'), addremove=True) + + self.append('a', 'a') + rev, self.node1 = self.client.commit(b('change')) + + def test_basic(self): + self.client.update(self.node0) + self.append('b', 'a') + rev, node2 = self.client.commit(b('new file'), addremove=True) + self.client.merge(self.node1) + rev, node = self.client.commit(b('merge')) + diff = b("diff -r ") + node2[:12] + b(" -r ") + node[:12] + b(""" a +--- a/a ++++ b/a +@@ -1,1 +1,1 @@ +-a +\ No newline at end of file ++aa +\ No newline at end of file +""") + + self.assertEquals(diff, self.client.diff(change=node, nodates=True)) + + def test_merge_prompt_abort(self): + self.client.update(self.node0) + self.client.remove(b('a')) + self.client.commit(b('remove')) + + self.assertRaises(hglib.error.CommandError, self.client.merge) + + def test_merge_prompt_noninteractive(self): + self.client.update(self.node0) + self.client.remove(b('a')) + rev, node = self.client.commit(b('remove')) + + if self.client.version >= (3, 7): + self.assertRaises(hglib.error.CommandError, + self.client.merge, + cb=hglib.merge.handlers.noninteractive) + else: + self.client.merge(cb=hglib.merge.handlers.noninteractive) + + diff = b("diff -r ") + node[:12] + b(""" a +--- /dev/null ++++ b/a +@@ -0,0 +1,1 @@ ++aa +\ No newline at end of file +""") + self.assertEquals(diff, self.client.diff(nodates=True)) + + def test_merge_prompt_cb(self): + self.client.update(self.node0) + self.client.remove(b('a')) + rev, node = self.client.commit(b('remove')) + + def cb(output): + return b('c') + + self.client.merge(cb=cb) + + diff = b("diff -r ") + node[:12] + b(""" a +--- /dev/null ++++ b/a +@@ -0,0 +1,1 @@ ++aa +\ No newline at end of file +""") + self.assertEquals(diff, self.client.diff(nodates=True)) diff --git a/third_party/python/python-hglib/tests/test-move.py b/third_party/python/python-hglib/tests/test-move.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-move.py @@ -0,0 +1,16 @@ +import os +from tests import common +from hglib.util import b + +class test_move(common.basetest): + def test_basic(self): + self.append('a', 'a') + self.client.add(b('a')) + self.assertTrue(self.client.move(b('a'), b('b'))) + + # hg returns 0 even if there were warnings + #def test_warnings(self): + # self.append('a', 'a') + # self.client.add('a') + # os.mkdir('c') + # self.assertFalse(self.client.move(['a', 'b'], 'c')) diff --git a/third_party/python/python-hglib/tests/test-outgoing-incoming.py b/third_party/python/python-hglib/tests/test-outgoing-incoming.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-outgoing-incoming.py @@ -0,0 +1,53 @@ +from tests import common +import hglib +from hglib.util import b + +class test_outgoing_incoming(common.basetest): + def test_no_path(self): + self.assertRaises(hglib.error.CommandError, self.client.incoming) + + def test_empty(self): + self.client.clone(dest=b('other')) + self.other = hglib.open(b('other')) + + self.assertEquals(self.other.incoming(), []) + self.assertEquals(self.other.outgoing(), []) + + def test_basic(self): + self.append('a', 'a') + self.client.commit(b('first'), addremove=True) + self.append('a', 'a') + self.client.commit(b('second')) + + self.client.clone(dest=b('other')) + other = hglib.open(b('other')) + + self.assertEquals(self.client.log(), other.log()) + self.assertEquals(self.client.outgoing(path=b('other')), + other.incoming()) + + self.append('a', 'a') + rev, node = self.client.commit(b('third')) + out = self.client.outgoing(path=b('other')) + + self.assertEquals(len(out), 1) + self.assertEquals(out[0].node, node) + + self.assertEquals(out, other.incoming()) + + def test_bookmarks(self): + self.append('a', 'a') + self.client.commit(b('first'), addremove=True) + self.append('a', 'a') + self.client.commit(b('second')) + + self.client.clone(dest=b('other')) + other = hglib.open(b('other')) + + self.client.bookmark(b('bm1'), 1) + + self.assertEquals(other.incoming(bookmarks=True), + [(b('bm1'), self.client.tip().node[:12])]) + + self.assertEquals(self.client.outgoing(path=b('other'), bookmarks=True), + [(b('bm1'), self.client.tip().node[:12])]) diff --git a/third_party/python/python-hglib/tests/test-parents.py b/third_party/python/python-hglib/tests/test-parents.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-parents.py @@ -0,0 +1,15 @@ +from tests import common +from hglib.util import b + +class test_parents(common.basetest): + def test_noparents(self): + self.assertEquals(self.client.parents(), None) + + def test_basic(self): + self.append('a', 'a') + rev, node = self.client.commit(b('first'), addremove=True) + self.assertEquals(node, self.client.parents()[0].node) + self.assertEquals(node, self.client.parents(file=b('a'))[0].node) + + def test_two_parents(self): + pass diff --git a/third_party/python/python-hglib/tests/test-paths.py b/third_party/python/python-hglib/tests/test-paths.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-paths.py @@ -0,0 +1,19 @@ +import os +from tests import common +import hglib +from hglib.util import b + +class test_paths(common.basetest): + def test_basic(self): + f = open('.hg/hgrc', 'a') + f.write('[paths]\nfoo = bar\n') + f.close() + + # hgrc isn't watched for changes yet, have to reopen + self.client = hglib.open() + paths = self.client.paths() + self.assertEquals(len(paths), 1) + self.assertEquals(paths[b('foo')], + os.path.abspath('bar').encode('latin-1')) + self.assertEquals(self.client.paths(b('foo')), + os.path.abspath('bar').encode('latin-1')) diff --git a/third_party/python/python-hglib/tests/test-pull.py b/third_party/python/python-hglib/tests/test-pull.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-pull.py @@ -0,0 +1,31 @@ +from tests import common +import hglib +from hglib.util import b + +class test_pull(common.basetest): + def test_basic(self): + self.append('a', 'a') + self.client.commit(b('first'), addremove=True) + + self.client.clone(dest=b('other')) + other = hglib.open(b('other')) + + self.append('a', 'a') + self.client.commit(b('second')) + + self.assertTrue(other.pull()) + self.assertEquals(self.client.log(), other.log()) + + def test_unresolved(self): + self.append('a', 'a') + self.client.commit(b('first'), addremove=True) + + self.client.clone(dest=b('other')) + other = hglib.open(b('other')) + + self.append('a', 'a') + self.client.commit(b('second')) + + self.append('other/a', 'b') + self.assertFalse(other.pull(update=True)) + self.assertTrue((b('M'), b('a')) in other.status()) diff --git a/third_party/python/python-hglib/tests/test-push.py b/third_party/python/python-hglib/tests/test-push.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-push.py @@ -0,0 +1,20 @@ +from tests import common +import hglib +from hglib.util import b + +class test_push(common.basetest): + def test_basic(self): + self.append('a', 'a') + self.client.commit(b('first'), addremove=True) + + self.client.clone(dest=b('other')) + other = hglib.open(b('other')) + + # broken in hg, doesn't return 1 if nothing to push + #self.assertFalse(self.client.push('other')) + + self.append('a', 'a') + self.client.commit(b('second')) + + self.assertTrue(self.client.push(b('other'))) + self.assertEquals(self.client.log(), other.log()) diff --git a/third_party/python/python-hglib/tests/test-remove.py b/third_party/python/python-hglib/tests/test-remove.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-remove.py @@ -0,0 +1,13 @@ +from tests import common +from hglib.util import b + +class test_remove(common.basetest): + def test_basic(self): + self.append('a', 'a') + self.client.commit(b('first'), addremove=True) + self.assertTrue(self.client.remove([b('a')])) + + def test_warnings(self): + self.append('a', 'a') + self.client.commit(b('first'), addremove=True) + self.assertFalse(self.client.remove([b('a'), b('b')])) diff --git a/third_party/python/python-hglib/tests/test-resolve.py b/third_party/python/python-hglib/tests/test-resolve.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-resolve.py @@ -0,0 +1,33 @@ +from tests import common +import hglib +from hglib.util import b + +class test_resolve(common.basetest): + def setUp(self): + common.basetest.setUp(self) + + self.append('a', 'a') + self.append('b', 'b') + rev, self.node0 = self.client.commit(b('first'), addremove=True) + + self.append('a', 'a') + self.append('b', 'b') + rev, self.node1 = self.client.commit(b('second')) + + def test_basic(self): + self.client.update(self.node0) + self.append('a', 'b') + self.append('b', 'a') + rev, self.node3 = self.client.commit(b('third')) + + self.assertRaises(hglib.error.CommandError, self.client.merge, + self.node1) + self.assertRaises(hglib.error.CommandError, + self.client.resolve, all=True) + + self.assertEquals([(b('U'), b('a')), (b('U'), b('b'))], + self.client.resolve(listfiles=True)) + + self.client.resolve(b('a'), mark=True) + self.assertEquals([(b('R'), b('a')), (b('U'), b('b'))], + self.client.resolve(listfiles=True)) diff --git a/third_party/python/python-hglib/tests/test-status.py b/third_party/python/python-hglib/tests/test-status.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-status.py @@ -0,0 +1,50 @@ +import os +from tests import common +from hglib.util import b + +class test_status(common.basetest): + def test_empty(self): + self.assertEquals(self.client.status(), []) + + def test_one_of_each(self): + self.append('.hgignore', 'ignored') + self.append('ignored', 'a') + self.append('clean', 'a') + self.append('modified', 'a') + self.append('removed', 'a') + self.append('missing', 'a') + self.client.commit(b('first'), addremove=True) + self.append('modified', 'a') + self.append('added', 'a') + self.client.add([b('added')]) + os.remove('missing') + self.client.remove([b('removed')]) + self.append('untracked') + + l = [(b('M'), b('modified')), + (b('A'), b('added')), + (b('R'), b('removed')), + (b('C'), b('.hgignore')), + (b('C'), b('clean')), + (b('!'), b('missing')), + (b('?'), b('untracked')), + (b('I'), b('ignored'))] + + st = self.client.status(all=True) + + for i in l: + self.assertTrue(i in st) + + def test_copy(self): + self.append('source', 'a') + self.client.commit(b('first'), addremove=True) + self.client.copy(b('source'), b('dest')) + l = [(b('A'), b('dest')), (b(' '), b('source'))] + self.assertEquals(self.client.status(copies=True), l) + + def test_copy_origin_space(self): + self.append('s ource', 'a') + self.client.commit(b('first'), addremove=True) + self.client.copy(b('s ource'), b('dest')) + l = [(b('A'), b('dest')), (b(' '), b('s ource'))] + self.assertEquals(self.client.status(copies=True), l) diff --git a/third_party/python/python-hglib/tests/test-summary.py b/third_party/python/python-hglib/tests/test-summary.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-summary.py @@ -0,0 +1,125 @@ +from tests import common +import hglib +from hglib.util import b + +class test_summary(common.basetest): + def test_empty(self): + d = {b('parent') : [(-1, b('000000000000'), b('tip'), None)], + b('branch') : b('default'), + b('commit') : True, + b('update') : 0} + + self.assertEquals(self.client.summary(), d) + + def test_basic(self): + self.append('a', 'a') + rev, node = self.client.commit(b('first'), addremove=True) + + d = {b('parent') : [(0, node[:12], b('tip'), b('first'))], + b('branch') : b('default'), + b('commit') : True, + b('update') : 0} + if self.client.version >= (3, 5): + d[b('phases')] = b('1 draft') + + self.assertEquals(self.client.summary(), d) + + def test_commit_dirty(self): + self.append('a', 'a') + rev, node = self.client.commit(b('first'), addremove=True) + self.append('a', 'a') + + d = {b('parent') : [(0, node[:12], b('tip'), b('first'))], + b('branch') : b('default'), + b('commit') : False, + b('update') : 0} + if self.client.version >= (3, 5): + d[b('phases')] = b('1 draft') + + self.assertEquals(self.client.summary(), d) + + def test_update(self): + self.append('a', 'a') + rev, node = self.client.commit(b('first'), addremove=True) + self.append('a', 'a') + self.client.commit(b('second')) + self.client.update(0) + + d = {b('parent') : [(0, node[:12], None, b('first'))], + b('branch') : b('default'), + b('commit') : True, + b('update') : 1} + if self.client.version >= (3, 5): + d[b('phases')] = b('2 draft') + + self.assertEquals(self.client.summary(), d) + + def test_remote(self): + self.append('a', 'a') + rev, node = self.client.commit(b('first'), addremove=True) + + self.client.clone(dest=b('other')) + other = hglib.open('other') + + d = {b('parent') : [(0, node[:12], b('tip'), b('first'))], + b('branch') : b('default'), + b('commit') : True, + b('update') : 0, + b('remote') : (0, 0, 0, 0)} + + self.assertEquals(other.summary(remote=True), d) + + self.append('a', 'a') + self.client.commit(b('second')) + + d[b('remote')] = (1, 0, 0, 0) + self.assertEquals(other.summary(remote=True), d) + + self.client.bookmark(b('bm')) + d[b('remote')] = (1, 1, 0, 0) + self.assertEquals(other.summary(remote=True), d) + + other.bookmark(b('bmother')) + d[b('remote')] = (1, 1, 0, 1) + if self.client.version < (2, 0, 0): + d[b('parent')] = [(0, node[:12], b('tip bmother'), b('first'))] + else: + d[b('bookmarks')] = b('*bmother') + self.assertEquals(other.summary(remote=True), d) + + self.append('other/a', 'a') + rev, node = other.commit(b('second in other')) + + d[b('remote')] = (1, 1, 1, 1) + if self.client.version < (2, 0, 0): + tags = b('tip bmother') + else: + tags = b('tip') + d[b('parent')] = [(1, node[:12], tags, b('second in other'))] + if self.client.version >= (3, 5): + d[b('phases')] = b('1 draft') + + self.assertEquals(other.summary(remote=True), d) + + def test_two_parents(self): + self.append('a', 'a') + rev0, node = self.client.commit(b('first'), addremove=True) + + self.append('a', 'a') + rev1, node1 = self.client.commit(b('second')) + + self.client.update(rev0) + self.append('b', 'a') + rev2, node2 = self.client.commit(b('third'), addremove=True) + + self.client.merge(rev1) + + d = {b('parent') : [(2, node2[:12], b('tip'), b('third')), + (1, node1[:12], None, b('second'))], + b('branch') : b('default'), + b('commit') : False, + b('update') : 0} + if self.client.version >= (3, 5): + d[b('phases')] = b('3 draft') + + self.assertEquals(self.client.summary(), d) diff --git a/third_party/python/python-hglib/tests/test-tags.py b/third_party/python/python-hglib/tests/test-tags.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-tags.py @@ -0,0 +1,21 @@ +from tests import common +import hglib +from hglib.util import b + +class test_tags(common.basetest): + def test_basic(self): + self.append('a', 'a') + rev, node = self.client.commit(b('first'), addremove=True) + self.client.tag(b('my tag')) + self.client.tag(b('local tag'), rev=rev, local=True) + + # filecache that was introduced in 2.0 makes us see the local tag, for + # now we have to reconnect + if self.client.version < (2, 0, 0): + self.client = hglib.open() + + tags = self.client.tags() + self.assertEquals(tags, + [(b('tip'), 1, self.client.tip().node[:12], False), + (b('my tag'), 0, node[:12], False), + (b('local tag'), 0, node[:12], True)]) diff --git a/third_party/python/python-hglib/tests/test-update.py b/third_party/python/python-hglib/tests/test-update.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/test-update.py @@ -0,0 +1,102 @@ +from tests import common +from hglib import error +from hglib.util import b, strtobytes + +class test_update(common.basetest): + def setUp(self): + common.basetest.setUp(self) + self.append('a', 'a') + self.rev0, self.node0 = self.client.commit(b('first'), addremove=True) + self.append('a', 'a') + self.rev1, self.node1 = self.client.commit(b('second')) + + def test_basic(self): + u, m, r, ur = self.client.update(self.rev0) + self.assertEquals(u, 1) + self.assertEquals(m, 0) + self.assertEquals(r, 0) + self.assertEquals(ur, 0) + + def test_unresolved(self): + self.client.update(self.rev0) + self.append('a', 'b') + u, m, r, ur = self.client.update() + self.assertEquals(u, 0) + self.assertEquals(m, 0) + self.assertEquals(r, 0) + self.assertEquals(ur, 1) + self.assertTrue((b('M'), b('a')) in self.client.status()) + + def test_merge(self): + self.append('a', '\n\n\n\nb') + rev2, node2 = self.client.commit(b('third')) + self.append('a', 'b') + self.client.commit(b('fourth')) + self.client.update(rev2) + old = open('a').read() + f = open('a', 'wb') + f.write(b('a') + old.encode('latin-1')) + f.close() + u, m, r, ur = self.client.update() + self.assertEquals(u, 0) + self.assertEquals(m, 1) + self.assertEquals(r, 0) + self.assertEquals(ur, 0) + self.assertEquals(self.client.status(), [(b('M'), b('a'))]) + + def test_tip(self): + self.client.update(self.rev0) + u, m, r, ur = self.client.update() + self.assertEquals(u, 1) + self.assertEquals(self.client.parents()[0].node, self.node1) + + self.client.update(self.rev0) + self.append('a', 'b') + rev2, node2 = self.client.commit(b('new head')) + self.client.update(self.rev0) + + self.client.update() + self.assertEquals(self.client.parents()[0].node, node2) + + def test_check_clean(self): + self.assertRaises(ValueError, self.client.update, clean=True, + check=True) + + def test_clean(self): + old = open('a').read() + self.append('a', 'b') + self.assertRaises(error.CommandError, self.client.update, check=True) + + u, m, r, ur = self.client.update(clean=True) + self.assertEquals(u, 1) + self.assertEquals(old, open('a').read()) + + def test_basic_plain(self): + f = open('.hg/hgrc', 'a') + f.write('[defaults]\nupdate=-v\n') + f.close() + self.test_basic() + + def disabled_largefiles(self): + # we don't run reposetup after a session has started, so this + # test is broken + import os + f = open('.hg/hgrc', 'a') + f.write('[extensions]\nlargefiles=\n') + f.close() + self.append('b', 'a') + try: + self.client.rawcommand([b('add'), b('b'), b('--large')]) + except error.CommandError: + return + + rev2, node2 = self.client.commit(b('third')) + # Go back to 0 + self.client.rawcommand([b('update'), strtobytes(self.rev0)], + # Keep the 'changed' version + prompt=lambda s, d: 'c\n') + u, m, r, ur = self.client.update(rev2, clean=True) + self.assertEquals(u, 2) + self.assertEquals(m, 0) + self.assertEquals(r, 0) + self.assertEquals(ur, 0) diff --git a/third_party/python/python-hglib/tests/with_hg.py b/third_party/python/python-hglib/tests/with_hg.py new file mode 100644 --- /dev/null +++ b/third_party/python/python-hglib/tests/with_hg.py @@ -0,0 +1,33 @@ +import os +from nose.plugins import Plugin + +class WithHgPlugin(Plugin): + name = 'with-hg' + enabled = False + + def options(self, parser, env): + Plugin.options(self, parser, env) + parser.add_option('--with-hg', + action='store', + type='string', + metavar='HG', + dest='with_hg', + help='test using specified hg script.') + + def configure(self, options, conf): + Plugin.configure(self, options, conf) + if options.with_hg: + self.enabled = True + self.hgpath = os.path.realpath(options.with_hg) + + def begin(self): + import hglib + + p = hglib.util.popen([self.hgpath, 'version']) + p.communicate() + + if p.returncode: + raise ValueError("custom hg %r doesn't look like Mercurial" + % self.hgpath) + + hglib.HGPATH = self.hgpath