JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [],
"is_fork": true,
"size_kb": 100618,
"has_wiki": true,
"homepage": null,
"languages": {
"C": 909138,
"R": 4070,
"C++": 1432731,
"CSS": 12885,
"QML": 62923,
"HTML": 33129,
"Perl": 8743,
"XSLT": 235279,
"CMake": 42511,
"QMake": 8972,
"Shell": 71371,
"Makefile": 3446,
"JavaScript": 40793,
"Objective-C": 301
},
"pushed_at": "2018-12-10T12:01:03Z",
"created_at": "2013-04-01T14:06:24Z",
"owner_type": "User",
"updated_at": "2020-04-26T23:13:34Z",
"description": "Rough divelog in C and Gtk",
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "master",
"license_spdx_raw": null,
"primary_language": "C++",
"significant_languages": [
"C++",
"C"
]
},
"owner": {
"blog": "https://tcanabrava.github.io",
"name": "Tomaz Canabrava",
"type": "User",
"login": "tcanabrava",
"company": "KDE",
"location": "Munchen",
"followers": 171,
"avatar_url": "https://avatars.githubusercontent.com/u/4027216?v=4",
"created_at": "2013-04-01T14:04:02Z",
"is_verified": null,
"public_repos": 34,
"account_age_days": 4864
},
"license": {
"state": "absent",
"spdx_id": null,
"raw_spdx": null,
"file_present": false,
"scorecard_found": false,
"profile_has_license": false
},
"activity": {
"releases": [
{
"tag": "v4.4.1",
"kind": "patch",
"published_at": "2015-02-18T19:11:03Z"
},
{
"tag": "v4.4.0",
"kind": "minor",
"published_at": "2015-02-04T16:00:33Z"
},
{
"tag": "v4.3.970",
"kind": "patch",
"published_at": "2015-02-01T15:24:48Z"
},
{
"tag": "v4.3.960",
"kind": "patch",
"published_at": "2015-01-25T21:40:18Z"
},
{
"tag": "v4.3.950",
"kind": "patch",
"published_at": "2015-01-24T02:52:26Z"
},
{
"tag": "v4.2.91",
"kind": "patch",
"published_at": "2014-12-09T02:49:01Z"
},
{
"tag": "v4.2.90",
"kind": "patch",
"published_at": "2014-11-17T22:27:05Z"
},
{
"tag": "v4.2.1",
"kind": "patch",
"published_at": "2014-11-13T18:25:56Z"
},
{
"tag": "v4.1.94",
"kind": "patch",
"published_at": "2014-08-05T22:50:14Z"
},
{
"tag": "v4.1.93",
"kind": "patch",
"published_at": "2014-07-25T19:51:23Z"
},
{
"tag": "v4.1.92",
"kind": "patch",
"published_at": "2014-07-24T20:53:21Z"
},
{
"tag": "v4.1.91",
"kind": "patch",
"published_at": "2014-07-19T01:46:51Z"
},
{
"tag": "v4.1.90",
"kind": "patch",
"published_at": "2014-07-13T04:09:32Z"
},
{
"tag": "v4.0.99",
"kind": "patch",
"published_at": "2014-05-06T18:32:48Z"
},
{
"tag": "v4.0.98",
"kind": "patch",
"published_at": "2014-05-02T04:30:29Z"
},
{
"tag": "v4.0.97",
"kind": "patch",
"published_at": "2014-05-01T22:23:33Z"
},
{
"tag": "v4.0.96",
"kind": "patch",
"published_at": "2014-04-25T14:20:33Z"
},
{
"tag": "v4.0.3",
"kind": "patch",
"published_at": "2014-02-16T03:38:11Z"
},
{
"tag": "v4.0.2",
"kind": "patch",
"published_at": "2014-01-09T08:09:43Z"
},
{
"tag": "v4.0.1",
"kind": "patch",
"published_at": "2014-01-03T11:18:59Z"
},
{
"tag": "v3.9.2",
"kind": "patch",
"published_at": "2013-12-07T06:57:39Z"
},
{
"tag": "v3.9.1",
"kind": "patch",
"published_at": "2013-11-28T05:27:01Z"
},
{
"tag": "v3.1.1",
"kind": "patch",
"published_at": "2013-06-30T16:47:46Z"
},
{
"tag": "v3.0.2",
"kind": "patch",
"published_at": "2013-03-04T08:26:32Z"
},
{
"tag": "v3.0.1",
"kind": "patch",
"published_at": "2013-02-26T21:29:23Z"
},
{
"tag": "v2.0.1",
"kind": "patch",
"published_at": "2012-10-07T12:02:48Z"
}
],
"recent_commits": [
{
"oid": "67742856b2d8b3659505fd094cd0c6b86785da26",
"body": "If no timestamp is available, just start at dive 0.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: don't try to scroll to dive at time 0",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-14T18:49:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "95292ac560bac1365f022ba85b19520ce787ca5b",
"body": "Having build number as mandatory parameter seems unnecessary, thus\nsetting default value (used for andoird:versionCode) to 0.\n\nSigned-off-by: Miika Turkia <miika.turkia@gmail.com>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Set default build number for apk building",
"author_name": "Miika Turkia",
"author_login": "mturkia",
"committed_at": "2016-04-14T18:02:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "454a62c835d9e9e183438eb491c54be2de4e4254",
"body": "Running subsurface/packaging/android/build.sh after deleting\nsubsurface-mobile-build-arm directory fails for me due to missing\nssrf-version.h file. Just ignore if it doesn't exist.\n\nSigned-off-by: Miika Turkia <miika.turkia@gmail.com>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Fix initial build of APK",
"author_name": "Miika Turkia",
"author_login": "mturkia",
"committed_at": "2016-04-14T17:59:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f9853fc4495cc70db260a0b8bca5aa13e00ce6c",
"body": "Commit 339411cca69b in Kirigami master tries to reparent the OverlaySheet\nto the page that it is related to. Unfortunately the heuristic used there\nto find the right object assumes that every page has a contentItem\nproperty, which our DiveDetails page doesn't have.\n\nAs a hack to work around this issue (until this is fixed upstream in\nKirigami) we simply create such a property. This commit should be\nreverted once Kirigami upstream has been fixed.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Hack to work around issue in current Kirigami master",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-14T17:53:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6e6cce770b671cea58251475546c77c5bc1468be",
"body": "The manager can now directly update the index of the selected dive, and\nthe UI tells the manager the timestamp of the currently selected dive.\nThis allows the manager to pick the best possible dive as selected dive\nif things change (for example if the dive list gets reloaded because it\nchanged in cloud storage).\n\nFixes #1009\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: keep QML manager and the UI in sync about selected dive",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-14T16:43:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5909e438c9394f7e831d7d9f912788ade87b6b1f",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Make it easy to access the sort model from the QML manager",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-14T16:43:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "287823626823ad139986685f1a310fe2539aeac0",
"body": "If the automatic sync is turned off we could be stuck in a state where we\nalways thought that we were already in the middle of a save.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: clear the flag indicating that we are accessing storage",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-14T16:43:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c84f16e7f68df2227cec202feb8948eb75ac6613",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Make the raw timestamp available in QML",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-14T16:43:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "590af9ae7dced1ca87b38f1ab3774d3a2b678ba1",
"body": "If we want to keep the selected dive \"close\" to where it was before an\noperation (whether a delete, or a reload, or something like that), then\nthe most intuitive thing to do appears to be to select either the same\ndive again (if it still exists), or one very close to it in time. This\nhelper allows u\n[…]\n to ensure that we look at all dives in the\ndive_table - based on the id that is returned the UI can then figure out\nwhere this dive is currently shown.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Add helper to find the dive closest to a given time",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-14T16:42:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "176b92776b45d6f1135441513727cb5f23f49d88",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Silence warning",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-14T16:19:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9a2e3ce7e8cbdf67f32b8581ac3e9735f4824793",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Remove unused function",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-13T16:28:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c0a4ffead8c29b7bfc32111bc140745248abe796",
"body": "... so others might have less trouble.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Build instructions to deplay on you own iOS device",
"author_name": "Robert C. Helling",
"author_login": "atdotde",
"committed_at": "2016-04-11T19:42:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7bca367c57af95bd7b863e398f810b2efe38878c",
"body": "Before it had the next dive still selected.\n\nFixes #1053\n\nSigned-off-by: Robert C. Helling <helling@atdotde.de>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Upon undoing a dive deletion select that dive",
"author_name": "Robert Helling",
"author_login": "atdotde",
"committed_at": "2016-04-11T19:41:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e1af20728e76acbc3cd6e5e4b8cfbbd31a70f028",
"body": null,
"is_bot": false,
"headline": "Merge branch 'for_dirkhh' of https://github.com/atdotde/subsurface",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-11T19:40:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "22afd4a1ced1c3c6c2a2324e4091c7aeb001ebad",
"body": "The variables that control each CVA iteration should be declared at the start\nof each loop so that the values are carried over from one iteration to the\nnext.\n\nSigned-off-by: Rick Walsh <rickmwalsh@gmail.com>\nSigned-off-by: Robert C. Helling <helling@atdotde.de>",
"is_bot": false,
"headline": "VPM-B profile: declare CVA iteration variables within each loop",
"author_name": "Rick Walsh",
"author_login": "RickMWalsh",
"committed_at": "2016-04-11T19:24:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a260dc2f8ac3123b85a9f5bd0a3fd3186db67055",
"body": "In our verision of VPM-B for real dives, we take as the deco time the\ndifference between the time of the deepest ceiling and the time when the\nceiling clears.\n\nWhen the display of ceilings was set to multiples of 3m this was confused, as\nthe maximum finder had issues: First of all, it updated the ti\n[…]\nd was used.\n\nThis patch uses the actual ceiling (not rounded to the next integer multiple of 3m)\nfor this calculation to get rid of this problem.\n\nSigned-off-by: Robert C. Helling <helling@atdotde.de>",
"is_bot": false,
"headline": "Fix time of first ceiling calculation",
"author_name": "Robert C. Helling",
"author_login": "atdotde",
"committed_at": "2016-04-11T19:23:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "effad4b2c8c1b929125e499af3071232aee59938",
"body": "The Seabear import fixed up the NDL and TTS in the samples from minutes\n(in the import) to seconds (our internal format for all time). But it\ndid it with a loop that overran the end of the samples array by one:\n\n\tfor(int s_nr = 0 ; s_nr <= dive->dc.samples ; s_nr++) {\n\nFix it to use the proper \"<\" \n[…]\nted-by: Stuart Vernon <stuartv@force2.net>\nTested-by: Miika Turkia <miika.turkia@gmail.com>\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Fix seabear import sample overrun bug",
"author_name": "Linus Torvalds",
"author_login": "torvalds",
"committed_at": "2016-04-11T19:23:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ccff22759612455ba5b4eb7232b6b8d50177ba4a",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Fix wrong function call for desktop build of Subsurface-mobile",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-11T16:56:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "18b7ee3875f8e469a456b61f78fa3ab85b7f5041",
"body": "On Android we can save locally right away, but we don't want to make the user\nwait for a network sync. Sadly, on Android currently the saving in the\nbackground doesn't work and the save will run when the user comes back.\nDefinitely not ideal.\n\nOn iOS the situation is different - a save to the local \n[…]\n builds of\nSubsurface-mobile? But there may be other mobile OSs that people might want to\nbuild it on) we save both locally and to the cloud right away.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: try to do the right thing for changes on all platforms",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-11T02:22:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4ed369b9759d2a720cffcba3062d50713233150d",
"body": "So when the user taps on the manual cloud sync, we always force access to\nthe cloud server. Otherwise we only access the cloud server if\ngit_local_only isn't set.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: only force network access when user asks us to",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-08T19:37:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "685d31cd4fda38c5d7c410356bbb2398d6dc2867",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Simplify code - we now can rely on git_local_only to do the right thing",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-08T19:34:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eefda2b090b9c802051f60b95078993d312a8a1d",
"body": "This is silly - it should be set up so it wraps by itself...\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: reformat the warning message when turning off auto sync",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-08T19:29:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a1ec0d672493d1bb5e05042b1e0a05fce8ba42e4",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "git storage: only sync with remote if git_local_only isn't set",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-08T19:29:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e2e4bb6c2ac52c7df99d4284389fb490fcabe588",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: change order of cloud backend accesses",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-08T19:28:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "829369c18acea2b7ddf421559f924aaf2d3366ef",
"body": "Remove the border and make them look more like labels. This adds a\nStyledTextField for that purpose. And while we are at it, we can make that\nStyledTextField a little prettier.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: make readonly fields more obvious in dive edit",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-08T18:14:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "df2e7c052bffcc69d8409c9753a338f500b00bdf",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: make gas mix validator case insensitive",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-08T05:57:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "069cb8f6c5f47f2c007a39f4dd80272a0d05d056",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "remove reference to non-existing object",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-08T05:57:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1004ced28592137586beff53b2c307c0b4164c3f",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "avoid dereferencing undefined object",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-08T05:57:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "12f0af19cbfec25befa9f2c2aee42edbee65068a",
"body": "This makes the start page look a bit more natural\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: remove redundant heading",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-08T05:57:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "41ab12533b33174c080fcdd0008a56f3bde6194b",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: more fixes to correctly calculate page widths",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-08T05:57:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0e49d6965cbdbf387c0fe316338805d3232c0d3d",
"body": "Fixes #1049\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: fix page width calculation for dive details",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-07T18:22:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f7e509f9afe57f81adda9649dc4f57a27faf5c7",
"body": "This makes the code much cleaner and easier to understand and should allow\nus to then switch back to doing at least the local save right after we make\nany changes to the data.\n\nThis commit also tries to make sure that the accessingCloud status stays\ncorrect and consistent throughout all the various success and error paths.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: break the sync into explicit save local and save cloud",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T18:47:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3bafc2a4e6c0e7c34f941332e15677c35be3297c",
"body": "Having a short delay before the menu closes looks bad.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: close the drawer right when the user taps sync manually",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T18:46:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "961b80ec20e48e0ffaef93bbcb1951560902fbff",
"body": "We rely on the filename being valid elsewhere in the code.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: after successfully opening storage, store the filename",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T18:44:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6a23e0ef664d081ec9351603c76af8c46edd4e89",
"body": "If the user is on the credentials page, doesn't change the credentials\nbut simply taps on save, they now get back to the dive list.\n\nFixes #1047\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: save with unchanged credentials returns to dive list",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T18:42:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f21b36d9ba15bb36b4b3cda49498cbf95606c2ae",
"body": "This way the user gets to see the git notifications.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: hide keyboard before saving credentials",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T18:40:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6725d54db2a1793c3483385daffd6be8acc6a3b9",
"body": "This updates the got progress indicator to the changed interface where we don't\npass in an explicit percentage.\n\nIt also finally fixes an old problem: If we don't allow the Qt main loop to\nprocess the events, we'll never see a decent progress indicator...\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Desktop UI: make sure that git progress is actually shown",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T06:43:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "922c945f5a5199fb27f9b68272157a238d2c371e",
"body": "I gave up on the magic numbers and instead report simply linear progress.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: more hacking around with git progress reporting",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T06:39:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3555cadb77ca25fcf4883a5f1506e83222d6b29d",
"body": "We first check the sha to see if we want to load at all. But at that\npoint we already have the repository and the branch and we have synced\nwith the remote. So when we decide that we need to reload from storage,\nwe don't need to repeat those steps, instead we can go directly to the\ngit load.\n\nFor that to work we need to pass the repository pointer and the branch\nname back to the caller so that we can directly call git_load_dives().\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: don't fetch the remote twice when loading",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T05:57:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b670c3f3f937ca7b491e3e44f462a86b1509f53",
"body": "We first want to save any exiting unsaved changes to the local repository\n(and ONLY to the local repository). After that we want to make sure that\nwe are syncing remotely, fetch the remote and then (possibly after a\nmerge) push the changes to the remote. In the end we reset the previous\n\"local git only\" preference which we overwrote for this manual forced\nsync.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: restructure (and fix) the saveChanges logic",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T05:57:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8af45342863f096aee1359b1702c774035466c58",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: don't try to save again if we are already saving",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T04:36:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c3ab4dfc3e59515fd36cfa99c61f2b431f0480ea",
"body": "We had a redundant check of the server reply hidden in there, and the\nlogic which values were set where didn't really make much sense. This\nseems clearer to me.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: simplify code for loading data from the cloud",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T04:32:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a1332ce36148e097fe7a9d7764bc02152d3b8425",
"body": "With Linus' changes to the tree creation saving the dives is no longer\nthe dominant part of that process, so simplify the output (which also\nremoves the hacky buggy code to show the percentages that is of course\ntotally bogus).\n\n(apparently a couple of white space cleanups snuck into this patch)\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Simplify git tracking of git tree creation",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T04:23:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "afb5bb8b06b079ffbccc970554733e63ee77b5b5",
"body": "And don't waste quite as much time on updating the UI.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: simplify git tracking output",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T04:20:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1634c62b9a156b59faab4ed89d64c359ba0580f2",
"body": "Most of the time we are adding all the dives, so do this in a single model\noperation. This makes the case when adding a single dive (in the undo delete\nfunction) slightly more complicated, but that seems totally worth it for the\nspeedup in the common case.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "DiveListModel: don't add the dives one at a time",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T04:17:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f16a3a1709be50cb2ed4f4ca0e1e9bb5217cc25f",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Keep the instance in static variable",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T04:16:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f869ce51b473aff2818afd365013b777c3413524",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "git storage: add explanation for fast forward to remote",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T04:13:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "092d0478c3729689b7f76eb5674eb55d8d33e47c",
"body": "Otherwise by the time we make the comparison the saved_git_id has already\nbeen updated.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "git storage: compare with correct SHA when checking if cache is current",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-06T04:10:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "485c5a4ebd02279ba88ffedf026e384197820668",
"body": "John Van Ostrand reports that when he dives using two cylinders using\nsidemounts, the per-cylinder SAC rate display is very misleading.\n\nWhat happens is that since the two cylinders are used together (but\nwithout a manifold), John is alternating between the two but not\nactually adding gas switches i\n[…]\nt know what the mean depths might be\".\n\nReported-by: John Van Ostrand <john@vanostrand.com>\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Fix per-cylinder SAC rate calculations when cylinder use isn't known",
"author_name": "Linus Torvalds",
"author_login": "torvalds",
"committed_at": "2016-04-05T23:53:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ff8392da54a01013c47bdd87ee57895536d639ba",
"body": "It's good that this is unused, because it does the calculations wrong.\n\nDue to the gas compressibility the gas use calculations should subtract\nthe gas_volume() values at the differing pressures, not the pressures\nthemselves.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Remove unused and buggy get_cylinder_used_gas_string() function",
"author_name": "Linus Torvalds",
"author_login": "torvalds",
"committed_at": "2016-04-05T23:52:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6d1effe8864894f7268289ae6ee71067b0c9e756",
"body": "The fonts on my Nexus 6p are way too big (especially when compared\nto the fonts of the same build on an iPhone 6plus that has very\nsimilar screen size). Simply trying to get more data...\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: more theme information",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-05T23:50:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "65696e1eb552f8c8bccdadff8a70384711d5be2a",
"body": "Not that it appears to have been an issue, it just seemed wrong for this\nto be Android only...\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Don't set the window size on iOS, either",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-05T23:49:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8afdb665cde5e06ff42b3f406f637d3ca44f20e2",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: dive list: smaller header above dives that aren't in a trip",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-05T23:02:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7101cc8c021f414811eca2425cb39db44828554c",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: remove redundant dive log title",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-05T22:54:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3c1d8ec2918bbe28a24edd8978aa4b3ffc924ba0",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "remove code that is no longer used",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-05T22:53:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5dab95b3647fd410fdd469365dfbcab7db093919",
"body": "The issue with needing extra space at the top of the page has been\nfixed upstream.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: use Kirigami default padding",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-05T22:49:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "21e8b1e363fcb46798aec49b623cfd2b29c286a3",
"body": "A few more fixes for things that broke in commit 7be962bfc287 (\"Move\nsubsurface-core to core and qt-mobile to mobile-widgets\").\n\n[Dirk Hohndel: slightly edited and overlap with Linus' patch removed]\n\nSigned-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Fix compilation with the new folder architecture",
"author_name": "Tomaz Canabrava",
"author_login": "tcanabrava",
"committed_at": "2016-04-05T19:32:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6d6ba8b54aad2ebcd7fc4259f6c9976022362ee5",
"body": "This tries to give the best information about the trip that we have.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: better trip header",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-05T19:27:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3472f2035491b9801058ea76a828e80f01b70f80",
"body": "Subsurface-mobile is the name of the app, but not a good title for\nthe Dive list / Cloud credential page\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: dynamic page title for the root page",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-05T16:52:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "77e83e88432844d46cea2aef9f044945ebe66334",
"body": "This is where the back button is located on iOS.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: keep the title bar larger on iOS",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-05T16:42:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ad2ac58ea2c7a696227b2db243a76adb633158dd",
"body": "As expected, commit 7be962bfc287 (\"Move subsurface-core to core and qt-mobile\nto mobile-widgets\") caused some breakage.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Fix include paths",
"author_name": "Linus Torvalds",
"author_login": "torvalds",
"committed_at": "2016-04-05T16:40:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0a4b2464216d7e701e500b5a9f3370aab04791c5",
"body": "Also removes an unused variable.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Small cleanup of helper functions to remove unused arguments",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-05T14:40:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "710e2150c84c50d059e84afb9f25e75fc781f125",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Add another Kirigami file and sort the private ones",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-05T14:32:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eff405980214d8324d5448b5ed9e80a96addde9c",
"body": "Now that gas switch events always have indices into the cylinder table,\nstart using that to look up the gas mix from the cylinders rather than\nfrom the gas switch event itself. In other words, the cylinder index is\nnow the primary data for gas switch events.\n\nThis means that now as you change the c\n[…]\nlue, even if\nthe gasmix has changed, so that remains as a record of the original\ndownload.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Start using the actual cylinder data for gas switch events",
"author_name": "Linus Torvalds",
"author_login": "torvalds",
"committed_at": "2016-04-05T05:37:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e0824ef9f3e2a0cc0fae435b8e3560b309d9708e",
"body": "In commit df4e26c8757a (\"Start sanitizing gaschange event information\")\nback about a year and a half ago, I started sanitizing the gas switch\nevent data, allowing gas switches to be associated with a particular\ncylinder index rather than just the gas mix that is switched to.\n\nBut that initial step o\n[…]\nnot just the event but also\nthe dive pointer to the routines that look up gas mix details.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Make gas change events always have a cylinder index",
"author_name": "Linus Torvalds",
"author_login": "torvalds",
"committed_at": "2016-04-05T05:37:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7a444c0210783b926c9f60dd7b436eb086e8f396",
"body": "Some of the gas mix cleanups I'm doing are in code that uses const\npointers, and wants to use this.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Make cylinder_nodata() take a const cylinder pointer",
"author_name": "Linus Torvalds",
"author_login": "torvalds",
"committed_at": "2016-04-05T05:37:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "900527498690c80b5303a608002431966bacae93",
"body": "The gas switch event handling is somewhat fragile, mostly because the\nlegacy event encoding for gas switches is odd. It's also limited to\nwhole percentages, unlike our internal gas mix model.\n\nIn addition, it also ends up comparing the values to the raw permille\nvalues, which is wrong for air, and \n[…]\n, and should match 20.9%. And use the proper accessor functions to\nget the gasmix values.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Make \"is_gasmix_redundant()\" more robust",
"author_name": "Linus Torvalds",
"author_login": "torvalds",
"committed_at": "2016-04-05T05:37:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "eb5907ab3b8805d4c9990cba45ac4b46f6e5cdb8",
"body": "Dirk says that divinglog hasn't been doing the linear pressure\ninterpolation for a long while, so we're doing extra dive fixups that\nreally aren't needed any more.\n\nAlso, the code is actually buggy: it only ever worked on the first\ncylinder anyway (because only the first cylinder pressure_delta[] wo\n[…]\na bit hard to read, so let's get rid of it if there is\nno reason to maintain it or fix it.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Remove linear pressure interpolation detection code",
"author_name": "Linus Torvalds",
"author_login": "torvalds",
"committed_at": "2016-04-05T05:37:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7be962bfc2879a72c32ff67518731347dcdff6de",
"body": "Having subsurface-core as a directory name really messes with\nautocomplete and is obviously redundant. Simmilarly, qt-mobile caused an\nautocomplete conflict and also was inconsistent with the desktop-widget\nname for the directory containing the \"other\" UI.\n\nAnd while cleaning up the resulting change\n[…]\nrall.\n\nThis could have been handled in more commits, but since this requires a\nmake clean before the build, it seemed more sensible to do it all in one.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Move subsurface-core to core and qt-mobile to mobile-widgets",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-05T05:33:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2d760a7bff71c46c5aeba37c40d236ea16eefea2",
"body": "This caches the git ID for the dive on load, and avoids building the\ndive directory and hashing it on save as long as nothing has invalidated\nthe git ID cache.\n\nThat should make it much faster to write back data to the git\nrepository, since the dive tree structure and the divecomputer blobs in\nparti\n[…]\nn mobile with much weaker CPU's. This should\nspeed things up by at least a factor of two.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Don't write back dive data that hasn't changed in git",
"author_name": "Linus Torvalds",
"author_login": "torvalds",
"committed_at": "2016-04-05T00:27:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2b36091599cbc51474e103f14037e5ac44215cf3",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: include the new back button for iOS",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:55:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1bbf6ab8a8b16f81d82134f80c257ee3472d3f2d",
"body": "This reverts commit 410fd222d15dca8673606133499cefde780f163b.\n\nThe change this relied on was rejected by upstream Kirigami\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Revert \"QML UI: make sure the correct data is in the bread crumbs\"",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:24:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e0ad3c85d17ff554775df8c5f40a19b16a671b30",
"body": "This now uses the correct property to open the OverlaySheet.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: animate showing the dive edit sheet",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:23:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d8ec9597fa27a5e90f4d24d1b96d6604949bf7df",
"body": "This reverts commit faa22d5343f39f335bc281e139bc347241295ebf.\n\nUpstream Kirigami already had a property to do this. Oops.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Revert \"QML UI: animate showing the dive edit sheet\"",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:22:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e50a3470c1810d5c80ff8f96e03a50dbc9fba254",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: rate limit git progress output",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:19:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9283332b95d3e41f43f3300667ac7523f58ab14b",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Use the same format for output to stderr and AppLog",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:19:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f7564c2b776f93cb1c2af2da26a44ef2eaaec837",
"body": "So if the app gets closed and restarted, it will continue to not sync (or\nsync) over the network.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: keep cloud sync enabled state in settings",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:18:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bb74144860b14d23f26ebd3dd72e4654342282ae",
"body": "This is useful if you are in an area with slow or spotty network and if\nyou are fine with just saving to the phone. In order to sync to the cloud\nyou either have to manually sync via the menu or turn this back on and\nhide the application.\n\nThe commit also removes the old refresh from the Manage dive\n[…]\nuctive now that we no longer\nimmediately save changes to git - those could be thrown away by selecting\nrefresh before the app had a chance to save them.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: allow user to disable automatic cloud sync",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:18:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "616842c8c00654718ba3390b055eb946aaa4cff4",
"body": "There may be other paths where we potentially show the wrong status to\nthe user... but at least with this it times out eventually; there\nshouldn't be any single operation that isn't broken down with progress\nmarkers that takes more than 10 seconds, so keeping the notification\naround for 30 seconds seems very conservative.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: be more careful when to show us accessing the cloud",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:18:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4af9ee5deaa087bdbbb3ca9a79ff199cc6b89529",
"body": "Much as this felt like the prudent thing to do, it makes the UI painful\nto use. In bad network conditions, with a large dive log, on a phone,\nthe save operation can take more than a minute - which is just completely\nludicrous.\n\nSo instead we mark the dive list changed when we make changes and wait\n\n[…]\n time to save\nyour data or your changes may be gone. In typical use that shouldn't be\nan issue, but it is something that we need to tell the user about.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: don't immediately save data after we make changes",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:18:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5821c56da24d0aa02e5bb6d54f14e7651d23269b",
"body": "This allows fairly fine grained analysis on what part of loading from\nand saving to git we are spending our time. Compute performance and\nnetwork speed play a significant role in how all this plays out.\n\nThe routine to check if we can reach the cloud server is modified to\nsend updates every second s\n[…]\nk for five\nseconds when there is network but we can't reach the cloud server (not\nan unlikely scenario in many dive locations with poor network quality)\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Instrument the git storage code",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:18:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "904539024e97b5980050c4ad65a6d2a901f3cb3a",
"body": "This will be used to simulate a progress bar eventually.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Make accessingCloud an integer so it can convey more information",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:17:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eea1ff6a83a318d7749110baa81c249a6faea8ef",
"body": "This way we can include additional text. This will be used in later\npatches.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Change the git progress update callback signature",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:17:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b710f4d6cde00bf598031fafa9e3f1d8c2708a5",
"body": "Otherwise a merge will only make it to cloud storage the second time we\nconnect.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "Git storage: after successful merge push merged commit to upstream",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-04T21:17:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "410fd222d15dca8673606133499cefde780f163b",
"body": "Once again this requires changes that aren't upstream in Kirigami.\nBut with this the bread crumbs update when the user swipes from dive\nto dive.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: make sure the correct data is in the bread crumbs",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T22:59:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "162d07086bc2c0e6f3ca16ed0ea581b1c12a7c88",
"body": "This simply causes an error\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: remove obsolete code",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T22:59:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d95805e90be0a05f4c86f2173b8366470f60412b",
"body": "This requires changes to Kirigami that aren't upstream, yet. So there's\na chance that this commit will have to be changed or reverted / redone.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: tap on the very top / title bar of dive list goes to top",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T22:01:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "09856b4546de1fd2de563e51a4f26b42eedfeaef",
"body": "If you show the App log and then start \"Add dive manually\" or \"Show GPS\nfixes\" you get this odd behavior that the page stack returns to the App\nlog for some reason. A simple workaround is of course to return to the\ndive list, first. Not ideal (because there shouldn't be a reason not to\nhave the All log in the stack as well, but not really a big problem,\neither, since the App log is mainly intended for developers.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: work around problem starting some actions while on the App log",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T17:47:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "254ea5accb25cf3218af8df7da6471d10bceee5b",
"body": "This makes things wrap and scroll correctly again for me\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: redo application log page",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T17:46:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bb43a3fa32d887c256bfd65a0c8336cc36c1a573",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "whitespace cleanup for previous commit",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T17:46:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0a0d7b48e9cc84c1d1bf68846a13cebf3e98aafd",
"body": "This looks a little rough, but I think it works well. I'm sure it could\nbe prettier, though. The next patch will just do the white space cleanup\nfor the additional indentation level.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: press and hold for delete dive on dive list",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T17:46:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "69c10808af442140829975ee1cf893160e3be10d",
"body": "We can open URLs in the browser directly from QML.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: don't go through manager object to show map",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T17:46:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f677d482e9db6f4d566eac40909bb7c8f01fafd7",
"body": "We can open URLs in the browser directly from QML.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: don't go through manager object to open user manual",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T12:02:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7e47874adb88bf3ce318fa8331ded19d9f868da4",
"body": "Seems that testing if BOOKMARK is empty is a bad idea. We end up not\ngetting any samples, but the ones containing a bookmark. So we need to\nswitch the logic to testing if BOOKMARK contains something and do those\ntasks first and otherwise grab a regular sample.\n\nSigned-off-by: Miika Turkia <miika.turkia@gmail.com>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "SDM import: fix logic for sample import",
"author_name": "Miika Turkia",
"author_login": "mturkia",
"committed_at": "2016-04-02T11:29:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "19400b8da19f90365cf3b6a4c9963184cc9e9073",
"body": "Seems that DiveManager does not always return the dive duration in\nDIVETIMESEC field. In this case we can try to calculate the duration\nfrom sample count and interval.\n\nSigned-off-by: Miika Turkia <miika.turkia@gmail.com>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "SDM import: calculate duration if needed",
"author_name": "Miika Turkia",
"author_login": "mturkia",
"committed_at": "2016-04-02T11:28:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "094ff8c681ee05c86b329a2f1e3a14d1a31a9afc",
"body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: all these changes certainly deserve a new version",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T04:05:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "48362ae11a175ce64518e1203b893b0d401fec5a",
"body": "This seems like a useful default action when people are looking at the dive\nlist (and it's a request from a user to have this as a button instead of just\nvia the menu).\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: when on the dive list, action button now offers add dive",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T03:31:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7d62ce5295570f1aa3af09c6f4d89d1f9d5c2c62",
"body": "Again, proudly borrowing from the breeze icon set.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: add an \"add\" icon",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T03:31:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b1d142f3a75c39ca65e7ccdf5d1716d9e3936fd",
"body": "This way we can call this from a button as well as the menu.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "QML UI: put add dive action in a function",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T03:29:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b158d554744540eec7d9a506eeccb3a36e22a287",
"body": "Left over from the merge of the Kirigami 1.0 port\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
"is_bot": false,
"headline": "qml white space fixes",
"author_name": "Dirk Hohndel",
"author_login": "dirkhh",
"committed_at": "2016-04-02T03:29:06Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 26,
"commits_last_year": 0,
"latest_release_at": "2015-02-18T19:11:03Z",
"latest_release_tag": "v4.4.1",
"releases_from_tags": true,
"days_since_last_push": 2785,
"active_weeks_last_year": 0,
"days_since_latest_release": 4176,
"mean_days_between_releases": 23.1
},
"community": {
"has_readme": false,
"has_license": false,
"has_description": false,
"has_contributing": false,
"health_percentage": null,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": []
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 1,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"Documentation/Makefile",
"ReleaseNotes/Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 437745,
"source_files_sampled": 344,
"oversized_source_files": 36,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [],
"dependencies": [],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 2,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "dirkhh",
"commits": 3939,
"avatar_url": "https://avatars.githubusercontent.com/u/237471?v=4"
},
{
"type": "User",
"login": "torvalds",
"commits": 838,
"avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4"
},
{
"type": "User",
"login": "tcanabrava",
"commits": 757,
"avatar_url": "https://avatars.githubusercontent.com/u/4027216?v=4"
},
{
"type": "User",
"login": "mturkia",
"commits": 691,
"avatar_url": "https://avatars.githubusercontent.com/u/2674500?v=4"
},
{
"type": "User",
"login": "neolit123",
"commits": 530,
"avatar_url": "https://avatars.githubusercontent.com/u/331852?v=4"
},
{
"type": "User",
"login": "glance-",
"commits": 504,
"avatar_url": "https://avatars.githubusercontent.com/u/1290022?v=4"
},
{
"type": "User",
"login": "gehadelrobey",
"commits": 281,
"avatar_url": "https://avatars.githubusercontent.com/u/5366682?v=4"
},
{
"type": "User",
"login": "atdotde",
"commits": 269,
"avatar_url": "https://avatars.githubusercontent.com/u/863957?v=4"
},
{
"type": "User",
"login": "willemferguson",
"commits": 159,
"avatar_url": "https://avatars.githubusercontent.com/u/5078706?v=4"
},
{
"type": "User",
"login": "thiagomacieira",
"commits": 152,
"avatar_url": "https://avatars.githubusercontent.com/u/4109772?v=4"
}
],
"contributors_sampled": 100,
"top_contributor_share": 0.417
},
"quality_signals": {
"has_ci": false,
"has_tests": true,
"ci_workflows": [],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 26 contributing companies or organizations",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": null,
"reason": "no workflows found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 0,
"reason": "license file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": null,
"reason": "no dependencies found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "67742856b2d8b3659505fd094cd0c6b86785da26",
"ran_at": "2026-07-27T02:29:43Z",
"aggregate_score": 2.6,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": null,
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/tcanabrava/subsurface",
"host": "github.com",
"name": "subsurface",
"owner": "tcanabrava"
},
"metrics": {
"overall": {
"key": "overall",
"band": "critical",
"name": "Overall health",
"note": "Abandonment Policy applies a 85% multiplier to weighted overall health.",
"notes": [
{
"code": "abandonment_overall_adjustment",
"params": {
"cap": 0,
"pct": 85
}
}
],
"value": 21,
"inputs": {
"security": 26,
"vitality": 20,
"community": 1,
"governance": 43,
"engineering": 32,
"abandonment_cap": null,
"abandonment_state": "at_risk",
"abandonment_multiplier": 85,
"weighted_overall_before_abandonment": 25,
"overall_after_abandonment_multiplier": 21
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "critical",
"name": "Vitality",
"value": 20,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "critical",
"name": "Development activity",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"commits_last_year": 0,
"human_commit_share": 1,
"days_since_last_push": 2785,
"active_weeks_last_year": 0
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 2785 days ago",
"points": 0,
"status": "missed",
"details": [
{
"code": "push_recency",
"params": {
"days": 2785
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "0/52 weeks with commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 0
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "0 commits in the last year",
"points": 0,
"status": "missed",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 0
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "at_risk",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 48,
"inputs": {
"releases_count": 26,
"latest_release_tag": "v4.4.1",
"releases_from_tags": true,
"days_since_latest_release": 4176,
"mean_days_between_releases": 23.1
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "26 version tags (no GitHub releases)",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "version_tags_no_releases",
"params": {
"count": 26
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 4176 days ago",
"points": 0,
"status": "missed",
"details": [
{
"code": "release_recency",
"params": {
"days": 4176
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~23.1 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 23.1
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"cap": null,
"state": "at_risk",
"guards": [
"no_open_demand"
],
"signals": [
"release_stall",
"scorecard_unmaintained"
],
"red_flag": true,
"multiplier_pct": 85,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": 0,
"unanswered_open_issues": 0,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 3755,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "no human commit for 3755 days; 2 unmet obligation(s): releases stalled, Scorecard reports it unmaintained",
"points": 85,
"status": "partial",
"details": [
{
"code": "abandonment_flagged",
"params": {
"days": 3755,
"count": 2,
"signals": "releases stalled, Scorecard reports it unmaintained"
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "critical",
"name": "Community & Adoption",
"value": 1,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 1,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "1 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 1
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "critical",
"name": "Community health",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"has_readme": false,
"has_license": false,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "no license file detected",
"points": 0,
"status": "missed",
"details": [
{
"code": "license_absent",
"params": {}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 43,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "moderate",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 62,
"inputs": {
"bus_factor": 2,
"contributors_sampled": 100,
"top_contributor_share": 0.417
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "2 contributor(s) cover half of all commits",
"points": 25.2,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 2
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 42% of commits",
"points": 13.1,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 42
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "100 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 100
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 26 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution",
"pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 62,
"inputs": {
"followers": 171,
"owner_type": "User",
"is_verified": null,
"owner_login": "tcanabrava",
"public_repos": 34,
"account_age_days": 4864
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "171 followers of tcanabrava",
"points": 16.1,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 171,
"login": "tcanabrava"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "34 public repos, account ~13 yr old",
"points": 23.2,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 34
}
},
{
"code": "account_age_years",
"params": {
"years": 13
}
}
],
"max_points": 25
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "at_risk",
"name": "Engineering Quality",
"value": 32,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "at_risk",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 30,
"inputs": {
"has_ci": false,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "at_risk",
"name": "Documentation",
"note": null,
"notes": [],
"value": 35,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": false,
"has_docs_dir": true,
"has_description": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "critical",
"name": "Security",
"value": 26,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "critical",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"dangerous_workflow",
"packaging",
"pinned_dependencies",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 26,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 12,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 6,
"scorecard_aggregate": 2.6
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 26 contributing companies or organizations",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 9
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 57,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 39,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.73,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "73 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 38.9,
"status": "partial",
"details": [
{
"code": "legible_history",
"params": {
"legible": 73,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_pinned_dependencies"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 57,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"Documentation/Makefile",
"ReleaseNotes/Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Documentation/Makefile, ReleaseNotes/Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Documentation/Makefile, ReleaseNotes/Makefile"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "C++ (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "C++"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 94,
"inputs": {
"primary_language": "C++",
"largest_source_bytes": 437745,
"source_files_sampled": 344,
"oversized_source_files": 36
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "C++ (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "C++"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "36/344 source files over 60KB",
"points": 49.2,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 344,
"oversized": 36
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Community profile unavailable",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-27T02:30:00.924316Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/tcanabrava/subsurface.svg",
"full_name": "tcanabrava/subsurface",
"license_state": "absent",
"license_spdx": null
}