Optional nested objects and lists/maps of nested objects?

It might be useful to treat nested configuration more like normal values? Making them optional or putting them in lists/maps. But there are lots of open questions and I have to reevaluate whether this requirement still makes sense now that we can have maps and arrays as default values.

Maps of nested objects seem like they would be particularly useful!
In my use case I have a config structure with this kind of thing (TOML):
[oidc.clients.key1]
name = "abc"
secret = "123"

[oidc.clients.key2]
name = "abc"
secret = "123"

I'd like to let users load the secret from a separate file if they want, so that they can keep their secret configuration separate from the less-sensitive configuration (e.g. because the secret configuration might be stored encrypted in their git repository that they use to set up the service).
Because maps of nested objects aren't supported, I believe the whole map has to appear in one particular file since it only uses serde's Deserialize implementation, so currently the above would need some workaround...

I tried to tackle this issue a couple of times already but always kind of got stuck. What follows is a bunch of thoughts, mostly as a note to self, but of course I'm always happy for more input and ideas.

Why even?
Why not just have a struct and derive Serialize for it, instead of Config? I think there are only two main things:

Merging of different sources
Configuration template (e.g. being able to document individual fields). These can be hand-written, but it becomes problematic if you support multiple formats.

@reivilibre provided an example above (thanks!) with the goal of merging objects from different sources. But one can also imagine each client having a bunch of fields and the documentation aspect being important. Some examples how the template for optional objects or lists or maps could look:
Template examples/brainstorming
Optional nested object
#[derive(Config)]
struct PopupConfig {
    /// The title of the popup.
    title: String,

    /// The body text of the popup, basic markdown is supported.
    body: String,

    /// Label for the button that makes the annoying popup go away.
    #[config(default = "Yeah whatever")]
    label: String,
}

#[derive(Config)]
struct Conf {
    /// Allows you to configure an annoying popup on this website.
    #[config(nested)]
    popup: Option<PopupConfig>,
}

# Allows you to configure an annoying popup on this website.
#
# This object is optional.
#[popup]
# The title of the popup.
#
# Required!
#title =

# The body text of the popup, basic markdown is supported.
#
# Required!
#body =

# Label for the button that makes the annoying popup go away.

#
# This object is optional.
#popup:
    # The title of the popup.
    #
    # Required!
    #title:

    # The body text of the popup, basic markdown is supported.
    #
    # Required!
    #body:

    # Label for the button that makes the annoying popup go away.
    #
    # Default value: Yeah whatever
    #label: Yeah whatever

Or do we want to add double # (comment token) to all comment lines inside the object so that one can easily uncomment the whole block in one go (with some editor/IDE function)?
List of objects
#[derive(Config)]
struct QuicklinkConfig {
    /// Label of the link.
    label: String,
    /// Target of the link.
    href: String,
}

#[derive(Config)]
struct Conf {
    /// Links shown in the footer.
    #[config(nested)]
    quicklinks: Vec<QuicklinkConfig>,
}

# Links shown in the footer.
#
# Required!
#[[quicklinks]]
# Label of the link.
#
# Required!
#label =

# Target of the link.
#
# Required!
#href =

The other array syntax in TOML might be more preferable, but it's unclear how to best emit the field docs then.
# Links shown in the footer.
#
# Each object in the list has the following fields:
# - label: Label of the link (required)
# - href: Target of the link (required)
#
# Required!
#quicklinks = []

Both TOML examples are not great IMO. The first one is confusing because of TOMLs [[]] syntax and it's not clear that quicklinks = [] is a valid option there as well. The bottom example is not great because it doesn't show how you would write an object in that syntax. Also, letting the user chose between those requires another attribute.
YAML is a bit better here I think:
# Links shown in the footer.
#
# Required.
quicklinks:
    # Label of the link.
    #
    # Required.
    # - label:

    # Target of the link.
    #
    # Required.
    #  href:

But I can't come up with a really nice way to incooperate the field docs here and how to indent them.
Something similar can be observed with a map of nested objects. But there, the example key probably needs to be specified by the user.
So I think my takeaway is that there isn't really a perfect way. Oftentimes the user wants/needs more control over how the template is formatted, which increases complexity. Just letting the user manually write a doc comment with examples, as is the current workaround for half of this issue, might not be too bad after all. Of course, so far I have only looked at small examples. If someone has a good use case where the nested object (in option, list, map) is quite large, please let me know! Because at some point manually writing the example and field descriptions will be a problem.
Random thoughts
Random thought: letting the user write simple Mustache-template-like things inside the doc comment, giving it access to docs of subfields?
Random thought 2: to solve the "you can always write manually, but it gets problematic with multiple formats", confique could filter out fenced code blocks of the wrong format? And convert fenced code blocks into indented ones?
#[derive(Config)]
struct Conf {
    /// Cool example:
    ///
    /// ```toml
    /// foo = "heyyy"
    /// ```
    /// ```yaml
    /// foo: heyyy
    /// ```
    foo: String,
}

Would result in in these, depending on the format.
# Cool example:
#
#     foo = "heyyy"
#
# Required!
#foo =

# Cool example:
#
#     foo: heyyy
#
# Required!
#foo:

Merge modes
It might also be a neat idea to add a attribute merge_mode that can be used on non-nested fields. The current merge mode would be called "none" for example, meaning that the first value would be taken. But arrays and maps there could be different merge modes. Or one could let users specify a custom function responsible for merging.
That would solve the "merge" part of this issue.

Sorry for the extremly unstructured comment, but I needed to dump these thoughts as otherwise I start at 0 again next time I try tackling this.

Oh also: env would be tricky on these kinds of nested objects. The derive on the struct does not know how it is used and would accept an env = "FOO" attribute. But if it's used as a list... what then?

Hello!
I am in this same boat. I've tested many crates for config management, and I really like the derive style of confique. However, all of the crates seem to fall short when it comes to complex and dynamic data structured. In my case, I have:
mesh_bbox: &mesh_bbox
    xmin: -98.00556
    ymin: 8.534422
    xmax: -60.040005
    ymax: 45.831431
    crs: 'epsg:4326'

rasters:
  - &GEBCO_2021_sub_ice_topo_1
    path: 'GEBCO_2021_sub_ice_topo/gebco_2021_sub_ice_topo_n90.0_s0.0_w-180.0_e-90.0.tif'
    bbox: *mesh_bbox
    chunk_size: 1500
  - &GEBCO_2021_sub_ice_topo_2
    path: 'GEBCO_2021_sub_ice_topo/gebco_2021_sub_ice_topo_n90.0_s0.0_w-90.0_e0.0.tif'
    bbox: *mesh_bbox
    chunk_size: 1500

geom: &geom
    zmax: &zmax 10.
    rasters:
      - <<: *GEBCO_2021_sub_ice_topo_1
        zmax: 0.
        overlap: 5
      - <<: *GEBCO_2021_sub_ice_topo_2
        zmax: 0.
        overlap: 5
    sieve: true

The objective is that the same yaml file that works for Python continues to work in Rust.
The above yaml file is validated in the Python version using pydantic.
To give you more context, my application will process separate keys, for example, the geom_build binary will naturally process the geom key, whereas the hfun_build binary will process the hfun key of the same file. The reason we have the rasters key as separate is because it is reused multiple times in the yaml document. My Rust code would ideally look like this:
use confique::Config;
use serde::Deserialize;
use std::path::PathBuf;

#[derive(Debug, Config, Deserialize)]
pub struct RasterConfig {     ■ similarly named struct `RasterConfig` defined here
    path: PathBuf,
}

#[derive(Config, Deserialize)]
pub enum RestersConfig {     ■ `confique::Config` can only be derive for structs with named fields
    Single(RasterConfig),
    Multiple(Vec<RasterConfig>),
}

#[derive(Debug, Config, Deserialize)]     ■ you might be missing a type parameter: `<RastersConfig>`
pub struct GeomConfigOpts {     ■ you might be missing a type parameter: `<RastersConfig>`
    zmax: Option<f64>,
    zmin: Option<f64>,
    sieve: bool,
    rasters: Option<RastersConfig>,     ■■ a struct with a similar name exists: `RasterConfig`
}

#[derive(Debug, Config, Deserialize)]
pub struct GeomConfig {
    geom: GeomConfigOpts,
}

I have included the error indications as well for reference.
I think the confique style has a lot of potential, but I still haven't found one crate that is full featured like pydantic is.
In my case, I'd rather priotitize the ability to have enums and nested structs, than to be able to get them from ENV, which can be worked around in many ways.
Any thoughts on this?
Thanks!

@jreniel Is there any reason you have to derive Config for RastersConfig and RasterConfig? Deriving Deserialize Should suffice. At least you can make it work, i.e. read a file that way. As I've written above, I only see two reasons why this "nested objects/lists/maps" even have to be supported by confique natively: merging and config templates. Do you specifically need one of those in your case? For the fields in question?

Thanks for looking into this.

Is there any reason you have to derive Config for RastersConfig and RasterConfig?

Because the compiler will complain that GeomConfigOpts has some attributes that doesn't implement Config. It's literally confique who's implicitly requiring it. However, Config doesn't work for enums, anyways, and that's a as far as I got through this route.

At least you can make it work, i.e. read a file that way.

But it won't validate and populate the nested struct, so reading the file this way is pointless. And it is pointless for two reasons. The RastersConfig is a reusable struct. There are other components that construct other data object, but basically all of the data object are obtained from the rasters. These rasters can have semi-complex user configurations, so we need to validate those always. We can't simply ingest plain text, and we need this to be expanded in other parts of the code as well.
In the end, I was able to get what I needed by just using plain serde and the validator crate. Below is a snippet.
I really like where confique is going but if it can't do nested then I might as well just go for serde+validator which does handle nesting and flattening. I think not having proper nesting and enum support is a deal breaker. I can do away with the enums, but not with the nesting, specially since plain serde handles it nicely, so using confique in this case becomes a step back, rather than forwards. Don't get me wrong, I still think it's great to have this kind of libraries, but at least in this case, functionality overcomes convenience.
Thanks for looking into this anyway!
#[derive(Debug, Validate, Serialize, Deserialize)]
pub struct GeomRasterConfig {
    #[validate(nested)]
    #[serde(flatten)]
    raster: RasterConfig,
    zmax: Option<f64>,
    zmin: Option<f64>,
}

#[derive(Debug, Validate, Serialize, Deserialize)]
pub struct GeomConfigOpts {
    zmax: Option<f64>,
    zmin: Option<f64>,
    #[serde(default)]
    sieve: bool,
    #[validate(nested)]
    rasters: Vec<GeomRasterConfig>,
}

#[derive(Debug, Validate, Serialize, Deserialize)]
pub struct GeomConfig {
    #[validate(nested)]
    geom: GeomConfigOpts,
}
impl GeomConfig {
    pub fn iter_raster_windows(&self) -> RastersWindowIter {
        RastersWindowIter {
            geom: &self.geom,
            current_raster_index: 0,
            current_window_index: 0,
        }
    }
}

I think this is the relevant issue, I needed support for having a map of a string id to a nested-config object in my config, and managed to add it with a newtype with a manual impl of Config, I wonder if something like this impl could be added for HashMap directly:
#[derive(Debug)]
pub struct ConfigMap<K: DeserializeOwned + Eq + Hash, V: confique::Config> {
    pub inner: HashMap<K, V>,
}

#[derive(Debug)]
pub struct ConfigMapPartial<K: DeserializeOwned + Eq + Hash, V: confique::Partial> {
    pub inner: HashMap<K, V>,
}

