Skip to content

Commit 1f8ed4a

Browse files
committed
Merge remote-tracking branch 'origin/develop' into dev-r84-concurrent-push
2 parents d11228a + 417fbcd commit 1f8ed4a

6 files changed

Lines changed: 96 additions & 89 deletions

File tree

server/Pipfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ flask-migrate = "==2.6.0" # 3.1.0
2626
wtforms-json = "==0.3.5"
2727
pytz = "==2022.2.1"
2828
scikit-build = "==0.18.1"
29-
pygeodiff = "==1.0.6"
29+
pygeodiff = "==2.0.4"
3030
pathvalidate = "==3.2.0"
3131
celery= "==5.4.0"
3232
redis= "==5.0.1"
@@ -40,6 +40,7 @@ psycogreen = "==1.0.2"
4040
importlib-metadata = "==8.4.0" # https://github.com/pallets/flask/issues/4502
4141
typing_extensions = "==4.12.2"
4242
python-magic = "==0.4.27"
43+
click = "==8.2.0"
4344
# requirements for development on windows
4445
colorama = "==0.4.5"
4546

server/Pipfile.lock

Lines changed: 77 additions & 43 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/mergin/sync/public_api_controller.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,14 @@
8888
get_user_agent,
8989
generate_location,
9090
is_valid_uuid,
91-
gpkg_wkb_to_wkt,
9291
is_versioned_file,
9392
get_project_path,
9493
get_device_id,
9594
is_valid_path,
9695
is_supported_type,
9796
is_supported_extension,
9897
get_mimetype,
98+
wkb2wkt,
9999
)
100100
from .errors import StorageLimitHit, ProjectLocked
101101
from ..utils import format_time_delta
@@ -1336,7 +1336,10 @@ def get_resource_changeset(project_name, namespace, version_id, path): # noqa:
13361336
if key not in geom_change:
13371337
continue
13381338
gpkg_wkb = base64.b64decode(geom_change[key], validate=True)
1339-
wkt = gpkg_wkb_to_wkt(gpkg_wkb)
1339+
wkb = version.project.storage.geodiff.create_wkb_from_gpkg_header(
1340+
gpkg_wkb
1341+
)
1342+
wkt = wkb2wkt(wkb)
13401343
if wkt:
13411344
geom_change[key] = wkt
13421345
except (binascii.Error, TypeError, ValueError):

server/mergin/sync/utils.py

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -188,38 +188,8 @@ def is_valid_uuid(uuid):
188188
return False
189189

190190

191-
# inspired by C++ implementation https://github.com/lutraconsulting/geodiff/blob/master/geodiff/src/drivers/sqliteutils.cpp
192-
# in geodiff lib (MIT licence)
193-
def parse_gpkgb_header_size(gpkg_wkb):
194-
"""Parse header of geopackage wkb and return its size"""
195-
# some constants
196-
no_envelope_header_size = 8
197-
flag_byte_pos = 3
198-
envelope_size_mask = 14
199-
200-
try:
201-
flag_byte = gpkg_wkb[flag_byte_pos]
202-
except IndexError:
203-
return -1 # probably some invalid input
204-
envelope_byte = (flag_byte & envelope_size_mask) >> 1
205-
envelope_size = 0
206-
207-
if envelope_byte == 1:
208-
envelope_size = 32
209-
elif envelope_byte == 2:
210-
envelope_size = 48
211-
elif envelope_byte == 3:
212-
envelope_size = 48
213-
elif envelope_byte == 4:
214-
envelope_size = 64
215-
216-
return no_envelope_header_size + envelope_size
217-
218-
219-
def gpkg_wkb_to_wkt(gpkg_wkb):
220-
"""Convert WKB (with gpkg header) to WKT"""
221-
wkb_header_length = parse_gpkgb_header_size(gpkg_wkb)
222-
wkb_geom = gpkg_wkb[wkb_header_length:]
191+
def wkb2wkt(wkb_geom: bytes) -> str | None:
192+
"""Convert WKB to WKT"""
223193
try:
224194
wkt = wkb.loads(wkb_geom).wkt
225195
except ShapelyError:

server/mergin/tests/test_utils.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,18 @@
1212
import os
1313
from unittest.mock import patch
1414
from pathvalidate import sanitize_filename
15+
from pygeodiff import GeoDiff
1516

1617
from ..utils import save_diagnostic_log_file
1718

1819
from ..sync.utils import (
19-
parse_gpkgb_header_size,
20-
gpkg_wkb_to_wkt,
2120
is_reserved_word,
2221
has_valid_characters,
2322
has_valid_first_character,
2423
check_filename,
2524
is_valid_path,
2625
get_x_accel_uri,
26+
wkb2wkt,
2727
)
2828
from ..auth.models import LoginHistory, User
2929
from . import json_headers
@@ -86,30 +86,28 @@ def test_maintenance_mode(client):
8686

8787

8888
def test_parse_gpkg():
89+
geodiff = GeoDiff()
8990
# Point
9091
gpkg_wkb = base64.b64decode(
9192
"R1AAAeYQAAABAQAAAID8bic0LLE/RlTr7Iuo1j8=", validate=True
9293
)
93-
header_len = parse_gpkgb_header_size(gpkg_wkb)
94-
assert header_len == 8
95-
wkt = gpkg_wkb_to_wkt(gpkg_wkb)
94+
wkb = geodiff.create_wkb_from_gpkg_header(gpkg_wkb)
95+
wkt = wkb2wkt(wkb)
9696
assert "POINT" in wkt
9797

9898
# Linestring
9999
gpkg_wkb = base64.b64decode(
100100
"R1AAA+YQAABA0VaD5wjkv+R3O6FhidC/hn8DkdjL0z8Iwc3FqhvlPwECAAAABAAAAGhDvPBvINK/CMHNxaob5T9I139WMEjZv+DthIYlQuA/5Hc7oWGJ0L+GfwOR2MvTP0DRVoPnCOS/zB9sPJo/2D8=",
101101
validate=True,
102102
)
103-
header_len = parse_gpkgb_header_size(gpkg_wkb)
104-
assert header_len == 40
105-
wkt = gpkg_wkb_to_wkt(gpkg_wkb)
103+
104+
wkb = geodiff.create_wkb_from_gpkg_header(gpkg_wkb)
105+
wkt = wkb2wkt(wkb)
106106
assert "LINESTRING" in wkt
107107

108108
# Invalid
109109
gpkg_wkb = base64.b64decode("aaaa", validate=True)
110-
header_len = parse_gpkgb_header_size(gpkg_wkb)
111-
assert header_len == -1
112-
wkt = gpkg_wkb_to_wkt(gpkg_wkb)
110+
wkt = wkb2wkt(gpkg_wkb)
113111
assert not wkt
114112

115113

web-app/packages/lib/src/modules/project/views/ProjectViewTemplate.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-MerginMaps-Commercial
1212
>
1313
<!-- Z indexes based on minus margin, its not possible to add additional buttons to tab view -->
1414
<div class="relative z-1">
15+
<slot name="action-button" />
1516
<PButton
1617
severity="secondary"
1718
@click="downloadArchive({ url: downloadUrl })"

0 commit comments

Comments
 (0)