)
from dulwich.refs import (
read_info_refs,
+ ANNOTATED_TAG_SUFFIX,
)
+class InvalidWants(Exception):
+ """Invalid wants."""
+
+ def __init__(self, wants):
+ Exception.__init__(
+ self,
+ "requested wants not in server provided refs: %r" % wants)
+
+
def _fileno_can_read(fileno):
"""Check if a file descriptor is readable."""
return len(select.select([fileno], [], [], 0)[0]) > 0
pack_data(data)
+def check_wants(wants, refs):
+ """Check that a set of wants is valid.
+
+ :param wants: Set of object SHAs to fetch
+ :param refs: Refs dictionary to check against
+ """
+ missing = set(wants) - {
+ v for (k, v) in refs.items()
+ if not k.endswith(ANNOTATED_TAG_SUFFIX)}
+ if missing:
+ raise InvalidWants(missing)
+
+
class TraditionalGitClient(GitClient):
"""Traditional Git client."""
client,
)
from dulwich.client import (
+ InvalidWants,
LocalGitClient,
TraditionalGitClient,
TCPGitClient,
SubprocessSSHVendor,
PLinkSSHVendor,
UpdateRefsError,
+ check_wants,
default_urllib3_manager,
get_transport_and_path,
get_transport_and_path_from_url,
def test_path(self):
self.assertRaises(ValueError, parse_rsync_url, '/path')
+
+
+class CheckWantsTests(TestCase):
+
+ def test_fine(self):
+ check_wants(['2f3dc7a53fb752a6961d3a56683df46d4d3bf262'],
+ {'refs/heads/blah': '2f3dc7a53fb752a6961d3a56683df46d4d3bf262'})
+
+ def test_missing(self):
+ self.assertRaises(InvalidWants, check_wants,
+ ['2f3dc7a53fb752a6961d3a56683df46d4d3bf262'],
+ {'refs/heads/blah': '3f3dc7a53fb752a6961d3a56683df46d4d3bf262'})
+
+ def test_annotated(self):
+ self.assertRaises(InvalidWants, check_wants,
+ ['2f3dc7a53fb752a6961d3a56683df46d4d3bf262'],
+ {'refs/heads/blah': '3f3dc7a53fb752a6961d3a56683df46d4d3bf262',
+ 'refs/heads/blah^{}': '2f3dc7a53fb752a6961d3a56683df46d4d3bf262'})