impl<K: DeserializeOwned + Eq + Hash, V: confique::Config> confique::Config for ConfigMap<K, V> {
    type Partial = ConfigMapPartial<K, V::Partial>;

    // TODO
    const META: confique::meta::Meta = confique::meta::Meta {
        name: "",
        doc: &[],
        fields: &[],
    };

    fn from_partial(partial: Self::Partial) -> Result<Self, confique::Error> {
        let inner: Result<_, confique::Error> = partial.inner.into_iter().map(|(k, v)| Ok((k, V::from_partial(v)?))).collect();
        Ok(Self { inner: inner? })
    }
}

impl<'de, K: DeserializeOwned + Eq + Hash, V: confique::Partial> serde::Deserialize<'de> for ConfigMapPartial<K, V> {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: serde::de::Deserializer<'de> {
       Ok(Self { inner: HashMap::deserialize(deserializer)? })
    }
}

impl<K: DeserializeOwned + Eq + Hash, V: confique::Partial> confique::Partial for ConfigMapPartial<K, V> {
    fn empty() -> Self { Self { inner: HashMap::new() } }
    fn default_values() -> Self { Self::empty() }
    fn from_env() -> Result<Self, confique::Error> {
        // TODO: dunno if this makes sense to support somehow
        Ok(Self::empty())
    }
    fn with_fallback(mut self, fallback: Self) -> Self {
        for (k, v) in fallback.inner {
            let v = match self.inner.remove(&k) {
                Some(value) => value.with_fallback(v),
                None => v,
            };
            self.inner.insert(k, v);
        }
        self
    }
    fn is_empty(&self) -> bool { self.inner.is_empty() }
    fn is_complete(&self) -> bool { self.inner.values().all(|v| v.is_complete()) }
}

impl<K: DeserializeOwned + Eq + Hash + Clone, V: confique::Partial + Clone> Clone for ConfigMapPartial<K, V> {
    fn clone(&self) -> Self {
        Self { inner: self.inner.clone() }
    }
}

Are there any plans for Confique to support this, i.e. nested config templates. Would really love to have documentation of the nested config show up as well.


Country request: Ukraine

I'd like to request Ukraine be added to the queue.
Cheers!

Thanks for the request!
We've added it to the list

+1

Ukraine is now available.
Happy mapping!

Ukraine is now available.
Happy mapping!

Thanks for great NY gift!


WIFI component: Allocate static buffer in SPIRAM, the other parts (dynamically buffer, ...) in internal RAM (IDFGH-10507)

Is your feature request related to a problem?
Running out of internal memory.
WIFI component: With option CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP only all buffers, also dynamically allocated ones, are preferably stored into SPIRAM. This leads to fragmentation of SPIRAM.
Describe the solution you'd like.
It would be beneficial to have an additional option to allocate static buffers in SPIRAM and dynamically allocated buffers and other smaller components in internal RAM. This would free more internal RAM and avoid fragmentation in SPIRAM.
Describe alternatives you've considered.
N/A
Additional context.
N/A

Hi @Slider0007
An additional configuration item, CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL, can be used to set the size threshold when a single allocation should prefer external memory. Please reference,
https://github.com/espressif/esp-idf/blob/9f4e8eb0cde35308f2d46c2f419f4c170116bf9c/docs/en/api-guides/external-ram.rst?plain=1#L101

Hi @mhdong
Thank you for your response and looking into it.
I was playing with this parameter, but for me it seems that this is no working for allocations initiated by WIFI component. Even CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL is set to 8192, smaller chunks get allocated in SPIRAM.

Test 1: CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y

Dump from SPIRAM after bootup
-->  As you can see there are a lot of smaller chunks allocated in SPIRAM. When I switch off CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP, all those allocations are gone again --> Test 2
Showing data for heap: 0x3f802968
Showing data for heap: 0x3f802968
Block 0x3f8031e4 data, size: 55880 bytes, Free: No -> OK
Block 0x3f810c30 data, size: 12 bytes, Free: No
Block 0x3f810c40 data, size: 40 bytes, Free: No
Block 0x3f810c6c data, size: 16 bytes, Free: No
Block 0x3f810c80 data, size: 16 bytes, Free: No
Block 0x3f810c94 data, size: 16 bytes, Free: No
Block 0x3f810ca8 data, size: 12 bytes, Free: No
Block 0x3f810cb8 data, size: 24 bytes, Free: No
Block 0x3f810cd4 data, size: 2392 bytes, Free: No -> WIFI?
Block 0x3f811630 data, size: 136 bytes, Free: No
Block 0x3f8116bc data, size: 136 bytes, Free: No
Block 0x3f811748 data, size: 1696 bytes, Free: No -> From here static WIFI allocs
Block 0x3f811dec data, size: 1696 bytes, Free: No
Block 0x3f812490 data, size: 1696 bytes, Free: No
Block 0x3f812b34 data, size: 1696 bytes, Free: No
Block 0x3f8131d8 data, size: 1696 bytes, Free: No
Block 0x3f81387c data, size: 1696 bytes, Free: No
Block 0x3f813f20 data, size: 1696 bytes, Free: No
Block 0x3f8145c4 data, size: 1696 bytes, Free: No
Block 0x3f814c68 data, size: 1696 bytes, Free: No
Block 0x3f81530c data, size: 1696 bytes, Free: No
Block 0x3f8159b0 data, size: 1696 bytes, Free: No
Block 0x3f816054 data, size: 1696 bytes, Free: No
Block 0x3f8166f8 data, size: 1696 bytes, Free: No
Block 0x3f816d9c data, size: 1696 bytes, Free: No
Block 0x3f817440 data, size: 1696 bytes, Free: No
Block 0x3f817ae4 data, size: 1696 bytes, Free: No -> end
Block 0x3f818188 data, size: 572 bytes, Free: No -> WIFI?
Block 0x3f8183c8 data, size: 944 bytes, Free: No
Block 0x3f81877c data, size: 16 bytes, Free: No
Block 0x3f818790 data, size: 60 bytes, Free: No
Block 0x3f8187d0 data, size: 44 bytes, Free: No
Block 0x3f818800 data, size: 12 bytes, Free: No
Block 0x3f818810 data, size: 184 bytes, Free: No
Block 0x3f8188cc data, size: 184 bytes, Free: No
Block 0x3f818988 data, size: 40 bytes, Free: No
Block 0x3f8189b4 data, size: 16 bytes, Free: No
Block 0x3f8189c8 data, size: 12 bytes, Free: No
Block 0x3f8189d8 data, size: 20 bytes, Free: No
Block 0x3f8189f0 data, size: 64 bytes, Free: No
Block 0x3f818a34 data, size: 120 bytes, Free: No
Block 0x3f818ab0 data, size: 64 bytes, Free: No
Block 0x3f818af4 data, size: 36 bytes, Free: No
Block 0x3f818b1c data, size: 40 bytes, Free: No
Block 0x3f818b48 data, size: 12 bytes, Free: No
Block 0x3f818b58 data, size: 168 bytes, Free: No
Block 0x3f818c04 data, size: 48 bytes, Free: Yes
Block 0x3f818c38 data, size: 12 bytes, Free: No
Block 0x3f818c48 data, size: 168 bytes, Free: No
Block 0x3f818cf4 data, size: 108 bytes, Free: Yes
Block 0x3f818d64 data, size: 52 bytes, Free: No
Block 0x3f818d9c data, size: 20 bytes, Free: No
Block 0x3f818db4 data, size: 56 bytes, Free: No
Block 0x3f818df0 data, size: 52 bytes, Free: No
Block 0x3f818e28 data, size: 12 bytes, Free: No
Block 0x3f818e38 data, size: 40 bytes, Free: No
Block 0x3f818e64 data, size: 52 bytes, Free: No
Block 0x3f818e9c data, size: 20 bytes, Free: No
Block 0x3f818eb4 data, size: 136 bytes, Free: No -> end
Block 0x3f818f40 data, size: 61440 bytes, Free: No  -> OK, my application
Block 0x3f827f44 data, size: 168 bytes, Free: No
Block 0x3f827ff0 data, size: 16 bytes, Free: No
Block 0x3f828004 data, size: 16 bytes, Free: No
Block 0x3f828018 data, size: 20 bytes, Free: No
Block 0x3f828030 data, size: 168 bytes, Free: No
Block 0x3f8280dc data, size: 12 bytes, Free: No
Block 0x3f8280ec data, size: 928 bytes, Free: No  -> OK, my application
Block 0x3f828490 data, size: 628 bytes, Free: No
Block 0x3f828708 data, size: 28 bytes, Free: No
Block 0x3f828728 data, size: 16 bytes, Free: No
Block 0x3f82873c data, size: 16 bytes, Free: No
Block 0x3f828750 data, size: 168 bytes, Free: No
Block 0x3f8287fc data, size: 308 bytes, Free: Yes
Block 0x3f828934 data, size: 168 bytes, Free: No
Block 0x3f8289e0 data, size: 136 bytes, Free: Yes
Block 0x3f828a6c data, size: 12 bytes, Free: No
Block 0x3f828a7c data, size: 52 bytes, Free: No
Block 0x3f828ab4 data, size: 168 bytes, Free: No
Block 0x3f828b60 data, size: 52 bytes, Free: No
Block 0x3f828b98 data, size: 52 bytes, Free: No
Block 0x3f828bd0 data, size: 28 bytes, Free: Yes
Block 0x3f828bf0 data, size: 60 bytes, Free: No
Block 0x3f828c30 data, size: 52 bytes, Free: No
Block 0x3f828c68 data, size: 76 bytes, Free: No
Block 0x3f828cb8 data, size: 28 bytes, Free: No
Block 0x3f828cd8 data, size: 1696 bytes, Free: No -> OK, my application
Block 0x3f82937c data, size: 1920 bytes, Free: No
Block 0x3f829b00 data, size: 10712 bytes, Free: No
Block 0x3f82c4dc data, size: 1920 bytes, Free: No -> end
Block 0x3f82cc60 data, size: 636 bytes, Free: Yes
Block 0x3f82cee0 data, size: 12 bytes, Free: No
Block 0x3f82cef0 data, size: 16 bytes, Free: No
Block 0x3f82cf04 data, size: 24576 bytes, Free: No -> OK, from here my application
Block 0x3f832f08 data, size: 921604 bytes, Free: No
Block 0x3f913f10 data, size: 128004 bytes, Free: No
Block 0x3f933318 data, size: 226968 bytes, Free: No
Block 0x3f96a9b4 data, size: 10712 bytes, Free: No
Block 0x3f96d390 data, size: 1920 bytes, Free: No
Block 0x3f96db14 data, size: 10712 bytes, Free: No
Block 0x3f9704f0 data, size: 1920 bytes, Free: No
Block 0x3f970c74 data, size: 10712 bytes, Free: No
Block 0x3f973650 data, size: 1920 bytes, Free: No
Block 0x3f973dd4 data, size: 10712 bytes, Free: No
Block 0x3f9767b0 data, size: 47232 bytes, Free: No
Block 0x3f982034 data, size: 3072 bytes, Free: No
Block 0x3f982c38 data, size: 57132 bytes, Free: No
Block 0x3f990b68 data, size: 3072 bytes, Free: No
Block 0x3f99176c data, size: 57132 bytes, Free: No
Block 0x3f99f69c data, size: 3072 bytes, Free: No
Block 0x3f9a02a0 data, size: 57132 bytes, Free: No
Block 0x3f9ae1d0 data, size: 3072 bytes, Free: No
Block 0x3f9aedd4 data, size: 57132 bytes, Free: No -> end
Block 0x3f9bcd04 data, size: 1512 bytes, Free: No -> from here dynamic WIFI allocs
Block 0x3f9bd2f0 data, size: 1512 bytes, Free: Yes
Block 0x3f9bd8dc data, size: 1512 bytes, Free: No
Block 0x3f9bdec8 data, size: 1512 bytes, Free: No
Block 0x3f9be4b4 data, size: 1512 bytes, Free: No
Block 0x3f9beaa0 data, size: 1512 bytes, Free: Yes -> end
Block 0x3f9bf08c data, size: 29312 bytes, Free: No
Block 0x3f9c6310 data, size: 2333932 bytes, Free: Yes
... further entries

