ElasticSearch Nest 5.0.1 throwing below exception, when called from Droid project, From Unit test everything works fine

NEST/Elasticsearch.Net 5.0.1:
Elasticsearch 5.0.1:
Description of the problem including expected versus actual behavior:
I am working on Xamarin Android using Nest 5.0.1 in NetStandard project.
Search api are called from a portable project.
When calling any Nest Search api via Unit test. It is working fine. But when calling the same api via Droid project getting error.
Steps to reproduce:

Create a .NetStandard Library Project. A Unit Test Project and a Droid Project.
Create any simplest Nest Search Query in a method.
Call above method from Unit test then Run from the Droid project.
Unit test call will give result, but Call from Droid project will fail with below Debug Information.

Provide ConnectionSettings (if relevant):
var connectionPool = new SingleNodeConnectionPool( new Uri( "http://localhost:9200" ) );
SearchSettings = new ConnectionSettings( connectionPool, new HttpConnection()).DefaultIndex( "test-index" );
SearchClient = new ElasticClient( SearchSettings );

Provide DebugInformation (if relevant):
 # Audit exception in step 1 BadRequest:
    System.NotImplementedException: The method or operation is not implemented.
      at System.Net.Http.HttpClientHandler.set_MaxConnectionsPerServer (System.Int32 value) [0x00000] in /Users/builder/data/lanes/4009/72366f70/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs:427
      at Elasticsearch.Net.HttpConnection.CreateHttpClientHandler (Elasticsearch.Net.RequestData requestData) [0x00000] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection-CoreFx.cs:108
      at Elasticsearch.Net.HttpConnection+<>c__DisplayClass2_0.<GetClient>b__0 (System.Int32 h) [0x00000] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection-CoreFx.cs:47
      at System.Collections.Concurrent.ConcurrentDictionary`2[TKey,TValue].GetOrAdd (TKey key, System.Func`2[T,TResult] valueFactory) [0x00037] in /Users/builder/data/lanes/4009/72366f70/source/mono/mcs/class/referencesource/mscorlib/system/collections/Concurrent/ConcurrentDictionary.cs:1049
      at Elasticsearch.Net.HttpConnection.GetClient (Elasticsearch.Net.RequestData requestData) [0x00042] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection-CoreFx.cs:45
      at Elasticsearch.Net.HttpConnection.Request[TReturn] (Elasticsearch.Net.RequestData requestData) [0x00000] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection-CoreFx.cs:64
      at Elasticsearch.Net.RequestPipeline.CallElasticsearch[TReturn] (Elasticsearch.Net.RequestData requestData) [0x00023] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Transport\Pipeline\RequestPipeline.cs:400
    # Inner Exception: The method or operation is not implemented.
    System.NotImplementedException: The method or operation is not implemented.
      at System.Net.Http.HttpClientHandler.set_MaxConnectionsPerServer (System.Int32 value) [0x00000] in /Users/builder/data/lanes/4009/72366f70/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs:427
      at Elasticsearch.Net.HttpConnection.CreateHttpClientHandler (Elasticsearch.Net.RequestData requestData) [0x00000] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection-CoreFx.cs:108
      at Elasticsearch.Net.HttpConnection+<>c__DisplayClass2_0.<GetClient>b__0 (System.Int32 h) [0x00000] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection-CoreFx.cs:47
      at System.Collections.Concurrent.ConcurrentDictionary`2[TKey,TValue].GetOrAdd (TKey key, System.Func`2[T,TResult] valueFactory) [0x00037] in /Users/builder/data/lanes/4009/72366f70/source/mono/mcs/class/referencesource/mscorlib/system/collections/Concurrent/ConcurrentDictionary.cs:1049
      at Elasticsearch.Net.HttpConnection.GetClient (Elasticsearch.Net.RequestData requestData) [0x00042] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection-CoreFx.cs:45
      at Elasticsearch.Net.HttpConnection.Request[TReturn] (Elasticsearch.Net.RequestData requestData) [0x00000] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection-CoreFx.cs:64
      at Elasticsearch.Net.RequestPipeline.CallElasticsearch[TReturn] (Elasticsearch.Net.RequestData requestData) [0x00023] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Transport\Pipeline\RequestPipeline.cs:400
    # Exception:
    Elasticsearch.Net.UnexpectedElasticsearchClientException: The method or operation is not implemented. ---> System.NotImplementedException: The method or operation is not implemented.
      at System.Net.Http.HttpClientHandler.set_MaxConnectionsPerServer (System.Int32 value) [0x00000] in /Users/builder/data/lanes/4009/72366f70/source/mono/mcs/class/System.Net.Http/System.Net.Http/HttpClientHandler.cs:427
      at Elasticsearch.Net.HttpConnection.CreateHttpClientHandler (Elasticsearch.Net.RequestData requestData) [0x00000] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection-CoreFx.cs:108
      at Elasticsearch.Net.HttpConnection+<>c__DisplayClass2_0.<GetClient>b__0 (System.Int32 h) [0x00000] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection-CoreFx.cs:47
      at System.Collections.Concurrent.ConcurrentDictionary`2[TKey,TValue].GetOrAdd (TKey key, System.Func`2[T,TResult] valueFactory) [0x00037] in /Users/builder/data/lanes/4009/72366f70/source/mono/mcs/class/referencesource/mscorlib/system/collections/Concurrent/ConcurrentDictionary.cs:1049
      at Elasticsearch.Net.HttpConnection.GetClient (Elasticsearch.Net.RequestData requestData) [0x00042] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection-CoreFx.cs:45
      at Elasticsearch.Net.HttpConnection.Request[TReturn] (Elasticsearch.Net.RequestData requestData) [0x00000] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Connection\HttpConnection-CoreFx.cs:64
      at Elasticsearch.Net.RequestPipeline.CallElasticsearch[TReturn] (Elasticsearch.Net.RequestData requestData) [0x00023] in C:\Users\russ\source\elasticsearch-net-5.x\src\Elasticsearch.Net\Transport\Pipeline\RequestPipeline.cs:400
       --- End of inner exception stack trace ---

Dup of #2581 thanks for reporting @irsali, we'll push a new release out later today that will have a fix for it,
You'll have to set .ConnectionLimit(-1) on ConnectionSettings to disable setting that property.

Thanks a lot. It was a big issue for me to get resolved.


Improve cookie parsing algorithm.

While the previous parser dealt with commas, some cases were not
correctly handled, like when a comma was in the last attribute before a
second cookie.
Also trim the names of the cookies to allow spaces before the equal.

@swift-ci please test

