# HG changeset patch # User Daniel Dourvaris # Date 2019-08-23 18:32:20 # Node ID 077cbac3177790e5d2e4c88cab63967c9f4bcdd8 # Parent 304a54136237f3af02267a4965c487f1119d9475 vcsserver: added dedicated binary content check functions for all backends diff --git a/vcsserver/git.py b/vcsserver/git.py --- a/vcsserver/git.py +++ b/vcsserver/git.py @@ -245,8 +245,8 @@ class GitRemote(RemoteBase): @reraise_safe_exceptions def is_large_file(self, wire, commit_id): + cache_on, context_uid, repo_id = self._cache_on(wire) - cache_on, context_uid, repo_id = self._cache_on(wire) @self.region.conditional_cache_on_arguments(condition=cache_on) def _is_large_file(_repo_id, _sha): repo_init = self._factory.repo_libgit2(wire) @@ -260,6 +260,19 @@ class GitRemote(RemoteBase): return _is_large_file(repo_id, commit_id) @reraise_safe_exceptions + def is_binary(self, wire, tree_id): + cache_on, context_uid, repo_id = self._cache_on(wire) + + @self.region.conditional_cache_on_arguments(condition=cache_on) + def _is_binary(_repo_id, _tree_id): + repo_init = self._factory.repo_libgit2(wire) + with repo_init as repo: + blob_obj = repo[tree_id] + return blob_obj.is_binary + + return _is_binary(repo_id, tree_id) + + @reraise_safe_exceptions def in_largefiles_store(self, wire, oid): conf = self._wire_to_config(wire) repo_init = self._factory.repo_libgit2(wire) diff --git a/vcsserver/hg.py b/vcsserver/hg.py --- a/vcsserver/hg.py +++ b/vcsserver/hg.py @@ -567,6 +567,19 @@ class HgRemote(RemoteBase): return _is_large_file(context_uid, repo_id, path) @reraise_safe_exceptions + def is_binary(self, wire, revision, path): + cache_on, context_uid, repo_id = self._cache_on(wire) + + @self.region.conditional_cache_on_arguments(condition=cache_on) + def _is_binary(_repo_id, _sha, _path): + repo = self._factory.repo(wire) + ctx = self._get_ctx(repo, revision) + fctx = ctx.filectx(path) + return fctx.isbinary() + + return _is_binary(repo_id, revision, path) + + @reraise_safe_exceptions def in_largefiles_store(self, wire, sha): repo = self._factory.repo(wire) return largefiles.lfutil.instore(repo, sha) diff --git a/vcsserver/svn.py b/vcsserver/svn.py --- a/vcsserver/svn.py +++ b/vcsserver/svn.py @@ -472,6 +472,17 @@ class SvnRemote(RemoteBase): return False @reraise_safe_exceptions + def is_binary(self, wire, rev, path): + cache_on, context_uid, repo_id = self._cache_on(wire) + + @self.region.conditional_cache_on_arguments(condition=cache_on) + def _is_binary(_repo_id, _rev, _path): + raw_bytes = self.get_file_content(wire, path, rev) + return raw_bytes and '\0' in raw_bytes + + return _is_binary(repo_id, rev, path) + + @reraise_safe_exceptions def run_svn_command(self, wire, cmd, **opts): path = wire.get('path', None)