###Test 2: CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=n (all other parameter are untouched)
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=8192
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=n

Showing data for heap: 0x3f802968
Block 0x3f8031e4 data, size: 55880 bytes, Free: No -> OK
Block 0x3f810c30 data, size: 12 bytes, Free: No
Block 0x3f810c40 data, size: 56 bytes, Free: No
Block 0x3f810c7c data, size: 16 bytes, Free: Yes
Block 0x3f810c90 data, size: 61440 bytes, Free: No  -> OK, from here my application
Block 0x3f81fc94 data, size: 928 bytes, Free: No
Block 0x3f820038 data, size: 1684 bytes, Free: No
Block 0x3f8206d0 data, size: 1920 bytes, Free: No
Block 0x3f820e54 data, size: 1920 bytes, Free: No
Block 0x3f8215d8 data, size: 1920 bytes, Free: No
Block 0x3f821d5c data, size: 1920 bytes, Free: No
Block 0x3f8224e0 data, size: 1920 bytes, Free: No
Block 0x3f822c64 data, size: 48 bytes, Free: Yes
Block 0x3f822c98 data, size: 24576 bytes, Free: No
Block 0x3f828c9c data, size: 921604 bytes, Free: No
Block 0x3f909ca4 data, size: 128004 bytes, Free: No
Block 0x3f9290ac data, size: 226968 bytes, Free: No
Block 0x3f960748 data, size: 10712 bytes, Free: No
Block 0x3f963124 data, size: 10712 bytes, Free: No
Block 0x3f965b00 data, size: 10712 bytes, Free: No
Block 0x3f9684dc data, size: 10712 bytes, Free: No
Block 0x3f96aeb8 data, size: 10712 bytes, Free: No
Block 0x3f96d894 data, size: 47232 bytes, Free: No
Block 0x3f979118 data, size: 3072 bytes, Free: No
Block 0x3f979d1c data, size: 57132 bytes, Free: No
Block 0x3f987c4c data, size: 3072 bytes, Free: No
Block 0x3f988850 data, size: 57132 bytes, Free: No
Block 0x3f996780 data, size: 3072 bytes, Free: No
Block 0x3f997384 data, size: 57132 bytes, Free: No
Block 0x3f9a52b4 data, size: 3072 bytes, Free: No
Block 0x3f9a5eb8 data, size: 57132 bytes, Free: No -> end
Block 0x3f9b3de8 data, size: 2408980 bytes, Free: Yes

Test 2 shows no fragmention, after activating CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP lots of smaller chunks from WIFI component gets allocated in SPIRAM.
Thanks again for looking into this topic. If you need further info, don't hesitate to ask.

Hi @Slider0007
If CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is enabled. Prefer to allocate a chunk of memory in SPIRAM firstly.
If failed, try to allocate it in internal memory then.
CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP will cause
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL disable for WIFI and LWIP.
We will add some relevant explanatory documents to explain this issue.

Hi @mhdong
Thanks for your explaination. I almost thought that this would be the case, but I do not understand why there is such an exception for WIFI and LWIP?
Wouldn't it be possible to add a flag to choose which behaviour is better for user's use case (actual implemented alloc strategy or with respect of CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL like all other components)? Or if there is any limitation not be able to do so, implement a flag like I initially proposed -> allocate static chunks in SPIRAM and dynamically allocated chunks in internal memory.
Best Regards

Hi @Slider0007

