Please note that compatibility for 0.x releases (software or repositories) isn't guaranteed. Kart is evolving quickly and things will change. However, we aim to provide the means to upgrade existing repositories between 0.x versions and to 1.0.
When adding new entries to the changelog, please include issue/PR numbers wherever possible.
- Fixes a crash when branch names contain a slash. #1089
- Helper mode: Fixed crashes when environment variables contain invalid UTF-8 sequences. #1085
- import:
--replace-existingnow preserves attachments (files at the dataset root level, such as licenses or READMEs) instead of deleting them along with the dataset data. #1083 - Fixes the HTML diff viewer (
-o html) failing to load the page if the data contained<,>, or/characters. #1081 - Adds support for an env-var flag
KART_ALLOW_FROM_GIT=1that turns off the safe-guard that stops Kart from running on what appear to be Git repositories. #1100 - Adds support for cloning from git bundles to speed up initial clones of large repositories #1106
- No longer building MacOS builds for Intel Macs, only building for Apple Silicon Macs. Please get in touch if this is a concern for you.
- Patch format now uses unambiguous keys for feature changes -
++for inserts,--for deletes, and+/-for updates. This matches the delta-filter format used in diffs.
- New
kart mvcommand to rename dataset paths. #1067 - Patches (
apply/create-patch): - merge:
--message/-moption no longer implies--no-ff. The message will now be used if the command can't do a fast-forward. #1051 diff/show:- Fixed garbled json-lines output sometimes when using
--add-feature-count-estimate#1040 - Faster output for some large repositories (varies wildly) #1038
- Text output now consistently displays a 'Merge: {parentIDs}' line when showing a merge commit #1043
- show: Added
--no-sort-keysoption to disable sorting of features by name/PK. Previously added todiffonly - show: Added
--add-feature-count-estimateoption to add a feature count estimate tojson-linesoutput. Previously added todiffonly - Fixed some issues with the built-in visual HTML diff ie
kart show -ohtml
- Fixed garbled json-lines output sometimes when using
- diff: Much faster and much lower memory usage when using
--no-sort-keys#1032 - diff: Fix an error when diffing a commit against the working copy, where a dataset has been deleted since the commit. #1033
- Custom CRS support in MSSQL server - OGR conventions are used to store custom CRSs in a
spatial_ref_systable. #1036
- Much faster access to tabular/vector datasets (about 75% more features processed per second) by switching to msgspec - #1025
- diff: Faster JSON-Lines output (also using msgspec)
- diff: Added
--no-sort-keysoption to disable sorting of features by name/PK. This is a minor speed improvement. - Linux builds now require glibc 2.28+ #1027 - This means minimum distro versions are:
- Debian 10+
- Ubuntu 18.10+
- Fedora 29+
- RHEL/Rocky/AlmaLinux 8+
- Upgrade to PDAL 2.7 #1005
- Adds a
--drop-empty-geometry-featuresoption tokart export. #1007 - Adds diagnostic output to Kart when
KART_DIAGNOSTICS=1environment variable is set. #1013 - In
kart merge --output-format=json, themessagefield is nownullif the merge is a no-op. #1021
- Replaces minimal patches with delta-filters - a more general-purpose way of filtering parts (inserts, updates, deletes) of JSON diffs when not all parts are required. #998
- Remove automatic resolution of
localhostbefore calling MSSQL driver. Fixes SQL Server instance names issue. #999 - Upgraded pyodbc for compatibility with the latest MSSQL driver.
- Adds a new command
kart exportwhich enables export of vector or tabular datasets to any OGR format. #992
- Prevented committing local changes to linked datasets. #953
- Fixes a bug where even datasets marked as
--no-checkoutare checked out when the working copy is first created. #954 - Fixes a bug where minor changes to auxiliary metadata (.aux.xml) files that Kart is supposed to ignore were preventing branch changes. #957
- Improved performance when the user filters a diff request to only show certain features. #962
- Clean up the empty directory if a clone fails outright. #963
- Fixes
add-datasetto work for PostGIS working copies. #965 - Fixes
kart import --linkto not fetch any tiles when importing into a bare Kart repo. #970
- First and foremost: linked datasets! Kart now supports linking a tile-based dataset to tiles that are hosted on S3, so that the tiles don't need to be hosted on a Kart LFS server. For more information, see Linked Datasets. #905
- Native Apple Silicon builds are now available for macOS 12 and newer. #927
- Adds support for disabling the working-copy checkout of specific datasets using the commands
kart import DATASET --no-checkoutorkart checkout --not-dataset=DATASET, and re-enabling it usingkart checkout --dataset=DATASET. #926 - Adds information on referencing and citing Kart to
CITATION. #914 - Fixes a bug where Kart would misidentify a non-Kart repo as a Kart V1 repo in some circumstances. #918
- Improve schema extraction for point cloud datasets. #924
- Some tweaks to
--dry-runoutput of Kart LFS commands. #932 - Now using Python 3.11 to build Kart, and vendored dependencies have been updated to newer versions. #933
- Adds support for importing point-cloud and raster tiles directly from an S3 URL. #940
checkout: Smoother progressbar updates- Add library support for WEBP & ZSTD compression with GeoTIFF raster datasets. #951
- Fixes a bug where the GPKG application ID is not being written in GPKG working copies - other software reading the GPKG may be confused by this. #902
- Fixes a bug where points could shift by small amounts while importing point-clouds if the tiles were converted to COPC. PDAL#4180
- Fixes a bug where Git subprocesses (such as git clone) don't prompt the user for credentials or to resolve SSH issues on Windows. #852
- Better protection against XSS in the HTML diff viewer. #884
- Speed-up: greatly reduces the time taken to update the index file after checking out LFS tiles to the working copy. #880
- Adds
--with-dataset-typesoption tokart data lscommand (and deprecateskart data version). #892 - Use
journal_mode = WALin annotations.db sqlite database. #898 - Slightly modifies the GPKG working copy format to avoid an incompatiblity with Global Mapper. #899
- First and foremost: raster datasets! Kart now supports raster datasets, which track changes to a set of GeoTIFF files. To get started, see Raster Datasets #794
- Fixes a bug where SIGINT (Ctrl+C) wasn't terminating Kart when using helper mode, affects macOS and Linux. #869
- Fixes a bug where reflink wasn't working on macOS, leading to larger size on disk for point cloud datasets. #876
If your repositories use the NUMERIC or NUMERIC(a,b) types and were imported/committed from a Postgres source or working copy, you may have lost data.
Specifically, any numeric values with a scale of zero (no digits after the decimal point) were affected. If the only numerics in your repositories were defined with a scale greater than zero, no data corruption should have occured.
For example, a value of 100 in a postgres database with the type NUMERIC(10, 0) or NUMERIC would have been imported as 1 - losing its trailing zeroes.
However, a value of 100.0 in a field declared as NUMERIC(10, 1) would not have been affected.
Other data types (integer, floating-point etc) are not affected, and repos sourced from other SQL databases (Geopackage, MSSQL, MySQL) were not affected.
- Allow kart to import non-spatial tables from PostgreSQL databases which don't have postGIS extension installed. #728
- PostgreSQL working copy no longer requires PostGIS for aspatial datasets. #729
- Fixes a bug where the current spatial filter isn't stored in the filesystem working copy, affecting the spatial filtering of point cloud datasets. #833
- Fixes pthread_key leaks in a long running Kart process due to repeated loading and unloading of mod_spatialite. #838
- Fixes a bug where features are written to the working copy without their CRS identifier during
kart resolve. #840 - Drop CI testing of amazonlinux:2, replace with amazonlinux:2023. #838
- Point clouds (or rasters): during import, require the user to choose if they want to make a "cloud-optimized" dataset or a "preserve-format" dataset. #842
- Point clouds (or rasters): require
--no-convert-to-dataset-formatto add new tiles to a dataset that can be committed as-is but only if the dataset's format is changed. Note--convert-to-dataset-formatworks as before. #842 - Allow kart to check out attached files into the file-based working copy.
- Fixes a bug where tab-completion wasn't working with helper mode, affects macOS and Linux. #851
- Fixes a bug where git-lfs (and potentially other subprocesses) wasn't working reliably with helper mode, affects macOS and Linux. #853
importnow informs the user to useadd-datasetinstead if they try to import a table that is already inside the working copy. #249- Fixes a bug where datasets with no CRS couldn't be checked out into a Geopackage working copy. #855
- Upgrade libgit2 to v1.6.4, pygit2 to v1.12.1 (plus Kart-specific changes). #868
- Fix the issue where re-importing the same shapefile with
--replace-existingwould show spurious schema changes (and therefore row changes). #791 - Added support for committing new layers to a kart repository with
add-datasetand the table name. #249 - Switched the crs84Extent field for point-cloud tiles to store a 4-point-polygons (instead of an axis-aligned envelope). #809
- Improved progress reporting when importing tiles, in line with working copy checkout.
- Added support for
--diff-formatoption underkart showcommand to display different level of detail depending on the user's needs. #721 - Allow for automatically resolving primary key conflicts during a merge using
kart resolve --renumber=(ours|theirs)#814 - Improved tile import performance for point-cloud (and eventually raster) by making it multithreaded. #818
- Fixed a bug where Kart would require
user.nameanduser.emailto be set, even whenGIT_AUTHOR_EMAILand similar variables were set in the environment. #812 - Update native dependencies. #820
- Drop CI testing of Debian Stretch/oldoldstable. #820
- Fix for issue with launching an editor while using helper mode, affects macOS and Linux. #788
- Added support for
--list-untracked-tablesoption underkart statuscommand to list the tables/datasets that are added to the repository but are not tracked by Kart.
- Modified
point-cloud-import --replace-existingto reuse previously imported tiles, rather than reimport them, if tiles that have already been imported are imported again - potentially saving time and disk space. Note thatpoint-cloud-import --update-existingalready had this optimization. #783 - Reintroduced support for
log --graph. #784 - Added checks to various commands to ensure user.name and user.email have been configured (ie to
kart merge), to bring them in line withkart commitbehaviour. #785
- First and foremost: point cloud datasets! Kart now supports point cloud datasets which track changes to a set of LAS files. This required the addition of a file-system working copy (as opposed to the existing database working copy types), and integrating Git LFS to store the large files. To get started with point cloud datasets, see Point Cloud Datasets #565
- Install tab completion using
kart install tab-completioninstead ofkart config --install-tab-completion. #701 - "Primary key conflicts" - conflicts caused by reusing a primary key which is already assigned to a feature outside the spatial filter - are renamed to "spatial filter conflicts" for future proofing with other dataset types. Consequently, commit option
--allow-pk-conflictsis renamed to--allow-spatial-filter-conflicts. - Support shell detection for tab completion installation when running in helper mode. #704
- Bugfix: directing geojson diff output to the console didn't work in a multi-dataset repo, even if only one dataset had changed. #702
- Improve argument parsing for
kart diffandkart show. #706 - Bugfix: don't allow
kart mergeto fast-forward if the user specifies a merge message. #705 diff,show,create-patchandapplynow handle attached files (as could already be created usingkart commit-files) #583metadata.xmlis now consistently treated as an attached file, rather than as a hidden "meta item". #583applyandmeta setnow support--amendto amend an existing commit- Bugfix: don't allow
kart diffto diff to/from HEAD if HEAD does not yet point to a commit. - Improved progress reporting during working-copy checkout. #738
- Support for changing the primary key column of an existing dataset. #238
- Help for the user get the working copy back into a valid state if a crash or similar causes it to become out of sync with the Kart repo. #751
- Enable the background CLI helper on Linux & macOS in CI builds. The helper improves CLI performance significantly. #776
- Dropped support for a variety of
kart logoptions that were previously being forwarded to Git. #508
- Tab completion. Run
kart config --install-tab-completion=autoto install. Supports Windows cmd, Windows PowerShell, macOS and Linux. #643 - Add
kart helperwhich starts a long running process to reduce the overhead of Python startup.
- Add man-style pagers instead of click's default help page on
kart <command> --help. #643 - Changed format of feature IDs in GeoJSON output to be more informative and consistent. #135
- Fixed primary key issues for shapefile import - now generates an
auto_pkby default, but uses an existing field if specified (doesn't use the FID). #646 - Add
--with-dataset-typesoption tokart meta getwhich is informative now that there is more than one type of dataset. #649 - Support
kart diff COMMIT1 COMMIT2as an alternative to typingkart diff COMMIT1...COMMIT2#666 - Add
kart helperwhich starts a long running process to reduce the overhead of Python startup. - the
--num-processesoption toinitandimportcommands is now deprecated and does nothing. In most situations it offered no performance gain. #692 - Honour symlinks for shared libraries rather than including copies created by PyInstaller. #691
- Strip shared libraries on Linux to reduce package size. #691
- Added support for
--outputoption tokart conflicts. #135 - Bugfix: Better error message on using
kart conflicts -ogeojsonformeta-itemconflicts. #515 - Removed the older
upgrade-to-tidyandupgrade-to-kartfeatures which were only relevant to Sno (predecessor of Kart). #585 - Added support for
--decorateand--no-decorateinkart log. #586 - Bugfix: Fixed a bug where creating a MSSQL working copy fails when there are large (~10KB) geometries. #617
- Bugfix: Fixed
kart diff <commit-id>for a commit containing a dataset that has since been deleted usingkart data rm. #611 - Add
ext-runto provide an execution environment for prototyping ideas/extensions. - Added more context about datasets to JSONL diffs. #624
- Fix
kart branch -o jsonwhen branch HEAD is unborn or repo is empty - this would either fail outright or report that HEAD is on branch "null" which is not exactly true. #637
- Improve performance when creating a working copy in a spatially filtered repository (this was previously slower than in a non-filtered repository; now it is much faster) #561
- Added Sphinx documentation, built from the
docsdirectory. #220
Support for spatial filters - the spatial filter can be updated during an init, clone or checkout by supplying the option --spatial-filter=CRS;GEOMETRY where CRS is a string such as EPSG:4326 and GEOMETRY is a polygon or multigon specified using WKT or hex-encoded WKB. When a spatial filter is set, the working copy will only contain features that intersect the spatial filter, and changes that happened outside the working copy are not shown to the user unless specifically required. Starting with Kart 0.11.0, only the features that are inside the specified spatial filter are downloaded during a clone. Spatial filter docs | #456
- Expanded
--output-format/-oto accept format specifiers; e.g.-o json:compact.kart lognow accepts text formatstrings, e.g.-o text:%H#544 - Deprecated
--json-stylein favour of-o json:{style} - diff: Added
--add-feature-count-estimate=<accuracy>tojson-linesdiffs. This lazily inserts an estimate of the total number of features into the output stream. #543 - Bugfix: fixed errors with Postgres working copies when one or more datasets have no CRS defined. #529
- Bugfix: better error message when
kart importfails due to multiple XML metadata files for a single dataset, which Kart does not support #547 - When there are two pieces of XML metadata for a single dataset, but one is simply a
GDALMultiDomainMetadatawrapping the other, the wrapped version is ignored. #547 - Bugfix: fixed a bug preventing
checkout -b NEW_BRANCH HEAD^and similar commands from working - Bugfix: fixed a bug where
kart mergewould fail in a shallow clone, in certain circumstances. #555
- More advanced filters for
log,diffandcommit: All of these now work:- Wildcard (
*) filters for dataset names, e.g.kart diff -- *parcel*:meta:schema.jsonwill show only schema changes for all datasets withparcelin their names.*by itself matches all datasets. #532 - You can now output the history of individual features:
kart log -- <dataset-name>:feature:<feature-primary-key>. #496
- Wildcard (
kart clonenow strips.gitoff the end of automatically-generated repo paths, if--bareis not specified. #540- Simpler developer builds using CMake, see the contributing notes.
- Bugfix: fixed certificate verification errors when cloning HTTPS repositories on some Linux distributions. #541
- Bugfix: fixed the error when merging a commit where every feature in a dataset is deleted. #506
- Bugfix: Don't allow
--replace-idsto be specified during an import where the primary key is changing. #521
log: Fixed some regressions in 0.10.6 involving argument parsing:- Auto-incrementing PK sequences now work in PostGIS working copies for table names containing the
.character. #468
- Information about the current spatial filter is now shown in
status. #456 - Added a specification for allowed characters & path components in dataset names - see Valid Dataset Names.
- New
kart data rmcommand to simply delete datasets and commit the result #490 - Fix for #491 - make Kart more robust to manual edits to the GPKG working copy that don't leave the metadata exactly as Kart would leave it (such as by leaving unneeded table rows in
gpkg_contents) - Added minimal patches:
kart create-patchnow supports--patch-type minimal, which creates a much-smaller patch; relying on the patch recipient having the HEAD commit in their repository #482kart applynow applies both types of patch.
kart lognow accepts a--marker to signal that all remaining arguments are dataset names. #498importfrom a Postgres or MSSQL source will no longer prepend the database schema name to the imported dataset path.- Bugfix: Diffing between an old commit and the current working copy no longer fails when datasets have been deleted in the intervening commits.
- Bugfix: Existing auto-incrementing integer PK sequences are now overwritten properly in GPKG working copies. #468
- Fixed regressions in
diff -o geojsonsince Kart 0.10.1 #487 - Removed
kart show -o geojson#487 - Fix for #478
merge --dry-runraises error - Fix for #483
differror with Z/M geometries
- Added basic support for spatial filters - the spatial filter can be updated during an
init,cloneorcheckoutby supplying the option--spatial-filter=CRS;GEOMETRYwhere CRS is a string such asEPSG:4326and GEOMETRY is a polygon or multigon specified using WKT or hex-encoded WKB. When a spatial filter is set, the working copy will only contain features that intersect the spatial filter, and changes that happened outside the working copy are not shown to the user unless specifically required. #456
- Auto-incrementing integer PKs: When the working copy is written, Kart now sets up a sequence which supplies the next unassigned PK value and sets it as the default value for the PK column. This helps the user find the next unassigned PK, which can be non-obvious in particular when a spatial filter has been applied and not all features are present in the working copy. #468
- Bugfix: Set GDAL and PROJ environment variables on startup, which fixes an issue where Kart may or may not work properly depending on whether GDAL and PROJ are appropriately configured in the user's environment
- Bugfix:
kart restorenow simply discards all working copy changes, as it is intended to - previously it would complain if there were "structural" schema differences between the working copy and HEAD. - Bugfix: MySQL working copy now works without a timezone database - previously it required that at least
UTCwas defined in such a database. - Feature-count estimates are now more accurate and generally also faster #467
kart lognow supports output in JSON-lines format, so that large logs can be streamed before being entirely generated.
- Added support for the geometry
POINT EMPTYin SQL Server working copy. - Bugfix: fixed the error when writing diff output to a file. #453
- Bugfix: when checking out a dataset that has an integer primary key as a GPKG working copy, Kart should continue to use the actual primary key instead of overriding it, even if the primary key column isn't the first column. #455
Fixed kart upgrade so that it preserves more complicated (or yet-to-be-released) features of V2 repos as they are upgraded to V3. #448
Specifically:
generated-pks.jsonmetadata, extra metadata found in datasets that have an automatically generated primary key and which are maintained by repeatedly importing from a primary-key-less datasource- attachments (which are not yet fully supported by Kart) - arbitrary files kept alongside datasets, such as license or readme files.
kart shownow supports all the same options askart diff. Bothkart diffandkart shownow both support output in JSON-lines format, so that large diffs can be processed as the diff is generated.- Bugfix: diffs containing a mixture of primary key types can now be shown (necessary in the case where the primary key type has changed).
- Some performance improvements - less startup overhead.
Kart v0.10.0 introduces a new repository structure, which is the default, dubbed 'Datasets V3'. Datasets V2 continues to be supported, but all newly created repos are V3 going forward.
- Entire repositories can be upgraded from V2 to V3 using
kart upgrade EXISTING_REPO NEW_REPO. - Anything which works in a V2 repo should work in a V3 repo and vice versa.
- V3 repos are more performant for large datasets - compared to V2 repos where size-on-disk climbs quickly once dataset size exceeds 16 million features.
- The working copy can now be a MySQL database (previously only GPKG, PostGIS and SQL Server working copies were supported). The commands
init,cloneandcreate-workingcopynow all accept working copy paths in the formmysql://HOST/DBNAME#399- Read the documentation at docs/MYSQL_WC.md
- Import of tables using
kart importis now supported from any type of database that Kart also supports writing to as a working copy - namely, GPKG, PostGIS, SQL Server and MySQL. - Support for rapidly calculating or estimating feature-counts - see below.
- Change to
kart data lsJSON output, now includes whether repo is Kart or Sno branded. - Importing from a datasource now samples the first geometry to check the number of dimensions - in case the datasource actually has 3 or 4 dimensions but this fact is not stored in the column metadata (which is not necessarily required by all source types). #337
- Bugfix: Creating a working copy while switching branch now creates a working copy with the post-switch branch checked out, not the pre-switch branch.
- Bugfix: GPKG spatial indexes are now created and deleted properly regardless of the case (upper-case or lower-case) of the table name and geometry column.
- A few bugfixes involving accurately roundtripping boolean and blob types through different working copy types.
- Bugfix: 3D and 4D geometries are now properly roundtripped through SQL Server working copy.
- Fix help text for discarding changes to refer to
kart restoreinstead ofkart reset, askart restoreis now the simplest way to discard changes. #426 import: PostGIS internal views/tables are no longer listed by--listor imported by--all-tables, and can't be imported by name either. #439upgradeno longer adds amainormasterbranch to upgraded repos.
Kart now includes ways to calculate or estimate feature counts for diffs. This encompasses the following changes:
diffnow accepts--only-feature-count=<ACCURACY>, which produces a feature count for the diff.lognow accepts--with-feature-count=<ACCURACY>which adds a feature count to each commit when used with-o json.- All calculated feature counts are stored in a SQLite database in the repo's
.kartdirectory. - Feature counts for commit diffs can be populated in bulk with the new
build-annotationscommand
- First and foremost, the name — we're now called Kart!
- Various local config and structure which was named after
snois now named afterkart- for instance, a Kart repo's objects are now hidden inside a.kartfolder. Sno repos with the older names will continue to be supported going forward. To modify a repo in place to use thekartbased names instead of thesnoones, usekart upgrade-to-kart PATH. import&initare often much faster now because they do imports in parallel subprocesses. Use--num-processesto control this behaviour. #408status -o jsonnow shows which branch you are on, even if that branch doesn't yet have any commits yet.
- Internally, Sno now stores XML metadata in an XML file, instead of nested inside a JSON file. This is part of a longer term plan to make it easier to attach metadata or other files to a repository in a straight-forward way, without having to understand JSON internals. Unfortunately, diffing commits where the XML metadata has been written by Sno 0.8.0 won't work in Sno 0.7.1 or earlier - it will fail with
binascii.Error - Backwards compatibility with Datasets V1 ends at Sno 0.8.0 - all Sno commands except
sno upgradewill no longer work in a V1 repository. Since Datasets V2 has been the default since Sno 0.5.0, most users will be unaffected. Remaining V1 repositories can be upgraded to V2 usingsno upgrade EXISTING_REPO NEW_REPO, and the ability to upgrade from V1 to V2 continues to be supported indefinitely. #342 sno initnow sets the head branch tomainby default, instead ofmaster. To override this, add--initial-branch=masterresetnow behaves more likegit reset- specifically,sno reset COMMITstays on the same branch but sets the branch tip to beCOMMIT. #60importnow accepts a--replace-idsargument for much faster importing of small changesets from large sources. #378
- The working copy can now be a SQL Server database (previously only GPKG and PostGIS working copies were supported). The commands
init,cloneandcreate-workingcopynow all accept working copy paths in the formmssql://HOST/DBNAME/DBSCHEMA#362- Currently requires that the ODBC driver for SQL Server is installed.
- Read the documentation at docs/SQL_SERVER_WC.md
- Support for detecting features which have changed slightly during a re-import from a data source without a primary key, and reimporting them with the same primary key as last time so they show as edits as opposed to inserts. #212
- Optimised GPKG working copies for better performance for large datasets.
- Bugfix - fixed issues roundtripping certain type metadata in the PostGIS working copy: specifically geometry types with 3 or more dimensions (Z/M values) and numeric types with scale.
- Bugfix - if a database schema already exists, Sno shouldn't try to create it, and it shouldn't matter if Sno lacks permission to do so #391
- Internal dependency change - Sno no longer depends on apsw, instead it depends on SQLAlchemy.
initnow accepts a--initial-branchoptionclonenow accepts a--filteroption (advanced users only)show -o jsonnow includes the commit hash in the outputimportfrom Postgres now uses a server-side cursor, which means sno uses less memory- Improved log formatting at higher verbosity levels
sno -vvvwill log SQL queries to the console for debugging
- Any command which outputs JSON would fail in 0.7.0 when run in a terminal unless a JSON style other than
--prettywas explicitly specified, due to a change in the pygments library which Sno's JSON syntax-highlighting code failed to accomodate. This is fixed in the 0.7.1 release. #335
- Support for importing data without a primary key. Since the Sno model requires that every feature has a primary key, primary keys are assigned during import. #212
- Support for checking out a dataset with a string primary key (or other non-integer primary key) as a GPKG working copy. #307
- Improved error recovery: Sno commands now write to the working copy within a single transaction, which is rolled back if the command fails. #281
- Dependency upgrades (GDAL; Git; Pygit2; Libgit2; Spatialite; GEOS) #327
- Bugfixes:
sno meta setdidn't allow updates toschema.json- Fixed a potential
KeyErrorinSchema._try_align - Fixed a potential
unexpected NoneTypeinWorkingCopy.is_dirty - Imports now preserve fixed-precision numeric types in most situations.
- Imports now preserve length of text/string fields.
- Imported fields of type
numericnow stored internally as strings, as required by datasets V2 spec. #325
- Newly created Sno repositories no longer have git internals visible in the main folder - they are hidden away in a '.sno' folder. #147
- The working copy can now be a PostgreSQL / PostGIS database (previously only GPKG working copies were supported). The commands
init,cloneandcreate-workingcopynow all accept working copy paths in the formpostgresql://HOST/DBNAME/DBSCHEMA#267- Read the documentation at docs/POSTGIS_WC.md
- Patches that create or delete datasets are now supported in Datasets V2 #239
applyandimportno longer create empty commits unless you specify--allow-empty#243, #245applycan now apply patches to branches other thanHEAD#294apply,commitandmergecommands now optimise repositories after committing, to avoid poor repo performance. #250commitnow checks that the diff to be committed matches the schema, and rejects diffs that do not - this is possible in working copy formats that have relatively lax type enforcement, ie GPKG #300- Added GPKG support for Sno types that GPKG doesn't support - they are approximated as strings. #304
schema.jsonno longer stores attributes that are null - a missing attribute has the same meaning as that attribute being present and null. #304data lsnow accepts an optional ref argumentmeta getnow accepts a--ref=REFoptionclonenow accepts a--branchoption to clone a specific branch.switch BRANCHnow switches to a newly created local branch that tracksBRANCH, ifBRANCHis a remote branch and not a local branch #259gccommand added (delegates togit gc)- Bugfix - don't drop the user-supplied authority from the supplied CRS and generate a new unrelated one. #278
- Bugfix - generated CRS numbers are now within the user range: 200000 to 209199 #296
Sno v0.5 introduces a new repo layout, which is the default, dubbed 'Datasets V2'
Existing commands are backward compatible with V1 datasets, however some new functionality is only supported in repositories upgraded to the new layout.
- Entire repositories can be upgraded from V1 to V2 using
sno upgrade EXISTING_REPO NEW_REPO. - V2 should support everything V1 supports
- All new repositories use the new layout by default. To opt out, use the
--repo-version=1flag forsno init - A future release will drop support for v1 repositories
- Most schema changes now work
- this includes column adds, drops, renames and reordering.
- Notably, changing the primary key field of a dataset are not yet supported.
- Meta changes are now supported (title, description and XML metadata for each dataset)
importnow has a--replace-existingflag to replace existing dataset(s).
- String primary keys and tables without primary keys are not yet supported. #212
- Changing the primary key column is not yet supported. #238
- Patches which create or delete datasets are not supported. #239
- Schema changes might not be correctly interpreted if too many changes are made at once (eg adding a new column with the same name as a deleted column - sno may incorrectly assume it is the same column).
- It is safest to commit schema changes to any existing columns, then commit schema changes adding any new columns, then commit any feature changes.
- New structure to
sno diffoutput:- Text output: Features are now labelled as
<dataset>:feature:<primary_key>, consistent with meta items that are labelled as<dataset>:meta:<meta_item_name> - JSON output also uses "feature" and "meta" as keys for the different types of changes, instead of "featureChanges" and "metaChanges".
- Text output: Features are now labelled as
sno show -o jsonheader key changed tosno.show/v1, which is not an applyable patch. Usesno create-patchto create a patch.sno upgradenow only takes two arguments:sno upgrade EXISTING_REPO NEW_REPO. No other arguments are required or accepted, exactly how to upgrade the repository is detected automatically.
- Added
sno create-patch <refish>- creates a JSON patch file, which can be applied usingsno apply#210 - Added
sno data ls- shows a list of datasets in the sno repository #203 sno help [command]is a synonym forsno [subcommand] --help#221sno clonenow support shallow clones (--depth N) to avoid cloning a repo's entire history #174sno lognow supports JSON output with--output-format json#170sno meta getnow prints text items as text (not encoded as JSON) #211sno meta getwithout arguments now outputs multiple datasets #217sno diffandsno shownow accept a--crsparameter to reproject output #213- Streaming diffs: less time until first change is shown when diffing large changes. #156
- Working copies are now created automatically. #192
- Commands which are misspelled now suggest the correct spelling #199
- Bugfix: operations that should immediately fail due to dirty working copy no longer partially succeed. #181
- Bugfix: some column datatype conversion issues during import and checkout.
- Linux: Add openssh client dependency into rpm & deb packages. #121
- Windows: Fix missing PROJ data files in packages. #235
- packaging: Fix issue with broken git component paths in packages on macOS and Linux (#143)
- packaging: Exclude dev dependency in macOS package
- Added a
sno meta getcommand for viewing dataset metadata (#136) merge,commit,init,importcommands can now take commit messages as files with--message=@filename.txt. This replaces thesno commit -Foption (#138)import: Added--table-infooption to set dataset metadata, when it can't be autodetected from the source database (#139)pull,push,fetch,clonecommands now show progress - disabled with--quiet(#144)importnow works while on an empty branch (#149)
- Basic conflict resolution:
- Major improvements to
sno importandsno init --import: - Added
sno show: shows a commit. With-o jsongenerates a patch (#48) - Added
sno applyto apply the patches generated bysno show -o json(#61)
- add a changelog (here!)
sno importenhancements (in addition to major changes above):- GPKG database paths no longer need
GPKG:prefix - now takes table names as separate arguments
- Added
--primary-key=FIELDto override primary key field name - Added
--messageto customize the commit message --listno longer requires a repository
- GPKG database paths no longer need
sno init --importenhancements:- imports are much faster (#55)
- now imports all tables from database, doesn't allow table to be specified
- Many JSON output improvements:
- JSON output is specified with
-o jsoninstead of--json(#98) - Added syntax highlighting to JSON output when viewed in a terminal (#54)
sno diffJSON output layout has changed - features are now flat objects instead of GeoJSON objects. This is much more compact (#71)- Added JSON output option for most commands
- Added
--json-styleoption to several commands to control JSON formatting (#70)
- JSON output is specified with
sno diff:sno commit:- can now commit some subset of the changes by supplying filter args, ie
[dataset[:pk]](#69)
- can now commit some subset of the changes by supplying filter args, ie
- removed
import-gpkgcommand; useimportinstead (#85) - Error messages now go to stderr instead of stdout (#57)
- Error conditions now use exit codes to indicate different types of errors (#46)
- Sno is now available on Windows 🎉 (Windows 8.1+ / Server 2016+ (64-bit))
- Updates to continuous integration — installers/archives are now built and tested with every commit for every platform.
- For macOS users, a homebrew "tap" is now available:
brew cask install koordinates/sno/sno - Several bug fixes
- License: sno is now publicly available under the GPL open source license.
- Sno now has a website at sno.earth
- Standalone builds and packaging for Linux and macOS. Windows won't be far behind
- Refactoring to support alternative database working copies
- Dependency upgrades (GDAL; Git; Pygit2; Proj; Libgit2; Sqlite; and others)
- Several bug fixes
If you were running a preview release, remove it before installing the new release:
$ brew uninstall sno
$ brew untap koordinates/snoWe have an initial preview available of our Sno repository hosting. This allows you & your team to push and pull Sno repositories. Please contact support@koordinates.com with your Github username and we can get you set up. There is no cost for this service.
Repositories created with Sno v0.2 are compatible with v0.3. For assistance upgrading any v0.1 repositories, please read our upgrade guide.
- First and foremost, the name — we're now called Sno!
- A new repository structure/layout, which has better performance and a smaller on-disk size
- Data imports are now orders of magnitude faster
- Support for multiple datasets in a single Sno repository
- Support for non-spatial datasets
- Increased test coverage including end-to-end tests
- Improved macOS Homebrew packaging with CI testing.
- Prototype support for spatial-indexing and a sno query command for spatial lookups.
- Diffs across branches/commits, and a GeoJSON diff format.
- Numerous bug fixes