Redirect URL using Action Element

Hello, Is there any way to redirect an URL in a new tab when user click on Action Button.

Hi @kietbg0079  , have u got any solution for this ?

@kietbg0079 @anandrajB Do you mean to have a button with a link with target=_blank?

yes like that

Thanks for clarifying. Considering what's documented now, what could be a sensible and minimal API to allow for this feature look like?

i was expecting a simple redirect_to like option in action callbacks
actions = [
cl.Action(name="proceed", value="create_table", label="Create Table")
        ]
await cl.Message(content="Confirm to create table?", actions=actions).send()

@cl.action_callback("proceed")
async def on_action(action):
   cl.redirect_to(url)

expecting something like this redirect_to , help me out
in the documentation mentioned toast message will be displaying , documentation , but its not working for me , need to change anything in toml or any specific versions ?

If the toast is not working, that seems another issue. Please file a different bug report (ensure to fill in the full bug report template!).
Regarding the 'redirect', the semantics seem closer to [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open) ('normal link') or [window.navigate()](https://developer.mozilla.org/en-US/docs/Web/API/Navigation/navigate). If I understand it well, you propose to be able to drive the user agent (browser) to any page, either in the current or in a new window.
I also think this feature should implement this in a way where we can interoperate with React (so navigate()). We could have routes for things like chat profiles and other features so devs are free to create much richer UX's.

Thanks for the assist @dokterbob  , will look forward on it
Hi @kietbg0079  , just temporarily use webbrowser lib
import webbrowser
webbrowser.open(url , new = 0)


BOM

Any change for a BOM soon? The Kicad BOM output is very vague.

What questions do you have about it?  I did not list specific part numbers for caps or resistors as many go out of stock etc.


Add repo link

e.g.
[MichaelCurrin/repo-boilerplates](https://github.com/MichaelCurrin/repo-boilerplates)

Find a way to include Github icon too whether from shields site or SVG

Link is on homepage. Need an icon. Preferably using the core code.


follow upstream to suppress "Not enough storage~" message

hello, there is an issue on upstream https://github.com/rprichard/winpty/issues/74
i'm facing the same problem on windows7. please check. thank you!

Looks fine, thanks!

thank you!


Access url slug in templates

Is it possible to access the slug for a page without explicitly defining the slug in the frontmatter? I have been digging through the code but cannot quite tell for sure. It appears it can't be.

Try .URLPath.Slug

Nope, still only accessible if the slug is defined in front matter. :(

So, the closest I could get is .Source.LogicalName but then I need to chop off the .md. I may submit a PR to set the slug if one is not provided.

As slug is user-provided and there is logic to use it if set, It doesn't make sense to put something in it if ... not set.
What is your use case?

http://rainbowsixbootcamp.com is built on Hugo. I created a page for each operator, weapon, weapon mod, etc. When I am trying to generate a list of related pages, I want to include an image and I don't want to have to code the path to the image for each file. So, I want to link to the image matching the content files slug.
E.g. The weapon skins, I have an icon file showing the skin texture, a 320x180 image and a 1600x900 image. There are ~140 skins and more created with each DLC drop. If the skin is called [Acid Rain](http://rainbowsixbootcamp.com/advanced-training/gear/weapon-mod/acid-rain/), then my images are:

http://rainbowsixbootcamp.com/images/gear/weapon-mod/skin/acid-rain-th.jpg
http://rainbowsixbootcamp.com/images/gear/weapon-mod/skin/acid-rain-320x180.jpg
http://rainbowsixbootcamp.com/images/gear/weapon-mod/skin/acid-rain-1600x900.jpg

If I have access to the slug without having to explicitly define it every time, then things are way easier.

.Source.LogicalName but then I need to chop off the .md. I may submit a PR to set the slug if one is not provided.

.Source.BaseFileName is the LogicalName without the suffix.

@bep Yea, I figured that out. Thanks.

@christophermancini is this still an issue?

This issue has been automatically marked as stale because it has not been commented on for at least four months.
The resources of the Hugo team are limited, and so we are asking for your help.
If this is a bug and you can still reproduce this error on the master branch, please reply with all of the information you have about it in order to keep the issue open.
If this is a feature request, and you feel that it is still valuable, please open a proposal at https://discuss.gohugo.io/.
This issue will automatically be closed in four months if no further activity occurs. Thank you for all your contributions.

Note/Update: This issue is marked as stale, and I may have said something earlier about "opening a thread on the discussion forum". Please don't.
If this is a bug and you can still reproduce this error on the latest release or the master branch, please reply with all of the information you have about it in order to keep the issue open.
If this is a feature request, and you feel that it is still relevant and valuable, please tell us why.


[VL] Use the default pip3.6 from the alinux3 in the build of velox

What changes were proposed in this pull request?
Use the default pip3.6 from the alinux3 in the build of velox
How was this patch tested?


add diagnostics

Some PRs are hitting a corner-case where our binary writer reports
  FSC : error FS2014: A problem occurred writing the binary ... EmitZUntaggedIndex: too big for small address or simple index

This adds some diagnostics so that next time this happens we can find out a bit more about why

I am also using this PR to add some extra diagnostics and a possible fix for the "type provider smoke tests" which fail from time to time

@dsyme the only changes in the one file are to the unit tests, perhaps you need to add a file to the commit.

@dsyme the only changes in the one file are to the unit tests, perhaps you need to add a file to the commit.

Most of the changes were incorporated into #6316 , this is the last part of the diagnostics in one of the flaky unit test

Dodgy test: AwaitTaskCancellationAfterAsyncTokenCancellation

The SmokeTests failed again, but this time we got a little more information:
Failed   TypeProvider.Disposal.SmokeTest1
Error Message:
   Check3, countCreations() = i, iteration 35, countCreations() = 36
  Expected: True
  But was:  False

(It's very odd that this is erratic: there are more creations than interations.???...)

I updated this with improvements to make the TypeProvider disposal smoke test less flaky

CI is no longer being triggered on Push for some reason.....

This is ready - some diagnostics and some changes to reduce test flakiness


UnboundLocalError: local variable 'mask_sharp' referenced before assignment ? WIN11 RTX 3050

File "inference.py", line 345, in
main()
File "inference.py", line 201, in main
pred, _, _ = enhancer.process(img, img, face_enhance=True, possion_blending=False)
File "C:\AI\opentalker\video-retalking\third_part\GPEN\gpen_face_enhancer.py", line 113, in process
mask_sharp = cv2.GaussianBlur(mask_sharp, (0,0), sigmaX=1, sigmaY=1, borderType = cv2.BORDER_DEFAULT)
UnboundLocalError: local variable 'mask_sharp' referenced before assignment

Same here, with Windows10, RTX A4500

same

Also experiencing this.
Not smart enough to touch the code.

I added this line 61 to initialize mask_sharp :
mask_sharp = full_mask.copy()
It seems to work but not sure at all it's a good fix.

Hello @PhilGauthier , did it work since yesterday? (Also you memntioned A4500, is that shadow by any chance?)

    mask_sharp = []  //add

    for i, (faceb, facial5points) in enumerate(zip(facebs, landms)):

mask_sharp = []  #add

for i, (faceb, facial5points) in enumerate(zip(facebs, landms)):


Install a subdirectory of a package to the installer-path

I'm wondering if there is a way to install a package, where the contents that need to be installed to the installer-path actually is a subdirectory of the repo/package.
Example: https://github.com/johndwells/craft.minimee, is a craft-plugin. The author has the folder (minimee/) that needs to be moved to craft/app/plugins/ actually in the repo. Other authors just put the contents of that folder in the root, but since the proper naming of that folder is crucial, it is easy to see why authors sometimes include it.

I'm running into this same problem with https://github.com/pixelandtonic/ElementAPI of all plugins.

This particular case is similar to the feature requested in composer/composer#3037.  There is a target-directory configuration, I don't believe anyone has ever suggested the inverse as a feature in composer/composer.

@slbmeh Any guidance here would be great.
Here's the use-case:
A number of plugin developers in the Craft CMS community have adopted using craft-plugin from composer/installers, myself included. Great.
However, many people are opposed to the idea, simply because they don't want to restructure their repos to have the "plugin directory" at the root. Instead they have it in a appropriately named folder (e.g. https://github.com/pixelandtonic/ElementAPI).
This is understandable because the folder has to named correctly in the install path craft/plugins/pluginName to work correctly. To achieve this, craft-plugin relies on stripping craft and plugin from the repo name.
What is the right course of action here?

Is there an option these authors can use to tell composer/installers to use ./myPluginName as the base path for installing? Would this be a composer/composer thing or composer/installers, or should there be?
Should the craft-plugin functionality simply be changed use the subdirectory?
Should there be a separate craft-plugin-nested for this? (seems dumb)


Changing the alpha value of a stream loaded geometry doesn't work

Describe the bug 📝
Setting a low alpha value for some objects is useful since it allows dimming non-relevant objects in a model view. Therefore I tried manipulating some objects in the geometry definition for the tiles streamer with the method below:
function makeAllTransparent(geometryData){
        geometryData.assets = geometryData.assets.map(item => {
          item.geometries = item.geometries.map(g => {
            g.color[3] = 0.001;
            return g;
          });
          return item;
        });
 }

As you can see in the demo, however, this results in some objects not being shown.
Try demo
Source code
Sample tiles found here
Reproduction ▶
https://qaecy.github.io/demos/obc_1.4.21/dist/issue-transparency.html
Steps to reproduce 🔢
No response
System Info 💻
Tiles created with web-ifc version 0.0.51 and openbim-components 1.4.15.

Loader uses openbim-components 1.4.21 (same problem with 1.4.15)

Used Package Manager 📦
npm
Error Trace/Logs 📃
No response
Validations ✅

[X] Read the docs.
[X] Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
[X] Make sure this is a repository issue and not a framework-specific issue. For example, if it's a THREE.js related bug, it should likely be reported to mrdoob/threejs instead.
[X] Check that this is a concrete bug. For Q&A join our Community.
[X] The provided reproduction is a minimal reproducible example of the bug.

Same results in 1.5.0

Same results in 2.0.1. An alternative could be the new setColor()-method on the fragments, but this doesn't support transparency either.

I am interested in this feature too.
As a temporary solution I am using the highlight function.

IMO the JSON containing the information of the geometries shouldn't be edited, as it could greatly increase the number of edge cases. So let's see if we can make this happen without doing that.
With the current API, and using the streamer tutorial as a starting point, I've changed the load function to this:
async function loadModel(geometryURL: string, propertiesURL?: string) {
  const rawGeometryData = await fetch(geometryURL);
  const geometryData = await rawGeometryData.json();
  let propertiesData;
  if (propertiesURL) {
    const rawPropertiesData = await fetch(propertiesURL);
    propertiesData = await rawPropertiesData.json();
  }

  const model = await loader.load(geometryData, true, propertiesData);
  console.log(model);

  const classifier = components.get(OBC.Classifier);
  classifier.byEntity(model);
  const found = classifier.find({ entities: ["IFCWALLSTANDARDCASE"] });
  const fragKeys = new Set(Object.keys(found));

  const transpMaterial = new THREE.MeshLambertMaterial({
    transparent: true,
    opacity: 0.2,
  });

  loader.onFragmentsLoaded.add((frags) => {
    for (const frag of frags) {
      if (fragKeys.has(frag.id)) {
        frag.mesh.material = [transpMaterial];
      }
    }
  });
}

This is the result:
https://github.com/user-attachments/assets/e9fe62d9-58e1-40e4-8a1a-97e8f54b3fc1
As you can see, streaming doesn't support visibility through transparent objects, as it would increase its complexity by an order of magnitude. This is also the case for fragments that were already transparent in the original BIM model.
If you want to make the whole model transparent and force that some objects are displayed, IMO the best way would be to add a list of fragments to the streamer that should always be visible and present in memory, regardless of the streaming visibility test. I'm likely going to do it for this issue, so if this is what you need, we can continue the discussion there.
For now, I'm closing this, as changing the alpha value of streamed elements works. Cheers!

Thanks for sharing this approach + your idea on how to force load some fragments @agviegas. Of course, if it complicates things unnecessarily, this is the way to go. But I hope you understand the purpose. In some cases you need a full BIM authoring tools. In other cases you just need a visual representation of your data, and in this case a simple 3D view of the model, where colors/transparency are manipulated to reflect your specific message, is what you want.
I will follow the issue you are linking to.

Actually, I was just looking at your code and this does indeed work in the case where you want to highlight all walls. However, it will not work if I want to highlight only one wall in that fragment.

@MadsHolten I know! Right now, partial transparency is not possible due to the Three.js limitations mentioned above.
But I plan to implement fragment cloning these days. So with that, you should be able to create a clone of the fragment you want to make "partially transparent". Then make 1 clone fully opaque and 1 clone fully transparent, and use the hide functions to choose what items get opaque/transparent.
Maybe worth making a component to do this with ease?


create a digital relational schema of data-domain

Using the discussion notes taken on in-office meetings, create a digital relational schema that includes:

Schema Diagram
An md file explaining each entity's function / role.

I have added a first version of the ERD at project wiki.


Wrong winning revision when try to delete document

Tested on 1.3.1 and 1.3.1-89

have old app with CBL 1.3.1
upgrade to our new app (with 1.3.1-89)
after upgrade app all records was updated (added envelopeId to record)
try to delete object created in old app with 1.3.1 (I tried to uninstall new app and install new app again with replication from server, for exclude upgrade CBL process, same result)

Tested with CBL SQLite and CBL Forest, both have same result. Not deleted object.
com.couchbase.lite.store > SQLiteStore > winningRevIDOfDocNumericID returns wrong revID.
com.couchbase.lite.store > SQLiteStore > winner
docNumericID = 1056
oldWinningRevID = "6-8c6f538b0517a7b7d75e246e3e596c4d"
oldWinnerWasDeletion = false
newRev = {RevisionInternal@8111} "{-Category_bf1c14ad-d6a5-4457-9609-ff91d0e973c0 #7-d33410b6da60ee83a49e5feae726ff58 @1726 DEL}"
newRevID = "7-d33410b6da60ee83a49e5feae726ff58"
outIsDeleted = {AtomicBoolean@8135} "false"

returning revision is: revID = "5-0274f5bcd70851e493292992e2167459"
But, it's older than current revision. And 2 version back than version which should win!
What happens:
Current revision:
{"seq":1408,"id":"-Category_bf1c14ad-d6a5-4457-9609-ff91d0e973c0","changes":[{"rev":"6-8c6f538b0517a7b7d75e246e3e596c4d"}],"doc":{"_id":"-Category_bf1c14ad-d6a5-4457-9609-ff91d0e973c0","_rev":"6-8c6f538b0517a7b7d75e246e3e596c4d","reservedCreatedAt":"2016-11-01T10:27:25.589Z","icon":49,"reservedModelType":"Category","position":12000,"reservedOwnerId":"76544ded-2920-471d-9713-364711cb2f94","reservedSource":"android","envelopeId":3002,"color":"#AD1457","customCategory":true,"name":"Domácnost, služby","defaultType":1,"reservedUpdatedAt":"2016-11-01T10:31:36.433Z"}},
new revision how should looks like, what I expect:
{"seq":1729,"id":"-Category_bf1c14ad-d6a5-4457-9609-ff91d0e973c0","changes":[{"rev":"7-d33410b6da60ee83a49e5feae726ff58"}],"deleted":true,"doc":{"_id":"-Category_bf1c14ad-d6a5-4457-9609-ff91d0e973c0","_rev":"7-d33410b6da60ee83a49e5feae726ff58","reservedCreatedAt":"2016-11-01T10:27:25.589Z","icon":49,"reservedModelType":"Category","position":12000,"reservedOwnerId":"76544ded-2920-471d-9713-364711cb2f94","reservedSource":"android","envelopeId":3002,"color":"#AD1457","customCategory":true,"name":"Domácnost, služby","defaultType":1,"reservedUpdatedAt":"2016-11-01T11:20:22.433Z","_deleted":true}}
What I really get:
{"seq":1729,"id":"-Category_bf1c14ad-d6a5-4457-9609-ff91d0e973c0","changes":[{"rev":"5-0274f5bcd70851e493292992e2167459"}],"doc":{"_id":"-Category_bf1c14ad-d6a5-4457-9609-ff91d0e973c0","_rev":"5-0274f5bcd70851e493292992e2167459","reservedCreatedAt":"2016-11-01T10:27:25.589Z","icon":49,"enabled":true,"reservedModelType":"Category","position":12000,"reservedOwnerId":"76544ded-2920-471d-9713-364711cb2f94","reservedSource":"android","color":"#AD1457","name":"Domácnost, služby","defaultType":1,"reservedUpdatedAt":"2016-11-01T10:27:56.443Z"}}
How you can look, winning revision is older than previous current (current is revision 6, with some date, new winning is older and with revision 5)

public synchronized boolean delete(String id) {
        Document doc = getDatabase().getDocument(id);
        try {
            doc.update(new Document.DocumentUpdater() {
                @Override
                public boolean update(UnsavedRevision newRevision) {
                    newRevision.setIsDeletion(true);
                    Map<String, Object> properties = newRevision.getUserProperties();
                    properties.put("deletedAt", DateTime.now(DateTimeZone.UTC).toString());
                    newRevision.setUserProperties(properties);
                    return true;
                }
            });
        } catch (CouchbaseLiteException e) {
...
        }
        return true;
    }

From doc.update >

com.couchbase.lite/couchbase-lite-java-core/1.3.1-89/f3934ba1c881792b808a269713bceeca70d09fdf/couchbase-lite-java-core-1.3.1-89-sources.jar!/com/couchbase/lite/Document.java:380

com.couchbase.lite/couchbase-lite-java-core/1.3.1-89/f3934ba1c881792b808a269713bceeca70d09fdf/couchbase-lite-java-core-1.3.1-89-sources.jar!/com/couchbase/lite/UnsavedRevision.java:118

com.couchbase.lite/couchbase-lite-java-core/1.3.1-89/f3934ba1c881792b808a269713bceeca70d09fdf/couchbase-lite-java-core-1.3.1-89-sources.jar!/com/couchbase/lite/Document.java:525

properties = {HashMap@7333}  size = 16
 0 = {HashMap$HashMapEntry@7344} "reservedCreatedAt" -> "2016-11-01T10:27:25.600Z"
 1 = {HashMap$HashMapEntry@7345} "_rev" -> "6-edea31ae699bc6553c0846d19816198d"
 2 = {HashMap$HashMapEntry@7346} "icon" -> "70"
 3 = {HashMap$HashMapEntry@7347} "deletedAt" -> "2016-11-01T13:55:47.204Z"
 4 = {HashMap$HashMapEntry@7348} "reservedModelType" -> "Category"
 5 = {HashMap$HashMapEntry@7349} "position" -> "18000"
 6 = {HashMap$HashMapEntry@7350} "reservedOwnerId" -> "76544ded-2920-471d-9713-364711cb2f94"
 7 = {HashMap$HashMapEntry@7351} "reservedSource" -> "android"
 8 = {HashMap$HashMapEntry@7352} "envelopeId" -> "11000"
 9 = {HashMap$HashMapEntry@7353} "color" -> "#64dd17"
 10 = {HashMap$HashMapEntry@7354} "customCategory" -> "true"
 11 = {HashMap$HashMapEntry@7355} "name" -> "Ostatní"
 12 = {HashMap$HashMapEntry@7356} "defaultType" -> "1"
 13 = {HashMap$HashMapEntry@7357} "_deleted" -> "true"
 14 = {HashMap$HashMapEntry@7358} "_id" -> "-Category_472621e1-6753-4bbd-af5d-136caef1e0bf"
 15 = {HashMap$HashMapEntry@7359} "reservedUpdatedAt" -> "2016-11-01T10:31:36.463Z"
prevID = "6-edea31ae699bc6553c0846d19816198d"
allowConflict = false
hasTrueDeletedProperty = true
deleted = true
rev = {RevisionInternal@7335} "{-Category_472621e1-6753-4bbd-af5d-136caef1e0bf #null @0 DEL}"

com.couchbase.lite/couchbase-lite-java-core/1.3.1-89/f3934ba1c881792b808a269713bceeca70d09fdf/couchbase-lite-java-core-1.3.1-89-sources.jar!/com/couchbase/lite/Database.java:1913

com.couchbase.lite/couchbase-lite-java-core/1.3.1-89/f3934ba1c881792b808a269713bceeca70d09fdf/couchbase-lite-java-core-1.3.1-89-sources.jar!/com/couchbase/lite/Database.java:1975

docID = "-Category_472621e1-6753-4bbd-af5d-136caef1e0bf"
properties = {HashMap@7385}  size = 16
 0 = {HashMap$HashMapEntry@7396} "reservedCreatedAt" -> "2016-11-01T10:27:25.600Z"
 1 = {HashMap$HashMapEntry@7397} "_rev" -> "6-edea31ae699bc6553c0846d19816198d"
 2 = {HashMap$HashMapEntry@7398} "icon" -> "70"
 3 = {HashMap$HashMapEntry@7399} "deletedAt" -> "2016-11-01T13:55:47.204Z"
 4 = {HashMap$HashMapEntry@7400} "reservedModelType" -> "Category"
 5 = {HashMap$HashMapEntry@7401} "position" -> "18000"
 6 = {HashMap$HashMapEntry@7402} "reservedOwnerId" -> "76544ded-2920-471d-9713-364711cb2f94"
 7 = {HashMap$HashMapEntry@7403} "reservedSource" -> "android"
 8 = {HashMap$HashMapEntry@7404} "envelopeId" -> "11000"
 9 = {HashMap$HashMapEntry@7405} "color" -> "#64dd17"
 10 = {HashMap$HashMapEntry@7406} "customCategory" -> "true"
 11 = {HashMap$HashMapEntry@7407} "name" -> "Ostatní"
 12 = {HashMap$HashMapEntry@7408} "defaultType" -> "1"
 13 = {HashMap$HashMapEntry@7409} "_deleted" -> "true"
 14 = {HashMap$HashMapEntry@7410} "_id" -> "-Category_472621e1-6753-4bbd-af5d-136caef1e0bf"
 15 = {HashMap$HashMapEntry@7411} "reservedUpdatedAt" -> "2016-11-01T10:31:36.463Z"
prevRevID = "6-edea31ae699bc6553c0846d19816198d"
allowConflict = false
source = null
outStatus = {Status@7378} "Status: 200 (HTTP 200 OK)"
deleting = true
validationBlock = null

com.couchbase.lite/couchbase-lite-java-core/1.3.1-89/f3934ba1c881792b808a269713bceeca70d09fdf/couchbase-lite-java-core-1.3.1-89-sources.jar!/com/couchbase/lite/store/SQLiteStore.java:1623
winner(docNumericID, oldWinningRevID, oldWinnerWasDeletion.get(), newRev, deleting ? wasConflicted : null);

docID = "-Category_472621e1-6753-4bbd-af5d-136caef1e0bf"
prevRevID = "6-edea31ae699bc6553c0846d19816198d"
properties = {HashMap@7385}  size = 16
deleting = true
allowConflict = false
validationBlock = null
outStatus = {Status@7378} "Status: 200 (HTTP 200 OK)"
json = {byte[369]@7416}
winningRevID = null
inConflict = true
docNumericID = 1049
isNewDoc = {AtomicBoolean@7423} "false"
oldWinnerWasDeletion = {AtomicBoolean@7430} "false"
wasConflicted = {AtomicBoolean@7432} "true"
oldWinningRevID = "6-edea31ae699bc6553c0846d19816198d"
parentSequence = 1052
newRevId = "7-f43dd6c1875202a805dd9744b6c878de"
newRev = {RevisionInternal@7456} "{-Category_472621e1-6753-4bbd-af5d-136caef1e0bf #7-f43dd6c1875202a805dd9744b6c878de @1732 DEL}"
 body = {Body@7470}
 deleted = true
 docID = "-Category_472621e1-6753-4bbd-af5d-136caef1e0bf"
 missing = false
 revID = "7-f43dd6c1875202a805dd9744b6c878de"
 sequence = 1732
 shadow$_klass_ = {Class@1690} "class com.couchbase.lite.internal.RevisionInternal"
 shadow$_monitor_ = -1902962516
hasAttachments = false
docType = null
sequence = 1732
minGenToKeep = -12

UNDER IS WRONG RETURNING WINNING REVISION

com.couchbase.lite/couchbase-lite-java-core/1.3.1-89/f3934ba1c881792b808a269713bceeca70d09fdf/couchbase-lite-java-core-1.3.1-89-sources.jar!/com/couchbase/lite/store/SQLiteStore.java:2274

docNumericId = 1049
outIsDeleted = {AtomicBoolean@7548} "false"
outIsConflict = {AtomicBoolean@7432} "true"
cursor = {SQLiteStorageEngineBase$SQLiteCursor@7561}
sql = "SELECT revid, deleted FROM revs WHERE doc_id=? and current=1 ORDER BY deleted asc, revid desc LIMIT ?"
limit = 2
args = {String[2]@7558}
revID = "5-7341df900fa7ad7904eca10336303862"

Returning revision is 5, not 7!

com.couchbase.lite/couchbase-lite-java-core/1.3.1-89/f3934ba1c881792b808a269713bceeca70d09fdf/couchbase-lite-java-core-1.3.1-89-sources.jar!/com/couchbase/lite/store/SQLiteStore.java:2292
revID = "5-7341df900fa7ad7904eca10336303862"

com.couchbase.lite/couchbase-lite-java-core/1.3.1-89/f3934ba1c881792b808a269713bceeca70d09fdf/couchbase-lite-java-core-1.3.1-89-sources.jar!/com/couchbase/lite/store/SQLiteStore.java:2795

docNumericID = 1049
oldWinningRevID = "6-edea31ae699bc6553c0846d19816198d"
oldWinnerWasDeletion = false
newRev = {RevisionInternal@7456} "{-Category_472621e1-6753-4bbd-af5d-136caef1e0bf #7-f43dd6c1875202a805dd9744b6c878de @1732 DEL}"
outIsConflict = {AtomicBoolean@7432} "false"
newRevID = "5-7341df900fa7ad7904eca10336303862"
outIsDeleted = {AtomicBoolean@7548} "false"
winningRevID = "5-7341df900fa7ad7904eca10336303862"

Hi @mtrakal,
I tried to reproduce the issue. So far, I can not.
Can you debug winningRevIDOfDocNumericID().

What is query result of SQL. This method returns only first entry. Can you modify the code, and iterate?

    protected String winningRevIDOfDocNumericID(long docNumericId,
                                                AtomicBoolean outIsDeleted,
                                                AtomicBoolean outIsConflict) // optional
            throws CouchbaseLiteException {
        assert (docNumericId > 0);
        Cursor cursor = null;
        String sql = "SELECT revid, deleted FROM revs" +
                " WHERE doc_id=? and current=1" +
                " ORDER BY deleted asc, revid desc LIMIT ?";

        long limit = outIsConflict != null ? 2 : 1;
        String[] args = {Long.toString(docNumericId), Long.toString(limit)};
        String revID = null;
        try {
            cursor = storageEngine.rawQuery(sql, args);
            if (cursor.moveToNext()) {
                revID = cursor.getString(0);
                outIsDeleted.set(cursor.getInt(1) > 0);
                // The document is in conflict if there are two+ result rows that are not deletions.
                if (outIsConflict != null)
                    outIsConflict.set(!outIsDeleted.get() && cursor.moveToNext() && !(cursor.getInt(1) > 0));
            } else {
                outIsDeleted.set(false);
                if (outIsConflict != null)
                    outIsConflict.set(false);
            }
        } catch (SQLException e) {
            Log.e(TAG, "Error", e);
            throw new CouchbaseLiteException("Error", e, new Status(Status.INTERNAL_SERVER_ERROR));
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
        return revID;
    }

Hi @mtrakal,
From the information you provided, this document has conflicts. One of branch is with 6-edea31ae699bc6553c0846d19816198d. Another one is 5-7341df900fa7ad7904eca10336303862. (I believe 5-7341df900fa7ad7904eca10336303862 is not ancestor of 6-edea31ae699bc6553c0846d19816198d. )
Before deleting branch of 6-edea31ae699bc6553c0846d19816198d, both 6-edea31ae699bc6553c0846d19816198d and 5-7341df900fa7ad7904eca10336303862 are a current revision.
By deleting branch of 6-edea31ae699bc6553c0846d19816198d with 7-f43dd6c1875202a805dd9744b6c878de, other branch 5-7341df900fa7ad7904eca10336303862 becomes winning revision. This is expected behavior.
I will close this ticket. If my assumption is not correct, please reopen the ticket.
Thanks!

There is no reason for conflicts on this document. I'm using just one device and make linear changes.

old app: create document

upgrade to new app version (newer CBL, but not important, because it's caused after delete app and install again with initial replication)

after run new app data migration start (add to document with rev 5 just next one column (envelopeId))

it's created new revision 6 (actual object), no reason for conflict here.

Now when try to delete document (internally created rev7 with flag deleted)

but new revision is 5

code didn't go through our code for resolving conflicts. 'New' old 5 revision comes to app without conflict from CBL as a non-conflicted.

Hi @hideki,
you are right. We have documents in conflict, but don't know reason :(. I must check why conflict is created.

private Database.ChangeListener getChangeListener() {
        return new Database.ChangeListener() {
            @Override
            public void changed(Database.ChangeEvent changeEvent) {
                for (DocumentChange documentChange : changeEvent.getChanges()) {
                  if (documentChange.isConflict()) { // everytime is false
...

We didn't found where is problem with created conflicted records, but have a solution for it :).
Thanks for help.


Rubric / Evaluation example for assigning grades + giving feedback

@shiffman In case you're looking for an example for evaluating student work for the IMA students, here's an example of a rubric that I've found to be very helpful
https://github.com/cmda-tt/course-17-18/tree/master/assessment-1#rubric

Starting to address in #18

The Rubric is available for comments, questions and feedback!
https://github.com/ml5js/Intro-ML-Arts-IMA/blob/source/rubric.md

TODO: add links to the rubric and communicate to the students the criteria over e-mail, in person, and linked from homework.

This is now settled. I'm sure there could be improvements and there will continue to be questions, but further discussion can be in class or in new issues / pull requests / etc!


rhine, rhine-gloss: Remove broken marker

Motivation for this change
Things done

[ ] Tested using sandboxing (nix.useSandbox on NixOS, or option sandbox in nix.conf on non-NixOS linux)
Built on platform(s)

[x] NixOS
[ ] macOS
[ ] other Linux distributions

[ ] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
[ ] Tested compilation of all pkgs that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review wip"
[ ] Tested execution of all binary files (usually in ./result/bin/)
[ ] Determined the impact on package closure size (by running nix path-info -S before and after)
[ ] Ensured that relevant documentation is up to date
[ ] Fits CONTRIBUTING.md.

I cloned fresh from master and tested like this:
$ echo "{ allowBroken = true; }" > ~/.config/nixpkgs/config.nix

$ nix repl .
Welcome to Nix version 2.3.4. Type :? for help.

Loading '.'...
Added 11883 variables.

nix-repl> :b haskellPackages.rhine
[2 built, 43 copied (132.5 MiB), 10.6 MiB DL]

this derivation produced the following outputs:
  doc -> /nix/store/2x5g9gk7396nz20fcglrca0cxrav5w97-rhine-0.6.0-doc
  out -> /nix/store/nq99lc10zm9wg0g50pmbhjzmikan66bn-rhine-0.6.0

nix-repl> :b haskellPackages.rhine-gloss
[2 built, 47 copied (1010.7 MiB), 142.0 MiB DL]

this derivation produced the following outputs:
  doc -> /nix/store/062pizv6mczkqb25fbcwgdf8a13h3flv-rhine-gloss-<IP_ADDRESS>-doc
  out -> /nix/store/aw6lcfcx06apx2jxq30ibs9vcgpaqqa1-rhine-gloss-<IP_ADDRESS>
``

I have no idea what the error message is trying to tell me.

Looks good, both of these build.  Thanks!


[内测] 文案提示 “生成的单测代码不一定能直接执行”

Well, after looking into the text flow, I don't find a perfect place to add this. Let's leave it to users who may try and find this fact.


update config for biome and tsconfig, also implement a CI workflow that will also run future tests

This pull request introduces a new continuous integration (CI) workflow, updates an existing workflow, and adds new CI-related scripts to the package.json file. The most important changes include setting up a CI workflow for linting, modifying the default value type in a workflow, and adding new scripts for CI linting and installation.
CI Workflow Setup

.github/workflows/ci.yml: Added a new CI workflow to lint the codebase using GitHub Actions, including steps for checking out code, setting up PNPM and Node, installing dependencies, and running the linting process.

Workflow Updates

.github/workflows/todo-auto-issue.yml: Changed the default value for the importAll input from a string to a boolean.

CI Scripts

package.json: Added new scripts for CI linting (ci:lint) and installing dependencies with a frozen lockfile (ci:install).

Thank you for submitting your Pull Request, the following links will become available for preview shortly:

StudioCMS Landing Page

StudioCMS Documentation

StudioCMS Demo (node-playground) (Also deployed with package changes)

StudioCMS Ui Demo (ui-playground)

see https://github.com/withastro/astro/pull/12167#issuecomment-2401769265 for example


Move Base Flex Action Server Implementation to Cancel Goal

Need to implement the cancel goal function of move base flex inside our BT.

rostopic pub -1 /move_base_flex/exe_path/cancel actionlib_msgs/GoalID -- {}
This will stop the movement but the TEB global path is active and no new goal can be sent.
Where would we send the cancel command?

This is likely the correct way to cancel the ExePath action however I can see that cancelling leads to the recovery behavior to which I am getting the following error:
[ INFO] [1606784298.371841034,<PHONE_NUMBER>00]: Recovery behavior "" patience exceeded! Cancel recovering...
[ WARN] [1606784298.371892158,<PHONE_NUMBER>00]: Cancel recovery behavior "rotate_recovery" failed or is not supported by the plugin. Wait until the current recovery behavior finished!

I think I will play around with this recovery behavior, or modify the BT so that we don't enter it since we don't really use it anyways.


Finsy's P4TableEntry supports metadata, but not controller_metadata

Because controller_metadata: int was deprecated in the spec, and supplanted by metadata: bytes, I have not implemented it (yet).

Fixed.


Fail to login. Cannot read properties of undefined (reading 'bloks_payload')

Hi there! Today, I encountered an error when trying to log in through the IOS client.
I attached a screenshot of the error message for reference

I have a working code on Firebase Functions that I've been using without any issues when running it locally. However, when I tried to use it with IOS -> Firebase Functions -> threads.js client.login, something went wrong. Could you kindly assist me with this issue?
Thank you!
P.S. The same error persists even when the username and password are hardcoded.
Also, I've attached a screenshot of the working code on Firebase Functions for your reference

cc https://github.com/stevenlafl/threads-web-client/issues/11

interesting because I can't actually replicate this. could you console.log what text is giving you in Bloks.js? if it's sensitive information, remove it

Are you in the EU or in the UK perchance? The app is blocked in the EU and the UK is having issues right now. I think part of these answering these reports should be asking the location now @elijah-wright

well I start out by assuming that because you can't have a threads account if you live in the EU. but if the UK is having issues then that might be important to mention

I have same issue

2023-07-14T02:29:55.730172+00:00 app[web.1]: TypeError: Cannot read properties of undefined (reading 'bloks_payload')
2023-07-14T02:29:55.730186+00:00 app[web.1]:     at parseBloksResponse (/app/node_modules/@threadsjs/threads.js/src/util/Bloks.js:29:42)
2023-07-14T02:29:55.730187+00:00 app[web.1]:     at Client.login (/app/node_modules/@threadsjs/threads.js/src/index.js:131:17)
2023-07-14T02:29:55.730187+00:00 app[web.1]:     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
2023-07-14T02:29:55.730187+00:00 app[web.1]:     at async /app/server.js:17:5

Perhaps you need this to fix the issue. I can't help much because I have a lot of work, but good luck. https://github.com/sooluh/bloks-parser

could you console.log what text is giving you in Bloks.js?

I'm seeing the similar issue.
My code (written in Golang) runs fine on my Mac, but fails running on Google Cloud Functions. I'm suspecting Threads service restricts login requests from public cloud (or maybe, from IP addresses, whose locations are unidentifiable).

any solution here?

@tyagihas is your function located in the EU? if not, it's probably blocking IP addresses from known cloud servers

@tyagihas is your function located in the EU? if not, it's probably blocking IP addresses from known cloud servers

I am able to run it in AWS Lambda. However I only tested it having a token already. Try logging in the US and then reusing that token.

I've found that threads.js doesn't properly handle:

Attempted login with bad user
Attempted login with bad password
Other assorted authentication errors

In my investigation, I wrote a peggy parser that understands the Bloks payload well enough to process it into arrays (which you then need to walk):

parseBloks.js

const { generate } = require('peggy');
const { relative, resolve } = require('path');

const BLOKS_GRAMMAR = `
{
  // Allows you to provide a blok processor by passing the "processBlokModule" argument
  const processBlok = options.processBlok ?? ((name, args) => [name, ...args]);
}

Blok
  = _ "(" _ name:ClassName _ args:("," _ next:Arg { return next; })* _ ")" _ {
    return processBlok(name, args);
  }

ClassName
  = head:$Identifier tail:("." next:$Identifier { return next; })* { return [head, ...tail].join('.'); }

Identifier
  = [a-zA-Z_] [a-zA-Z_0-9]*

Arg
  = Blok
  / Number
  / String
  / Null
  / Boolean

Number
  = n:$[0-9]+ { return parseInt(n); }

String
  = '"' content:StringChar* '"' { return content.join(''); }

Null
  = "null" { return null; }

Boolean
  = "true" { return true; }
  / "false" { return false; }

StringChar
  = [^"\\\\]
  / "\\\\" "\\"" { return '"'; }
  / "\\\\" "\\\\" { return '\\\\'; }
  / "\\\\" "b" { return '\\b'; }
  / "\\\\" "f" { return '\\f'; }
  / "\\\\" "r" { return '\\r'; }
  / "\\\\" "t" { return '\\t'; }
  / "\\\\" "b" { return '\\b'; }
  / "\\\\" "u" hex:$[0-9][0-9][0-9][0-9] { return String.fromCodePoint(parseInt(hex, 16)); }
  / "\\\\" ch:[^\\\\bfrtbu] { return ch; }

_ = [ \\r\\n\\t]*

`;

function createBloksParser(processors = {}) {
  const { parse } = generate(BLOKS_GRAMMAR);
  const processBlok = (name, args) => {
    if (typeof processors[name] === 'function') {
      return processors[name](name, args);
    }
    if (processors['@']) {
      return processors['@'](name, args);
    }
    return [name, ...args];
  };
  return (bloks_payload) => parse(bloks_payload, { processBlok });
};

module.exports = {
  createBloksParser
};

You then create and use it:
const bloks_payload = `
  (bk.action.map.Make,
    (bk.action.array.Make, "login_type", "login_source"),
    (bk.action.array.Make, "Password", "Login")
  )
`;
const parseBloks = createBlokParser();
const bloks = parseBloks(bloks_payload);

and the result will be:
["bk.action.map.Make",
  ["bk.action.map.Make", "login_type", "login_source"],
  ["bk.action.map.Make", "Password", "Login"]
]

Anyway, what I've found trawling through the parsed payloads is that, for the login responses at least, you can detect an error by searching for a bk.action.qpl.MarkerAnnotate blok with a child of ["bk.action.array.Make", "generic_error_dialog"]; in the same response there will be a ig.action.cdsdialog.OpenDialog.  The string children of the OpenDialog's first bk.action.tree.Make child will be the error heading and message.
To search for a blok by name:
const isBlok = bloks && typeof bloks === 'object' && Array.isArray(bloks) && typeof bloks[0] === 'string';
const findBloksByName = (name, blok) => {
  if (!isBlok(blok)) return null;
  if (blok[0] === name) return [blok];
  return blok.slice(1).reduce((instances, child) => {
    instances.push(...findBloksByName(name, child);
    return instances;
  }, []);
};

To get a blok's string content:
const blokTextContent = (blok) => blok.slice(1).filter(item => typeof item === 'string');

Putting it all together:
const getBlokError = (blok) => {
  const candidates = findBloksByName('bk.action.qpl.MarkerAnnotate', blok);
  const hasError = candidates.some(candidate => (
    return candidate.some(child => (
      child.length === 2
      && child[0] === 'bk.action.array.Make'
      && child[1] === 'generic_error_dialog'
    ))
  ));
  if (!hasError) return null;
  const dialog = findBloksByName('ig.action.cdsdialog.OpenDialog')[0];
  const [title, message] = blokTextContent(dialog);
  return { title, message };
};

Admittedly, I haven't done all the legwork to figure out what bloks contain JSON response data, however, I did find that during the login flow, bk.action.caa.PresentTwoFactorAuthFlow and bk.action.caa.HandleLoginResponse play key roles.
The parser is also made so you can create your own handlers for each blok type when generating the parser, e.g.,
const parse = createBlokParser({
  "bk.action.array.Make": (_, entries) => entries,
  "bk.action.i32.Const": (_, [value]) => parseInt(value),
  "bk.action.bool.Const": (_, [value]) => !!value,
});
const payload = '(bk.action.array.Make, (bk.action.i32.Const, 42069), "nice", (bk.action.bool.Const, true))';
console.log(JSON.stringify(parse(payload)));

[42069, "nice", true]

I hope this can help you with making threads.js more reliable!

@Fordi it's not necessarily about not being able to handle those things, but I just haven't had the ability to be able to go in and see what some of the bloks being returned are. I'd like to be able to make a library to parse this stuff tho, that's definitely something I want to do. but I also have to write typings. so it's also managing some of this stuff

:+1:  Makes sense.  Here's hoping the parser is useful to you.
On that subject, I almost forgot.  Sample payloads!  Took me a second to redact them so you wouldn't have my auth tokens.
success.bloks.txt
2fa-req.bloks.txt
bad-account.bloks.txt
bad-password.bloks.txt

awesome, thanks for this. I'll definitely see what I can do but there's a lot to be done. the idea I have right now is to make this a monorepo with the bloks parser because this library is tied to bloks parsing

@elijah-wright  Something strange happened when I tried to debug the text in Bloks.js. I forked and added console logs to debug in Google Cloud Console. Everything started to work as expected. The magic of console.log xD
@stevenlafl, no Im not from UK or EU, but Im from Ukraine. We have no problems with the Threads access.

I changed my server from Heroku to Cyclic it's resolved

Done.
https://www.npmjs.com/package/@fordi-org/bloks-parser
https://github.com/Fordi/bloks-parser
I'll add you as a contributor.

@serhaterfidan its a floating bug, so I think it doesn matter which server you are using... Im using firebase and it always unexpected... Now I have the same problem.

@elijah-wright that what's I get when trying to login

@serhaterfidan its a floating bug, so I think it doesn matter which server you are using... Im using firebase and it always unexpected... Now I have the same problem.

I think it's about Threads endpoints limitations or restrictions

I've gotten that wait a few minutes thing before, I actually don't know how to fix it lol. it's just one of those things that meta has

@elijah-wright Idk too. I've been waiting for several hours... And nothing. Im still see the "Wait for a few minutes, please" error 😭

I switched the environment and was able to run my Golang code on Google Cloud Functions with a fixed external IP address (ap-northeast1, Tokyo).
I think some of you are facing IP address ban issue with Instagram. They may ban your IP address from several reasons. I haven't confirmed with the support, but for my case, It's probably because I tried to login with multiple accounts from a single IP address.
You may reach out to the support and ask them to remove the IP address from the blocked list (I haven't done this yet).

Hey @tyagihas, I think your issue can be solved by implementing a proxy. I just opened a new issue on #74.

no longer applicable in v2


[FEATURE REQ] support for ignoring null params

JPQL queries are able to handle null params with "(:param is null or .....)" like described here
https://www.baeldung.com/spring-data-jpa-null-parameters#Ignoring
How can we achieve it with spring-data-cosmos ?

@stliu @kushagraThapar could you please help schedule this request to an appropriate milestone

@mbhaskar  - do we have a plan for this feature request ?


Map from original to transformed entry point names

Currently entry points may be transformed during compilation, but it's not obvious how to determine whether a transformation has occurred.
For example, if a default entry point is defined as main (which is quite common), the MSL output will rename it to main0 because main is not allowed in MSL. That behavior seems reasonable, but how can we determine that this renaming occurred in order to use the transformed name when configuring Metal shaders?
More generally, for any of the compilers, if a function named has been transformed (i.e. because it is reserved in that SL or some other issue), how can we map from the original entry point names to the transformed entry point names?
Perhaps it's as straightforward as creating and exposing a map prior to the compile step (i.e. during the constructor). Although maybe it's possible that some dynamic renaming would need to occur during compile in the future, in which case we wouldn't be able to do this. Let me know what you think.

Setting an entry point name is something I think could already work.
It shouldn't be that much work to add a way to change the name of an entry point during reflection. This name should be used somehow during compilation (except on GLSL of course, because it only understands main()). I don't think this is happening at the moment given that MSL hardcodes the main -> main0 transform, but sounds trivial to make this more generic.
Of course there are issues with "main" as an entry point name as it is reserved, I think the easiest way there is just to say it is reserved and it will be called something else.
From an API perspective something like:
Compiler::rename_entry_point(from, to);

should be good enough, really.

@HansKristian-ARM That sounds good to me!
It would be useful to either have 1) a list of reserved entry point names for each compiler so we can explicitly set a new name (i.e. so we know to is not reserved), or 2) for the current approach, a way to know whether it was renamed automatically by the compiler.
Being able to know all reserved names is not too important anyway. Applications could use rename_entry_point to automatically prefix all entry points with some random characters to avoid reserved words.

I'm not sure what the problem is that is trying to be fixed here. Can you clarify, please?
Currently MSL requirements force a renaming of main() to something else. Somewhat arbitrarily, I chose main0(...).
As far as an app knowing how the compiler renames entry points...for MSL, the rules are basically...

main is converted to main0.
All other entry point names are left alone.

Do we have a use case for a more general need for more flexible renaming requirements?
BTW...I am about to issue a PR that includes some changes to how the name is changed (but not to the name itself). So...please hold off for a couple of days before anyone takes a stab at generalizing.

@billhollings The rules are fine. I'm looking for a way to know that my main has been renamed to main0 without leaking the renaming rules into my application.
For example, if there are similar rules in the other compilers (now or in the future), I'd prefer to query the final entry point names.
Otherwise, what @HansKristian-ARM is proposing, is that I just rename each of the entry point names myself. Either being able to query the updated name, or renaming the entry points (i.e. so I could prefix each name), would work well.

Hmmm...it seems to me that having the app pass in an entry point name change mapping (i.e. main -> myMain) sounds like the app would have to know only to do that only for Metal (because as @HansKristian-ARM points out...you'd have to NOT do this for GLSL). In which case...you're stuck with platform-specific app code no better than simply knowing to use main0 in Metal.
And...unless I'm missing something...it doesn't sound like there are any other general purpose use-cases for a general-purpose renaming mechanism.
Would your query idea...simply retrieving a list of the entry point names be useful?
If so...there is already an existing get_entry_points() function. Does that suffice?
If that would suit your needs...get_entry_points() might not work correctly now because of the way renaming happens. But the renaming updates that I mentioned I'm about to PR should allow that to work after compilation is complete.

Exactly, that's the idea. I would like to avoid special casing MSL if possible.
get_entry_points is the correct concept but I need to know the map from the original name to the renamed value, as you said. So it's more like get_entry_points would return a map containing pairs of original name/cleaned name.

Okay. Got it.
Perhaps I can just jam a simple get_cleansed_entry_points() function into the PR I am preparing right now.

PR #321 includes this as a new feature.

Great, thanks!

This should be resolved now.


Servers should have a name

In addition to the code a server should have a name that is shown to the users above the portal block.

This probably needs to be in the room server PHP so you can get it without joining the session.

This is done.


Build Server - Unable to configure Build Agent

We are using TFS 2017.1 On Prem.
On our Build Server, when trying to configure Agent, getting  error
Able to ping to the TFS Server, but when configuring agent, it says Internal Server Error.
E:\BuildAgents\XRPSWPAPPTFB01F-Agent6>config.cmd

>> Connect:

Enter server URL > http://TFS INSTANCE:8080/tfs/
Enter authentication type (press enter for Integrated) >
Internal Server Error
Failed to connect.  Try again or ctrl-c to quit
Enter server URL >
Enter server URL > Enter server URL > Exiting...
Terminate batch job (Y/N)? Y

E:\BuildAgents\XRPSWPAPPTFB01F-Agent6>ping http://TFS INSTANCE
Ping request could not find host http://TFS INSTANCEt. Please che
ck the name and try again.

E:\BuildAgents\XRPSWPAPPTFB01F-Agent6>ping TFS INSTANCE

Pinging devconnecttfs.hca.corpad.net [<IP_ADDRESS>] with 32 bytes of data:
Reply from IP: bytes=32 time<1ms TTL=252
Reply from IP: bytes=32 time<1ms TTL=252
Reply from IP: bytes=32 time<1ms TTL=252
Reply from IP: bytes=32 time<1ms TTL=252

Ping statistics for IP:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

E:\BuildAgents\XRPSWPAPPTFB01F-Agent6>

Attahced the screenshot

agent repo is vsts-agent.  please log an issue there.
also, the error is coming from the server.  check the event log and see if there's any more info there.


fix and extend the integer encoding/decoding functions

Yeah, true. I actually noticed that during the tests of the decoder. Sorry, I somehow missed it to apply that to the decoder, because it seemed to work anyway (at least, the numbers were correctly printed by Owl). This time I hopefully got it right.

Thanks for the explanation! Now I know, why I got random memory faults when testing these functions in a loop (calling onum(cnum(a) - 1) ). But since there was no issue during testing with single values, I assumed that there was a general issue which I wanted to investigate later. This time all my tests properly passed. So, what about this patch? (-;


chore: update documentation [ROAD-631]

Please review

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.You have signed the CLA already but the status is still pending? Let us recheck it.


Label filtering on StatefulSets is bringing additional pods into the test

Describe the bug
If there are multiple pods in the namespace of the AUT, tests like specialized_init_system or sig_term_handled are triggered multiple times for the same pod or the tests are triggered for pods of other objects that should not be applied the test. The problem seems to be with the label filtering on StatefulSets. The label filtering on Deployments works as expected.
To Reproduce
Steps to reproduce the behavior:
$ cnf-testsuite version
CNF TestSuite version: v1.2.0

Include one Deployment and StatefulSet object in the AUT. Set the pod selection and the pod labels as follows:

Deployment  release-dns-sig:
selector.matchLabels.app/pod-group: release-dns-sig
template.metadata.labels.l1: v1
template.metadata.labels.l2: v2
template.metadata.labels.app/pod-group: release-dns-sig
template.metadata.labels.l3: v3

StatefulSet release-dns-prov:
selector.matchLabels.app/pod-group: release-dns-prov
template.metadata.labels.l1: v4
template.metadata.labels.l2: v5
template.metadata.labels.app/pod-group: release-dns-prov
template.metadata.labels.l3: v3

deploy the AUT with 1 replica of the release-dns-sig pod and 1 replica of the release-dns-prov pod
run specialized_init_system test and verify the test was executed twice for the  release-dns-sig pod
inspect the debug log

Deployment release-dns-sig (seems to be using selector.matchLabels in label filtering):
INFO -- cnf-testsuite: resource kind: Deployment
INFO -- cnf-testsuite: pods_by_resource name: release-dns-sig
DEBUG -- cnf-testsuite: resource_labels kind: Deployment resource_name: release-dns-sig
DEBUG -- cnf-testsuite: resource_labels: {"app/pod-group" => "release-dns-sig"}
INFO -- cnf-testsuite: pods_by_resource labels: {"app/pod-group" => "release-dns-sig"}
DEBUG -- cnf-testsuite: pods_by_label labels: {"app/pod-group" => "release-dns-sig"}
... pod selection
INFO -- cnf-testsuite-specialized_init_system: Pod count for resource Deployment/release-dns-sig in ns: 1 <----- OK!

StatefulSet release-dns-prov (seems to be using template.metadata.labels in label filtering):
INFO -- cnf-testsuite: resource kind: StatefulSet
INFO -- cnf-testsuite: pods_by_resource name: release-dns-prov
DEBUG -- cnf-testsuite: resource_labels kind: StatefulSet resource_name: release-dns-prov
DEBUG -- cnf-testsuite: resource_labels: {"l1" => "v4", "l2" => "v5", "app/pod-group" => "release-dns-prov", "l3" => "v3"}
INFO -- cnf-testsuite: pods_by_resource labels: {"l1" => "v4", "l2" => "v5", "app/pod-group" => "release-dns-prov", "l3" => "v3"}
DEBUG -- cnf-testsuite: pods_by_label labels: {"l1" => "v4", "l2" => "v5", "app/pod-group" => "release-dns-prov", "l3" => "v3"}
... pod selection
INFO -- cnf-testsuite-specialized_init_system: Pod count for resource StatefulSet/release-dns-prov in ns1: 2 <---- WRONG

As a result, the test is executed twice for the release-dns-sig Deployment which makes for example the sig_term_handled test FAIL (probably because the pod is restarted from the previous test run making the test logic consider the container as not ready).
Expected behavior
Label filtering on StatefulSets only selects the relevant pods, i.e. the selector.matchLabels (not the template.metadata.labels) are utilized in the pod selection.
Device (please complete the following information):
$ uname -a
Linux ip-10-0-17-74 6.5.0-1020-aws #20~22.04.1-Ubuntu SMP Wed May  1 16:10:50 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

Good point. However identifying resources deployed by a helm chart is probably non-trivial task. It needs to be analyzed/explored if/how this would be possible.

@martin-mat,
I am deploying two objects as AUT:

Deployment/-dns-sig
StatefulSet/-dns-prov

There are also other Deployments / StatefulSets deployed in the same namespace (without those, the AUT would not become ready).
The number of replicas is 1 pod for each AUT object.
For the Deployment, the test correctly logs:
INFO -- cnf-testsuite-specialized_init_system: Pod count for resource Deployment/-dns-sig in : 1
But for the StatefulSet,the test incorrectly determines:
INFO -- cnf-testsuite-specialized_init_system: Pod count for resource StatefulSet/-dns-prov in : 8
So instead of checking the one replica of StatefulSet/-dns-prov the test checks 8 objects including the already checked object Deployment/-dns-sig.
I will provide more debug info about the selection criteria that leads to the wrong number of pod count (8 instead of 1).

@martin-mat, is there anything else I can add to the ticket to move it forward? Currently, the issue is extremely extending the duration of the tests and I also believe that the sig_term_handled test fails because of the multiple involvement of the same pod in the test. Thanks a lot for your support.

@sysarch-repo sure you can; this is open community project, you are free and welcome to figure out how to design a fix and and go ahead with implementation.
If you are not into digging into the code, you need to wait until someone has some time to work on it. The fix of this does not look to be trivial and needs some time.
Meanwhile you can think about a workaround - depending on your use case, for example splitting to 2 different namespaces.
As for the sig_term_handled - "multiple involvement of the same pod" sounds like a different issue though, maybe a separate ticket for this one?
Other than that that: can you get in contact with me via LFN slack?
https://github.com/cnti-testcatalog/testsuite?tab=readme-ov-file#communication-and-community-meetings

the issue might point here
https://github.com/cnf-testsuite/kubectl_client/blob/v1.0.6/kubectl_client.cr#L1310

@martin-mat thanks a lot. Very helpful and much appreciated. IMO the simple fix would be adding an if statement for statefulset to use the labels in the pod selector - exactly as done for the deployment type.
    def self.resource_spec_labels(kind : String, resource_name : String, namespace : String | Nil = nil) : JSON::Any
      Log.debug { "resource_labels kind: #{kind} resource_name: #{resource_name}" }
      if kind.downcase == "service"
        resp = resource(kind, resource_name, namespace: namespace).dig?("spec", "selector")
      elsif kind.downcase == "deployment"
        resp = resource(kind, resource_name, namespace: namespace).dig?("spec", "selector", "matchLabels")
      elsif kind.downcase == "statefulset"
        resp = resource(kind, resource_name, namespace: namespace).dig?("spec", "selector", "matchLabels")
      else
        resp = resource(kind, resource_name, namespace: namespace).dig?("spec", "template", "metadata", "labels")
      end
      Log.debug { "resource_labels: #{resp}" }
      if resp
        resp
      else
        JSON.parse(%({}))
      end
    end

I am not skilled wrt git merges (yet) and crystal but I am happy to join the team on Slack. Thanks again!

@sysarch-repo can you please test this patch on your cnf?
https://github.com/cnf-testsuite/kubectl_client/pull/14

@martin-mat I can only test by downloading a new CNTI testsuite tar gz, i.e. here is how I install it on AWS EKS:
curl -sLO "https://github.com/cnti-testcatalog/testsuite/releases/download/v1.2.0/cnf-testsuite-v1.2.0.tar.gz"
I assume for the test you ask I need to master a different procedure but I have no skills / experience with that. Thoughts?

Thoughts?

joining the lfn slack for a quicker support?

The issue is addressed by cnf-testsuite/kubectl_client#14 and #2085 and released as a part of v1.3.0.


Can't resolve errors

Your readme states that you can resolve errors like so:
AirbrakeAPI::Error.update(1696170, :group => { :resolved => true})

However I found it necessary to do this in order to get it to resolve:
module AirbrakeAPI
  class Error
    def self.resolve(id)
      setup
      put(error_path(id), :body => { :group => {:resolved => true}})
    end
  end
end

I think the issue is here (since this isn't a query):
https://github.com/spagalloco/airbrake-api/blob/master/lib/airbrake-api/error.rb#L25

Thanks for reporting, I'll get a fix out ASAP

I've updated to use the code that was working for you, thanks for reporting and for the fix as well.  Released in 3.2.1, can you give it a shot, hopefully it's fixed now.  Thanks.


ORC-1783: Add MacOS 15 to GitHub Action MacOS CI and docs

What changes were proposed in this pull request?

Why are the changes needed?

How was this patch tested?

Was this patch authored or co-authored using generative AI tooling?

Merged to main/2.0.


Set up the test infrastructure

Although every plugin maintains its own unit tests and e2e tests, we still need a test infrastructure to run the presubmit tests, set up an e2e environment, and etc.
Maybe follow the same test infrastructure of client repo.

Close it cause it has been supported in pr #12


UI: create page for adding content for Digest

Currently Digest content is aggregated into separate document.
When it's time for new digest edition the appropriate dgest.json file is being modified.
New page for saving digest content into drafts should be implemented. From the draft the new edition of the Digest will be created.
The page should look into the following way:

Page for creating Digest is added with new approach.


Fixing _get_policies to fetch the grains for the minion

__grains__ is not available in the runner so this PR fixes fetching the grains for the minion.

Thanks!


Allow site admin to suspend a subdomain

Hi,  I feel it would be great if we have option to suspend a subdomain site using admin window(admin/settings/sites/).
Suspended sites can show suspended message on their submdomain home page and if we required site owner can ask subdomain owners to take some actions to re-activate that subdomain...

Done!

Thanks @owen2345 :)


Be able to accept special chars

For now the library only has ordinal letters and digits into its dictionary. Make it able to handle special characters too

Have sure?
Maybe just to translate "áááááééééíííí" before encode.
Has morse code to special chars?

I don't know if I should open a new issue, but enter wouldn't add a slash or something like because when you get a text instead of a quote it's get all mess up
https://9o8x7rwor4.codesandbox.io/

@vinyvicente, I expressed myself erroneously. I was referring to special chars for punctuation not accentuation. These ones definitely should be represented and they gonna be there soon, in the next version probably.

@evansantos you're definitely right about a new line representation. Gonna research the right way of doing it. BTW I've just opened a new issue (https://github.com/gabrielfurini/morsee/issues/2) for it. Thanks for reporting it 🙏


Embedded or dataview content not truncated

This is a great idea, first of all thank you immensely for working on this, it has huge potential! ✨
I notice that pages with embedded or Dataview content are not truncated like normal pages, making them excessively long. Is this something you could look into?
Out of interest, how do you decide the truncated length of each page? It might be more practical for each page Card to have a similar height, right now it looks a little random.

I'm experiencing the same problem
I agree that having them all the same height could be a viable fix for this. I'm hoping to some day build an Evernote-like dashboard in Obsidian where I can set rows for e.g. recent notes, notes matching a certain tag, etc.

I agree about the potential of this plugin. Also came here to report this issue. Here is a screenshot of what I am seeing in notes with embeds.


In query doesn

sids := []interface{}{"1", "2", "3"}
xquery, _, err := sqlx.In("SELECT * FROM foo WHERE id IN (?)", sids...)
if err != nil {
	logrus.WithError(err).Error("random query fails")
        return ns, err
}
logrus.Println("[FindFindFind] ", xquery)

Prints:
[FindFindFind]  SELECT * FROM foo WHERE id IN (?)

https://github.com/jmoiron/sqlx/blob/master/sqlx_context_test.go#L1233 here however it says, the number of question marks in the new query string should be equal to the len(args) .
Which is not what is happening.

You need to pass a slice for the ?:
sqlx.In("SELECT * FROM foo WHERE id IN (?)", sids)

You're using sids..., so it's passing three ints rather than a slice.


Playlist controls (ie loop/shuffle/repeat)

Does this library come with an API to control how to music plays? I've read through the docs and since I wasn't able to find it, I would appreciate some suggestions as to how to implement this behavior. I am using redux and redux-saga to handle state/effects. I've thought about implementing this logic within the listeners whenever events are triggered. But a lot of the time the app will be in the background or the screen will be locked. Does the JS still execute in those cases? Still a bit new, Thanks.

I've had the same question. I'm building an music player that should still loop even if it's in the background.

I've found this from Apple's iOS docs:
https://developer.apple.com/documentation/mediaplayer/mpremotecommandcenter/1649694-changerepeatmodecommand
It looks like we could update the RNTrackPlayer.update function to set a target for the changeRepeatModeCommand and changeShuffleModeCommand objects.  This should make it repeat and shuffle. However, once we are getting these events, I don't know how to use them (yet).

Add an event listener whenever the track ends and then call play with the
songs I'd.. it works even in the bg
On Wed, May 2, 2018, 6:01 PM Josh Marinacci<EMAIL_ADDRESS>wrote:

I've had the same question. I'm building an music player that should still
loop even if it's in the background.
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/react-native-kit/react-native-track-player/issues/122#issuecomment-386135208,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AEpTRaWcSl4sO4xBloVCl2omZdRE2bGxks5tuiylgaJpZM4Rh5hX
.

It looks like the react native code is wrapping RNTrackPlayer which wraps MediaWrapper which wraps AudioPlayer from the vendor dir. This class calls AVPlayer. Unfortunately this class doesn't have shuffle. It's designed to only manage one media object at a time. There is an AVPlayerQueue class, but I'm guessing it would require updating a lot of code to use this.
https://developer.apple.com/documentation/avfoundation/avplayer

@Alanz2223 can you please share a snippet of code that you use?

Here's what I ended up doing.  I have an event handler to get all of the track changed events. If repeat is turned on then it checks if the next track is the one we are repeating. If so it does nothing. If not, it will pause the player, then do 'skip' to the track to be repeated, then play again.
    TrackPlayer.registerEventHandler((data)=>{
        console.log("got event",data.type,data)
        TrackPlayer.getCurrentTrack().then((track_id)=>{
            this.currentIndex = this.tracks.findIndex(t => t.id === track_id)
        })

        if(data.type === 'playback-track-changed') {
            if(this.repeat) {
                //don't mess with anything if already on the track to repeat
                if(data.nextTrack === this.trackToRepeat) return
                if(!data.track && data.nextTrack && this.trackToRepeat === null) {
                    this.trackToRepeat = data.nextTrack
                } else {
                    TrackPlayer.pause()
                    TrackPlayer.skip(this.trackToRepeat).then(()=>TrackPlayer.play())
                }
            }
        }

I maintain queue on js side and feed tracks one by one when queue ended event fires. Not sure about performance yet though.

@joshmarinacci does it work wen application is in background and it is playing last track? I did not try this approach. But with my single item queue I cannot get next/previous controls to work.

There are some issues issue with observing playback-queue-ended and feeding items one by one. On lock screen there is a noticeable blink until next item is supplied. And new item does not get current time on lock screen updated. Here is my asset update code:
      await trackPlayer.remove(currentFile.name)
    }
    await trackPlayer.add(trackPlayerAsset)```
Any ideas how to make it smoother? With native queue there are no such issues. I am testing on iOS only so far.

Moving making track addition and playing track before doing anything else (e.g. updating UI) did the trick.

@iThinker how were you able to fix the blinking issue on lock screen? I wasn't sure since the UI is managed by this package

@jdrorrer my code is ugly. But basically the issue was too much code doing unrelated stuff before playing next track.
Here is my current code:
const shouldRemoveCurrentFile = currentFile && !!currentFile.name
if (shouldRemoveCurrentFile && isAndroid) {
  await trackPlayer.remove(currentFile.name)
}

const trackPlayerAsset = {
  id: file.name,
  url: file.source,
  title: file.name,
  artist: ''
}
await trackPlayer.add(trackPlayerAsset)

if (autoplay) {
  await trackPlayer.play()
}

if (shouldRemoveCurrentFile && isAndroid == false) {
  await trackPlayer.remove(currentFile.name)
}

+1

I tried this to shuffle queue
shuffleArray = (array) => { 		let currentIndex = array.length, temporaryValue, randomIndex; 		// While there remain elements to shuffle... 		while (0 !== currentIndex) { 			// Pick a remaining element... 			randomIndex = Math.floor(Math.random() * currentIndex); 			currentIndex -= 1; 			// And swap it with the current element. 			temporaryValue = array[currentIndex]; 			array[currentIndex] = array[randomIndex]; 			array[randomIndex] = temporaryValue; 		} 		return array; 	}; 	shuffle = async () => { 		const queue = await TrackPlayer.getQueue(); 		const shuffledQueue = this.shuffleArray(queue); // any shuffle logic 		await TrackPlayer.destroy(); 		await TrackPlayer.setupPlayer(); 		await TrackPlayer.add(shuffledQueue); 		await TrackPlayer.play(); 	};

I tried this to shuffle Queue
shuffleArray = (array) => {
		let currentIndex = array.length, temporaryValue, randomIndex;
		// While there remain elements to shuffle...
		while (0 !== currentIndex) {
			// Pick a remaining element...
			randomIndex = Math.floor(Math.random() * currentIndex);
			currentIndex -= 1;
			// And swap it with the current element.
			temporaryValue = array[currentIndex];
			array[currentIndex] = array[randomIndex];
			array[randomIndex] = temporaryValue;
		}
		return array;
	};
	shuffle = async () => {
		const queue = await TrackPlayer.getQueue();
		const shuffledQueue = this.shuffleArray(queue);
		await TrackPlayer.destroy()
		await TrackPlayer.setupPlayer();
		await TrackPlayer.add(shuffledQueue);
		await TrackPlayer.play();
	};

@PiyushGaurav it will work if we make the shuffle off again?

Currently I am able to add duplicate songs to queue. Is there a possibility to remove duplicates from queue without writing to write JavaScript code ?

Is it not better to handle queue functionality from JavaScript ?

+1 on getting loop/shuffle please.
Managing queue in JS means background play stops working (at least it does for me).

+1

+1

+1

+1

+1

+1

+1

+1

Added to Project backlog. Obviously this is a highly requested feature. We will review. Thanks all

I know that this is in progress, but I wanted to chime in with my own request.  I've been playing with the audio player trying to get a seamless loop - i.e. no space between audio file 1 and audio file 2 (or, in my case, trying to reset and play audio file 1 in a seamless loop). Does anyone know if this is possible?  No matter how I configure end of queue actions and loading on a next track I always get a little pause between tracks.


Preview Fonts More Easily

Is your feature request related to a problem? Please describe.
Searching for a font on your website feels unnecessarily difficult. No need to reinvent the wheel here, just copy what practically all other fonts-websites are doing.
Describe the solution you'd like
I want to be able to quickly scroll trough all available fonts, while having sensible filtering options to easily get what I'm looking for (e.g. type, weight, variable, etc.).
Describe alternatives you've considered
Google
Additional context
NEIN!

I'd like to hear more of a detailed spec of things you feel could be improved on rather than a vague over-encompassing remark since it's hard to understand exactly what you disagree with.
Are you suggesting copying entirely what Google Fonts has done? Or are there specific things that we can work on the existing site that bother you?
If you think the former, I suggest using Google Fonts. I think the 'Preview' feature is a "nice thing to have" but not really the focus of the Fontsource website since it's a utility website for documentation and referencing. There's no real reason to replace Google Fonts if they're doing a good job of previewing and searching. Unless there are people who disagree in the direction they are going towards for their website, in which case making a competing solution does make sense.
Design isn't my forte, but I'm always open to people who may propose and help out with a full redesign mockup for the website. I have no issues implementing new designs if people want to offer their assistance for that.

@ayuhito, reason I found this project is because I think it has a great goal: independence. As far as I can see the project delivers on what it promises to do, so no complaints in that regard. The only thing that struck me as somewhat unpleasant was the website UX when it comes to searching/finding a font. I've found myself using Google's registry to search for a font which I would than use with FontSource, which might not be necessary. Let's cut out Google.
When I start a new project I typically don't know exactly what I want for a font to look like, just some general specs (for example, serif, bold, square-looking), so I like to search to find the right font. On Google's fonts website you can quickly preview boatloads of fonts with just a few filters. On the FontSource preview page I get a list of font names that don't mean a whole lot to me, having to click and load another page just to see what one specific font is actually like. This feels unnecessarily cumbersome.
To be clear, the project as a whole is doing fine as far as I can see. This proposal of mine is at best just a small incremental enhancement on the registry's UX. If it's not the direction you want to take the project, that's your decision to make. I'll be using this project regardless.

I don't disagree with any of your remarks here.
I think the website as a whole is due for a full refresh which might pair nicely with the v5 release. There are a bunch of outstanding issues both already on the issue tracker (e.g. #244 or #293) and some not written down (docs grouping improvements, maybe i18n, global preview text state, tests etc) that can improve the website experience.
What I can do is make a brand new issue in a couple days that will spec out the requirements and suggestions for a new website. It'll be open ended for any designer or developer who is interested in contributing to create a mock-up design and then we can move on from there.
If you have any alternative suggestions or ideas, feel free to share.

Closing in favour of #558.

Awesome news.

I didn't want to comment on the new issue, but I definitely would love to see something more for quick previews in the new website. It's really slow to click through each font name to get a new preview loaded and see if the font is the right style. Filtering a list of fonts (already previewed with the default text) will go a long way in quickly finding a font that fits the needs of your design.
The extended preview in #558 is great, but I think this is a slightly different request and very much needed. I can't send my designer to the fontsource website and say "we need to find a font that matches what you used in the design." without it taking many many clicks. (I also may have missed this in the new feature list 🙏 )  cc: @ayuhito

It's really slow to click through each font name to get a new preview loaded and see if the font is the right style. Filtering a list of fonts (already previewed with the default text) will go a long way in quickly finding a font that fits the needs of your design.

Are you perhaps talking about #552? A lot of that is already implemented at the current preview website for reference. Font loading on the homepage is also slow rn, I've got something in the works with LiteFS to speed that up.

Ah perfect! I missed that on the home task. Thanks. This'll be great


WIP Fix docs re PHP server

Fixes #1240
It looks like the PHP builtin server isn't very useful with CI4, as it doesn't process .htaccess files :(

The php spark serve command takes care of that limitation by providing a mod_rewrite type functionality...

Hmm - maybe that should be mentioned in the tutorial :-/
I'm playing with it.

The tutorial still needs changing. I haven't found a bug in the code yet, but haven't finished playing.

php spark serve helps, but I still get errors trying to serve the default page. /home and /about work fine.

Interesting. I haven't pulled down a fresh branch in a while, but I use serve for everything when I'm working on CI stuff. Maybe I'll actually have a chance this weekend to look into more.

Merging this, as it is an improvement though not a solution to the "error" situation going through the tutorial.


git-state produces unpredicted results on Windows machine

Hi,
I was trying to use this repo in my cli utility list-repos.
Recently I updated my utility from simple-git to git-state for the normal git statuses around repo, I used the new updated code on Windows and it failed.
Unpredictable results included empty branch-names in many cases.
Then I tried your similar repo code-status, which worked fine on Mac but that also failed on Windows. I think git-state has few things that should be optimized for Windows.

following is the output of test.js on windows
Z:\git-state>node test.js
TAP version 13
# #isGit()
ok 1 should be equal
# #isGitSync()
ok 2 should be equal
# #check()
ok 3 null
ok 4 should be equivalent
not ok 5 should be equal
  ---
    operator: equal
    expected: 'string'
    actual:   'undefined'
    at: _combinedTickCallback (internal/process/next_tick.js:67:7)
  ...
ok 6 should be equal
ok 7 should be equal
ok 8 should be equal
ok 9 should be equal
# #untracked()
ok 10 null
ok 11 should be equal
# #dirty()
ok 12 null
ok 13 should be equal
# #branch()
ok 14 undefined
not ok 15 should be equal
  ---
    operator: equal
    expected: 'string'
    actual:   'undefined'
    at: maybeClose (internal/child_process.js:877:16)
  ...
# #ahead()
ok 16 null
ok 17 should be equal
# #commit()
ok 18 null
ok 19 should be equal

1..19
# tests 19
# pass  17
# fail  2

I've published your pull request that fixes this bug to npm as v2.5.2


Database

Fixes #2044
Fixes #1933
Fixes #1831
Fixes #2025
Fixes #2056
Fixes #2077
Fixes #2085
Fixes #1615
Short description
Use PouchDB (backed by default by IndexedDB on browsers, LevelDown on NodeJS) as a persistent storage to store state.
Only pending transfers are kept in Redux (in memory) state, and synced to the database as soon as they change, by a persister middleware. This gives us the speed of in-memory access, the backends/adapters/sync power of Pouch, and memory-safety of not keeping everything in memory all the time and instead accessing historic data only if needed.
RaidenState/Channels is kept in memory (Redux) and just synced asynchronously to the db (per individual top level keys, and individual channels).
Transfers state, as they can grow boundless (#1618), is kept on database and retrieved on demand if needed using secondary indexes. This allows us to keep sub-0.2s transfers (cli-to-cli, nodejs, webrtc) while saving everything at real time to avoid losing state.
Legacy (once) and new async migration schemas are also implemented.
Definition of Done

[x] Steps to manually test the change have been documented
[x] Acceptance criteria are met
[ ] Change has been manually tested by the reviewer (dApp)

Steps to manually test the change (dApp)

This is too big to get reviewed. I'll merge as is, and we can test and narrow down any issues on our development branch (master) ;)


support for ${env:...} syntax

This adds support for issue #265. It adds a regex match for ${env:...} and a replace with the value from the process environment. That's automatically picked up by many of the properties already but also an escapeArray() method has been added to allow the arrays of config/build/install parameters to pass through substitution as well.

Since this PR is obsolete, I will close it.
Please target any future PRs to the refactor-1.0 branch.
Closed.

was that issue ever addressed, I saw no follow-up on it at all, no discussion and the pull request was just ignored. That didn't make it feel like contributions are actually welcomed.

@rolandking. I have to apologize for the way I treated this PR, and it's not the only one. Life got very busy for me around the time you sent it and the email fell to the bottom of my inbox (among many others, unfortunately).
I've recently pulled in some new collaborators (Randshot being one of them) to help make sure this doesn't happen again.
Of course, contributions are always welcome and will (hopefully) not be ignored in the future like this one was.
To answer your question, though: Yes, environment variable substitution is now implemented in the latest beta release and will be pushed to public 0.11.0 in the near future.


fix 13899: lockfile usage with transitive tool-dependencies

xxx
Changelog: (Bugfix): fix 13899: lockfile usage with transitive tool-dependencies
Docs: https://github.com/conan-io/docs/pull/XXXX

[ ] Refer to the issue that supports this Pull Request.
[ ] If the issue has missing info, explain the purpose/use case/pain/need that covers this Pull Request.
[ ] I've read the Contributing guide.
[ ] I've followed the PEP8 style guides for Python code.
[ ] I've opened another PR in the Conan docs repo to the develop branch, documenting this one.

wrongly created


Multiple click events raised from a single in-Editor click

Describe the bug
Using default MRTK configuration, in at least some situations a single click within the Unity editor (performed by holding left-shift and clicking the mouse on a click-responsive control) causes three click events to be raised within the input system, in my case on the Left_PokePointer, the Left_DefaultControllerPointer and the Left_GrabPointer.
To reproduce
Set up a clickable surface (e.g. a Unity button) and add a script that implements IMixedRealityPointerHandler. In play mode, hold left-shift, point the controller ray at the button and click the left mouse button.
Break execution in the click handler and trace through to see repeated events.
Expected behavior
A single click on the part of the user should only raise a single Click event from the pointer deemed active.
Your Setup

Unity 2018.4.1f1
MRTK RC1 Refresh

Target Platform

HoloLens 1/2 (n/a, as behaviour is in-Editor)

Additional context
I'm guessing that reproduction may be inconsistent due to the interactable components used (e.g. graphic raycaster vs physics) and their structuring, though once you have it, repro is 100%. In my case the behaviour was highlighted because the clicked control activates new UI including a fallback listener that would immediately fire and close the UI up again, all in the same frame. My first control (a simple IMixedRealityPointerHandler implementer) fired on the DefaultControllerPointer's click. My fallback listener fired on the GrabPointer's click.
May relate to #3652

Looked into this bug while testing #3652 - I'm not reproing with a standard IMixedRealityPointerHandler on a Unity Button - can you share the script or project you're referencing in Additional context?

Can't share that project, unfortunately, but I'll try to put together a minimum viable repro in a fresh one.

Here's a unitypackage that demonstrates the issue.
Note that I didn't include the MRTK in order to keep the filesize manageable, therefore to put this together:

Start a fresh Unity project
Import MRTK RC1 Refresh
Import the attached package

You'll see a modification to MixedRealityInputSystem.cs will come in on step 3; this is simply a debug message that counts the raised pointer clicks - feel free to exclude it from the import.
MrtkRC1RMultipleClicks.zip

Thank you so much. Super helpful to get some additional context.

A quick fix would be to check the type of pointer in FallbackClickHandler.
Something like:
if(eventData.Pointer.GetType() != typeof(ShellHandRayPointer)) { return; }

Many thanks for your time and for the offered workaround. The issue isn't time critical for me; actually it arose during a project port I was trying out to gather v2 experience. I'm just keen to track down and fix the root of the problem.
If I get some time tomorrow I'll try the test project on-device too.

Okay. This bug repros on HL2. I found the underlying issue in SpherePointer. This bug has actually been fixed for PokePointer in the latest mrtk_development.
The fix: SpherePointer currently does not filter for distance / NearInteractionGrabbable the way PokePointer does for distance / NearInteractionTouchable. As a result, SpherePointer always successfully evaluates to call BaseControllerPointer.InputDown() on any down action.

Nice work!

Addison is on pat leave so I'll be taking over the bug.

Give me a shout if there's anything I can do to assist!

merged.


TV Logo not a issue

I saw your epg with the logos.
In which format do you have in tvheadend logos? format and size. Thanks

Fixed png works


Move screenshots to their own folder, update gitignore, and fix formatting

Move screenshots to their own folder. Godot ignores any folder containing a .gdignore file, so this will prevent Godot from importing the screenshots.

Update gitignore to match other common Godot gitignores.

Fix file formatting for the script by removing undesired carriage return characters.

Thank's.
PS : I should add a .gitattributes for CRLF / LF in file comparaison :)


support env config

Things to consider before raising a bug
This extension needs to understand how your project(s) are structured, where to find your test configuration and test files among other things.  It turns out that there are many ways to structure JS projects and the extension may not currently accommodate your project.  The following section is to aid in collecting information to identify the issue.
Describe the bug

[ ] test load missing suites/tests
[ ] test load errors
[ ] test running errors

A clear and concise description of what the bug is.
To Reproduce
Steps to reproduce the behavior:

Write ESM modules
Run Test by plugin

Expected behavior
work fine just like NODE_OPTIONS=--experimental-vm-modules jest

Have the same issue. Hope to have this feature.

https://github.com/kavod-io/vscode-jest-test-adapter/blob/master/src/JestSettings/index.ts#L58
return {
  // need to provide a vscode settings then convert to nodeEnv
  nodeEnv: {},

  localJestMajorVersion: 20,
  pathToConfig,
  jestCommandLine: jestCommand,
  rootPath: projectConfig.jestExecutionDirectory,
};

FYI, I think this is a dupe of #93


Working Setup: Samsung S24D390  ← HDMI → MacBook Pro Retina 15'' (Mid 2014)

Thanks for providing this software!
Hardware

MacBook Pro Retina  15'' (Mid 2014)
External Display: Samsung S24D390.

Connected via HDMI
No other external displays currently.

Software

macOS 11.6.6 Big Sur
ExternalDisplayBrightness 1.3.0

ExternalDisplayBrightness
Configuration

Decrease brightness key: F1
Increase brightness key: F2
☑ Change brightness on all displays at once

🔲 Require Command modifier to be pressed

🔲 Read initial brightness from the display before adjusting it

Notes on configuration

Read initial brightness from the display before adjusting it activated indeed froze my Mac and I needed to do a cold reboot.

Nevermind. I do really not need that option. I simply increase the brightness to the min or max, and from then on the software-controls and the hardware are in sync again.

My setup only works with Change brightness on all displays at once ON!

When I turn it off, then F1 and F2 do nothing. Regardless of whether Require Command modifier to be pressed is ON, and regardless of whether I press ⌘ additionally.
I don't mind.
Sometimes I anyhow want to regulate brightness on both 👉 Then I simply use Fn + BrightnessDown (=F1) and Fn + BrightnessUp (=F2)
And if I want to regulate them separately

I first press Fn + BrightnessDown/Up (F1 or F2) and get the external display to my intended brightness.
I then press BrightnessDown/Up to regulare my internal display. Either back to where it was or to another brightness value.

The controls work correctly and (almost) lineary:

Reduced to the minimum value via ExternalDisplayBrightness. Checked display's on-screen menu. Brightness = 6.

That's also the absolute minimum you can achieve with the HW menu.

Reduced to the middle position via ExternalDisplayBrightness. Checked display's on-screen menu. Brightness = 50.
Reduced to the max position via ExternalDisplayBrightness. Checked display's on-screen menu. Brightness = 100.

Another note. During initial setup and testing I too was puzzled by #13.
But after some thought realized that this is by design.
What could be done to improve an optimal user experience is to better info in the help/readme/first-use-assistant. I wrote that there as a comment.

👍 Really great long time performance (June - October)

Always worked. Never crashed.
Very low CPU load. Now e.g. over an uptime of ~13 days the accumulated CPU time is:

    16h         WindowServer
     1h 43m     Finder
     1h 21m     Safari
            53s ExternalDisplayBrightness 👈


[Enhancement] Enable multiple segments apply at once to reduce disk IO for persistent index during apply

To reduce the memory usage after we do a large data ingestion, we support applying by segment and we will flush the primary index in advance. However, apply by segment will increase the disk IO for persistent index even we have enough memory because when we update a segment, we may need to scan the persistent index file.
This pr introduces support for batching segments in memory. When sufficient memory is available, it accumulates multiple segments and performs a batched update of the persistent index to reduce I/O operations on the persistent index during the apply process.
In my test env, one BE has one disk(HDD) and create a primary key table with one bucket, using tpcds data.

PrimaryKey Length
RowNum
Update memory limit
Apply time(ms)
Note

16 Bytes
259196263
16 GB
2014666
branch-main

16 Bytes
259196263
16 GB
219978
branch-opt

16 Bytes
259196263
8 GB
302050
branch-opt

When the memory is insufficient, an early flush will still be triggered, so the longest time-consuming is the same as before optimization.
What type of PR is this:

[ ] BugFix
[ ] Feature
[x] Enhancement
[ ] Refactor
[ ] UT
[ ] Doc
[ ] Tool

Does this PR entail a change in behavior?

[] Yes, this PR will result in a change in behavior.
[x] No, this PR will not result in a change in behavior.

If yes, please specify the type of change:

[ ] Interface/UI changes: syntax, type conversion, expression evaluation, display information
[ ] Parameter changes: default values, similar parameters but with different default values
[ ] Policy changes: use new policy to replace old one, functionality automatically enabled
[ ] Feature removed
[ ] Miscellaneous: upgrade & downgrade compatibility, etc.

Checklist:

[ ] I have added test cases for my bug fix or my new feature
[ ] This pr needs user documentation (for new or modified features or behaviors)

[ ] I have added documentation for my new feature or new function

Bugfix cherry-pick branch check:

[x] I have checked the version labels which the pr will be auto-backported to the target branch

[x] 3.1
[x] 3.0
[x] 2.5
[ ] 2.4

[FE Incremental Coverage Report]
:heart_eyes: pass : 0 / 0 (0%)

[BE Incremental Coverage Report]
:disappointed: fail : 315 / 445 (70.79%)
file detail

path
covered_line
new_line
coverage
not_covered_line_detail

:large_blue_circle:
src/storage/tablet_updates.cpp
195
318
61.32%
[1072, 1073, 1074, 1075, 1094, 1096, 1097, 1098, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1115, 1116, 1119, 1120, 1122, 1123, 1124, 1132, 1134, 1135, 1136, 1148, 1149, 1150, 1151, 1152, 1179, 1180, 1181, 1182, 1183, 1194, 1195, 1196, 1197, 1199, 1200, 1201, 1203, 1204, 1206, 1207, 1209, 1210, 1211, 1221, 1223, 1224, 1225, 1254, 1255, 1257, 1258, 1389, 1390, 1391, 1392, 1395, 1396, 1397, 1399, 1403, 1404, 1412, 1413, 1432, 1433, 1435, 1436, 1437, 1440, 1441, 1442, 1444, 1445, 1446, 1447, 1448, 1449, 1450, 1452, 1453, 1454, 1455, 1457, 1459, 1460, 1461, 1462, 1464, 1465, 1466, 1468, 1469, 1470, 1471, 1472, 1474, 1475, 1476, 1478, 1479, 1481, 1482, 1483, 1485, 1486, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1922]

:large_blue_circle:
src/storage/primary_index.cpp
110
117
94.02%
[649, 654, 656, 1269, 1270, 1311, 1344]

:large_blue_circle:
src/storage/primary_index.h
10
10
100.00%
[]

[FE Incremental Coverage Report]
:heart_eyes: pass : 0 / 0 (0%)

[FE Incremental Coverage Report]
:heart_eyes: pass : 0 / 0 (0%)

[BE Incremental Coverage Report]
:disappointed: fail : 311 / 441 (70.52%)
file detail

path
covered_line
new_line
coverage
not_covered_line_detail

:large_blue_circle:
src/storage/tablet_updates.cpp
195
318
61.32%
[1080, 1081, 1082, 1083, 1102, 1104, 1105, 1106, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1123, 1124, 1127, 1128, 1130, 1131, 1132, 1140, 1142, 1143, 1144, 1156, 1157, 1158, 1159, 1160, 1187, 1188, 1189, 1190, 1191, 1202, 1203, 1204, 1205, 1207, 1208, 1209, 1211, 1212, 1214, 1215, 1217, 1218, 1219, 1229, 1231, 1232, 1233, 1262, 1263, 1265, 1266, 1397, 1398, 1399, 1400, 1403, 1404, 1405, 1407, 1411, 1412, 1420, 1421, 1440, 1441, 1443, 1444, 1445, 1448, 1449, 1450, 1452, 1453, 1454, 1455, 1456, 1457, 1458, 1460, 1461, 1462, 1463, 1465, 1467, 1468, 1469, 1470, 1472, 1473, 1474, 1476, 1477, 1478, 1479, 1480, 1482, 1483, 1484, 1486, 1487, 1489, 1490, 1491, 1493, 1494, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1930]

:large_blue_circle:
src/storage/primary_index.cpp
106
113
93.81%
[649, 654, 656, 1265, 1266, 1307, 1340]

:large_blue_circle:
src/storage/primary_index.h
10
10
100.00%
[]

[FE Incremental Coverage Report]
:heart_eyes: pass : 0 / 0 (0%)

[BE Incremental Coverage Report]
:disappointed: fail : 260 / 398 (65.33%)
file detail

path
covered_line
new_line
coverage
not_covered_line_detail

:large_blue_circle:
src/storage/tablet_updates.cpp
200
320
62.50%
[1074, 1075, 1076, 1077, 1078, 1079, 1089, 1090, 1092, 1093, 1094, 1095, 1101, 1102, 1103, 1104, 1115, 1116, 1117, 1118, 1127, 1128, 1129, 1130, 1169, 1171, 1172, 1173, 1178, 1180, 1181, 1182, 1186, 1196, 1197, 1198, 1199, 1200, 1225, 1226, 1227, 1228, 1229, 1234, 1235, 1236, 1237, 1238, 1242, 1270, 1271, 1272, 1273, 1279, 1280, 1281, 1398, 1399, 1400, 1401, 1422, 1442, 1466, 1474, 1477, 1478, 1479, 1492, 1504, 1505, 1506, 1852, 1853, 1854, 1855, 1856, 1857, 1858, 1862, 1863, 1864, 1865, 1866, 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1890, 1891, 1892, 1893, 1894, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1918, 1919, 1934, 1935, 1936, 1937, 1942, 1943, 1944, 1945, 1951, 1952, 1958, 1959, 1960, 1961, 1962, 1963]

:large_blue_circle:
src/storage/primary_index.cpp
60
78
76.92%
[649, 1201, 1202, 1245, 1246, 1247, 1248, 1250, 1262, 1270, 1300, 1307, 1309, 1310, 1311, 1312, 1314, 1316]

[FE Incremental Coverage Report]
:heart_eyes: pass : 0 / 0 (0%)

[BE Incremental Coverage Report]
:disappointed: fail : 265 / 415 (63.86%)
file detail

path
covered_line
new_line
coverage
not_covered_line_detail

:large_blue_circle:
src/storage/tablet_updates.cpp
171
293
58.36%
[1081, 1082, 1083, 1084, 1103, 1105, 1106, 1107, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1124, 1125, 1128, 1129, 1131, 1132, 1133, 1141, 1143, 1144, 1145, 1157, 1158, 1159, 1160, 1161, 1188, 1189, 1190, 1191, 1192, 1203, 1204, 1205, 1206, 1208, 1209, 1210, 1212, 1213, 1215, 1216, 1218, 1219, 1220, 1230, 1232, 1233, 1234, 1263, 1264, 1266, 1267, 1398, 1399, 1400, 1401, 1404, 1405, 1406, 1408, 1412, 1413, 1421, 1422, 1441, 1442, 1444, 1445, 1446, 1449, 1450, 1451, 1453, 1454, 1455, 1456, 1457, 1458, 1459, 1461, 1462, 1463, 1464, 1466, 1468, 1469, 1470, 1471, 1473, 1474, 1475, 1477, 1478, 1479, 1480, 1481, 1483, 1484, 1485, 1487, 1488, 1490, 1491, 1492, 1494, 1495, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505]

:large_blue_circle:
src/storage/primary_index.cpp
84
112
75.00%
[648, 653, 655, 1264, 1265, 1306, 1326, 1328, 1329, 1330, 1331, 1332, 1333, 1335, 1336, 1337, 1338, 1339, 1341, 1485, 1486, 1487, 1488, 1489, 1491, 1492, 1493, 1494]

:large_blue_circle:
src/storage/primary_index.h
10
10
100.00%
[]


Handle port state transitions and delay in port creation inside kernel

Instead of storing the entire DPC (including ports with errors) to track running DPC, we only store the ports that can be used and with out errors. The next time when we re-trigger verification process and have ports cleared of previous errors, VerifyPending will see that we have a difference in ports and start/stop dhcp on ports as required.
Port link transitions should re-trigger RestartVerify if they are part of DPC at index 0
If the latest DNS that we have port related errors, we should create test better timer to come back and see if the ports errors are gone.

LGTM. Some comments about making it more defensive.
Also, which kind of fault injections have you tested this with?

I did fault injection by adding ACL to drop all packets with dport 443. Test is to see if device switches to last resort and then move back DPC at index 0 after ACL rule is delelted.
Second fault is injected by removing one of the ports from kernel by unbinding the driver. See if the port error goes all the way till UI. Then bind the driver back to see if the port error goes away and is updated in UI as expected.