Yes, you can implement your own alloc strategy.
/* If CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is enabled. Prefer to allocate a chunk of memory in SPIRAM firstly. If failed, try to allocate it in internal memory then. */ IRAM_ATTR void *wifi_malloc( size_t size ) { #if CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP  return heap_caps_malloc_prefer(size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL); #else  return malloc(size); #endif }

 IRAM_ATTR void *wifi_malloc( size_t size ) { #if CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP if (size > SPIRAM_THRESHOLD) {     return heap_caps_malloc_prefer(size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL); } else {     return malloc(size); } #else     return malloc(size); #endif }
2. allocate static chunks in SPIRAM and dynamically allocated chunks in internal memory
This strategy is not very easy to implement for customers. If there is indeed a need or significant performance improvement, we can also implement similar strategy in the future.

Hi @mhdong,
Thanks for your suggestion. Sounds at least like a possible workaround.
How do replace this wifi malloc function the easiest way? It tried to copy complete esp_wifi component to my project component folder but now it fails to compile due to dependencies of wifi component.
Thanks.

Hi @Slider0007
You can find function wifi_malloc in file esp_adapter.c. Modifying this function in the function definition.

Hi @mhdong
I mananged to set this up (with a defined limit of 1600 byte) and tested for a longer period. I was able to get rid of the smaller dynamically allocated fragments related to WIFI component. Unfortunately this solve my problem only partially. There are still smaller fragments in SPIRAM even though I modified the malloc strategy of wifi component. Therefore SPIRAM is still fragmenting over time until system is running out of SPIRAM...
Showing data for heap: 0x3f802968
Block 0x3f8031e4 data, size: 55880 bytes, Free: No
Block 0x3f810c30 data, size: 12 bytes, Free: No
Block 0x3f810c40 data, size: 40 bytes, Free: No
Block 0x3f810c6c data, size: 16 bytes, Free: No
Block 0x3f810c80 data, size: 16 bytes, Free: No
Block 0x3f810c94 data, size: 16 bytes, Free: No
Block 0x3f810ca8 data, size: 12 bytes, Free: No
Block 0x3f810cb8 data, size: 2392 bytes, Free: No -> WIFI static allocations -> OK
Block 0x3f811614 data, size: 1696 bytes, Free: No
Block 0x3f811cb8 data, size: 1696 bytes, Free: No
Block 0x3f81235c data, size: 1696 bytes, Free: No
Block 0x3f812a00 data, size: 1696 bytes, Free: No
Block 0x3f8130a4 data, size: 1696 bytes, Free: No
Block 0x3f813748 data, size: 1696 bytes, Free: No
Block 0x3f813dec data, size: 1696 bytes, Free: No
Block 0x3f814490 data, size: 1696 bytes, Free: No
Block 0x3f814b34 data, size: 1696 bytes, Free: No
Block 0x3f8151d8 data, size: 1696 bytes, Free: No
Block 0x3f81587c data, size: 1696 bytes, Free: No
Block 0x3f815f20 data, size: 1696 bytes, Free: No
Block 0x3f8165c4 data, size: 1696 bytes, Free: No
Block 0x3f816c68 data, size: 1696 bytes, Free: No
Block 0x3f81730c data, size: 1696 bytes, Free: No
Block 0x3f8179b0 data, size: 1696 bytes, Free: No -> WIFI static allocations -> OK
Block 0x3f818054 data, size: 16 bytes, Free: No -> ?
Block 0x3f818068 data, size: 16 bytes, Free: No
Block 0x3f81807c data, size: 16 bytes, Free: No
Block 0x3f818090 data, size: 56 bytes, Free: No
Block 0x3f8180cc data, size: 16 bytes, Free: No -> ?
Block 0x3f8180e0 data, size: 61440 bytes, Free: No -> My application -> OK
Block 0x3f8270e4 data, size: 52 bytes, Free: No -> Fro here ?
Block 0x3f82711c data, size: 12 bytes, Free: No
Block 0x3f82712c data, size: 52 bytes, Free: No
Block 0x3f827164 data, size: 12 bytes, Free: No
Block 0x3f827174 data, size: 40 bytes, Free: No
Block 0x3f8271a0 data, size: 52 bytes, Free: No
Block 0x3f8271d8 data, size: 36 bytes, Free: No
Block 0x3f827200 data, size: 12 bytes, Free: No
Block 0x3f827210 data, size: 40 bytes, Free: No
Block 0x3f82723c data, size: 12 bytes, Free: No
Block 0x3f82724c data, size: 52 bytes, Free: No
Block 0x3f827284 data, size: 12 bytes, Free: No
Block 0x3f827294 data, size: 24 bytes, Free: Yes
Block 0x3f8272b0 data, size: 168 bytes, Free: No
Block 0x3f82735c data, size: 168 bytes, Free: No
Block 0x3f827408 data, size: 12 bytes, Free: No
Block 0x3f827418 data, size: 1276 bytes, Free: No -> ?
Block 0x3f827918 data, size: 1224 bytes, Free: Yes -> ?
Block 0x3f827de4 data, size: 168 bytes, Free: No -> ?
Block 0x3f827e90 data, size: 168 bytes, Free: No
Block 0x3f827f3c data, size: 168 bytes, Free: No
Block 0x3f827fe8 data, size: 168 bytes, Free: No
Block 0x3f828094 data, size: 168 bytes, Free: No
Block 0x3f828140 data, size: 168 bytes, Free: No
Block 0x3f8281ec data, size: 168 bytes, Free: No
Block 0x3f828298 data, size: 168 bytes, Free: No -> ?
Block 0x3f828344 data, size: 1684 bytes, Free: No
Block 0x3f8289dc data, size: 1920 bytes, Free: No -> From here my application
Block 0x3f829160 data, size: 10712 bytes, Free: No
Block 0x3f82bb3c data, size: 1920 bytes, Free: No
Block 0x3f82c2c0 data, size: 492 bytes, Free: Yes -> ?
Block 0x3f82c4b0 data, size: 24576 bytes, Free: No
Block 0x3f8324b4 data, size: 921604 bytes, Free: No
Block 0x3f9134bc data, size: 128004 bytes, Free: No
Block 0x3f9328c4 data, size: 226968 bytes, Free: No

I assume these smaller fragments are not related to wifi component anymore but to LWIP?
In sum the actual proposed workaround has two drawbacks:

Global modification necessary -> project specific modification would be prefered
Still SPIRAM fragementation (now running for a longer period but still not usable for productive environment)

Any further suggestions?
Thanks in advance.

Hi @Slider0007
Maybe you should also change here
https://github.com/espressif/esp-idf/blob/d4cd437ede613fffacc06ac6d6c93a083829022f/components/lwip/port/include/lwipopts.h#L1636C1-L1647C50
/**

If CONFIG_ALLOC_MEMORY_IN_SPIRAM_FIRST is enabled, Try to
allocate memory for lwip in SPIRAM firstly. If failed, try to allocate
internal memory then.
/
#if CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP
#define mem_clib_malloc(size)    heap_caps_malloc_prefer(size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL)
#define mem_clib_calloc(n, size) heap_caps_calloc_prefer(n, size, 2, MALLOC_CAP_DEFAULT|MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT|MALLOC_CAP_INTERNAL)
#else / !CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP /
#define mem_clib_malloc malloc
#define mem_clib_calloc calloc
#endif / CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP */

Hi @mhdong
thanks for your tipp. Redirecting all allocations of LWIP component to internal memory even the flag CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is set the fragmentation of SPIRAM is under control and free internal memory is still a little larger than before (static allocs of WIFI component are now in SPIRAM). That's great.
But I'm still struggling to implement these changes on project level in a smart way. Right now all changes are made on framework level. How could I implement these on project level?
Is there any chance that a better configurability of the allocation strategy of the WIFI and LWIP component will be officially supported by the framework in the future to avoid such custom modifications?

Hi @Slider0007
Thank you very much for your suggestion. Sure, we will try to optimize the allocation strategy of the WIFI and LWIP components.


Linter: Fix the perfsprint linter not working for some test files

WIP

This is wrong, see the discussion in https://github.com/prometheus/prometheus/issues/14214#issue-2335236539


fix(controller): claim BD only if BDC is not scheduled for deletion

since BDC can have multiple finalizers, there will be cases where BDC is scheduled for deletion, but not cleared from etcd due to finalizers. Such BDCs should not be processed and BD should not be claimed for those BDCs.
Signed-off-by: Akhil Mohan<EMAIL_ADDRESS>

Codecov Report

Merging #289 into master will increase coverage by 0.56%.
The diff coverage is 100%.

@@            Coverage Diff             @@
##           master     #289      +/-   ##
==========================================
+ Coverage   52.15%   52.72%   +0.56%
==========================================
  Files          51       51
  Lines        2385     2386       +1
==========================================
+ Hits         1244     1258      +14
+ Misses       1042     1032      -10
+ Partials       99       96       -3

Impacted Files
Coverage Δ

...er/blockdeviceclaim/blockdeviceclaim_controller.go
35.81% <100%> (+0.43%)
:arrow_up:

cmd/ndm_daemonset/probe/udevprobe.go
65.85% <0%> (+5.69%)
:arrow_up:

cmd/ndm_daemonset/probe/eventhandler.go
53.94% <0%> (+7.89%)
:arrow_up:

Continue to review full report at Codecov.

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


feat(client): added dynamic context in middleware

Problem
This problem is well described here: https://github.com/prisma/prisma/discussions/13366
Solution
Creation example:
prisma.findMany({
  context: {
    cache: 500
  }
})

Use example in middleware:
prisma.$use((params, next) => {
  // Get params.context...
  console.log(params.context)
  return next(params)
})

 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.

Related: https://github.com/prisma/prisma/pull/9759

Hey guys, any updates on this?? Really need this feature for my implementation.

LGTM!

I apologize for the delay from our side.
Since middlewares are deprecated, we don't currently plan to add new features to them and we are going to close this PR.
Client extensions allow to create independent context-specific lightweight prisma client "forks". The pattern for using this:
const prisma = new Prisma()
app.get('/some-path', (request) => {
   const localPrisma = prisma.$extends(someSessionSpecificExtension(request))
   // use localPrisma while handling the request
})

From all extension components, query extensions are  conceptually closest to the middlewares and most middlewares should be convertable to query extension.
If you encounter any problems with this pattern or it does not fit your usecases, feel free to open an issue.


Docs versions?

So I'm currently working on a older system that is using <IP_ADDRESS> and I can't figure out what features are new / what features I can't use.
Is there anything beside archive.org?

And which versions can be updated/which versions don't have backward compatibility?

We added upgrade documentation on official website. You will see the changes while you upgrading to the latest version.
https://medoo.in/api/upgrade

In case anyone searching for older docs for legacy projects:
Here are medoo documentations for older versions (from the beginning)

0.9.6: https://web.archive.org/web/20140625044946/http://medoo.in/doc
0.9.8: https://web.archive.org/web/20150215213036/http://medoo.in/doc
1.0.0: https://web.archive.org/web/20151006114145/http://medoo.in:80/doc
1.0.2: https://web.archive.org/web/20160620023645/http://medoo.in:80/doc
1.1.1: https://web.archive.org/web/20160702121735/http://medoo.in:80/doc
1.1.2: https://web.archive.org/web/20160807170540/http://medoo.in:80/doc
1.1.3: https://web.archive.org/web/20160905153430/http://medoo.in:80/doc

In case anyone needs the docs for medoo 1.7 (last version for PHP5.4 - PHP7.2), still installable with composer
There are only the docs online for 1.6.1 (last version crawled by waybackmachine)
So https://web.archive.org/web/20190216193429/https://medoo.in/doc

The new features create() / drop() and mapping are explained in the release note:
https://github.com/catfan/Medoo/releases/tag/v1.7.0


Find within a data structure based array

Can the Find method be used to find specific data that is part of a data structure when the array contains elements of that structure?

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: a8134a2a-bd1c-2fae-fdb2-f3268bd20c44
Version Independent ID: 6b316148-edfc-50c5-20c6-d2a91721b03a
Content: CSimpleArray Class
Content Source: docs/atl/reference/csimplearray-class.md
Product: visual-cpp
GitHub Login: @mikeblome
Microsoft Alias: mblome

@haephrati  Apologies for late response.  Yes, you can use Find to do that when you define a CSimpleArrayHelper class that compares each element in the array to an element that has the values you are looking for.  See the remarks for the class at the top of the topic. Also, StackOverflow is a great place to ask questions like this.


Truncate title in image card not working

Hi,
I'm using the image card component with long titles.
When I apply the 'truncate' class on it, the title still exceed the card's width.
Please find below the codepen to reproduce the issue.
http://codepen.io/pdupavillon/pen/EZmPqo

Fixed in 048bbf2


add check for owner to WithdrawToken function

why do we need this?
if some one else wants to pay the gas for the user withdrawal?

if the owner doesn't want to withdraw their tokens, but someone calls the function.


Splitting data with known camera pose into seperate blocks

I'm trying to generate a Block-NeRF with my own data
How would you proceed if you were to split your own data into separate blocks, in order to train them with train_block_nerf.py? split_block.py can't run on custom data because of lacking files such as train_all_meta.pt and split_block_train.json which are included in Waymo's data. Is there a way to generate these required files?

A general suggestion in the practice is that you can just split the training indexes on the fly and train each block independently while only loading the indexes in the current training block. You don't have to split the blocks prior to the NeRF training.

Okay, thanks for responding! So you would

feed all the images to train_block_nerf.py,
create a simple pre_processing-step for splitting the data into separate NeRFs,
train on a single split

The issue arises when you want to evaluate the block NeRF. In your prior implementation you define split_block_train.json which contains info about the elements of each nerf and their relative distances. How would you do this on the fly?

just cal_distance:calculate every co distance to the local centers.
split_indexs according to the distances and divide into blocks.
Then only load the index of interests.

Closed because of no response.


fix(typography):Adjusts typography for accessibility

Changes black-900 to a new color. Makes blue text semi-bold. Adjusts blue text on dark backgrounds.
Fixes #309

Deploy preview for pf-next ready!
Built with commit dbcf2d62fc66e2b7357407bddfa4baa02ad42327
https://deploy-preview-491--pf-next.netlify.com

@kybaker @andresgalante As requested, I've removed the variables for individual button types, so all buttons are semi-bold all the time.

LGTM!


High memory consumption when converting Flux to Mono

Describe the bug
High memory consumption when converting Flux to Mono
Exception or Stack Trace
No stack trace.
To Reproduce
N/A
Code Snippet
public static Mono<String> toString(Flux<ByteBuf> contentObservable) {
        return contentObservable
                .reduce(
                        new ByteArrayOutputStream(INITIAL_RESPONSE_BUFFER_SIZE),
                        (out, bb) -> {
                            try {
                                bb.readBytes(out, bb.readableBytes());
                                return out;
                            } catch (IOException e) {
                                throw new RuntimeException(e);
                            }
                        })
                .map(out -> new String(out.toByteArray(), StandardCharsets.UTF_8));
    }

Expected behavior
Use Reactor Netty inbound receive with aggregation to get body as Mono from channel

cc @jianghaolu

Released in V3.3.0


Cleanup warnings

This PR cleans up some warnings.
We still have a lot of them left from storyboards.
ping @analogcode

Looks like this branch may have some conflicts. Perhaps some things were addressed in a later PR by @marcussatellite ?


'No changes found' for first migration

Trying to create the first migration
node_modules/.bin/makemigration --name init

resulting
No changes found

although there are 3 new models in the models models-path

Was this ever resolved?

Not that I am aware of

@assapir
I'm guessing you didn't import your models?
Object.keys(models).forEach((modelName) => {
    db[modelName] = sequelize.import(models[modelName]);
});

this help solve my issues thanks you


Clarify the example of an I/O region.

The previous example of a "device scratchpad RAM" was awkward, possibly
suggesting that such RAMs could not be classified as Memory.
The platform HSC is accommodating Memory across PCIe and so that instigated this cleanup.

@jscheid-ventana Is this change still needed? If so, I can put into the asciidoc version for this chapter.

rewrote to be adoc here - https://github.com/riscv/riscv-isa-manual/pull/1301


[Question] Custom Database Connections for Tenants

Dear @luceos and community,
i recently toyed around with hyn, and i was able to get it to work - even though i have a quite complex application architecture (e.g., see another issue posted). That was a really (!) awesome experience 👍
However, i have an additional question - i was not able to find respective information on the docs and i am not sure if this is even possible:
Imagine the following scenario:
I want to use the "each customer has its own database" approach, because i really like to separate the data on "database" layer. i am fully aware that this, however, may cause issues related to hosting such applications as most "common hosters" do not offer such features as "nearly unlimited databases" or "automatically creating new databases" on the fly.
 Note that my hoster automatically generates a random database name i am not able to change! Further, this database gets its own user assigned (again, i am not able to change the username!)
Create a new Tenant with hyn and append the newly created database connection parameters to this model
Migrate the database to this connection

Is this currently possible with hyn? Will this be possible with tenancy?
If so, how can I achieve such a setup? If not, what would be the best approach to support such a feature?
Thank you very much for your awesome work and your time!
All the best,

wow, that was a fast resposne 😆
sorry, i may have not provided enough information. I don't want to "automatically" create a new database on my hoster - i will do this manually. So there should / will not be a "create account and immediately start working" setup (at least not for now, haha)..
Why shouldn't i use such an approach? Can you provide some details in order to reproduce your though-process on this?
Thank you very much!

Aha. The process is possible in both packages. Let's stick to the stable one though.
You can configure your own database configuration whenever tenancy needs it. For that to work you can listen to a specific event ; hyn tenancy events database configuration loading, sorry on mobile 🤞
As to my thought process. This package was developed to give you as much automation as possible, hence the vhost configuration files for apache and nginx, but also the database creation and deletion.. Not using those features is like buying a tesla and retrofitting it with a diesel engine. 🤭

haha, that is  a good example..
however, i would like to have some kind of "the admin can move the tenant ot another server" functionality..
For example, TenantA may be a "premium" user that should get a more "powerful" (i.e., less users per server) machine.. So i would like to move his database from ip-address-of-slow-server to ip-address-of-powerful-server. This way, however, the admin must "re-configure" the database-connection properties (e.g., address of the db, port, username, password, ...). Maybe one could also use some kind of "you can have a postgreSQL database instead of mySQL" approach..
Further, i did not find any "database fields" where such connection parameters of a tenant can be stored. From what i read, these database-connection properties are "calculated" from the tenant object (i.e., it generates a random "database name", creates a username with the same name, creates a hash for the pw from various attributes, ...)

Migrating to another server; as the code base doesn't change (and you can rely on block storage for most other files) we only have to offer a way to reconfigure another connection that is being seen as the connection on which to create users and databases. This feature exists under the name "managing connection". The default system connection still holds information on hostnames and websites, but the managing connection is responsible for maintaining the database and database user.
There are no database fields. The database connection configuration is generated dynamically, however you can still specify your own configuration before hand, as pointed out yesterday. To do so:

Listen to the even Hyn\Tenancy\Events\Database\ConfigurationLoading you can see how it is used here:
https://github.com/hyn/multi-tenant/blob/73d7d6d9ff746603987687f3e8f31f0df7e04519/src/Database/Connection.php#L296-L327
You'll achieve most flexibility by modifying the $mode to get the value Hyn\Tenancy\Database\Connection::DIVISION_MODE_BYPASS and setting the $configuration value to whatever array you need.

Hey @luceos ,
sorry for the delay, but at the moment I am quite busy with finishing my PhD thesis :joy:
If I would use the managed by database connection feature, however, I would need to specify a new connection in the config/database.php configuration file, right? So, basically, for each tenant, i would need to add such a block?!
Further, if i want to store the db-connection information (e.g., the host to connect to, db-name, db-user, ...) in the system database for the Website, i would need to extend the current models (and db-schema), right?
Thank you so much for your awesome support!

however, I would need to specify a new connection in the config/database.php configuration file, right? So, basically, for each tenant, i would need to add such a block?!

If you need a separate database server per tenant then you need a separate database connection set up per tenant. You can however do that during runtime as well! A possible location would be the ConfigurationLoading event, so that the system connection is set up before the Tenant connection..

Further, if i want to store the db-connection information (e.g., the host to connect to, db-name, db-user, ...) in the system database for the Website, i would need to extend the current models (and db-schema), right?

That would be possible. You can easily extend the implementation and configure it in the tenancy.php.
Good luck with your thesis!

For any one who stumbles over this: if you need to access the website object in the listener to ConfigurationLoading you could cache the website object in a listener to Events\Websites\Identified. Then you can access it in your listener.
@luceos Would you accept an PR which hands the website object to the ConfigurationLoadingevent?
$this->emitEvent(new Events\Database\ConfigurationLoading($mode, $clone, $this));
would become
$this->emitEvent(new Events\Database\ConfigurationLoading($mode, $clone, $this, $website));

Yes, seems like the original question was answered. Let's not trail into having a discussion on different topics inside one issue.


add length of slice property to Construction schema

 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.


Update in Zone Information

I have checked and found that the default settings in the IE security zone were not correct. Updated the correct default security zone settings.
Problem: https://github.com/MicrosoftDocs/windows-itpro-docs/issues/10154

@JohanFreelancer9 - kindly do the copy editor review for this PR. Thanks.


Comment parsing logic for invoice details page.

Describe the task

Add comment parsing logic according to the bank statement pattern of different banks.

Expected behavior

The system should be able to parse the paid amount from the comment with different logic according to bank statement pattern.
The system should also be able to calculate the conversion rate diff with different logic for different bank.
In case if there is no existing logic for the given bank statement, the system should use the default logic to parse the comment and calculate the conversion rate and conversion rate diff.

@Satendra-SR, please add the following ENV variables in UAT server.
CITI_BANK_MESSAGE_PATTERN='NEFTINWARDNEFTINUTRCITIN'
AXIS_BANK_MESSAGE_PATTERN='BRN-REFNO.1609FIR'

@Satendra-SR, please add the following ENV variables in UAT server.
CITI_BANK_MESSAGE_PATTERN=
AXIS_BANK_MESSAGE_PATTERN=
These are the bank message pattern string which will be used to determine the bank based on the message.


sail should report its usage for -h option.

MacOS: 11.2.3
Bash Version:3.2
Sail Version: 1.0.1
Laravel Version: 8.12
PHP Version: 8.0.2

Description:
I would like to see more options for the sail command.
Steps To Reproduce:
・Reproduction Procedure
sail -h
・Expected results
There is a description of the sail command
・Actual result
The description of the docker compose command is printed.
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [--profile <name>...] [options] [--] [COMMAND] [ARGS...]
  docker-compose -h|--help
...

Welcoming PR's 👍


What should be the CRDs categories for Tekton ?

As of today, Tekton's CRDs are using tektoncd-pipeline and all as categories. This means you can do kubectl get all or kubectl get tektoncd-pipeline and it will display those resources (and others if in the same categorie). For all, this might pose a problem if the user has not sufficient rights, see quote below.

_The problem with this is that if you are operating under expectation that 'all' will only include the original core builtin resources from Kubernetes, if you are using 'oc' from a service account with a basic set of roles which only covers builtin resource types, then you start getting errors:
Error from server (Forbidden): images.caching.internal.knative.dev is forbidden: User "system:serviceaccount:homeroom:portal-homeroom-user1" cannot list resource "images" in API group "caching.internal.knative.dev" in the namespace "portal-homeroom-user1-2"
Error from server (Forbidden): clustertasks.tekton.dev is forbidden: User "system:serviceaccount:homeroom:portal-homeroom-user1" can not list resource "clustertasks" in API group "tekton.dev" at the cluster scope
Can someone explain the rationale as to why knative/tekton resources are being shoved under the set of resources that 'all' returns when using 'oc get all'. It seems to go against the idea that these are optional resources for an operator that may not even be installed, they are not core builtin resources.

kubectl get all or oc get all displays all resources that are in the "all" category.
There used to be a small "best practice" doc on when to add resources to all or not (see https://github.com/thtanaka/kubernetes/blob/master/docs/devel/kubectl-conventions.md#rules-for-extending-special-resource-alias---all) ; which were

No cluster scoped resources
No namespace admin level resources (limits, quota, policy, authorization rules)
No resources that are potentially unrecoverable (secrets and pvc)
Resources that are considered "similar" to #3 should be grouped the same (configmaps)

Somehow, I can't find this document anymore. I don't think the expectation was "only original core builtin", as a lot of CRDs are adding themselves to "all" (part of istio, …).
That said, I understand that having those errors are not really user friendly. It might also make sense to groups some of those resources in other categories.
I wonder if we really need to have our CRDs adding to the all categorie or if we can remove that from the categories and use more accurate ones (like ci, pipelines, …) ?
/kind question

Worth also linking here is https://github.com/kubernetes/kubectl/issues/151#issuecomment-410306145
In this, core developers state the intention that all would not be extended any further to cover any other resource types. Presumably this is why in oart those guidelines for best practices may have disappeared. It was likely deemed as no longer being a best practice because of the issues including how it could cause around confusion of what all meant. It also causes issues as noted when users do not have the roles required to list resource types added by arbitrary operators.

@bobcatfish @skaegi @afrittoli @dlorenc @ImJasonH @abayer any thoughts on this ? :angel:

This has undesired consequences.


NLB forces replacement doesn't destroy before create

Description
We use the module to create a NLB which works as expected. When updating the NLB configuration with a different list of subnets, Terraform will again generate the expected force replacement of the resource. However when running terraform apply, terraform will not attempt to destroy the resource before creating it which leads to a clash with the name of the load balancer already existing.
Versions

Terraform: 0.14.5

Provider(s): AWS 3.42.0

Module: 6.1.0

Reproduction

Steps to reproduce the behavior:

Create a simple Network load balancer with the terraform-aws-alb module
Update the list of subnets and run terraform apply again
The terraform diff will show the force replacement of the resource:

  # module.test_nlb.aws_lb.this[0] must be replaced
...
      ~ subnets                          = [ # forces replacement
          + "subnet-01234",
            # (1 unchanged element hidden)
        ]
...
Plan: 1 to add, 0 to change, 1 to destroy.

Terraform apply will fail because of the name clash and because it doesn't try to delete the NLB beforehand.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

module.test_nlb.aws_lb.this[0]: Creating...

Error: error creating network Load Balancer: DuplicateLoadBalancerName: A load balancer with the same name 'test-nlb' exists, but with different settings
	status code: 400, request id: 8f7dcf84-9c47-4d8f-a43e-47b9aa35f636

  on .terraform/modules/test_nlb/main.tf line 1, in resource "aws_lb" "this":
   1: resource "aws_lb" "this" {

Are you using workspaces?
Yes in our production code. No in the minimal example I am running to confirm that issue.
Code Snippet to Reproduce
module "test_nlb" {
  internal           = true
  load_balancer_type = "network"
  name               = "test-nlb"
  source             = "terraform-aws-modules/alb/aws"
  subnets = [
    "subnet-01234",
    "subnet-4567", # Added for the second apply that forces the replacement of the LB
  ]
  version = "6.1.0"
  vpc_id  = "vpc-1234"
}

Expected behavior
The NLB being replaced should be destroyed before being created again.
Actual behavior
It goes straight to the creation of the LB leading to a name clash.
Additional context
Note that using a plain aws_lb resource from the aws provider does not reproduce that issue for some reason. Looking at the code of this module I can't find a reason why the behaviour is different here compared to simple aws_lb.

This is probably a result of the depends_on and create create_before_destroy statements in the target group resource (see lines 110-114 of main.tf).
It might be better is this create_before_destroy was configurable?


Strick Null Checker Loophole

type Getter<S, D> = (source: S) => D;

interface IPerson {
    name: string;
    spouse?: IPerson;
}

const klara: IPerson = {
    name: "Klara"
};

const paul: IPerson = {
    name: "Paul",
    spouse: klara
};

const spouseGetter: Getter<IPerson, IPerson | undefined> = (person) => person.spouse;
const nameGetter: Getter<IPerson, string> = (person) => person.name;

function chain<T1, T2, T3>(getter1: Getter<T1, T2>, getter2: Getter<T2, T3>): Getter<T1, T3> {
    return (source) => getter2(getter1(source));
}

const spouseNameGetter = chain(spouseGetter, nameGetter);
const paulSpouseName = spouseNameGetter(paul);
const klaraSpouseName = spouseNameGetter(klara);

Test it:
npx tsc getter.ts  --strictNullChecks

Expected behavior:
The definition of the chain function specifies as a constraint that the output type of getter1 (D) should be the same as the input type of getter2 (S) - both of which are named as T2. In this case, since the output type of spouseGetter could potentially be undefined (IPerson | undefined), and the input type of nameGetter is never undefined (IPerson), I expect the line chain(spouseGetter, nameGetter) to fail at compile time.
Actual behavior:
TypeScript seems to infer the type of T2 to be the union of the 2 types, thus: IPerson | undefined rather than strictly forcing them to be the same:

The program compiles successfully, but when run, it fails at runtime with:
var nameGetter = function (person) { return person.name; };
                                                   ^

TypeError: Cannot read property 'name' of undefined

Playground Link:
https://www.typescriptlang.org/play/#src=type Getter<S%2C D> %3D (source%3A S) %3D> D%3B

interface IPerson {
    name%3A string%3B
    spouse%3F%3A IPerson%3B
}

const klara%3A IPerson %3D {
    name%3A "Klara"
}%3B

const paul%3A IPerson %3D {
    name%3A "Paul"%2C
    spouse%3A klara
}%3B

const spouseGetter%3A Getter<IPerson%2C IPerson | undefined> %3D (person) %3D> person.spouse%3B
const nameGetter%3A Getter<IPerson%2C string> %3D (person) %3D> person.name%3B

function chain<T1%2C T2%2C T3>(getter1%3A Getter<T1%2C T2>%2C getter2%3A Getter<T2%2C T3>)%3A Getter<T1%2C T3> {
    return (source) %3D> getter2(getter1(source))%3B
}

const spouseNameGetter %3D chain(spouseGetter%2C nameGetter)%3B
const paulSpouseName %3D spouseNameGetter(paul)%3B
const klaraSpouseName %3D spouseNameGetter(klara)%3B

This is correctly flagged when you also enable strictFunctionTypes.

This is correctly flagged when you also enable strictFunctionTypes.

Wow! I had no idea. Thank you for this info. I will use --strict from now on which includes all the strict options. I played around more and found a narrower problem which I will document here: https://github.com/Microsoft/TypeScript/issues/30600. But now I have workaround.

Yup, use full --strict mode and you'll get more desirable results. Otherwise we always compare function parameters bivariantly.


Remove Some Components - Fails on other

I just ran the script and it removed some item but not all :(  See attached transcript
PowerShell_transcript.BLACK15.8ubCUUyB.20180427222703.txt
Thanks in advance,

Hi @Cash4Programming,
I see that there are errors showing "System.UnauthorizedAccessException,Microsoft.Windows.Appx.PackageManager.Commands.GetAppxPackageCommand
Get-AppxPackage : Access is denied.
Get-AppxProvisionedPackage : The requested operation requires elevation."
This means you did not run PowerShell as an Administrator when running this script. Try running PowerShell as an Administrator with this script and your issue will be resolved.

That fixed it.
Thanks!


after everything done device not turned on [deep sleep in dfu]

Hello, iPhone10,3 on 15.5!
[] Switching device into recovery mode...
Telling device with udid 1e3b6f049dcc520a99a6d0d02925f6b31033a3b1 to enter recovery mode.
Device is successfully switching to recovery mode.
[] Waiting for device to reconnect in recovery mode
[] Getting device info...
[] Press any key when ready for DFU mode
Get ready (0)
Hold volume down + side button (0)
Keep holding (0)
Release side button, but keep holding volume down (0)
[] Device entered DFU!
[] Pwning device
usb_timeout: 5
[libusb] Waiting for the USB handle with VID: 0x5AC, PID: 0x1227
CPID:8015 CPRV:11 CPFM:03 SCEP:01 BDID:06 ECID:000E4DEC38B8402E IBFL:3C SRTG:[iBoot-33<IP_ADDRESS>.23]
Found the USB handle.
Stage: RESET
ret: true
[libusb] Waiting for the USB handle with VID: 0x5AC, PID: 0x1227
CPID:8015 CPRV:11 CPFM:03 SCEP:01 BDID:06 ECID:000E4DEC38B8402E IBFL:3C SRTG:[iBoot-33<IP_ADDRESS>.23]
Found the USB handle.
Stage: SPRAY
ret: true
[libusb] Waiting for the USB handle with VID: 0x5AC, PID: 0x1227
CPID:8015 CPRV:11 CPFM:03 SCEP:01 BDID:06 ECID:000E4DEC38B8402E IBFL:3C SRTG:[iBoot-33<IP_ADDRESS>.23]
Found the USB handle.
Stage: SETUP
ret: true
[libusb] Waiting for the USB handle with VID: 0x5AC, PID: 0x1227
CPID:8015 CPRV:11 CPFM:03 SCEP:01 BDID:06 ECID:000E4DEC38B8402E IBFL:3C SRTG:[iBoot-33<IP_ADDRESS>.23]
Found the USB handle.
Stage: PATCH
ret: true
[libusb] Waiting for the USB handle with VID: 0x5AC, PID: 0x1227
CPID:8015 CPRV:11 CPFM:03 SCEP:01 BDID:06 ECID:000E4DEC38B8402E IBFL:3C SRTG:[iBoot-33<IP_ADDRESS>.23] PWND:[gaster]
Found the USB handle.
Now you can boot untrusted images.
[*] Booting device
Done!
The device should now boot to iOS
If you already have ran palera1n, click Do All in the tools section of Pogo
If not, Pogo should be installed to Tips
ubuntu@ubuntu:~/Downloads/palera1n$

But the device is not turned on
When i exit from dfu mode manually i tried to open tips but app crashing
Device iphone x ios 15.5 already restored no password

./palera1n.sh clean


RSS feed missing an "author" tag for all posts.

From intercom:
The RSS feed for lesswrong appears to be missing an "author" tag for all posts. As a result, the author in my RSS reader appears as "Lesswrong Development Server" (which is the channel title in the RSS feed and is presumably used as a fallback by my RSS reader). I think that the RSS feed should include an  tag for each post

Duplicate of: https://github.com/Discordius/Lesswrong2/issues/210
(Scanning through issues.)

I made a fix (pull request) for this but if you think it needs to be done another way, let me know and I can try again.

The RSS spec defines "author" and "creator" as two separate fields; currently we only provide "creator", which may mean that some RSS readers are ignoring it. Simple solution is to put the user display name in both places.

See also discussion in #210 ; I believe this is working correctly (crybx's PR fixed it).


Package licenses check

Check licenses of the misc integrated packages.
Replace packages with undesirable licenses.

[ ] flutter (BSD-3)
[ ] flutter_icons (Apache-2.0)
[ ] date_time_picker (proprietary, free)
[ ] excel (MIT)
[ ] path (BSD-3)
[ ] path_provider (BSD-3)
[ ] percent_indicator (BSD-2)
[ ] sqflite (BSD-2)
[ ] sqflite_common_ffi (BSD-2)
[ ] sqlite3_flutter_libs (MIT)
[ ] share_plus (BSD-3)
[ ] syncfusion_flutter_datapicker (proprietary, costly)
[ ] timezone (BSD-2)
[ ] xml (MIT)
[ ] cupertino_icons (MIT)

date_time_picker replaced with flutter material showTimePicker().

syncfusion_flutter_datapicker replaced with flutter material showDatePicker ().


Adds many unrelated vue dependencies to the project

Describe the bug
In case it used in pure node.js app or for example in react app - it unnecessary  adds such dependencies as  @vue/language-core, @vue/compiler-core, @vue/compiler-dom, batch of  @volar/** packages and so on.
Can be fixed by moving next packages to peerDependencies  or optionalDependencies

"@volar/typescript"
"@vue/language-core"
"vue-tsc"

Reproduction
not related
Steps to reproduce
pnpm add vite-plugin-dts
System Info
Not related

Validations

[X] Read the FAQ.
[X] Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
[X] The provided reproduction is a minimal reproducible example of the bug.

Temporary workaround: in case project uses pnpm you can add next settings in package.json
{
  "pnpm": {
    "packageExtensions": {
      "vite-plugin-dts": {
        "dependencies": {
          "@volar/typescript": {
            "optional": true
          },
          "vue-tsc": {
            "optional": true
          },
          "@vue/language-core": {
            "optional": true
          }
        }
      }
    }
  }
}

Let me be clear. Regardless of whether the plugin is installed in dependencies or devDepenencies - in a project that does not use vue they are not included in the final chunk, since they're not being used in such projects.
In other words, these packages are only needed if vue is used in the project. I.e., they're optional
What bad in excess of addiction that will never be used? I would say it's not a critical problem, but such dependencies cause some inconvenience:
1. Waste of resources - unnecessary dependencies take up disk space and slow down the overall time it takes to install dependencies.
2. If you are serious about security, dependencies should be audited and vulnerabilities in them promptly fixed. Adding unused dependencies significantly degrades the DX of those who do it
Thus, making these dependencies optional not only better reflects reality, but will make the users of this wonderful library a little happier ; )

I'd add to some downsides, these Vue dependencies that my project doesn't use caused dependency resolution conflicts because they specify a different version of vue-tsc that some other package is unnecessarily including vue-tsc as a dependency as well.


Mutation for changing logged user first and last name

I want to merge this change because resolve #4289

Screenshots

Pull Request Checklist

[ ] Privileged views and APIs are guarded by proper permission checks.
[ ] All visible strings are translated with proper context.
[ ] All data-formatting is locale-aware (dates, numbers, and so on).
[ ] Database queries are optimized and the number of queries is constant.
[ ] Database migration files are up to date.
[ ] The changes are tested.
[ ] The code is documented (docstrings, project documentation).
[ ] GraphQL schema and type definitions are up to date.
[ ] Changes are mentioned in the changelog.

Here is the report for 139f318ebb46d43d951724c133b3945161ee9520 (mirumee/saleor @ 4289/Change-logged-user-email-and-names)
Base comparison is c0984137c26304a1d0bd9b22cb6d31e48039959b.
No differences were found. (click me)

# api.benchmark checkout
  test name                           	left count 	right count	duplicate count
  ------------------------------------	-----------	-----------	---------------
  add billing address to checkout     	         34	         34	             20
  add shipping to checkout            	          7	          7	              0
  checkout payment charge             	         14	         14	              0
  complete checkout                   	          6	          6	              0
  create checkout                     	         43	         43	             21

# api.benchmark homepage
  test name                           	left count 	right count	duplicate count
  ------------------------------------	-----------	-----------	---------------
  retrieve main menu                  	          5	          5	              0
  retrieve product list               	          4	          4	              0
  retrieve secondary menu             	          5	          5	              0
  retrieve shop                       	          2	          2	              0

# api.benchmark product
  test name                           	left count 	right count	duplicate count
  ------------------------------------	-----------	-----------	---------------
  product details                     	         13	         13	              3

# api.benchmark variant
  test name                           	left count 	right count	duplicate count
  ------------------------------------	-----------	-----------	---------------
  retrieve variant list               	          9	          9	              2


Fixings for netdom commands

In the netdom section the @ sign and the slash are escaped which is not right when working with PowerShell.

This seems like a small (but important) contribution, so no Contribution License Agreement is required at this point. We will now review your pull request.
Thanks,
Microsoft Pull Request Bot


Azure Pipelines random failure

Python 3.6 -> Python 2.6
test_tuple (utils_test.CastTest) ... ok
test_unicode (utils_test.CastTest) ... ok
test_unknown (utils_test.CastTest) ... ok
test_run_with_broker (utils_test.RunWithRouterTest) ... 16:23:08.197842 D mitogen: Broker(0x7efd51c3df98).shutdown()
16:23:08.198162 D mitogen: Waker(Broker(0x7efd51c3df98) rfd=3, wfd=4).on_shutdown()
16:23:08.198626 D mitogen: Waker(Broker(0x7efd51c3df98) rfd=3, wfd=4).on_disconnect()
16:23:08.199080 D mitogen: Router(Broker(0x7efd51c3df98)): stats: 0 module requests in 0 ms, 0 sent (0 ms minify time), 0 negative responses. Sent 0.0 kb total, 0.0 kb avg.
ok
test_with_broker (utils_test.WithRouterTest) ... 16:23:08.200959 D mitogen: Broker(0x7efd5ab49f28).shutdown()
16:23:08.201232 D mitogen: Waker(Broker(0x7efd5ab49f28) rfd=3, wfd=4).on_shutdown()
16:23:08.201432 D mitogen: Waker(Broker(0x7efd5ab49f28) rfd=3, wfd=4).on_disconnect()
16:23:08.201707 D mitogen: Router(Broker(0x7efd5ab49f28)): stats: 0 module requests in 0 ms, 0 sent (0 ms minify time), 0 negative responses. Sent 0.0 kb total, 0.0 kb avg.
ok

======================================================================
FAIL: test_exception (broker_test.DeferSyncTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/vsts/work/1/s/tests/testlib.py", line 338, in tearDown
    self._teardown_check_fds()
  File "/home/vsts/work/1/s/tests/testlib.py", line 333, in _teardown_check_fds
    self, self._fd_count_before, get_fd_count(),
AssertionError: test_exception (broker_test.DeferSyncTest) leaked FDs. Count before: 4, after: 4

----------------------------------------------------------------------
Ran 506 tests in 80.786s

FAILED (failures=1, skipped=45)
coverage report is at file:///home/vsts/work/1/s/htmlcov/index.html
Command exited with non-zero status 1
35.21user 2.65system 1:25.49elapsed 44%CPU (0avgtext+0avgdata 60112maxresident)k
9600inputs+6784outputs (23major+793065minor)pagefaults 0swaps
Running: ['/usr/bin/time', '--', './run_tests', '-v']
Traceback (most recent call last):
  File ".ci/mitogen_tests.py", line 17, in <module>
    ci_lib.run('./run_tests -v')
  File "/home/vsts/work/1/s/.ci/ci_lib.py", line 89, in run
    ret = subprocess.check_call(argv, **kwargs)
  File "/opt/hostedtoolcache/Python/3.6.5/x64/lib/python3.6/subprocess.py", line 291, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/usr/bin/time', '--', './run_tests', '-v']' returned non-zero exit status 1.
##[error]Bash exited with code '1'.
##[section]Finishing: Run tests.

I have no idea how this is happening. That code should not run until the broker is (synchronously) completely shut down. The error suggests get_fd_count() returned >= 4 just a moment previously, so it's racing with some component that is shutting down


Publish to Azure DevOps Wiki fails with Error: spawn git ENOENT

Release notes are successful generated but in the next step publish to Azure DevOps Wiki fails with following error:
Error: Error: spawn git ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
    at onErrorNT (internal/child_process.js:415:16)
    at process._tickCallback (internal/process/next_tick.js:63:19)
    at Function.Module.runMain (internal/modules/cjs/loader.js:834:11)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
Error: Error: spawn git ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
    at onErrorNT (internal/child_process.js:415:16)
    at process._tickCallback (internal/process/next_tick.js:63:19)
    at Function.Module.runMain (internal/modules/cjs/loader.js:834:11)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)

tasklog_18.log
YAML Definition
steps:
- task: richardfennellBM.BM-VSTS-WIKIUpdater-Tasks.WikiFolderUpdaterTask.WikiFolderUpdaterTask@1
  displayName: 'Upload Release Notes to Technical Docs Wiki'
  inputs:
    repo: 'dev.azure.com/********/********/_git/TechnicalDocs.wiki'
    targetFolder: 'Environments\$(Release.EnvironmentName)\Releases\'
    sourceFolder: '$(Agent.TempDirectory)'
    Filter: '**/$(Release.ReleaseName)*.md'
    message: 'Auto-generated release notes for $(Release.ReleaseName) attempt $(Release.AttemptNumber)'
    gitname: '$(Release.RequestedFor)'
    gitemail: '$(Release.RequestedForEmail)'
    useAgentToken: false
    user: ******
    password: '$(PAT)'
    injectExtraHeader: false

I am getting the same outcome no matter I am using username and PAT, OAUTH token, or if credentials are passed via Header.
Agent Info
I have successfully tested the same task group using both azure-hosted and self-hosted agents with out any problems using OAUTH token. All release notes were successful published to the same git repo.
Once tests were all good I have added the same taskgroup to stages for our production environments.
Self-hosted agents on both test and production environments are configured to run under local admin account as windows service.
PAT issued for agents have full access to Azure DevOps.
Other info

Debug log is in the attachment.
It looks like it is related to #613 and #497

Sounds like you have tried everything I can think of. But, interestingly I had a similar issue myself yesterday

uploader worked using OAUTH or a PAT if run on

a Microsoft Hosted agent
my private agent

however, on a clients private agent I got the same error you have seen.

We tried everything we could think of, with no luck finding a real solution.
In the end, and it was a work around, what we did was to add a separate agent stage to the pipeline stage to do the release generation and wiki upload and got this to be run by a hosted agent. Would this work for you?
But this is a workaround but not a solution.
This task uses Simple-Git to do the upload, the task just wrappers this. The only way I can think of to move this forward is to do some local testing of Simple-Git a failing agent. Unfortunately, I don't have access to such an agent.

Oh, sorry forgot to say there is one thing extra to try switch on the inject header option. This can help if proxies are in the way.

Look like there is a work around the Git, at least if content should be published to AzureDevops Wiki
I can push new page to Wiki using PS and DevOps API https://docs.microsoft.com/en-us/rest/api/azure/devops/wiki/pages/create%20or%20update?view=azure-devops-rest-5.1 but that is exactly what I wanted to avoid by using WIKIUpdater task.
I will keep on trying to find solution for the original problem

I have tried Inject Header option but it failed with the same error message

I think I have found the cause of the problem
Environment PATH variable had C:\Program Files\Git\cmd\ entry but C:\Program Files\Git\ was missing.
After Adding 'C:\Program Files\Git' to the path and restarting agent service deployment was successful.
I am not 100% sure yet. Let me check it on another environment as well before closing this issue

I was wrong.
The correct solution is to add C:\agent\externals\git\cmd to the Environment Path on agent machine.
It seems that simple-git is sending git commands to console and console cannot resolve path to git.exe because it is not in the environment path.

Thanks for the excellent analysis. I will add it to the wiki notes in a troubleshooting section

New troubleshooting notes in WIKI with 1.12.3

I was wrong.
The correct solution is to add C:\agent\externals\git\cmd to the Environment Path on agent machine. Previous solution will work only if Git is installed separately.
It seems that simple-git is sending git commands to console and console cannot resolve path to git.exe because it is not in the environment path.

We have the exact same problem here. Git is missing in the enviroment path variable. Can someone tell me, how I can add the Git-Path to the agent path variable?

I assume you are using the hosted agents, as if it is private agent you can just update the path in the standard manner via the control panel for all users.
If it is hosted agent, then you need to make the change at runtime. The path is only an environmental variable, so you could try the process outlined here

No, we are using private agents. I assume we are talking about the System capabilities of the agent, right?
When I navigate to our Agent pools and then check agents capabilities, the Path variable doesn't contain a path to the git directory. And I can't update any variable in this control panel, since everything is locked. Am I trying to fix it in the wrong place?

You can use the Windows UI to edit the path for all users

Right click 'My Computer' and select 'Properties'.
Click 'Advanced System Settings' link.
Click 'Advanced' tab.
Click 'Environment Variables...' button.

You can set the path here for all users on that machine

So I was completely wrong :D Works like a charm now. Thank you.

In case it helps anyone, I had this in a pipeline when using an Ubuntu VM, and the easiest fix was to switch to windows-latest, because that latter has the path to GIT already set up.

Maybe I'm not commenting in the right issue, but I'm also facing the same problem, but under an Ubuntu Hosted Agent. Any plan to make this task work on Linux? I know using the image windows-latest is the workaround, but we're trying to exclusively use linux machines inside our build agents to reduce the overall execution time.

@ddprince-yaksa  you have a new issue it is best to start a new discussion or issue with details of your problem.
This thread was about the WIKI Updater, this already support Windows, Linux and Max agents - but this that the task you are using?

@rfennell yes this is the task we're using. I'm having the issue described here under an Ubuntu agent. I can open a new issue if you want!

So your problem is that the task cannot fine the instance of the Git command line tool?
I assume this is on an on premise Ubuntu agent, as I have tested this task with the Microsoft hosted Ubuntu agents. If that is the case, the fix is the same a Windows, make sure Git is installed on the agent and it is in the path
If that does not sort it, might be best to log a new issues with a details debug log (run with the variable system.debug=true set)

@rfennell this is not an on premise agent, we're using the Microsoft Hosted Agent. I'm currently getting the details and I can get back to you. Which information from the debug output would you like to see?

The whole debug output for the task, the following is what I expect to see for a Ubuntu agent
##[debug]updateOrderFile=true
##[debug]orderFilePath=undefined
##[debug]injecttoc=False
Variable: Repo [dev.azure.com/richardfennell/Git%20project/_git/Git-project.wiki]
Variable: Filename [TestPageWithCreds-10703.md]
Variable: Contents [Header
---
**Build Number**: 10703`n**Build Trigger PR Number**: `n`n# Global list of WI (0)`n`n# Global list of CS (1)`n### Associated commits  (only shown if CS) `n* ** ID6b7059ed94faa2e0105fe4ad9b4784bbb7ff472d**`n  -  **Message:** Documentation update (#1472)`n  -  **Commited by:** rfennell`n
---
Footer]
Variable: Commit Message [Update from Release - $(Release.ReleaseName) with Creds]
Variable: Git Username [builduser]
Variable: Git Email [build@demo]
Variable: Use Agent Token [false]
Variable: Replace File [true]
Variable: Append to File [true]
Variable: Username [richardfennell]
Variable: Password [*****]
Variable: LocalPath [D:\a\1\s\azurerepowithcreds]
Variable: Data Is File [false]
Variable: SourceFile [undefined]
Variable: Tag Repo [false]
Variable: Tag [undefined]
Variable: Branch [undefined]
Variable: InjectExtraHeader [false]
Variable: SslBackend [undefined]
Variable: Retries [5]
Variable: trimLeadingSpecialChar [false]
Variable: fixLineFeeds [true]
Variable: fixSpaces [false]
Variable: insertLinefeed [false]
Variable: updateOrderFile [true]
Variable: prependEntryToOrderFile [false]
Variable: orderFilePath [undefined]
Variable: injecttoc [false]
The provided repo URL is dev.azure.com/richardfennell/Git%20project/_git/Git-project.wiki
The protocol is https
The provided repo URL is dev.azure.com/richardfennell/Git%20project/_git/Git-project.wiki
Trimmed the URL to dev.azure.com/richardfennell/Git%20project/_git/Git-project.wiki
URL used<EMAIL_ADDRESS>Cleaned D:\a\1\s\azurerepowithcreds
Cloned dev.azure.com/richardfennell/Git%20project/_git/Git-project.wiki to D:\a\1\s\azurerepowithcreds
Set GIT values in D:\a\1\s\azurerepowithcreds
No sub-directory passed change to D:\a\1\s\azurerepowithcreds
Pull in case of post clone updates from other users
Working file name is TestPageWithCreds-10703.md
Created the 'TestPageWithCreds-10703.md' in 'D:\a\1\s\azurerepowithcreds' - fixing line-endings
Added TestPageWithCreds-10703.md to repo D:\a\1\s\azurerepowithcreds
Using the file - D:\a\1\s\azurerepowithcreds/.order
Attempting to updating the existing .order file
Appending entry to the .order file
Added .order file to repo D:\a\1\s\azurerepowithcreds
##[debug]Committing the changes with the message: Update from Release - $(Release.ReleaseName) with Creds
Committed file "D:\a\1\s\azurerepowithcreds" with message "Update from Release - $(Release.ReleaseName) with Creds" as SHA ead54bbd8764e79031ef6dedc645bbfcfde25d9e
Attempt 1 - Push to dev.azure.com/richardfennell/Git%20project/_git/Git-project.wiki
Push completed
Finishing: Git based WIKI Updater - Azure DevOps with Creds update .order file

@rfennell please see attached.
93.txt

@ddprince-yaksa this is getting too complex to handle in a side chat - now being tracked in #1473


Strange error

I encountered the following error after a successful LST-AI installation.
Can anyone help me resolve this issue?
Installing collected packages: LST-AI
Running setup.py develop for LST-AI
Successfully installed LST-AI-1.0.0
(py38) xubuntu@xubuntu-VirtualBox:~/LST-AI$ cd ..
(py38) xubuntu@xubuntu-VirtualBox:~$ lst -h
Illegal instruction (core dumped)
Thank you,
-SC

Hi @sj-choi
Can you please share the entire output from the installation?
Can you please provide more information regarding your platform?

Yes, I successfully installed LST-AI on one of my VirtualBox VMs, Xubuntu 18.04 LTS, on a Windows 11 host. I processed a few examples successfully and the results were great. Then, I decided to install LST-AI on another VirtualBox VM on a Windows 10 host. This time the installation appeared to be successful. However, when I tried to check if it worked well using the command 'lst -h' it issued the error message "Illegal instruction (core dumped)." This is an infrequent error message. Both Windows 11 and Windows 10 hosts are equipped with an identical Intel CPU. They are not very old and were purchased at a similar time.
In summary, both Windows hosts were purchased at a similar time and are equipped with identical Intel CPUs (Intel(R) Xeon(R) W-2123 CPU @ 3.60GHz   3.60 GHz). One installation on Xubuntu VM on Windows 11 works and another installation on identical Xubuntu VM on Windows 10 host does not work.
Is there any known installation trouble on VirtualBox VMs?
FYI, I share the whole installation output below:
(py38) xubuntu@xubuntu-VirtualBox:~$ git clone https://github.com/CompImg/LST-AI/
Cloning into 'LST-AI'...
remote: Enumerating objects: 380, done.
remote: Counting objects: 100% (33/33), done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 380 (delta 14), reused 12 (delta 11), pack-reused 347
Receiving objects: 100% (380/380), 32.76 MiB | 16.26 MiB/s, done.
Resolving deltas: 100% (183/183), done.
(py38) xubuntu@xubuntu-VirtualBox:~$ cd LST-AI
(py38) xubuntu@xubuntu-VirtualBox:~/LST-AI$ pip install -e .
Obtaining file:///home/xubuntu/LST-AI
Preparing metadata (setup.py) ... done
Requirement already satisfied: numpy<1.24.4 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from LST-AI==1.0.0) (1.24.3)
Requirement already satisfied: pillow in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from LST-AI==1.0.0) (10.2.0)
Requirement already satisfied: scipy>=1.9.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from LST-AI==1.0.0) (1.10.1)
Requirement already satisfied: scikit-image>=0.21.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from LST-AI==1.0.0) (0.21.0)
Requirement already satisfied: tensorflow>=2.13 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from LST-AI==1.0.0) (2.13.1)
Requirement already satisfied: nibabel in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from LST-AI==1.0.0) (5.2.0)
Requirement already satisfied: requests in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from LST-AI==1.0.0) (2.26.0)
Requirement already satisfied: networkx>=2.8 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from scikit-image>=0.21.0->LST-AI==1.0.0) (3.1)
Requirement already satisfied: imageio>=2.27 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from scikit-image>=0.21.0->LST-AI==1.0.0) (2.34.0)
Requirement already satisfied: tifffile>=2022.8.12 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from scikit-image>=0.21.0->LST-AI==1.0.0) (2023.7.10)
Requirement already satisfied: PyWavelets>=1.1.1 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from scikit-image>=0.21.0->LST-AI==1.0.0) (1.4.1)
Requirement already satisfied: packaging>=21 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from scikit-image>=0.21.0->LST-AI==1.0.0) (21.0)
Requirement already satisfied: lazy_loader>=0.2 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from scikit-image>=0.21.0->LST-AI==1.0.0) (0.3)
Requirement already satisfied: absl-py>=1.0.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (2.1.0)
Requirement already satisfied: astunparse>=1.6.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (1.6.3)
Requirement already satisfied: flatbuffers>=23.1.21 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (23.5.26)
Requirement already satisfied: gast<=0.4.0,>=0.2.1 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (0.4.0)
Requirement already satisfied: google-pasta>=0.1.1 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (0.2.0)
Requirement already satisfied: grpcio<2.0,>=1.24.3 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (1.62.0)
Requirement already satisfied: h5py>=2.9.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (3.1.0)
Requirement already satisfied: keras<2.14,>=2.13.1 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (2.13.1)
Requirement already satisfied: libclang>=13.0.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (16.0.6)
Requirement already satisfied: opt-einsum>=2.3.2 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (3.3.0)
Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.20.3 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (4.25.3)
Requirement already satisfied: setuptools in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (50.3.1.post20201107)
Requirement already satisfied: six>=1.12.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (1.15.0)
Requirement already satisfied: tensorboard<2.14,>=2.13 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (2.13.0)
Requirement already satisfied: tensorflow-estimator<2.14,>=2.13.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (2.13.0)
Requirement already satisfied: termcolor>=1.1.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (1.1.0)
Requirement already satisfied: typing-extensions<4.6.0,>=3.6.6 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (4.5.0)
Requirement already satisfied: wrapt>=1.11.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (1.12.1)
Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorflow>=2.13->LST-AI==1.0.0) (0.34.0)
Requirement already satisfied: importlib-resources>=1.3 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from nibabel->LST-AI==1.0.0) (6.1.2)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from requests->LST-AI==1.0.0) (1.26.6)
Requirement already satisfied: certifi>=2017.4.17 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from requests->LST-AI==1.0.0) (2021.10.8)
Requirement already satisfied: charset-normalizer~=2.0.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from requests->LST-AI==1.0.0) (2.0.3)
Requirement already satisfied: idna<4,>=2.5 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from requests->LST-AI==1.0.0) (3.2)
Requirement already satisfied: wheel<1.0,>=0.23.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from astunparse>=1.6.0->tensorflow>=2.13->LST-AI==1.0.0) (0.35.1)
Requirement already satisfied: zipp>=3.1.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from importlib-resources>=1.3->nibabel->LST-AI==1.0.0) (3.6.0)
Requirement already satisfied: pyparsing>=2.0.2 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from packaging>=21->scikit-image>=0.21.0->LST-AI==1.0.0) (3.0.4)
Requirement already satisfied: google-auth<3,>=1.6.3 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorboard<2.14,>=2.13->tensorflow>=2.13->LST-AI==1.0.0) (2.28.1)
Requirement already satisfied: google-auth-oauthlib<1.1,>=0.5 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorboard<2.14,>=2.13->tensorflow>=2.13->LST-AI==1.0.0) (1.0.0)
Requirement already satisfied: markdown>=2.6.8 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorboard<2.14,>=2.13->tensorflow>=2.13->LST-AI==1.0.0) (3.3.4)
Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorboard<2.14,>=2.13->tensorflow>=2.13->LST-AI==1.0.0) (0.7.2)
Requirement already satisfied: werkzeug>=1.0.1 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from tensorboard<2.14,>=2.13->tensorflow>=2.13->LST-AI==1.0.0) (2.0.1)
Requirement already satisfied: cachetools<6.0,>=2.0.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow>=2.13->LST-AI==1.0.0) (4.2.2)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow>=2.13->LST-AI==1.0.0) (0.2.8)
Requirement already satisfied: rsa<5,>=3.1.4 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow>=2.13->LST-AI==1.0.0) (4.7.2)
Requirement already satisfied: requests-oauthlib>=0.7.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from google-auth-oauthlib<1.1,>=0.5->tensorboard<2.14,>=2.13->tensorflow>=2.13->LST-AI==1.0.0) (1.3.0)
Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard<2.14,>=2.13->tensorflow>=2.13->LST-AI==1.0.0) (0.4.8)
Requirement already satisfied: oauthlib>=3.0.0 in /home/xubuntu/anaconda3/envs/py38/lib/python3.8/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<1.1,>=0.5->tensorboard<2.14,>=2.13->tensorflow>=2.13->LST-AI==1.0.0) (3.1.1)
Installing collected packages: LST-AI
Running setup.py develop for LST-AI
Successfully installed LST-AI-1.0.0
(py38) xubuntu@xubuntu-VirtualBox:~/LST-AI$ cd ..
(py38) xubuntu@xubuntu-VirtualBox:~$ lst -h
Illegal instruction (core dumped)
(py38) xubuntu@xubuntu-VirtualBox:~$