I have seen those failures in macOS all the time recently. I don’t think they are related to the PR (neither this, neither #2373).

@swift-ci please test Linux platform

@swift-ci please test Linux platform

@swift-ci please test Linux platform

@swift-ci please test Linux platform

I will try to improve the cookie parsing with the recommendations and add more tests with broken cookies in a later PR.
@swift-ci please test Linux platform

I finally reused this PR, but I haven't add new tests right now. The current one pass, which is quite good already. I will write better ones tomorrow.
@swift-ci please test Linux platform

@swift-ci please test Linux platform

Added the tests I promised for yesterday. Fixed some pieces to match better macOS Foundation.
@swift-ci please test Linux platform

@swift-ci please test Linux platform


Add GitHub Actions CI

This PR adds a CI build on GitHub Actions, to run tests with Rake, and check for Rubocop linting errors.
Currently, the lint checks don't pass, but I would like to make a separate PR for that. Same goes for some of the messages displayed in the tests.

@MaximeKjaer Looks good. But I have merged v4 to master. Would you mind changing it to master and merge master into your first. Seems to be some changes there.

I forgot to delete v4 upon merge. Sorry

Closing this PR, but I'll open another one to master instead of v4


Change course cards for self pace courses and open for enroll

Feature Request
Is your feature request related to a problem or unsupported use case? Please describe.
The course card footer isn't relevant for self pace courses that are open for enrollment and in progress.
Describe the solution you'd like
Currently on NAU we aren’t showing the course card footer, because for the our “normal” courses - self pace and open for enrollment and in-progress is showing irrelevant information, that is why we have decided to not show for any course. But there is some cases that the footer is relevant, like when the course is going to start in a couple of days, is archived, etc.
We propose the following change on the course cards:
If the course is:

open for enrollment;
it has enrollment start and end defined - not null;
a the course run has started

then:

replace the text in the card footer with Open for enrollment

Warning: if a course doesn't have a course end date, but has an enrollment end date, it is being shown on Richie as "On-going" on the course card footer. The current behavior should be preserved.
Describe alternatives you've considered
Any.
Discovery, Documentation, Adoption, Migration Strategy
Mockup:

Do you want to work on it through a Pull Request?
Yes.

During the 2023-04-26 meeting it was decided that this change should be implemented for all courses and not only for the self pace courses.
Nevertheless the "On-going" text should be preserved.
The issue description has been updated.


[Feat] Add KeypointAUC metric

Thanks for your contribution and we appreciate it a lot. The following instructions would make your pull request more healthy and more easily get feedback. If you do not understand some items, don't worry, just make the pull request and seek help from maintainers.
Motivation
Add new metric KeypointAUC.
Modification
Add new metric KeypointAUC and its corresponding unit test.
BC-breaking (Optional)
Does the modification introduce changes that break the backward-compatibility of the downstream repos?
If so, please describe how it breaks the compatibility and how the downstream projects should modify their code to keep compatibility with this PR.
Use cases (Optional)
If this PR introduces a new feature, it is better to list some use cases here, and update the documentation.
Checklist

Pre-commit or other linting tools are used to fix the potential lint issues.
The modification is covered by complete unit tests. If not, please add more unit test to ensure the correctness.
If the modification has potential influence on downstream projects, this PR should be tested with downstream projects, like MMDet or MMCls.
The documentation has been modified accordingly, like docstring or example tutorials.

Approved by mistake


Hello! Suggest to add ligatures font type

Describe the feature you'd like to request
Hello! Suggest to add ligatures font type to doppio-one font

Describe the solution you'd like
No response
Describe alternatives you've considered
No response
Additional context
No response

Hiya, this repository mirrors Google Fonts who don't have ligatures enabled. A large part of that is to reduce file sizes since these are web-focused fonts. We don't plan on adding support for this. Thanks!

The issue isn’t distribution (although it would double the number of packages we push to NPM to around 3000 packages - might be problematic), but where we can get those font files with ligatures and everything else. Since the Google Fonts repository is optimised for the web, we only have web-friendly fonts as an available source.
Manually finding and maintaining non-web friendly fonts is out of scope for this project since that would require an immense amount of work and time that I don’t have.


Integrate Flower with Docker Compose setup

Thought it'd be nice to have it.

[x] Integrate Flower Celery monitoring tool with our Docker Compose setup locally
[x] Cover production Compose configuration as well
Auth

[x] local
[x] production

[x] Update the docs

@jayfk, @pydanny, @browniebroke, @luzfcb, thoughts?

Looks good, and to answer your question (?) I am in favour of getting it into the production config too.

perhaps it would be good, enable the authentication by default in flower .
depending on how the tasks were created, they can leak sensitive information.
http://flower.readthedocs.io/en/latest/auth.html

@jayfk, @pydanny, @browniebroke, @luzfcb, thoughts?

@browniebroke since local and production setups are essentially the same I thought  referencing the local Flower docs section would be enough. As for Flower UI usage, I think it's best if our users merely follow the official links and see the original writing for themselves.

LGTM


Bump gradle-maven-publish-plugin to 0.19.0

Codecov Report

Merging #473 (c409ed7) into master (6d405e1) will not change coverage.
The diff coverage is n/a.

@@            Coverage Diff            @@
##             master     #473   +/-   ##
=========================================
  Coverage     58.87%   58.87%
  Complexity      861      861
=========================================
  Files            69       69
  Lines          6451     6451
  Branches       1006     1006
=========================================
  Hits           3798     3798
  Misses         2360     2360
  Partials        293      293

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 6d405e1...c409ed7. Read the comment docs.


Status of the websocket connection for Notification 2.0 subscriptions is not visible to users.

Currently the status of the websocket connection for Notification 2.0 subscriptions is not visible to users.
Therefore they cannot verify if an outbound mapping is processed correctly.

Sending lifecycle event from C8YAPISubscriber when the status of a websocket connection changes.
These events can be viewed in the UI under the tab configuration. A filter exists to only show lifecycle event from websocket connections.


gcmon-301; changed everyPeriod variable from P1D to P1M

I can check on that theory... It's a good one?
I told Topping it was slow and he commented that he hoped prod would be faster (not really from my testing). At home I have terrible internet, over wireless, and over ERAS, prod timed at 1.9 minutes, 5.6 mb download for the middle limitrophe. QA was 1.6 minutes.
I'll have to do some looking for missing bits, and do more time testing at work.


Unable to locate factory if using dump

Laravel Version: 7.13.0
PHP Version: 7.3.4
Database Driver & Version: no database used

Description:
In my feature tests I like to dump the response to help with debugging. I had a test that kept getting the error Unable to locate factory but if I removed the dump it would work. I am not sure if this is a Laravel bug, Symfony VarDumper bug or maybe a bug with facade/ignition but thought I'd start with Laravel and see if anybody has ideas on what is going on.
Steps To Reproduce:
I was able to reproduce the issue in a fresh Laravel 7 app. Here are steps to reproduce.
git clone https://github.com/laravel/laravel.git dump-test
cd dump-test
cp .env.example .env
composer install
php artisan key:generate

Create tests/Feature/DumpTest.php like this
<?php

namespace Tests\Feature;

use App\User;
use Tests\TestCase;

class DumpTest extends TestCase
{
    public function test_one()
    {
        $this->assertTrue(true);
    }

    public function test_two()
    {
        $this->get('/')
            ->dump()
            ->assertSuccessful();

        factory(User::class)->make();
    }
}

Run php artisan test and it will fail.
Run ./vendor/bin/phpunit tests/Feature/DumpTest.php and it will fail.
Run ./vendor/bin/phpunit tests/Feature/DumpTest.php --filter two and it will pass.
Comment out the ->dump() and run php artisan test and it will pass.
I also noticed if I go into vendor/facade/ignition/src/DumpRecorder/DumpRecorder.php  in the register() method and comment out the following that the test will pass.
        $multiDumpHandler->addHandler(function ($var) {
            //$this->app->make(DumpHandler::class)->dump($var);
        });

Moving to discussions.


Test on OS X

Update documentation accordingly.

Work and instructions here: https://github.com/blue-jay/blueprint/issues/36


Test support: Return AppWrappers based on prefix

To be adjusted once https://github.com/project-codeflare/codeflare-operator/pull/246 gets merged.
Issue link

N/A
What changes have been made

Adding support functionality for https://github.com/opendatahub-io/distributed-workloads/pull/103
Adding a function to return AppWrappers based on name prefix, also creation of temporary file with content.
Verification steps

N/A
Checks

[ ] I've made sure the tests are passing.
Testing Strategy

[ ] Unit tests
[ ] Manual tests
[ ] Testing is not required for this change

/lgtm

Self approving as nobody else reacts and I need this merged for follow up PR
/approve


Exec tachikoma update<PHONE_NUMBER>3356

:hamster::hamster::hamster:   Strategy none
Powered by Interval Pull Request as a Service - Tachikoma.io Announcement: 2015-06-28 Updated permissions - Tachikoma.io

Coverage remained the same at 68.0% when pulling e671893ebd025f5b80d56d7c993c715d72e0bcbc on pazjacket:tachikoma/update-20161204163356 into 391307db508f29cde46957edf9baba38c7a2933e on sanemat:master.


Withdraw Commission menu doesn't show on Station Desktop Windows

when a validator of luna classic clicks their wallet name on top of the Station Desktop (windows 10 Pro Version 21H2), there is no reaction and the withdraw commission menu doesn't show.

Hi! , I tried to find some good-first-issues to start my contributions to terra-money but sadly I couldn't find any.
If there are any issues that requires assistance, tag me with them, I'll be more than HAPPY to contribute 💯
Thanks!
PS: I'm specifically looking forward to contribute TS and React Projects.


Uri.parse result with dart2js throws runtime error on -O0, while other levels are OK

dart info

If providing this information as part of reporting a bug, please review the information
below to ensure it only contains things you're comfortable posting publicly.

#### General info

- Dart 3.2.6 (stable) (Wed Jan 24 13:41:58 2024 +0000) on "linux_x64"
- on linux / Linux 6.7.5-200.fc39.x86_64 #1 SMP PREEMPT_DYNAMIC Sat Feb 17 17:20:08 UTC 2024
- locale is en_US.UTF-8

#### Project info

- sdk constraint: '>=2.17.0 <4.0.0'
- dependencies: sentry, web
- dev_dependencies: build_runner, build_web_compilers, lints

#### Process info

| Memory |  CPU | Elapsed time | Command line                                                                    |
| -----: | ---: | -----------: | ------------------------------------------------------------------------------- |
| 481 MB | 0.4% |     01:12:25 | dart language-server --protocol=lsp --client-id=VS-Code --client-version=3.82.0 |
| 711 MB | 1.5% |        42:00 | dart language-server --protocol=lsp --client-id=VS-Code --client-version=3.82.0 |

The following code throws with -O0 when compiled with dart2js (release mode), while it works properly with other optimization levels:
void main() {
  var uri = Uri.parse('https://aaaa@bbbb.dart.dev/pathsegment');
  print('${uri.pathSegments.isEmpty}');
}

Uri.parse internally calls _computePathSegments which returns either a const <String>[] or List<String>.unmodifiable(pathToSplit.split("/").map(Uri.decodeComponent)).
I went ahead and tested if any of these might be the source of the problem and NO. In -O0, _computePathSegments is never actually called. In the compiled code, the execution stops here:
  A._Uri.prototype = {
    // ...
    get$pathSegments() {
      var result,
        value = this.___Uri_pathSegments_FI;
      if (A.boolConversionCheck(A.isSentinel(value))) { // HERE
        result = A._Uri__computePathSegments(this.path);
        value !== $ && A.throwLateFieldADI("pathSegments");
        this.set$___Uri_pathSegments_FI(result);
        value = result;
      }
      return value;
    },

The expression A.isSentinel(value) ALWAYS returns false - seem to be hard-coded:
    isSentinel(value) {
      return false;
    },

:exclamation: NOTE: replacing @ with eg. _ in the URL seem to fix the problem in -O0 :confused:
Update: found out why _ works while @ doesn't. Uri.parse with _ instantiates _SimpleUri while @ causes to instantiate _Uri that in fact calls _computePathSegments.
Is there anything else I can show/give you to help track this down?

Likely the same root cause as #49599. That bug hasn't been high priority, but I can take another look now that we have a report of someone using -O0 and running into this in the wild.

Likely the same root cause as #49599. That bug hasn't been high priority, but I can take another look now that we have a report of someone using -O0 and running into this in the wild.

To be fair, @fishythefish , I don't think it is that common.
What I do use -O0 for is debugging as it has the most info when compiling with dart2js. There are those bugs that just don't show up with DDC and dart2js is used for prod push.
Thanks if you look at it but even for me, I don't think it is high prio.


Simplify History Structure

In this issue, I would like to discuss how I believe we can simplify the structure of the history, explain why I think it's important, and highlight the potential problems that the current implementation might cause.
Contents

The Prelude

In General
For Other Vendors

The Dive

Current Implementation

Create Document
Open The Editor
Write The First Changes
Write The Second Changes

Houston, we have a problem

Create Document
Open The Editor
Write The First Changes
Write The Second Changes

The Potential Solutions

History Structure

Create The Source Directory
Create The Versions Directory
Create The First Version
Write The Changes
Rename The Source File
Write The Changes After Renaming
Restore The Specific Version

History Object

1. The Prelude
Before I dive into our examples, I would like to do some research on how history works in general and also learn a bit about how history works for other vendors in the field.
1.1. In General
Let's imagine that I'm creating a new Node.js tool that simply prints a friendly welcome message to the console. That's all there is to it. My tool will include two files. One of them is main.js, which is where my program starts, and the other is version, which indicates the version of the tool sources.
/tool
$ find .
├─ main.js
└─ version

Let's create the initial version of the tool. I'll add a print message to the console and pin the version.
/tool
$ cat main.js
console.log("Hi Buddy!")

/tool
$ cat version
1

Well, I would like to share my brilliant tool with friends, so I need to publish it in the registry. Imagine that the structure of the registry is as simple as the structure of the program. The registry contains directories named after versions of the tool, and these subdirectories contain the sources of the specific version. After executing the magic command, my program gets published in the registry with the initial version.
/registry
$ find .
└─ versions
   └─ 1
      ├─ main.js
      └─ version

As time goes by, I've made new friends who mostly speak French. I want them to be able to use my instrument as well. In order to achieve this, I've created a new version.
/tool
$ cat main.js
console.log("Hi Buddy! Salut mon pote!")

/tool
$ cat version
2

And of course, I published it in the registry.
/registry
$ find .
└─ versions
   ├─ 1
   │  ├─ main.js
   │  └─ version
   └─ 2
      ├─ main.js
      └─ version

Everything was going well, but my old friends were unaware for a long time that my tool had a new version. The issue arose because they had installed a specific version of the program. To resolve this, I added a symbolic link in the registry that will always point to the latest version.
/registry
$ find .
├─ latest -> /registry/versions/2/
└─ versions
   ├─ 1
   │  ├─ main.js
   │  └─ version
   └─ 2
      ├─ main.js
      └─ version

Starting now, whenever I add a new version, the registry will update the link so that all my friends can be informed about its release.
1.2. For Other Vendors
I'm a neophyte in the development of office tools, so sometimes I look at how my colleagues in the field implement certain things. This time, I was particularly interested in understanding how the first version of a document is created.
After playing with the most popular office services, I discovered that when a user creates a file, it automatically generates the initial, first version of the file. For me, this was non-intuitive because, in my experience, when I create a Node.js tool, the first version already contains some code. In this case, the initial version refers to an empty document.
2. The Dive
In the following, I'll first focus on the current implementation of the history. Then, I'll discuss potential problems. And finally, propose a possible solutions.
I'll consider the base scenario where a user creates a file and then edits it multiple times. I'll be working on an example written in Python because it contains sketches of a new history structure. I'll make sure to include links to all the implementations in all the examples.
2.1. Current Implementation
The user starts the document server with the project and opens the home page.
2.1.1 Create Document
The user creates a new document file. Under the hood, the following processes are launched.

A new blank document is being created.[^1][^2][^3][^4][^5][^6][^7][^8]
A file with meta information about new file is being created.[^9][^10][^11][^12][^13][^14][^15][^16]

The structure of the user storage directory might look something like this.
$ find .
├─ new.docx
└─ new.docx-hist
   └─ createdInfo.json

$ open new.docx
Blank document

$ cat new.docx-hist/createdInfo.json
{
  "created": "2023-07-31 12:05:45",
  "uid": "uid-1",
  "uname": "John Smith"
}

2.1.2 Open The Editor
The user open the editor and this action launched the following processes:

A key is being generated on the fly.[^17][^18][^19][^20][^21][^22][^23][^24]
A history object is being updated.[^25][^26][^27][^28][^29][^30][^31][^32]

The history object might look something like this.
{
  "history": {
    "currentVersion": 1,
    "history": [
      {
        "key": "871885520052496533",
        "version": 1,
        "created": "2023-07-31 12:05:45",
        "user": {
          "id": "uid-1",
          "name": "John Smith"
        }
      }
    ]
  },
  "historyData": {
    "0": {
      "fileType": "docx",
      "key": "871885520052496533",
      "version": 1,
      "url": "http://proxy/static/<IP_ADDRESS>/new.docx",
      "token": "..."
    }
  }
}

2.1.3 Write The First Changes
The user writes their first set of changes. For our convenience, they've added a "V2" sentence to their document. Here I refer to my reflections at the very beginning.

When a document is created, it's automatically assigned the initial, first version.

So the content of "V2" suggests to us that this document should, in theory, be the second version.

The structure of the user storage directory is shown below.
$ find .
├─ new.docx
└─ new.docx-hist
   ├─ 1
   │  ├─ changes.json
   │  ├─ diff.zip
   │  ├─ key.txt
   │  └─ prev.docx
   └─ createdInfo.json

$ open new.docx
V2

$ cat new.docx-hist/1/changes.json
{
  "serverVersion": "7.3.3",
  "changes": [
    {
      "created": "2023-07-31 12:57:43",
      "user": {
        "id": "uid-1",
        "name": "John Smith"
      }
    }
  ]
}

$ unzip new.docx-hist/1/diff.zip
Blank document -> V2

$ open new.docx-hist/1/prev.docx
Blank document

The history object might is shown below.
{
  "history": {
    "currentVersion": 2,
    "history": [
      {
        "key": "-1139790747860777407",
        "version": 1,
        "created": "2023-07-31 12:57:07",
        "user": {
          "id": "uid-1",
          "name": "John Smith"
        }
      },
      {
        "key": "-5826708658554727445",
        "version": 2,
        "changes": [
          {
            "created": "2023-07-31 12:57:43",
            "user": {
              "id": "uid-1",
              "name": "John Smith"
            }
          }
        ],
        "serverVersion": "7.3.3",
        "created": "2023-07-31 12:57:43",
        "user": {
          "id": "uid-1",
          "name": "John Smith"
        }
      }
    ]
  },
  "historyData": {
    "0": {
      "fileType": "docx",
      "key": "-1139790747860777407",
      "version": 1,
      "url": "http://proxy/downloadhistory?fileName=new.docx&ver=1&file=prev.docx&userAddress=<IP_ADDRESS>",
      "token": "..."
    },
    "1": {
      "fileType": "docx",
      "key": "-5826708658554727445",
      "version": 2,
      "url": "http://proxy/static/<IP_ADDRESS>/new.docx",
      "previous": {
        "fileType": "docx",
        "key": "-1139790747860777407",
        "url": "http://proxy/downloadhistory?fileName=new.docx&ver=1&file=prev.docx&userAddress=<IP_ADDRESS>"
      },
      "changesUrl": "http://proxy/downloadhistory?fileName=new.docx&ver=1&file=diff.zip&userAddress=<IP_ADDRESS>",
      "token": "..."
    }
  }
}

2.1.4. Write The Second Changes
By analogy with the previous section, the user writes the second changes by appending "V3".

The structure of the user storage directory is shown below.
$ find .
├─ new.docx
└─ new.docx-hist
   ├─ 1
   │  ├─ changes.json
   │  ├─ diff.zip
   │  ├─ key.txt
   │  └─ prev.docx
   ├─ 2
   │  ├─ changes.json
   │  ├─ diff.zip
   │  ├─ key.txt
   │  └─ prev.docx
   └─ createdInfo.json

$ open new.docx
V2 V3

$ cat new.docx-hist/2/changes.json
{
  "serverVersion": "7.3.3",
  "changes": [
    {
      "created": "2023-07-31 13:20:53",
      "user": {
        "id": "uid-1",
        "name": "John Smith"
      }
    }
  ]
}

$ unzip new.docx-hist/2/diff.zip
V2 -> V2 V3

$ open new.docx-hist/2/prev.docx
V2

The history object might is shown below.
{
  "history": {
    "currentVersion": 3,
    "history": [
      {
        "key": "-1139790747860777407",
        "version": 1,
        "created": "2023-07-31 12:57:07",
        "user": {
          "id": "uid-1",
          "name": "John Smith"
        }
      },
      {
        "key": "-5826708658554727445",
        "version": 2,
        "changes": [
          {
            "created": "2023-07-31 12:57:43",
            "user": {
              "id": "uid-1",
              "name": "John Smith"
            }
          }
        ],
        "serverVersion": "7.3.3",
        "created": "2023-07-31 12:57:43",
        "user": {
          "id": "uid-1",
          "name": "John Smith"
        }
      },
      {
        "key": "3159726309752106985",
        "version": 3,
        "changes": [
          {
            "created": "2023-07-31 13:20:53",
            "user": {
              "id": "uid-1",
              "name": "John Smith"
            }
          }
        ],
        "serverVersion": "7.3.3",
        "created": "2023-07-31 13:20:53",
        "user": {
          "id": "uid-1",
          "name": "John Smith"
        }
      }
    ]
  },
  "historyData": {
    "0": {
      "fileType": "docx",
      "key": "-1139790747860777407",
      "version": 1,
      "url": "http://proxy/downloadhistory?fileName=new.docx&ver=1&file=prev.docx&userAddress=<IP_ADDRESS>",
      "token": "..."
    },
    "1": {
      "fileType": "docx",
      "key": "-5826708658554727445",
      "version": 2,
      "url": "http://proxy/downloadhistory?fileName=new.docx&ver=2&file=prev.docx&userAddress=<IP_ADDRESS>",
      "previous": {
        "fileType": "docx",
        "key": "-1139790747860777407",
        "url": "http://proxy/downloadhistory?fileName=new.docx&ver=1&file=prev.docx&userAddress=<IP_ADDRESS>"
      },
      "changesUrl": "http://proxy/downloadhistory?fileName=new.docx&ver=1&file=diff.zip&userAddress=<IP_ADDRESS>",
      "token": "..."
    },
    "2": {
      "fileType": "docx",
      "key": "3159726309752106985",
      "version": 3,
      "url": "http://proxy/static/<IP_ADDRESS>/new.docx",
      "previous": {
        "fileType": "docx",
        "key": "-5826708658554727445",
        "url": "http://proxy/downloadhistory?fileName=new.docx&ver=2&file=prev.docx&userAddress=<IP_ADDRESS>"
      },
      "changesUrl": "http://proxy/downloadhistory?fileName=new.docx&ver=2&file=diff.zip&userAddress=<IP_ADDRESS>",
      "token": "..."
    }
  }
}

2.2. Houston, we have a problem
I propose to move in the same order as we moved earlier considering the base scenario.
2.2.1. Create Document
My misunderstanding starts right from the moment of creation of the file.

Note
Further along the text, I'll include small notes in the margins. These notes will highlight certain things that I would like to mention, but they may not be directly related to the current issue.

Let's remember how our registry handles versions of the tool. It creates a new directory for each version that contains the sources of that version. Additionally, it creates a symbolic link for the latest version.
Let's see how our examples handle the initial version.

Note
And the first thing I would like to consecrate is that the process of creation isn't implemented in the same way everywhere. Somewhere it's an endpoint with one name, somewhere with a different one, and somewhere without it at all.

$ find .
├─ new.docx
└─ new.docx-hist
   └─ createdInfo.json

— Do you see the first version of the file?
— No.
— But it exists.

Here new.docx is its the first version and at the same time the last one. The problem is that this file isn't in its designated, versioned subdirectory, and it's important to always remember this. For instance, when determining the latest version, we begin counting from one,[^33][^32][^33][^34][^35][^36][^37][^38] which may not seem logical because the latest version could actually be zero, indicating that the file doesn't exist.
The presence of createdInfo.json has also raised some questions. This file only contains information about the initial version, so it makes sense to store it near the first version. Placing it in the root of the history directory, where only versioned directories should be stored, may create additional branches in the business logic. This situation is already observed in the function that determining the latest version.[^39][^40][^41][^42][^43][^44][^45]
When creating, we don't generate a file with a key. For now, I'll leave this judgment without explanation, since I'll return to this later.
2.2.2. Open The Editor

A key is being generated on the fly.

Let's break the key generation process into stages.[^46][^47][^48][^49][^21][^22][^23][^24]

Note
Key generation isn't always wrapped in a function everywhere. In some examples, it's copy-pasted throughout the codebase. The algorithm may also vary, but not significantly.

Get the path to the source file. File that is located outside the history directory.
Generate a download URL for the source file.
Read the meta information of the source file.
Concatenate the download URL with the time of the most recent content modification of the source file.
Get the hash value of the concatenated string.
Trim the hash to the first 20 characters.

Behind the seemingly high complexity, in fact, unreliability is hidden.
While I was typing this text, @aleksandrfedorov97 found a unique situation. He discovered that the standard method of the File in Java doesn't copy the meta information of a file when copying it on the Windows platform. Surprisingly, we even have our own implementation of the file-copying![^50] We rely on unreliable data and then try to tune it to make it a bit more reliable.
Tritely, if the user opens a file, adds a space, and then immediately deletes it, we theoretically shouldn't create a new version of the file, because the content hasn't been changed. However, since the file has been modified, a new key will be generated for the unchanged content.
The problem is exacerbated by the fact that for the some cases, we've a function that generates a key from the download URL[^51][^52][^53][^54][^55][^56][^57][^58] provided by the document server[^59][^60][^61][^62][^63][^64][^65][^66] for a file that we already stored. However, it seems that the document server always returns the key of the file it worked with, if I understand correctly.[^67]
It appears to me that the current approach to key generation is like having a loaded gun on the wall, which is bound to go off more than once.
Looking ahead, I want to mention that currently we're unable to replace the key generation with something simpler and more standardized, such as UUID. If two users open the same file, they will receive two different keys because:

A key is being generated on the fly.

Not storing the key also has an impact on the generation of the history.

Note
I want to dwell on the structure of the history object. It's a combination of two documented structures: History and HistoryData, which serve different purposes.[^68][^69] When querying the History, we don't always require the HistoryData. Additionally, we often only need the HistoryData of specific elements, rather than all of them. It would be more logical and simpler to have separate endpoints for these two cases, just as the document server provides two separate callbacks for these two structures.

When the document server talks to our examples, it sends a key, and we save it. However, we don't store the key for the latest version. Therefore, when we generate the history object, we need to check if the version in the cycle is the latest. If it's, then we use the generated key. In all other cases, we read the key from the file. Essentially, we manually add branching to the universal process, making it non-generic.[^70][^71][^72][^73][^74][^75][^76][^77]

Warning
Further along the text, I'll rely on changes.json. This is incorrect because the file is a black box from the document server, and its content may be changed at any moment. Instead, we should create our own tracking system. Anyway, my future points will be relevant if we replace this box with our own system.

The situation is similar to the meta for the initial version. All files have a standardized method of storing additional information, but for the first version, we use something different. Once again, we introduce unnecessary complexity to the generic process.[^78][^79][^80][^81][^82][^83][^84][^85]
2.2.3. Write The First Changes
It's time to take a look at the first changes.
$ find .
├─ new.docx
└─ new.docx-hist
   ├─ 1
   │  ├─ changes.json
   │  ├─ diff.zip
   │  ├─ key.txt
   │  └─ prev.docx
   └─ createdInfo.json

We noticed that a versioned subdirectory isn't created for the latest version. Therefore, the new.docx file must be the second version. When our user initially created these files, they added specific content inside to indicate the version, making it easier for us.
$ open new.docx
V2

That's good. The file is indeed the second version, just as we suspected. Now, let's take a look at the other files in the history directory.
Here we'll find that an initial versioned directory has been created. Following the same logic as presented in the Node.js registry, this directory should contain sources, files of the specific, first version. But what do we've?
$ cat new.docx-hist/1/changes.json
{
  "serverVersion": "7.3.3",
  "changes": [
    {
      "created": "2023-07-31 12:57:43",
      "user": {
        "id": "uid-1",
        "name": "John Smith"
      }
    }
  ]
}

The black box from the document server contains an object that represents the changes made to the source file. This object was submitted after the initial changes were made, specifically after the user typed "V2". Based on this, I can infer that this object doesn't belong to the first version; rather, it's a generation, the starting point for the second version. Another approach is to examine the date of these changes and compare it with the creation date stored in the createdInfo.json.
$ cat new.docx-hist/createdInfo.json | jq -r ".created"
2023-07-31 12:05:45

The next file shows the difference between one version and its earlier one. The first version is a blank document, so it's impossible to have a diff for this version, it doesn't make sense to compare nothing to an empty document. We can unzip this archive and see for ourselves.
$ unzip new.docx-hist/1/diff.zip
Blank document -> V2

The next one is the file with a key. This is the key for the first version, so it's almost correct. I'll explain why it's only almost correct later on.
The last on this list is the previous file. This file serves as the source for this version. I'm not sure why it was named as a previous file. Previous to what?
$ open new.docx-hist/1/prev.docx
Blank document

2.2.4. Write The Second Changes
In this section, I won't analyze the addition of the second changes in such detail because the essence of the movement is similar to those described above. Instead, I want to summarize how the history structure looks in the end.
$ find .
├─ new.docx             The source file of the latest, third versions.
└─ new.docx-hist                                           (latest, 3)
   ├─ 1
   │  ├─ changes.json   The black box of the second version. (2)
   │  ├─ diff.zip       The diff of the second version. (2)
   │  ├─ key.txt        The key of the first version. (1)
   │  └─ prev.docx      The source file of the first version. (1)
   ├─ 2
   │  ├─ changes.json   The black box of the third version. (3)
   │  ├─ diff.zip       The diff of the third version. (3)
   │  ├─ key.txt        The key of the second version. (2)
   │  └─ prev.docx      The source file of the second version. (2)
   └─ createdInfo.json  The meta of the first version. (1)

To summarize, I would say that there is no structure here. It's more like a chaotic collection of files.
The features of this structure are naturally reflected in the history functions and, as a result, in the history object.
$ curl /history | jq '.historyData."0"'
{
  "fileType": "docx",
  "key": "-1139790747860777407",
  "version": 1,
  "url": "http://proxy/downloadhistory?fileName=new.docx&ver=1&file=prev.docx&userAddress=<IP_ADDRESS>",
  "token": "..."
}

Here we've a HistoryData object for the first version. This object contains the URL to download the source file for this version. Go ahead.
$ curl /history | jq '.historyData."2"'
{
  "fileType": "docx",
  "key": "3159726309752106985",
  "version": 3,
  "url": "http://proxy/static/<IP_ADDRESS>/new.docx",
  "previous": {
    "fileType": "docx",
    "key": "-5826708658554727445",
    "url": "http://proxy/downloadhistory?fileName=new.docx&ver=2&file=prev.docx&userAddress=<IP_ADDRESS>"
  },
  "changesUrl": "http://proxy/downloadhistory?fileName=new.docx&ver=2&file=diff.zip&userAddress=<IP_ADDRESS>",
  "token": "..."
}

Here we've a HistoryData object fot the third version.
This object contains the URL to download the source file, but with a different endpoint. This is because there is no versioned directory for the latest version in the history structure. Two endpoints for the same things.
This object also contains the URL to download the source file of the previous version. The URL embeds the version number, which is the second version. This is correct because the second version is the previous version of the third version.
However, the object also includes the URL to download the diff between the third and the second versions. This URL actually contains the second version, which by logic should indicates that it's a diff between the second and first versions, but not today, not today.
3. The Potential Solutions
In the final chapter of my text, I would like to discuss and propose potential solutions to the problems that I've previously mentioned.
3.1. History Structure
Let's start with structure.
3.1.1. Create The Source Directory
It's important for me to mention the source directory before discussing the history directory. Currently, we append the history postfix to the source file basename to create the history directory, which may seem strange. Tomorrow we'll introduce a new feature involving files and add another postfix. This process may continue repeatedly, resulting in a messy file structure. I believe it would be easier to keep all the files related to a specific source file in its own directory.
I won't reinvent the wheel. Instead, I'll simply take a hash string from the file basename that the user will create or upload.

Warning
To avoid straining our eyes, I'll visually trim the hash string. However, please refrain from doing this in the source code.

$ echo "new.docx" | openssl sha256 | awk '{print $2}'
0f08dbc2...

$ mkdir 0f08dbc2

Next, for example, if the user creates a new file, I'll copy the document sample from the templates to the source directory.
$ cp templates/new.docx 0f08dbc2/new.docx

In this step, the structure will be as follows.
$ find .
└─ 0f08dbc2
   └─ new.docx

3.1.2. Create The Versions Directory
In a separate step, I would like to move the creation of the versions directory (also known as the *-hist in the current implementation). My goal is to ensure that in the future when working with versions, we never encounter a situation where we've to create a version directory using force. In other words, I want to ensure that whenever we create a subdirectory, we can always be certain that the versions directory already exists. This will simplify the logic and prevent unexpected errors.
$ mkdir 0f08dbc2/versions

In this step, the structure will be as follows.
$ find .
└─ 0f08dbc2
   ├─ new.docx
   └─ versions

3.1.3. Create The First Version
Instead of the current implementation, I suggest explicitly creating an initial version of the file when it's created or uploaded. To do this, first need to create a versioned directory.
$ mkdir 0f08dbc2/versions/1

Copy the source file to the versioned directory without renaming.
$ cp 0f08dbc2/new.docx 0f08dbc2/versions/1/new.docx

Currently, when a file is created, we generate the createdInfo.json which includes the date of creation, user ID, and user name. Additionally, we generate a key on the fly and save it as a key file at a later time.
Instead, I suggest generating a standard UUID here. To take the creation date and only the user ID without their name. Also, from now on, we need to keep the basename as we're not renaming the version file to the prev.* anymore. We can easily retrieve the user name at any time since it's hardcoded in the source code.
$ cat 0f08dbc2/versions/1/meta.json
{
  "key": "55077772-da00-4ee4-bb76-0cac08498d20",
  "basename": "new.docx",
  "created": "2023-07-31 12:57:07",
  "user": {
    "id": "uid-1"
  }
}

In this step, the structure will be as follows.
$ find .
└─ 0f08dbc2
   ├─ new.docx
   └─ versions
      └─ 1
         ├─ meta.json
         └─ new.docx

3.1.4. Write The Changes
The process of modifying a file is essentially very similar to how this file was created.
Create a subdirectory for the next version.
$ mkdir 0f08dbc2/versions/2

Copy the source file to the versioned directory.
$ cp 0f08dbc2/new.docx 0f08dbc2/versions/2/new.docx

Finally, place the additional files near the version file.
$ echo ... > 0f08dbc2/versions/2/meta.json

$ echo ... > 0f08dbc2/versions/2/diff.zip

$ echo ... > 0f08dbc2/versions/2/changes.json

In this step, the structure will be as follows.
$ find .
└─ 0f08dbc2
   ├─ new.docx
   └─ versions
      ├─ 2
      │  ├─ changes.json
      │  ├─ diff.zip
      │  ├─ meta.json
      │  └─ new.docx
      └─ 1
         ├─ meta.json
         └─ new.docx

3.1.5. Rename The Source File
In my implementation, I add a directory for the source file and throughout all the steps, I keep the source file's basename. Therefore, I want to discuss the file renaming process.
In the beginning, like when creating a file, need to take a hash string from the new name. For example, when the user wants to rename the new.docx to the my.docx.
$ echo "my.docx" | openssl sha256 | awk '{print $2}'
a0c1d714...

After this, need to rename the directory of the source file.
$ mv 0f08dbc2 a0c1d714

And rename the source file itself.
$ mv a0c1d714/new.docx a0c1d714/my.docx

In this step, the structure will be as follows.
$ find .
└─ a0c1d714
   ├─ my.docx
   └─ versions
      ├─ 2
      │  ├─ changes.json
      │  ├─ diff.zip
      │  ├─ meta.json
      │  └─ new.docx
      └─ 1
         ├─ meta.json
         └─ new.docx

3.1.6. Write The Changes After Renaming
Making changes after renaming the file won't be much different from the process described earlier. The only difference is that the meta will now include the new file basename.

Note
In the future, thanks to the basename in the meta, we might consider adding a history of how the file name has changed over time.

$ cat a0c1d714/versions/3/meta.json | jq -r ".basename"
my.docx

In this step, the structure will be as follows.
$ find .
└─ a0c1d714
   ├─ my.docx
   └─ versions
      ├─ 3
      │  ├─ changes.json
      │  ├─ diff.zip
      │  ├─ meta.json
      │  └─ my.docx
      ├─ 2
      │  ├─ changes.json
      │  ├─ diff.zip
      │  ├─ meta.json
      │  └─ new.docx
      └─ 1
         ├─ meta.json
         └─ new.docx

3.1.7. Restore The Specific Version
Thanks to the new structure, restoring a specific version has become much simpler.
Replace the current source file with the file with the requested version.
$ cp a0c1d714/versions/2/new.docx a0c1d714/my.docx

Run the process of bootstrapping the new version, just like we did when we first created the file.
$ mkdir a0c1d714/versions/4

$ cp a0c1d714/my.docx a0c1d714/versions/4/my.docx

$ echo ... > a0c1d714/versions/4/meta.json

In this step, the structure will be as follows.
$ find .
└─ a0c1d714
   ├─ my.docx
   └─ versions
      ├─ 4
      │  ├─ meta.json
      │  └─ my.docx
      ├─ 3
      │  ├─ changes.json
      │  ├─ diff.zip
      │  ├─ meta.json
      │  └─ my.docx
      ├─ 2
      │  ├─ changes.json
      │  ├─ diff.zip
      │  ├─ meta.json
      │  └─ new.docx
      └─ 1
         ├─ meta.json
         └─ new.docx

3.2. History Object
Changing the structure also has a positive impact on generating the history objects.
Below I've imagined how the history endpoints could potentially look different, but that isn't the most important aspect. First and foremost, please focus on the embedded versions.
GET /history/{{hash}}/{{version}}/data

GET /history/{{hash}}/{{version}}/download/{{basename}}?userIp=

$ curl /history/a0c1d714/1/data
{
  "fileType": "docx",
  "key": "55077772-da00-4ee4-bb76-0cac08498d20",
  "version": 1,
  "url": "http://proxy/history/a0c1d714/1/download/new.docx?userIp=<IP_ADDRESS>",
  "token": "..."
}

$ curl /history/a0c1d714/3/data
{
  "fileType": "docx",
  "key": "a397ffb3-a02d-47d4-9f07-b43025485cd6",
  "version": 3,
  "url": "http://proxy/history/a0c1d714/3/download/my.docx?userIp=<IP_ADDRESS>",
  "previous": {
    "fileType": "docx",
    "key": "a7e590f0-603c-48ac-b614-219af9d77766",
    "url": "http://proxy/history/a0c1d714/2/download/new.docx?userIp=<IP_ADDRESS>",
  },
  "changesUrl": "http://proxy/history/a0c1d714/3/download/diff.zip?userIp=<IP_ADDRESS>",
  "token": "..."
}

The Postscript
I'm concerned that if we keep adding new features to the current structure, it could become confusing and illogical. It took me a while to understand how the current implementation works. I've tried to provide a detailed explanation of the issue I encountered. You can find some sketches of my proposed solution in the feature/python-raw-history-endpoints and feature/ruby-raw-history-manager.
[^1]: Python, endpoint that creates an initial file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/python/src/views/actions.py#L97
[^2]: Node.js, endpoint that creates an initial file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/nodejs/app.js#L273
[^3]: Ruby, endpoint that creates an initial file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/ruby/app/controllers/home_controller.rb#L41
[^4]: PHP, function that creates an initial file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/php/functions.php#L825
[^5]: Java, function that creates an initial file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java/src/main/java/helpers/DocumentManager.java#L304
[^6]: Java Spring, function that creates an initial file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/managers/document/DefaultDocumentManager.java#L217
[^7]: C#, function that creates an initial file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp/DocEditor.aspx.cs#L608
[^8]: C# MVC, function that creates an initial file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp-mvc/Controllers/HomeController.cs#L49
[^9]: Python, function that creates the meta. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/python/src/utils/historyManager.py#L82
[^10]: Node.js, function that creates the meta. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/nodejs/helpers/docManager.js#L147
[^11]: Ruby, function that creates the meta. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/ruby/app/models/document_helper.rb#L182
[^12]: PHP, function that creates the meta. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/php/functions.php#L399
[^13]: Java, function that creates the meta. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java/src/main/java/helpers/DocumentManager.java#L270
[^14]: Java Spring, function that creates the meta. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/storage/LocalFileStorage.java#L311
[^15]: C#, function that creates the meta. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp/DocEditor.aspx.cs#L644
[^16]: C# MVC, function that creates the meta. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp-mvc/Helpers/DocManagerHelper.cs#L229
[^17]: Python, key generation on the fly. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/python/src/views/actions.py#L175
[^18]: Node.js, key generation on the fly. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/nodejs/app.js#L936
[^19]: Ruby, key generation on the fly. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/ruby/app/models/file_model.rb#L193
[^20]: PHP, key generation on the fly. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/php/views/DocEditorView.php#L73
[^21]: Java, key generation on the fly. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java/src/main/java/entities/FileModel.java#L73
[^22]: Java Spring, key generation on the fly. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/services/configurers/implementations/DefaultDocumentConfigurer.java#L72
[^23]: C#, key generation on the fly. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp/DocEditor.aspx.cs#L47
[^24]: C# MVC, key generation on the fly. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp-mvc/Models/FileModel.cs#L59
[^25]: Python, function that generates the history. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/python/src/utils/historyManager.py#L148
[^26]: Node.js, function that generates the history. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/nodejs/helpers/docManager.js#L442
[^27]: Ruby, function that generates the history. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/ruby/app/models/file_model.rb#L190
[^28]: PHP, function that generates the history. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/php/functions.php#L928
[^29]: Java, function that generates the history. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java/src/main/java/entities/FileModel.java#L196
[^30]: Java Spring, function that generates the history. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/managers/history/DefaultHistoryManager.java#L67
[^31]: C#, function that generates the history. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp/DocEditor.aspx.cs#L339
[^32]: C# MVC, function that generates the history. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp-mvc/Models/FileModel.cs#L240
[^33]: Python, force counting from one. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/python/src/utils/historyManager.py#L155
[^32]: Node.js, force counting from one. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/nodejs/helpers/docManager.js#L451
[^33]: Ruby, force counting from one. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/ruby/app/models/document_helper.rb#L132
[^34]: PHP, force counting from one. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/php/functions.php#L317
[^35]: Java, force counting from one. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java/src/main/java/helpers/DocumentManager.java#L231
[^36]: Java Spring, force counting from one. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/storage/LocalFileStorage.java#L375
[^37]: C#, force counting from one. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp/Default.aspx.cs#L246
[^38]: C# MVC, force counting from one. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp-mvc/Helpers/DocManagerHelper.cs#L167
[^39]: Python, check if the history directory contains a file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/python/src/utils/historyManager.py#L47
[^40]: Ruby, check if the history directory contains a file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/ruby/app/models/document_helper.rb#L139
[^41]: PHP, check if the history directory contains a file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/php/functions.php#L324
[^42]: Java, check if the history directory contains a file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java/src/main/java/helpers/DocumentManager.java#L241
[^43]: Java Spring, check if the history directory contains a file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/storage/LocalFileStorage.java#L382
[^44]: C#, check if the history directory contains a file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp/Default.aspx.cs#L247
[^45]: C# MVC, check if the history directory contains a file. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp-mvc/Helpers/DocManagerHelper.cs#L168
[^46]: Python, function that generates a key. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/python/src/utils/docManager.py#L255
[^47]: Node.js, function that generates a key. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/nodejs/helpers/docManager.js#L403
[^48]: Ruby, function that generates a key. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/ruby/app/models/file_model.rb#L62
[^49]: PHP, function that generates a key. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/php/functions.php#L501
[^50]: Java, own implementation of the file-creating. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java/src/main/java/helpers/DocumentManager.java#L315-L320
[^51]: Python, function that generates a key from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/python/src/utils/docManager.py#L265
[^52]: Node.js, function that generates a key from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/nodejs/helpers/documentService.js#L108
[^53]: Ruby, function that generates a key from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/ruby/app/models/service_converter.rb#L95
[^54]: PHP, function that generates a key from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/php/functions.php#L597
[^55]: Java, function that generates a key from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java/src/main/java/helpers/ServiceConverter.java#L241
[^56]: Java Spring, function that generates a key from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/util/service/DefaultServiceConverter.java#L187
[^57]: C#, function that generates a key from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp/DocumentConverter.cs#L170
[^58]: C# MVC, function that generates a key from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp-mvc/Helpers/DocumentConverter.cs#L168
[^59]: Python, key generation from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/python/src/utils/trackManager.py#L62
[^60]: Node.js, key generation from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/nodejs/app.js#L771
[^61]: Ruby, key generation from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/ruby/app/controllers/home_controller.rb#L112
[^62]: PHP, key generation from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/php/trackmanager.php#L117
[^63]: Java, key generation from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java#L278
[^64]: Java Spring, key generation from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java#L214
[^65]: C#, key generation from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp/Default.aspx.cs#L480
[^66]: C# MVC, key generation from the URL. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs#L239
[^67]: Documentation, description of the key. https://api.onlyoffice.com/editors/callback#key
[^68]: Documentation, description of the onRequestHistory. https://api.onlyoffice.com/editors/config/events#onRequestHistory
[^69]: Documentation, description of the onRequestHistoryData. https://api.onlyoffice.com/editors/config/events#onRequestHistoryData
[^70]: Python, check if the file is the latest version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/python/src/utils/historyManager.py#L162
[^71]: Node.js, check if the file is the latest version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/nodejs/helpers/docManager.js#L468
[^72]: Ruby, check if the file is the latest version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/ruby/app/models/file_model.rb#L218
[^73]: PHP, check if the file is the latest version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/php/functions.php#L944
[^74]: Java, check if the file is the latest version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java/src/main/java/entities/FileModel.java#L218
[^75]: Java Spring, check if the file is the latest version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/managers/history/DefaultHistoryManager.java#L83
[^76]: C#, check if the file is the latest version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp/DocEditor.aspx.cs#L360
[^77]: C# MVC, check if the file is the latest version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp-mvc/Models/FileModel.cs#L261
[^78]: Python, check if the file is the first version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/python/src/utils/historyManager.py#L170
[^79]: Node.js, check if the file is the first version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/nodejs/helpers/docManager.js#L480
[^80]: Ruby, check if the file is the first version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/ruby/app/models/file_model.rb#L218
[^81]: PHP, check if the file is the first version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/php/functions.php#L944
[^82]: Java, check if the file is the first version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java/src/main/java/entities/FileModel.java#L218
[^83]: Java Spring, check if the file is the first version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/managers/history/DefaultHistoryManager.java#L88
[^84]: C#, check if the file is the first version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp/DocEditor.aspx.cs#L360
[^85]: C# MVC, check if the file is the first version. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/csharp-mvc/Models/FileModel.cs#L261

Note
This comment is another note in the margins.

I was working on implementing the restore endpoint for the example in Java with Spring and everything was going well. However, when I restored the document as the same user who created it, I noticed that the restored version has a different color in the history tree in the editor.
$ tree .
.
├── new.docx
└── new.docx-hist
    ├── 1
    │   ├── changes.json
    │   ├── diff.zip
    │   ├── key.txt
    │   └── prev.docx
    ├── 2
    │   ├── changes.json
    │   ├── diff.zip
    │   ├── key.txt
    │   └── prev.docx
    ├── 3
    │   ├── changes.json
    │   ├── key.txt
    │   └── prev.docx
    └── createdInfo.json

I was confused by this, so I decided to check if I had created the changes.json with a different user, but I didn't.
$ cat new.docx-hist/3/changes.json | jq
{
  "serverVersion": null,
  "changes": [
    {
      "created": "2023-08-03 07:28:29",
      "user": {
        "name": "John Smith",
        "id": "uid-1"
      }
    }
  ]
}

I also decided to take a look at the created.json file for a previous version. Instead of the usual user ID with the uid- prefix, I found a plain integer value.
$ cat new.docx-hist/1/changes.json | jq
{
  "serverVersion": "7.3.3",
  "changes": [
    {
      "created": "2023-08-03 07:27:20",
      "user": {
        "id": "1",
        "name": "John Smith"
      }
    }
  ]
}

My guess is that the misunderstanding is how the relationship is set up between the User entity[^1] and the User model.[^2] The User entity is stored in the database and has an integer primary key (also known as ID), while the User model stored the ID as a string.
[^1]: Java Spring, User entity. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/entities/User.java#L36
[^2]: Java Spring, User model. https://github.com/ONLYOFFICE/document-server-integration/blob/7f659bc95e7e92c5d428b00b17b68de5f374da99/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/User.java#L31

Some additions after talking with the team.
File Directory Name
I suggested taking a hash from the file name to use it in the directory name to avoid possible problems when working with the directory (spaces in the name, file extension in the name, and so on). But this approach isn't very good because when the user creates a file with the same name as the existing one. If we're working with a hash, then we must increase the counter, take a new hash, and check if the directory with this hash exists. If it does, then we must repeat the process until we find a non-existent version.
It's better to just create a new UUID for each directory. With this approach, we can store many files with the same name, and everything will be fine.
Key Length
Previously, the document server had a key length limit of 20 characters. However, if I understand correctly, this limitation isn't too strict anymore. Therefore, we can now use UUID for the file key.
Latest Version
It may not make sense to store the latest version outside of the versions directory since we already store it in the versioned directory.
Diff and Changes Locations
In the current history implementation, a diff.zip and change.json for the next version are kept near the current version directory. This is based on the assumption that these files are instructions for reaching the next version and that these instructions can only be applied to the current version.

Part of a snippet from the first issue message.

├─ 1
│  ├─ changes.json   The black box of the second version. (2)
│  ├─ diff.zip       The diff of the second version. (2)
│  ├─ key.txt        The key of the first version. (1)
│  └─ prev.docx      The source file of the first version. (1)

On the one hand, I now understand why this approach was chosen. On the other hand, it doesn't seem logical to me. I'll try to demonstrate this with a primitive example of how history works in Git.
Let's imagine we have a main branch and a feature and fix based on that branch. Each of the new branches has its own changes to the source file.
                      ┌───────────────────┐
                      │  branch: main     │
                   ┌──┤  source: main.js  ├──┐
                   │  └───────────────────┘  │
┌──────────────────┴─┐                     ┌─┴──────────────────────┐
│  branch: fix       │                     │  branch: feature       │
│  source: main.js   │                     │  source: main.js       │
│  diff:   fix.diff  │                     │  diff:   feature.diff  │
└────────────────────┘                     └────────────────────────┘

Yes, there is no such branching in our product, but the essence doesn't change from that. It's more logical to store a diff.zip and changes.json not near the file to which you want to apply these changes, but near the file that will be obtained after applying these changes.


Jenkins sending and collecting multiple jobs Shark

Succeeding #101:

The jenkins worker node that is connected to Shark should be able to submit multiple jobs (eventually for the challenge: calling SuperElastix with different datasets and blueprints).
These jobs run in parallel on Shark and the jenkins worker waits until all jobs are finished. When all jobs are finished the worker node continues to summarize the data. That is, having all results accessible at least. (eventually for the challenge: calculate histograms of the challenge metrics and post that on a visual dashboard/website)
We expect/decided that a python script on the jenkins worker node would be the best option to deal with these different tasks.

done in #172 deploy develop on shark and PR #180


Construct the Map and Serialize the Graph To GameData

Logic to serialized the Graph is completed
https://github.com/draukadin/iron-dragon/commit/2be71957f2dbaf94d8a3afeb9c8a733813260aeb
https://github.com/draukadin/iron-dragon/commit/52f4214081142122a73c04c533991b5630764857


Feat: Making the profile and dashboard respponsive

Describe the feature
The dashboard and profile in smaller screens are not resposive
Add ScreenShots
Not needed
Record

[X] I agree to follow this project's Code of Conduct
[X] I'm a GSSOC'24 contributor
[X] I want to work on this issue

Please assign this to me

@chitraa-cj done


Scaffolding does not respect namespace in links

Problem
If you generate scaffolding for admin/users some of the links in the views will be incorrect (missing the namespace). For example, the link to create a new user should look like new_admin_user_path but the generator has new_user_path.
Not all links are incorrect, but most are.
Cause
In the template some of the links are created like:
link_to edit_<%= singular_table_name %>_path (does not include namespace)
While others are created like:
link_to <%= index_helper %>_path (does include namespace)
Proposed Solution
Based on https://api.rubyonrails.org/classes/Rails/Generators/NamedBase.html; I think we can just use other helper methods, eg: show_helper & edit_helper in placed of singular_table_name. Tho, that will produce _url style links as opposed to _path style links like now.
I don't see any activity in a while, but if you haven't moved away from this project would you like a PR?

Hello,
Is this issue still active?
I would like to work on this.
Best Regards.


fix transition properties with Firefox

Closes #17.
Closes #18.

thanks!

@jquense Thanks you! Hopefully, I can close https://github.com/oliviertassinari/react-swipeable-views/issues/234 🎉  and material-ui is has one less bug.


Eclipse hawkBit is now licensed under EPL-2.0

https://github.com/eclipse/hawkbit/commit/9c86729a68af97a23f56e4fbe9be38b863895981

Thanks for noticing. We don't need another 2.0 example, but do need to replace hawkbit as a 1.0 example. https://github.com/clojure/clojurescript seems like an obvious pick.

We don't need another 2.0 example

Right. We don't need 4 examples.
But there are other examples that should be removed.
I removed Eclipse SmartHome because it is archived.

https://github.com/clojure/clojurescript/blob/master/LICENSE seems like an obvious pick.

I agree. I added ClojureScript on https://github.com/github/choosealicense.com/pull/1153/commits/d9f9de4c6368f7d2f59faa26ef55b96bf722c6fe.

Oh I did not see #1154 @shogo82148 glad we chose the same project.


Incompatibility with node.js 15.9.0

Hello, I'm trying to do yarn install on my serverless project. the serverless-bundle has this package as a dependency but every time it will hit me with the following error:
error<EMAIL_ADDRESS>The engine "node" is incompatible with this module. Expected version ">=8 <=14". Got "15.9.0" error Found incompatible module.
Is there any chance you can allow compatibility with this version of node, or maybe the error is on their part? Thank you.

Hello,
What about node 16 ?
error<EMAIL_ADDRESS>The engine "node" is incompatible with this module. Expected version ">=8 <=14". Got "16.0.0" error Found incompatible module.


Installation indigo on OSX failed while building 'nodelet_tutorial_math'

Hello,
I followed the official installation of ROS Indigo on OSX.
Everything worked perfectly until I started building the catkin Workspace.
And nodelet_tutorial_math failed to build but not for the same reason that is answered in the installation tutorial. This is what I get:
> cd /Users/ejalaa/Development/ros_installation/my_install/build_isolated/nodelet_tutorial_math && /Users/ejalaa/Development/ros_installation/my_install/install_isolated/env.sh make -j4 -l4

[ 50%] Building CXX object CMakeFiles/nodelet_math.dir/src/plus.cpp.o
In file included from /Users/ejalaa/Development/ros_installation/my_install/src/common_tutorials/nodelet_tutorial_math/src/plus.cpp:30:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/pluginlib/class_list_macros.h:40:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/class_loader/class_loader.h:33:
In file included from /usr/local/include/boost/shared_ptr.hpp:17:
In file included from /usr/local/include/boost/smart_ptr/shared_ptr.hpp:23:
In file included from /usr/local/include/boost/config/no_tr1/memory.hpp:21:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:610:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:79:9: error:
      no member named 'strcoll' in the global namespace
using ::strcoll;
      ~~^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:80:9: error:
      no member named 'strxfrm' in the global namespace
using ::strxfrm;
      ~~^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:82:9: error:
      no member named 'memchr' in the global namespace; did you mean 'wmemchr'?
using ::memchr;
      ~~^
/usr/include/wchar.h:150:10: note: 'wmemchr' declared here
wchar_t *wmemchr(const wchar_t *, wchar_t, size_t);
         ^
In file included from /Users/ejalaa/Development/ros_installation/my_install/src/common_tutorials/nodelet_tutorial_math/src/plus.cpp:30:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/pluginlib/class_list_macros.h:40:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/class_loader/class_loader.h:33:
In file included from /usr/local/include/boost/shared_ptr.hpp:17:
In file included from /usr/local/include/boost/smart_ptr/shared_ptr.hpp:23:
In file included from /usr/local/include/boost/config/no_tr1/memory.hpp:21:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:610:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:86:9: error:
      no member named 'strcspn' in the global namespace
using ::strcspn;
      ~~^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:88:9: error:
      no member named 'strpbrk' in the global namespace
using ::strpbrk;
      ~~^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:90:9: error:
      no member named 'strrchr' in the global namespace; did you mean 'strchr'?
using ::strrchr;
      ~~^
/System/Library/Frameworks/Kernel.framework/Headers/string.h:81:14: note:
      'strchr' declared here
extern char     *strchr(const char *s, int c);
                 ^
In file included from /Users/ejalaa/Development/ros_installation/my_install/src/common_tutorials/nodelet_tutorial_math/src/plus.cpp:30:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/pluginlib/class_list_macros.h:40:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/class_loader/class_loader.h:33:
In file included from /usr/local/include/boost/shared_ptr.hpp:17:
In file included from /usr/local/include/boost/smart_ptr/shared_ptr.hpp:23:
In file included from /usr/local/include/boost/config/no_tr1/memory.hpp:21:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:610:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:92:9: error:
      no member named 'strspn' in the global namespace
using ::strspn;
      ~~^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:94:9: error:
      no member named 'strstr' in the global namespace; did you mean 'strnstr'?
using ::strstr;
      ~~^
/System/Library/Frameworks/Kernel.framework/Headers/string.h:80:14: note:
      'strnstr' declared here
extern char     *strnstr(char *s, const char *find, size_t slen);
                 ^
In file included from /Users/ejalaa/Development/ros_installation/my_install/src/common_tutorials/nodelet_tutorial_math/src/plus.cpp:30:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/pluginlib/class_list_macros.h:40:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/class_loader/class_loader.h:33:
In file included from /usr/local/include/boost/shared_ptr.hpp:17:
In file included from /usr/local/include/boost/smart_ptr/shared_ptr.hpp:23:
In file included from /usr/local/include/boost/config/no_tr1/memory.hpp:21:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:610:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:99:98: error:
      no member named 'strpbrk' in the global namespace; did you mean simply
      'strpbrk'?
  ...char* strpbrk(      char* __s1, const char* __s2) {return ::strpbrk(__s1...
                                                               ^~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:99:46: note:
      'strpbrk' declared here
inline _LIBCPP_INLINE_VISIBILITY       char* strpbrk(      char* __s1, c...
                                             ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:100:88: error:
      no member named 'strrchr' in the global namespace; did you mean simply
      'strrchr'?
  ...char* strrchr(      char* __s, int __c) {return ::strrchr(__s, __c);}
                                                     ^~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:100:46: note:
      'strrchr' declared here
inline _LIBCPP_INLINE_VISIBILITY       char* strrchr(      char* __s, in...
                                             ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:101:99: error:
      no member named 'memchr' in the global namespace; did you mean simply
      'memchr'?
  ...void* memchr(      void* __s, int __c, size_t __n) {return ::memchr(__s...
                                                                ^~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:101:46: note:
      'memchr' declared here
inline _LIBCPP_INLINE_VISIBILITY       void* memchr(      void* __s, in...
                                             ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:102:97: error:
      no member named 'strstr' in the global namespace; did you mean simply
      'strstr'?
  ...char* strstr(      char* __s1, const char* __s2) {return ::strstr(__s1, ...
                                                              ^~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:102:46: note:
      'strstr' declared here
inline _LIBCPP_INLINE_VISIBILITY       char* strstr(      char* __s1, co...
                                             ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:106:9: error:
      no member named 'strtok' in the global namespace
using ::strtok;
      ~~^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:109:9: error:
      no member named 'strerror' in the global namespace
using ::strerror;
      ~~^
In file included from /Users/ejalaa/Development/ros_installation/my_install/src/common_tutorials/nodelet_tutorial_math/src/plus.cpp:30:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/pluginlib/class_list_macros.h:40:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/class_loader/class_loader.h:33:
In file included from /usr/local/include/boost/shared_ptr.hpp:17:
In file included from /usr/local/include/boost/smart_ptr/shared_ptr.hpp:28:
In file included from /usr/local/include/boost/smart_ptr/detail/shared_count.hpp:29:
In file included from /usr/local/include/boost/smart_ptr/detail/sp_counted_base.hpp:45:
In file included from /usr/local/include/boost/smart_ptr/detail/sp_counted_base_clang.hpp:18:
In file included from /usr/local/include/boost/detail/sp_typeinfo.hpp:20:
In file included from /usr/local/include/boost/core/typeinfo.hpp:119:
In file included from /usr/local/include/boost/core/demangle.hpp:14:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/string:438:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cwchar:186:49: error:
      declaration conflicts with target of using declaration already in scope
inline _LIBCPP_INLINE_VISIBILITY const wchar_t* wmemchr(const wchar_t* _...
                                                ^
/usr/include/wchar.h:150:10: note: target of using declaration
wchar_t *wmemchr(const wchar_t *, wchar_t, size_t);
         ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:82:9: note:
      using declaration
using ::memchr;
        ^
In file included from /Users/ejalaa/Development/ros_installation/my_install/src/common_tutorials/nodelet_tutorial_math/src/plus.cpp:30:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/pluginlib/class_list_macros.h:40:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/class_loader/class_loader.h:33:
In file included from /usr/local/include/boost/shared_ptr.hpp:17:
In file included from /usr/local/include/boost/smart_ptr/shared_ptr.hpp:28:
In file included from /usr/local/include/boost/smart_ptr/detail/shared_count.hpp:29:
In file included from /usr/local/include/boost/smart_ptr/detail/sp_counted_base.hpp:45:
In file included from /usr/local/include/boost/smart_ptr/detail/sp_counted_base_clang.hpp:18:
In file included from /usr/local/include/boost/detail/sp_typeinfo.hpp:20:
In file included from /usr/local/include/boost/core/typeinfo.hpp:119:
In file included from /usr/local/include/boost/core/demangle.hpp:14:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/string:646:54: error:
      no matching function for call to 'memchr'
        {return __n == 0 ? NULL : (const char_type*) memchr(__s, to_int_...
                                                     ^~~~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/cstring:101:46: note:
      candidate function not viable: no known conversion from
      'const char_type *' (aka 'const char *') to 'void *' for 1st argument;
      take the address of the argument with &
inline _LIBCPP_INLINE_VISIBILITY       void* memchr(      void* __s, in...
                                             ^
In file included from /Users/ejalaa/Development/ros_installation/my_install/src/common_tutorials/nodelet_tutorial_math/src/plus.cpp:30:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/pluginlib/class_list_macros.h:40:
In file included from /Users/ejalaa/Development/ros_installation/my_install/install_isolated/include/class_loader/class_loader.h:34:
In file included from /usr/local/include/boost/thread/recursive_mutex.hpp:16:
In file included from /usr/local/include/boost/thread/pthread/recursive_mutex.hpp:11:
In file included from /usr/local/include/boost/thread/exceptions.hpp:22:
In file included from /usr/local/include/boost/system/system_error.hpp:14:
In file included from /usr/local/include/boost/system/error_code.hpp:19:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/ostream:140:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/locale:871:44: error:
      use of undeclared identifier 'errno'
        typename remove_reference<decltype(errno)>::type __save_errno = errno;
                                           ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/locale:871:53: error:
      no type named 'type' in the global namespace
        typename remove_reference<decltype(errno)>::type __save_errno = errno;
                                                  ~~^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/locale:871:73: error:
      use of undeclared identifier 'errno'
        typename remove_reference<decltype(errno)>::type __save_errno = errno;
                                                                        ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make[2]: *** [CMakeFiles/nodelet_math.dir/src/plus.cpp.o] Error 1
make[1]: *** [CMakeFiles/nodelet_math.dir/all] Error 2
make: *** [all] Error 2

I can't figure out what to do ?
Apparently there is a similar issue on mikepurvis git
Thank you

This can be solved by passing -DCMAKE_FIND_FRAMEWORK=LAST as the very first CMake argument.

I don't know how to better fix this (better than the work around). If anyone know how please speak up. I might look into it again next time I update OS X.

AFAIK adding the CMake argument to the toplevel cmake list (with an if clause) does not introduce any regressions.

hi,ejalaa12
I have confuse with the same promble,Did you resolve it？

Sorry for bad English, yesterday I had update macOS to Sierra and use Xcode 8.2.1 to compile it ,But the problem is still here. I have no idea now, anyone know it?

The problem is due to the inclusion of the wrong string.h(from kernel framework instead of the standard library).  -DCMAKE_FIND_FRAMEWORK=LAST did not resolve the problem on my side.
I found the culprit to be the FindUUID CMake module. It is located at ${ros_ws}/src/cmake_modules/cmake/Modules/FindUUID.cmake. Changing from find_path(UUID_INCLUDE_DIRS uuid/uuid.h) to find_path(UUID_INCLUDE_DIRS ossp/uuid.h) worked for me. Be sure to install ossp-uuid via homebrew first.

@jundazhu Thanks for discovering it.
Note for others: to make this solution work it might be necessary to remove build_isolated/nodelet_core and devel_isolated/nodelet_core directories first (did the trick for me).

@jundazhu, your solution does not work for me, even with the @bgromov's note.
Also adding -DCMAKE_FIND_FRAMEWORK=LAST to the build workspace command ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release -DCMAKE_FIND_FRAMEWORK=LAST do not work.

@argrento Have you tried to wipe the whole build_isolated and devel_isolated? That what worked for me on another macOS.

@bgromov yes, thus I exclude 'nodelet_tutorial_math' from the build tree.

@argrento can you try to downgrade class_loader to version 3.4 to identify if this is the root of the problem? (you can post your comments on https://github.com/ros/class_loader/issues/44)
Thanks!

@mikaelarguedas yesterday I tried to use Mac OS X installer. I added -DCMAKE_FIND_FRAMEWORK=LAST to the build options and I saw no error, all was good.

@argrento glad it worked for you too. So you did succeed to compile nodelet_tutorial_math using @jundazhu's solution? Or is it still excluded from your workspace?

@argrento what macOS version are you using? I'm on Sierra and the installer script you mentioned will fail in qt discovery for me.

@folkwang I have 10.11.6. I have an issue with Qt as well. Section 4.2 helped me.

@argrento ah yeah. i did a clean rebuild and it works. thanks!

Had same problem with macOS Sierra 10.15.2 and ROS Kinetic, all suggestions didn't work for me, so I've removed ${UUID_INCLUDE_DIRS} ${UUID_LIBRARIES} from nodelet package.
Before:
catkin_package(
  INCLUDE_DIRS include ${UUID_INCLUDE_DIRS}
  LIBRARIES nodeletlib ${UUID_LIBRARIES}
  CATKIN_DEPENDS bondcpp message_runtime pluginlib rosconsole roscpp std_msgs
  DEPENDS Boost
)

After:
catkin_package(
  INCLUDE_DIRS include
  LIBRARIES nodeletlib
  CATKIN_DEPENDS bondcpp message_runtime pluginlib rosconsole roscpp std_msgs
  DEPENDS Boost
)

Hopefully this could help someone and won't brake something else :P.

@ilidar thank you, that fixed it for me to and now it compiles fine :)
it also fixed the rqt_gui_cpp error for me!

Since this has a workaround could someone please add this to the http://wiki.ros.org/kinetic/Installation/OSX/Homebrew/Source and then we can close this ticket?

Hi, sorry everyone, I haven't followed this issue closely lately. Besides, I don't get this error anymore, probably because I did several updates meanwhile. However, It seems that this issue has been resolved. Should I close the ticket or wait for someone to add it to the tutorial ? @tfoote

If this is no longer an issue with recent updates we can close this out as we don't need to update the documentation. Thanks for the followup @ejalaa12

This problem still seems to happen with lunar. It would be great if someone could add this to the Homebrew troubleshooting page.