subsurface/core
Linus Torvalds 05e1294be9 git parser: handle left-over multi-line quoted strings better
The git save format is designed to be entirely line-based, where all the
dive data is on individual lines that are independent.

That is very much by design, so that you can merge these files
automatically, and not worry about what it does to the context (contrast
this to structured files like JSON or XML, where you have multiple
levels of indentation, and the context of a line matters).

So the parser can just ignore any conflict markers, and parse everything
one line at a time.

Well, almost.

We do have *one* special form of multi-line context, where flowed text
(think things like dive notes) will have one "header line" that starts
the note, and then it can continue for several lines until the final
line that ends the quote.

In such a situation, the dive merging can result in a partially merged
string note, which has the ending line from one dive, and then continues
with more string data from the other dive.

That will confuse our parser mightily, because it will have seen the end
of the string, and parsed the rest of those string comments as garbage lines.

That part in itself is fine - the garbage lines won't pass as any real
data (because they don't start with a proper keyword), but while parsing
that garbage the *next* end of the string will be seen as a start of a
new string.

And *that* then confuses the git parser to think that the line after
that is now part of the string, and so it won't correctly parse the
non-string line that follows.

To give a more concrete example, the git dive data (here indented and
abbreviated) might look like this:

	suit "5mm long + 3mm hooded vest"
	notes "First boat dive.
		Giant-stride entry."
		Saw a turtle."
	cylinder vol=10.0l description="10.0ℓ" depth=66.019m

where the two notes from the two dives were

	notes "First boat dive.
		Giant-stride entry"

and

	notes "First boat dive.
		Saw a turtle."

respectively, and the merged result contained parts of both.

When we parse this, we will parse the 'notes' line as having the string

	First boat dive.
	Giant-stride entry

which is fine. But then the next line will be that

	Saw a turtle."

and now the ending double quote character on that line will be seen as
the beginning of a new string, and the cylinder information on the next
line will then be mixed up.  The resulting mess will be ignored, but in
the process the data on the "cylinder" line will basically have been
lost.

There are several ways to deal with this, but this particular fix
depends on the fact that we can recognize stale string continuation
lines: they are either empty (for an empty line), or they start with a
TAB character.

So to solve the problem with the mis-identified end quote, this
recognizes that we're in such a "stale left-over comment line" context,
and will just skip such lines entirely.

That does mean that when you have conflicts in dive note sections due to
having edited the dive concurrently on different machines, you may just
lose some of the edits.

But this way at least you shouldn't lose any other data due to the merge
conflict.

NOTE! We could try to improve on this by instead noticing that a "end of
multi-line string has a continuation entry on the next line", and just
say "ok, that wasn't a real end after all".

But that would be an independent thing anyway - this "ignore stale text
comment lines" logic would be required anyway, in case those stale text
comments ended up somewhere *else* than right after another text line.

So do this more important fix first.

Reported-by: Michael Werle
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2022-08-01 11:31:54 -07:00
..
settings Added option to choose between different depth grid quantization schema. 2022-05-21 17:29:40 -07:00
subsurface-qt Allow editing sensors through equipment tab 2022-03-12 11:24:50 -08:00
android.cpp core: move device related functions from display.h to device.h 2022-03-13 15:07:33 -07:00
btdiscovery.cpp core: add new Shearwater dive computer names 2022-06-14 11:15:53 -07:00
btdiscovery.h bluetooth discovery: report more information about progress 2020-09-30 16:40:41 -07:00
checkcloudconnection.cpp Collect and convert git repo data to 'struct git_info' 2022-04-17 22:14:34 -07:00
checkcloudconnection.h cloudstorage: try alternative server if first connection fails 2021-04-19 12:51:01 -07:00
cloudstorage.cpp Qt6: update the connect calls for QNetworkReply 2022-04-18 07:24:39 +02:00
cloudstorage.h get rid of some foreach and Q_FOREACH constructs 2019-04-12 12:59:17 +03:00
CMakeLists.txt core: add class that collects global objects to be deleted on exit 2022-03-16 13:06:06 -07:00
cochran.c cleanup: split out divecomputer functions from dive.c 2020-10-25 13:59:52 -07:00
cochran.h
color.cpp profile: rename GF_LINE color to DURATION_LINE 2021-05-08 13:40:24 +02:00
color.h cleanup: prevent distracing conversion warnings 2022-03-12 08:28:32 -08:00
compressibility.r
configuredivecomputer.cpp cleanup: use pointer-to-function connect() in ConfigureDiveComputer 2020-10-06 10:38:45 -07:00
configuredivecomputer.h cleanup: use pointer-to-function connect() in ConfigureDiveComputer 2020-10-06 10:38:45 -07:00
configuredivecomputerthreads.cpp Cleanup: move error reporting function declarations to errorhelper.h 2019-08-08 16:26:30 -07:00
configuredivecomputerthreads.h
connectionlistmodel.cpp core/bt: ensure that BT/BLE addresses with name sort first 2020-05-15 04:05:06 +03:00
connectionlistmodel.h Mobile: reinstate roleNames function in ConnectionListModel 2019-04-16 23:43:14 +12:00
datatrak.c cleanup: pass all parameters to weightsystem_t 2022-01-02 13:51:07 -08:00
datatrak.h Cleanup: const-ify functions taking dives and divecomputers 2018-08-23 14:41:01 -07:00
deco.c planner: pass in_planner argument to decoMode() 2021-02-17 07:26:55 -08:00
deco.h planner: pass in_planner argument to decoMode() 2021-02-17 07:26:55 -08:00
device.cpp cleanup: remove obsolete includes in core/device.cpp 2022-01-02 13:51:07 -08:00
device.h core: move device related functions from display.h to device.h 2022-03-13 15:07:33 -07:00
devicedetails.cpp
devicedetails.h
dive.c core: add missing properties to the dive merge 2022-06-08 13:29:37 -07:00
dive.h core: remove current_dc macro 2022-03-13 15:07:33 -07:00
divecomputer.c core: add a function to test for sensors of a given cylinder 2021-09-03 13:35:28 -07:00
divecomputer.h Clean up divecomputer 'device' handling 2021-08-18 13:22:02 -07:00
divefilter.cpp build-system: make map support its own thing 2022-04-18 07:24:38 +02:00
divefilter.h filter: provide function that returns all shown dives 2020-12-29 08:34:09 -08:00
divelist.c Don't attempt to compute SAC for CCR dives 2021-11-24 11:03:51 -08:00
divelist.h core: move has_dive helper function 2021-10-30 20:22:52 -07:00
divelogexportlogic.cpp Cleanup: move error reporting function declarations to errorhelper.h 2019-08-08 16:26:30 -07:00
divelogexportlogic.h avoid duplicate and inconsistent applying of QDir::separator() 2019-03-27 07:36:33 -07:00
divemode.h Cleanup: move planner/deco related declarations planner/deco.h 2019-08-08 16:26:31 -07:00
divesite-helper.cpp Dive site: use own copy of taxonomy in dive-site-edit widget 2018-10-13 21:41:41 -04:00
divesite.c core: avoid crash when reading corrupted git data 2022-02-28 14:31:19 -08:00
divesite.h cleanup: move dive_table from dive.h to divelist.h 2020-05-01 09:42:31 -07:00
divesitehelpers.cpp cleanup: replace QRegExp with QRegularExpression 2021-10-27 12:33:20 -07:00
divesitehelpers.h [Bug #2934] Geo Lookup - support for remote dive sites 2020-09-05 17:34:15 +02:00
downloadfromdcthread.cpp Re-do the libdivecomputer fingerprint save/load code 2021-09-19 16:51:46 -07:00
downloadfromdcthread.h Re-do the libdivecomputer fingerprint save/load code 2021-09-19 16:51:46 -07:00
equipment.c core: fold display.h into profile.h 2022-03-13 15:07:33 -07:00
equipment.h cylinders: add cylinder before hidden cylinders 2021-12-13 11:54:24 -08:00
errorhelper.c Don't expose 'detach_buffer()' to membuffer users 2019-10-27 12:42:54 -07:00
errorhelper.h Cleanup: move error reporting function declarations to errorhelper.h 2019-08-08 16:26:30 -07:00
event.c cleanup: break out event-related code into event.[c|h] 2020-10-25 13:59:52 -07:00
event.h cleanup: break out event-related code into event.[c|h] 2020-10-25 13:59:52 -07:00
exif.cpp cleanup: move declaration of utc_mk* functions to new subsurface-time.h header 2020-05-01 09:42:31 -07:00
exif.h
extradata.h cleanup: split out divecomputer functions from dive.c 2020-10-25 13:59:52 -07:00
file.c git access: add proper cleanup function for git_info 2022-04-22 08:28:17 -07:00
file.h devices: create device nodes in parsers 2020-10-24 09:51:37 -07:00
filterconstraint.cpp core: replace dive master by dive guide 2022-02-15 09:35:43 -08:00
filterconstraint.h filter: add tank size filter constraint 2020-10-03 10:29:15 -07:00
filterpreset.cpp filter: remove filter_preset_table_t 2020-10-17 09:04:20 -07:00
filterpreset.h filter: remove filter_preset_table_t 2020-10-17 09:04:20 -07:00
format.cpp core: C++-ify membuffer 2021-07-23 11:22:43 -07:00
format.h Cleanup: Move *_loc formatting functions into new format.cpp file 2018-04-09 11:29:43 -07:00
fulltext.cpp filter: normalize text of fulltext search to base letters 2022-07-08 11:38:44 -07:00
fulltext.h fulltext: remember original query 2020-09-29 16:13:03 -07:00
gas-model.c Don't access gasmix.o2.fraction 2021-10-01 08:50:36 -07:00
gas.c cleanup: fix narrowing type conversion warning 2022-01-02 13:51:07 -08:00
gas.h Don't access gasmix.o2.fraction 2021-10-01 08:50:36 -07:00
gaspressures.c core: fold display.h into profile.h 2022-03-13 15:07:33 -07:00
gaspressures.h cleanup: constify populate_pressure_information() 2021-01-20 10:01:50 -08:00
gettext.h
gettextfromc.cpp Localization: make cache thread safe and robust against use-after-free 2018-06-24 20:31:14 +02:00
gettextfromc.h Localization: remove gettextFromC::instance() 2018-06-24 20:31:14 +02:00
git-access.c git access: add proper cleanup function for git_info 2022-04-22 08:28:17 -07:00
git-access.h git access: add proper cleanup function for git_info 2022-04-22 08:28:17 -07:00
globals.cpp core: add class that collects global objects to be deleted on exit 2022-03-16 13:06:06 -07:00
globals.h core: add class that collects global objects to be deleted on exit 2022-03-16 13:06:06 -07:00
imagedownloader.cpp core: add "transparent" parameter to renderSVGIcon 2021-01-01 21:10:10 +01:00
imagedownloader.h Profile: add "synchronous" mode for picture plotting 2019-02-07 16:06:43 +01:00
import-cobalt.c cleanup: split out divecomputer functions from dive.c 2020-10-25 13:59:52 -07:00
import-csv.c cleanup: make a variable signed 2022-01-02 13:51:07 -08:00
import-csv.h parser: add device_table to parser state 2020-10-24 09:51:37 -07:00
import-divinglog.c core: replace dive master by dive guide 2022-02-15 09:35:43 -08:00
import-seac.c Handle Mulitple Seac Computers colliding during import 2022-05-12 11:07:03 -07:00
import-shearwater.c cleanup: remove system includes from dive.c 2020-10-25 13:59:52 -07:00
import-suunto.c DM5 import: Add dive mode support (OC and CCR) 2022-01-31 09:35:21 -08:00
interpolate.h cleanup: move interpolate inline function to its own header file 2020-10-25 13:59:52 -07:00
ios.cpp core: move device related functions from display.h to device.h 2022-03-13 15:07:33 -07:00
libdivecomputer.c core: work around water temperature bug in Tecdiving DiveComputer.eu 2022-04-13 14:29:10 -07:00
libdivecomputer.h Re-do the libdivecomputer fingerprint save/load code 2021-09-19 16:51:46 -07:00
liquivision.c Maintain sensor index for uemis and liquivision 2022-03-12 11:26:00 -08:00
load-git.c git parser: handle left-over multi-line quoted strings better 2022-08-01 11:31:54 -07:00
macos.c core: move device related functions from display.h to device.h 2022-03-13 15:07:33 -07:00
membuffer.cpp core: C++-ify membuffer 2021-07-23 11:22:43 -07:00
membuffer.h core: C++-ify membuffer 2021-07-23 11:22:43 -07:00
metadata.cpp cleanup: fix SkipEmptyParts warning for mobile 2021-11-24 10:53:26 -08:00
metadata.h Add 'location_t' data structure 2018-10-21 19:55:09 +03:00
metrics.cpp core: remove DPR from IconMetrics class 2021-12-17 11:54:23 -08:00
metrics.h core: remove DPR from IconMetrics class 2021-12-17 11:54:23 -08:00
namecmp.h Qt6: deal with changes from QStringRef to QStringView 2022-03-12 08:28:32 -08:00
ostctools.c cleanup: move sort_dive_table declaration to divetable.h 2020-10-25 13:59:52 -07:00
parse-gpx.cpp Qt6: deal with changes from QStringRef to QStringView 2022-03-12 08:28:32 -08:00
parse-gpx.h cleanup: only include QString in desktop-widgets/importgps.h 2020-05-01 09:42:31 -07:00
parse-xml.c core: replace dive master by dive guide 2022-02-15 09:35:43 -08:00
parse.c core: load and save fingerprints to XML 2021-11-12 12:45:22 -08:00
parse.h core: load and save fingerprints to XML 2021-11-12 12:45:22 -08:00
picture.c core/picture: don't compile all on mobile 2020-11-19 17:18:33 -08:00
picture.h core: move picture-related function from dive.c to picture.c 2020-05-06 13:58:09 -07:00
pictureobj.cpp media: add small C++ helper describing a picture struct 2020-05-06 13:58:09 -07:00
pictureobj.h media: add small C++ helper describing a picture struct 2020-05-06 13:58:09 -07:00
planner.c Planner: Correctly compute CNS and OTU for bailout segments 2021-08-19 10:58:08 -07:00
planner.h cleanup: move DECOTIMESTEP from dive.h to planner.h 2020-05-01 09:42:31 -07:00
plannernotes.c planner: pass in_planner argument to decoMode() 2021-02-17 07:26:55 -08:00
pref.c Added option to choose between different depth grid quantization schema. 2022-05-21 17:29:40 -07:00
pref.h Added option to choose between different depth grid quantization schema. 2022-05-21 17:29:40 -07:00
profile.c Use 10ft as deco step size in imperial units in profile 2022-05-06 14:17:29 -07:00
profile.h core: fold display.h into profile.h 2022-03-13 15:07:33 -07:00
qt-ble.cpp Qt6: use the newer createCentral() API 2022-03-12 08:28:32 -08:00
qt-ble.h Qt6: Bluetooth API changes 2022-03-12 08:28:32 -08:00
qt-gui.h mobile/UI: remember the system default font size 2021-01-19 12:35:29 -08:00
qt-init.cpp translations: fix Portuguese parent translation 2022-03-27 17:11:05 -07:00
qthelper.cpp core: allow separators ,; after degree-style coord 2022-03-27 16:37:10 -07:00
qthelper.h Collect and convert git repo data to 'struct git_info' 2022-04-17 22:14:34 -07:00
qtserialbluetooth.cpp Use QtBluetooth enums from their namespace 2021-03-12 08:41:31 -08:00
sample.c cleanup: split out divecomputer functions from dive.c 2020-10-25 13:59:52 -07:00
sample.h core: use int16_t for sensor-id 2021-07-23 11:16:00 -07:00
save-git.c git access: save to local repository before doing remote access 2022-04-22 08:28:17 -07:00
save-html.c core: replace dive master by dive guide 2022-02-15 09:35:43 -08:00
save-html.h Cleanup: move error reporting function declarations to errorhelper.h 2019-08-08 16:26:30 -07:00
save-profiledata.c core: fold display.h into profile.h 2022-03-13 15:07:33 -07:00
save-profiledata.h Cleanup: move file-related function declarations to file.h 2019-08-08 16:26:31 -07:00
save-xml.c git access: add proper cleanup function for git_info 2022-04-22 08:28:17 -07:00
selection.cpp selection: when changing current dive make sure it is selected 2020-09-20 18:23:57 -07:00
selection.h selection: create global single_selected_trip() function 2020-05-03 15:02:21 -07:00
serial_ftdi.c core: fix libdivecomputer dc_custom callbacks structures 2020-06-18 09:05:13 -07:00
serial_usb_android.cpp android/usb: remove "autoselect driver" option for unknown VID/PIDs 2020-03-16 07:58:20 -07:00
serial_usb_android.h android/usb: pass in the UsbDevice when downloading 2020-03-16 07:58:20 -07:00
sha1.c
sha1.h
ssrf.h core: remove LOG_STP from mobile 2019-12-13 07:04:00 -05:00
statistics.c core: fold display.h into profile.h 2022-03-13 15:07:33 -07:00
statistics.h cleanup: remove system includes from dive.c 2020-10-25 13:59:52 -07:00
string-format.cpp formatting: move get_trip_title to string-format.h and split it 2021-12-17 10:36:13 -08:00
string-format.h formatting: move get_trip_title to string-format.h and split it 2021-12-17 10:36:13 -08:00
strndup.h
strtod.c Core: introduce new subsurface-string header 2018-05-14 10:13:39 -07:00
structured_list.h media: use table instead of linked list for media 2020-05-06 13:58:09 -07:00
subsurface-string.h Core: don't inline rarely used function 2018-05-14 10:13:39 -07:00
subsurface-time.h cleanup: const-ify utc_mktime() 2020-12-29 08:34:09 -08:00
subsurfacestartup.c git access: add proper cleanup function for git_info 2022-04-22 08:28:17 -07:00
subsurfacestartup.h cleanup: move application flags to core/subsurfacehelper.h 2020-10-25 13:59:52 -07:00
subsurfacesysinfo.cpp cleanup: refactor subsurfacesysinfo.cpp 2020-10-27 16:18:09 -07:00
subsurfacesysinfo.h cleanup: refactor subsurfacesysinfo.cpp 2020-10-27 16:18:09 -07:00
table.h media: create sort_picture_table function via macro 2020-05-06 13:58:09 -07:00
tag.c Don't expose 'detach_buffer()' to membuffer users 2019-10-27 12:42:54 -07:00
tag.h Cleanup: move tag functions into own translation unit 2019-06-19 13:11:10 -07:00
taxonomy.c cleanup: make taxonomy_index_for_category() local to taxonomy.c 2020-09-06 12:59:54 -07:00
taxonomy.h cleanup: make taxonomy_index_for_category() local to taxonomy.c 2020-09-06 12:59:54 -07:00
time.c trivial: remove obscure division-assignment operator 2022-08-01 11:30:53 -07:00
timer.c Add timestamps to libdivecomputer.log 2020-03-10 17:42:54 -07:00
timer.h Add timestamps to libdivecomputer.log 2020-03-10 17:42:54 -07:00
trip.c cleanup: fix over-eager Coverity warnings 2020-10-25 13:58:03 -07:00
trip.h selection: add selection flag for trips 2020-05-03 15:02:21 -07:00
uemis-downloader.c bugfix: call fprintf() instead of printf() 2022-02-15 14:26:43 -08:00
uemis.c Maintain sensor index for uemis and liquivision 2022-03-12 11:26:00 -08:00
uemis.h Dive site: use pointer instead of uuid in uemis_helper 2018-10-29 00:09:31 +00:00
units.c core: return floating point from to_PSI() functions 2021-12-17 11:54:23 -08:00
units.h Deal with negative variation times 2022-06-04 14:19:05 -07:00
unix.c core: move device related functions from display.h to device.h 2022-03-13 15:07:33 -07:00
uploadDiveLogsDE.cpp Qt6: update the connect calls for QNetworkReply 2022-04-18 07:24:39 +02:00
uploadDiveLogsDE.h export: clean up temp file after divelogs.de upload 2021-08-06 11:05:06 -07:00
uploadDiveShare.cpp Qt6: update the connect calls for QNetworkReply 2022-04-18 07:24:39 +02:00
uploadDiveShare.h core: divehare change slot names 2019-12-12 10:10:01 -05:00
version.c
version.h
videoframeextractor.cpp Cleanup: move error reporting function declarations to errorhelper.h 2019-08-08 16:26:30 -07:00
videoframeextractor.h Dive media: Extract thumbnails from videos with ffmpeg 2018-07-28 15:31:25 -07:00
webservice.h
windows.c core: move device related functions from display.h to device.h 2022-03-13 15:07:33 -07:00
windowtitleupdate.cpp Cleanup: Make WindowsTitleUpdate a global object 2018-07-30 13:55:23 -07:00
windowtitleupdate.h Cleanup: Make WindowsTitleUpdate a global object 2018-07-30 13:55:23 -07:00
worldmap-options.h
worldmap-save.c cleanup: move dive_table from dive.h to divelist.h 2020-05-01 09:42:31 -07:00
worldmap-save.h Cleanup: remove const bool parameters and return types 2020-02-09 12:13:18 -08:00
xmlparams.cpp core: add a small helper-struct that keeps track of xml-parameters 2020-10-23 18:17:02 -07:00
xmlparams.h core: add a small helper-struct that keeps track of xml-parameters 2020-10-23 18:17:02 -07:00
xmp_parser.cpp cleanup: move declaration of utc_mk* functions to new subsurface-time.h header 2020-05-01 09:42:31 -07:00
xmp_parser.h Metadata: rudimentary support for XMP metadataa in MP4-based videos 2018-09-25 14:59:14 -07:00