I've verified the installation of "HD-BET" and "greedy" using the provided commands as directed, and they appears to be installed without issues. However, I'm encountering an "Illegal Instruction" error message when running "lst."

I was unable to determine the solution to the problem I encountered with my VirtualBox virtual machine (VM). While it functions on some VMs, it fails on others. I created additional VMs using VMware, all of which operate smoothly. I'm uncertain as to why all VMware VMs function well, while only a handful of VirtualBox VMs do. It's likely more effective to run LST-AI on native Linux machines rather than on VMs. If, like me, you need to operate LST-AI on a VM, I would advise using VMware instead of VirtualBox.

@sj-choi Sorry I was so unrsponsive the last two weeks, we had some deadline to work on. Thank you for reporting back, I am sure this is going to be helpful for other users with VM issues :)


calico spark-env change

What changes were proposed in this pull request?
For calico's needs Spark's docker must be generated with a custom spark-env.sh
How was this patch tested?
tested in a DC/OS 1.8.8 cluster with calico.

@Gschiavon is also a reviewer of this PR we have to wait for his ok in order to merge this

+1


Too much decimals in transactions details

when making transactions and checking the transaction details it shows too many decimals (7 decimals).

Verified on Android 14,
Threefold-Connect: 4.0.0-184
APK:12-12-2024
Transaction amount decimals have been reformatted.

Related Link:

https://app.testlodge.com/a/26076/projects/40893/suites/206114?expand_section=407473#case_4046920


Hide pnpm instructions on web interface

Is your feature request related to a problem?
We don't use pnpm at all in my office. I worry that people may get confused by what pnpm even is, especially since it's always prioritised over yarn which we do use.
Describe the solution you'd like
Provide the ability to choose which package managers show up in the web interface. The ordering isn't important to me.
Describe alternatives you've considered
I couldn't find any reference to any existing config setting that would make this possible.

There is a similar request, the idea in Verdaccio 5 is able to configure the UI and hide features. I added to the plan https://github.com/verdaccio/verdaccio/issues/1690 since I also want to hide many things by demand.

cc: @priscilawebdev

Can we unpin this issue?? @juanpicado


Do not use doctrine namer

Hello every one in the list. Is there any way to not use a namer because I have a database in MySQL but when I validate my entities, al foreign key constraint names and index namaes are changed by doctrine.
Regards.

@lazaro3487 this is currently not supported nor on the "nice to have" list, since FK names are generally not very important. My suggestion is to generate migrations via doctrine/migrations, then customize the SQL there.


[DOCS] link color is camouflage with background in docs

Description
Link color is camouflage with background
Visit: https://linkfree.io/docs/environments/environment-variables and scroll down to bottom
I am able to see because is selected.

If not selected:

Screenshots
No response
Additional information
No response

Same issue here .
Visit: https://linkfree.io/docs/community-resources

Oh great spot 👍 thank you both

I think we need to create custom components for the mdx markdown->html to allow for dark mode, here are the official docs to do it https://nextjs.org/docs/advanced-features/using-mdx#custom-elements

Hi @Chandraprakash-Darji, I'd like to take on this if it's possible. Thank you.

block quotes bugs #5926

If this issue is still open,please assign it to me

Hey @ajaxbo360 , @karthiknadar1204 apologies for not responding earlier, these bugs are from the PR I merged last week. I think it would be best if I close them in this considering the priority. Please feel free to take other new issues. Thank you for understanding!

Thank everyone for collaborating! I have assigned to @ChinmayMhatre as they have done all the work on this already before

Fixed https://github.com/EddieHubCommunity/LinkFree/pull/6000