IRC logs for #buildstream for Monday, 2020-06-22

*** tristan has quit IRC05:49
*** tristan has joined #buildstream06:06
*** ChanServ sets mode: +o tristan06:06
*** hasebastian has joined #buildstream06:42
tristanHmmmmmmmm06:43
tristanjuergbi, what is your take on this line: https://gitlab.com/BuildStream/buildstream/-/blob/master/src/buildstream/_variables.pyx#L302 ?06:43
tristanI think this is pretty weak, we should be able to detect a cyclic variable resolution the first time we encounter the same variable twice during resolution06:44
tristanAnd it's not impossible that we need to resolve 1000 variables to expand one variable :-S06:44
juergbitristan: the question is, would the required state tracking to detect cyclic cases have a significant performance overhead?06:45
juergbiI suppose we could store the expanded value in each variable06:46
juergbiand add a boolean flag to track expansion06:47
juergbiif it's marked as in progress, we have a cycle06:47
juergbinot sure whether that's feasible/sensible with our variable inheritance etc., though06:47
juergbiI don't think I've been involved in variable expansion code, maybe benschubert has some thoughts on this06:48
tristanYeah, I've pinged him on https://gitlab.com/BuildStream/buildstream/-/merge_requests/1951#note_36536445006:51
tristanI think regardless of this, we should probably make a policy to avoid raising Python core defined exceptions06:52
tristanThis is in fact BuildStream raising an exception which is saying "I found a cyclic dependency !", but disguising it as if it were a python core "Maximum stack depth reached !" error06:53
juergbiprobably not ideal here, yes. there may be valid situations of raising built-in exceptions, not sure06:54
tristanMaybe I should not block !1951 on this, not sure06:55
tristanjuergbi, fwiw, I've reconsidered Element.search() (I rebased that on the juncle this morning), and found that... we would really need to leverage the loader code for Element.search() instead of a blind dependency walk06:58
tristanSince project relative element paths can be changed depending on overrides and links, we cannot really expect the project author to ever have exact knowledge of what a fully resolved path would be06:59
tristanThis might actually be more performant, depending on how it's implemented07:00
tristanA bit of a can of worms though, might require some rules to follow, like "Element.search() must only be called in Plugin.configure() or Plugin.preflight() implementations"07:01
tristanIf we want to reserve the right to detach the Loader tree from elements and discard it after the load07:02
juergbithe main (only?) use case is for something like script `layout` where plugin-specific metadata is configured for dependencies, right?07:02
tristanIt can only be useful for an element's dependencies (for now)07:03
tristanI.e. yes, it's "A user provides a path, and the plugin uses that to find an element within it's scope"07:03
juergbiin which case the most important aspect is that it finds the correct element when passing exactly the same string that is used in the dependency list07:03
tristanjuergbi, I could imagine it being similarly useful in "Composite plugins" if they do materialize too07:03
tristanYes07:04
tristanWell07:04
tristanNo07:04
tristanjuergbi, There is no requirement, and I don't think there should be, that the dependency must be explicitly listed in the dependency list itself07:04
tristanI.e. it can very well be anything which one of it's explicitly listed dependencies depended on07:05
tristanNot having it work that way could be quite confusing07:05
juergbiright, there might be valid use cases for that. however, resolution/search should be identical as if the string was listed as a dependency07:05
tristanYes07:06
juergbiso, yes, making use of loader facility sounds sensible07:06
tristanIf you've taken any look at the juncle patches, I think you'll agree that the search paths through the Loader are optimal07:06
tristanI've added Loader.get_loader(... load_subprojects=True/False ...)07:07
tristanWhich now allows lightweight traversals07:07
tristanWhat I've been thinking though is, after obtaining the element, how do we know it's in the scope ?07:08
juergbistill on my todo list, planning to take a look later today07:08
juergbiah, we don't want non-dependencies in there, of course07:08
tristanyeah thats a bit tricky07:08
tristanMaybe we already have some reverse dependency caching07:09
juergbiwe could still traverse after the lookup, of course, but that's not optimal07:09
tristanI think that also, it would not be a problem to slightly break the Element.search() API at this point to remove the `scope` argument, if that simplifies things07:09
juergbithat said, I don't think it's in a performance critical path at all07:09
tristanNo ?07:10
tristanMaybe not07:10
juergbiit's normally used as part of assemble, isn't it?07:10
tristanIt only adds a bit07:10
juergbinot as part of loading07:10
tristanNot necessarily no, and I think it would make sense to restrict it to loading07:10
tristanTo keep our options open07:10
juergbiwithout `scope` my fear is that plugins then start to actually inspect non-dependency elements in the pipeline07:10
juergbiand this would cause all kinds of problems07:10
juergbiincluding cache key not being good enough because it's not affected by changes outside the dependency chain07:11
tristanIf we allow invoking loader code in assemble(), that paints us into a corner where the Loader must be present at assemble() time (which may mean things like pickling or such, depending on future refactors)07:11
tristanjuergbi, The `scope` only limits the search criteria though07:12
tristani.e. RUN/BUILD/ALL07:12
tristanIf it's got an element name/path, there can really only be one07:12
tristanThat said, we could keep it, I'm just thinking it might be more performant to not have it07:12
juergbitristan: yes, the actual scope aspect is not that important to me. however, we need to make sure the returned element is actually a dependency (of any kind) of `self`07:12
tristanif we could solve the issue of "is this a dependency" more efficiently07:13
juergbior do we guarantee this some other way even by going through the loader?07:13
juergbisure, as long as we have that check I'm happy07:13
tristanNo no... I was just saying that Element.search(path, scope) could lose the scope argument07:13
tristanOfcourse it must still return only dependencies07:13
juergbigood07:14
juergbitristan: regarding 'only as part of loading'. scriptelement currently uses it in stage()07:14
tristanYeah, we could break that07:14
tristanCurrently Element.search() does a dependency walk, which means it's safe to use for the element's lifetime07:15
tristanIf we change it to leverage the Loader code, it could be in our interest to enforce that it be used only in configure/preflight07:15
tristanRaise an error if it's called out of bounds (not a hard thing for plugins, just hold onto the instance after looking it up at load time)07:15
juergbiseems somewhat inconvenient and at that point performance is actually relevant07:15
tristanIt also seems quite inconvenient to promise that the loader structures are around after the load :-S07:16
juergbiyes...07:16
tristanI mean, we could code it that way, and refactoring would just be more expensive07:17
tristanLike, a way out of that mess would be to retain some shallow/mirror copy of element names paths post-loader-era07:17
juergbiI think for many/most use cases the ideal solution would actually be to allow plugin-specific config directly in the dependency list07:17
juergbibut we probably don't want to go there now07:17
tristanI think we need the element to interact with dependency parsing if we wanted that07:18
tristan(but yeah, it would reduce typing if we could do that, seems a bit of an obscure/unclear road to go down right now though)07:20
tristanOk so for a first iteration, I will do a Loader based search + an Element.dependencies() walk and not change API07:21
tristanScope reduces the cost of a dependencies() walk, but if we had a different cached approach, it might make sense to remove later07:22
tristanAnd allow calling Element.search() at any point, at the cost of tying the Loader to the Element lifecycles07:22
juergbitristan: or maybe a compromise, require preflight() to call search() for the loader-based lookup and then allow search() to be called again in stage/assemble but only for those strings that have been searched for already in preflight()07:24
juergbithe latter would result in a local hash table lookup instead of loader07:24
*** benschubert has joined #buildstream07:24
juergbimight be too confusing07:24
juergbimaybe it would be less confusing to use two different methods07:25
juergbithe idea of this would be that individual plugins don't have to fill a hash table on their own for this (as I imagine that would be a common pattern in plugins if we restrict to preflight)07:26
tristanHmmm, sounds not very pretty07:32
tristanwe'd have an additional API like Element.resolve_search_path(), to allow Element.search() to be called later07:33
tristaniiuc07:33
tristanMorning benschubert :)07:33
benschubertIt seems I made a habit of landing in the middle of important conversations :'D07:34
benschubertmorning!07:34
tristanIt's just fun times these days07:34
tristanI had a question for you, pinged you on https://gitlab.com/BuildStream/buildstream/-/merge_requests/1951#note_36536445007:34
benschubertyeah, will have a look07:34
tristanbenschubert, this conversation was about how Element.search() needs to leverage Loader code, because true resolved element paths cannot realistically be known by project authors, fwiw07:36
benschubertok, anything I can help with for this discussion or is it pretty much settled?07:37
tristanbenschubert, it could certainly benefit from your input if you want to look over it07:38
benschubertok, let me dig the logs07:38
tristanI've got an idea of what to do for now, you might have a different one :)07:38
tristanbenschubert, starts on this line: https://irclogs.baserock.org/buildstream/%23buildstream.2020-06-22.log.html#t2020-06-22T06:58:49 (not too long)07:39
benschubertOk, went through it.07:45
benschubertFirst question: Do we know (or remember) how much % of memory is used by the loader caches?07:45
tristanbenschubert, I would hazard a guess that it's >= 50%07:46
tristanbenschubert, given that we have LoadElements and then another pass of MetaElements, it could even be as much as 60% or 70%07:46
tristanBut that is less of a concern than the tangling of unneeded/redundant data structures in the data model07:47
tristanClarity and refactorability is severely compromised I think by having the Loader around07:47
tristanseverely might be too strong a word, I mean it can be livable07:48
tristanbut still07:48
benschubertfair point07:49
benschubertShould we actually in the loader generate the whole graph and keep the graph around? Possibly pruned to keep only what we want07:50
benschubertand provide APIs to access it07:50
benschubertit's not pretty, and the loader is already a hot spot pre-scheduling07:50
benschubertbut it would at least not keep the loader around07:50
tristanMaybe something similar to that07:51
tristanIntegrated somehow directly into the Element data model07:51
tristanadditional metadata cherry picked from the loader07:51
*** tomaz has joined #buildstream07:51
tristanCurrently we do have these references to the loader still around, dangling on Project07:52
tristanAnd we just don't bother NULL-ing them out07:52
tristan(a side effect of this was that for some reason, the pickle jobber was pickling loaders)07:52
tristanbenschubert, However we are not very good I think, for instance, I'm not convinced that in cli.py, the entire element data model gets properly GC'ed after a Stream invocation07:53
benschuberttristan: do you have an example of where that happens?07:54
tristanI recall I had the WeakValueTable thing in Plugin for some time and when it was provoked to actually work, things crashed07:54
WSalmonhi tomaz07:54
WSalmono/07:54
tomazo/07:55
tristanbenschubert, Well, we could check, apparently if we run `bst --debug` we should hit: https://gitlab.com/BuildStream/buildstream/-/blob/master/src/buildstream/plugin.py#L27707:56
tristanFor all instantiated plugins07:56
tristanbenschubert, honestly I havent looked for a very long time, maybe that is working now07:56
benschuberttristan: There are a few things at play, but the main one is that the GC for circular definitions runs periodically, so it migth not trigger before we end the program, in which case all the `__del__` are skipped since we are just exiting07:57
benschubertIf you believe we have things that should be destroyed earlier, I'm happy to have a look so we can save even more ram :)07:58
benschubertI also answered on !1951, does it make sense?07:58
tristanWell, it can make sense to manually provoke the GC at the exit of app.initialized() context manager, e.g.: https://gitlab.com/BuildStream/buildstream/-/blob/master/src/buildstream/_frontend/cli.py#L44807:58
benschubertmanually provoking it is not the best way of going through. We had tried this before and it turned out to be worse performance wise than letting it do its job07:59
benschubertWe _could_ help it by explicitely deleting a few items in a cycle we want gone though08:00
tristanAh, I don't mean for performance, just for correctness08:00
tristanbenschubert, We could have an internal BST_TEST environment check in app.initialized(), and have a test case which scans result.stderr() counting the amount of elements/sources which get destroyed08:01
benschubertWell, the objects would not be accessible by anyone unless they go through the GC, which... well if someone goes that far to get something I'd rather give them an API :'D08:01
tristanonly manually provoking the GC under test08:01
tristanBut ensuring beyond any doubt that we properly cleanup everything upon session completion08:01
benschubertthat could be nice indeed, to ensure we don't keep them around because we didn't cleanup08:01
benschubertbut do we have cases where we call app.initialized multiple times?08:01
*** samwilson has joined #buildstream08:02
benschubertIf not, I'm not sure it's worth the effort, since it's basically the end of the program at that point08:02
tristanbenschubert, Not real world ones afaict08:02
tristanonly via test cases08:02
tristanbenschubert, Right, I brought this up in conjunction with keeping the Loader around and destroying it early on, I mean; if we're going to clean up it seems to make sense to ensure it at all levels08:03
tristanNulling out the Project.loader members after load time doesnt appear to be meaningful unless we can make some guarantees that we don't ever leak things in general08:04
tristanor maybe that's just my own perception of the thing :)08:04
benschubertIdeally I'd say yes.08:05
benschubertPractically, gc has a cost, and unless the relieve memory pressure is a benefit I'd rather not mock around with it.08:05
benschubertIf you tried now calling the gc at the end of the build, it _could_ just hang your process for a few seconds, and the users would be like `wut?`08:05
tristanYes I agree, which is why I would only want to do it in CI08:06
benschubertso if we keep the assertions in tests and it's not too invasive I'm happy with it (We should definitely help the gc), but I think we need to be careful08:06
benschubertyep righ08:06
benschubert*right08:06
tristanIt's just a matter of knowing that you've actually freed something08:06
tristanSetting a member to None doesnt really mean anything to me :-S08:06
benschubertWhen do you think you will be looking at the scheduler / frontend split ?08:11
benschuberttristan: ^08:11
tristanAm I ?08:11
benschubertJust to ensure we don't conflict too much with my POC on the multiprocessing08:12
benschubertah I thought you said you wanted to look at it again?08:12
benschubertNevermind then :)08:12
tristanbenschubert, I think last I heard of that, I pasted the issue number here and asked you if you wanted to do the honors of closing it08:12
tristanIs it dead or not ?08:12
benschubertah sorry08:12
benschubertyeah it's dead at least for now08:12
benschubertcompletely misunderstood :)08:12
tristanMy impressions from our last conversation was that it was considered a failed experiment, which ended up being even less performant08:13
benschubertyes that is true08:13
tristanSo we should close it for clarity08:13
benschubertI still thought we wanted to bring in some cleanups to clearly separate the frontend and state?08:14
tristanWe do want to do that, but some of the measures taken in that code which landed in master actually made things more complex (i.e. the Scheduler grew new state change delivery codepaths instead of encapsulating this in State())08:15
benschubertah true, so you meant cleaning that up gotcha08:15
tristanI would want to purify State() further, make sure its the thing that you pass around in the frondend for notification receivals, and the thing you pass around to core components to notify of state changes08:15
tristanAnd if there is ever a scheduler/frontend process split, ensure that that stays encapsulated inside _state.py08:16
benschubertseems sensible08:16
tristanby way of Queues and such08:16
benschubertI'll close the MR then08:16
* tristan goes to grab a bite...08:17
*** tristan has quit IRC08:20
*** santi has joined #buildstream08:21
*** cphang has joined #buildstream08:22
coldtomhi! anyone seen anything like https://gitlab.com/libreml/libreml/-/jobs/604142338 before?08:23
* juergbi hasn't08:32
WSalmontristan how do i get a web link to things sent to the new mailing list08:33
*** tristan has joined #buildstream09:12
*** ChanServ sets mode: +o tristan09:12
douglaswinshipcoldtom: no, never seen it :(09:18
*** hasebastian has quit IRC09:24
*** Frazer has joined #buildstream09:41
tristanbenschubert, I replied to the RecursionError thing, I'm wondering a couple of things... (A) Should I block !1951 on fixing this together ? I worry that when we leave these things aside they have a tendency of being forgotten... and (B) Do you think it will be okay to do the cyclic variable detection with a hashtable/dict like we used to ?09:42
tristanRegarding (B), I have a suspicion that you would not have left it like that if it did not represent a performance issue, I can't fathom why it would be like that otherwise09:43
benschuberttristan: A) we should not get it in if we only rely on the RecursionError, otherwise we'll get nice segfaults09:43
benschubertRegarding B) I think we should try again, a lot of this code has changed now and it might be worth a new benchmark09:44
benschubertbecause it is indeed simpler09:44
tristanOk, is the benchmarking thing that you do available for anyone to do ?09:44
tristanis it finally the 'benchmarks' repo in the BuildStream group on gitlab which "just works" and get's everything right and gives us a nice report ?09:45
benschubertI don't have any benchmarking for variables :/09:45
benschubertIt is, but doesn't contain any variables09:46
benschubertit'I think valentind had a nice test which should be linked somewhere, give me a sec09:46
* tristan watches !1951 scope creep...09:46
tristanThis fixes a real problem which we need to backport to 1.x pronto also :-S09:46
benschuberthttps://gitlab.com/BuildStream/buildstream/-/merge_requests/1949#note_35292209709:47
tristanAh nice09:47
tristanOk, I'll give this a little go then09:47
benschubertthanks. let me know if I cna help09:47
Frazerhi, has there been any work on https://gitlab.com/BuildStream/buildstream/-/issues/408 ? planning on starting work on it and just checking if there's anything I should know first or any tips to get started09:51
Frazer?09:51
tristanFrazer, I don't know of any, I would suggest whatever you do, start by formulating a plan of what precisely you intend to do and post it to the mailing list09:57
tristanI.e. follow the proposal process, it's unclear to me what can/should be done09:57
*** tristan changes topic to "BuildStream 1.4.3 is out ! | https://gitlab.com/BuildStream/buildstream | Docs: https://docs.buildstream.build/ | IRC logs: https://irclogs.baserock.org/buildstream | Mailing List: https://lists.apache.org/list.html?dev@buildstream.apache.org | Roadmap: https://wiki.gnome.org/Projects/BuildStream/Roadmaps"09:57
*** tristan changes topic to "BuildStream 1.4.3 is out ! | https://gitlab.com/BuildStream/buildstream | Docs: https://docs.buildstream.build/ | IRC logs: https://irclogs.baserock.org/buildstream | Mailing List: https://lists.apache.org/list.html?dev@buildstream.apache.org"09:58
* tristan nukes the 'roadmaps' from the subject line, that's been stale for years09:58
Frazerthanks tristan, will investigate a solution10:02
tristanbenschubert, So maybe we need to keep raising RecursionError but never catch it ? At least until such a time that the code gets refactored to do variable resolution iteratively instead of recursively ?10:09
tristanMake sense ? Add cyclic dependency of variable checks separately, but keep the counter in place and raise an unhandled RecursionError with a corresponding comment ?10:10
* tristan wonders if he can easily make this iterative10:11
tristanCreate a list, scan the dictionary in a loop, searching for referenced variables and building a list ?10:13
tristanThen the list is already ordered correctly, and resolve it ?10:13
valentindtristan, we cannot resolve all variables.10:14
valentindThat was the point of the merge request.10:14
tristanvalentind, I mean in the context of one variable resolution10:14
valentindSure then.10:14
tristanvalentind, it appears that we need to care about reaching the upper limits of the stack, ergo the RecursionError, I'm trying to differentiate this RecursionError from a cyclic dependency error10:15
tristanIt appears that we just assume that a RecursionError means there was a cyclic dependency10:15
tristanSo, maybe just eliminate the recursion altogether is a good first step10:16
benschuberttristan: would make sense yes10:16
tristanstrange, we also have _check_for_cycles() here10:17
tristanSo at least in the context of _variables.pyx, we don't have anything causing a subproject to be loaded10:17
tristancycle_check is also recursive itself10:18
tristansigh, ok... lets do this10:18
tristanDo we want to remove _check_for_cycles() and _check_for_missing() altogether ?10:19
tristanIt seems to me that we assert the validity of unused variables this way10:19
valentindYes, it is for the unused one.10:19
valentindIf we had the evaluation to better support evaluation, then for full check we could just evaluate everything.10:20
tristanSo how about this... (A) Make Variables.subst() handle missing variables and cyclic dependencies... (B) Resolve them on the fly, keeping a cache of resolved variables... (C) Resolve every unresolved variable (at some point)10:22
tristanvalentind, right I think I'm saying the same thing10:23
tristanhowever10:23
tristanvalentind, Right now I'm based on your 'partial-variables' branch10:23
tristanvalentind, does it make sense that Variables.__init__() still does _check_for_missing() and _check_for_cycles() unconditionally ?10:24
tristanShould there not be an explicit API to call from outside of Variables() at some point when the core knows that everything is fully loaded ?10:24
tristanAhhhh10:24
tristanvalentind, Scratch that10:24
tristanFor some reason I had my branch based on your branch, but my buffer still had a copy of master _variables.pyx10:25
tristanSo you have check() for that10:25
tristanWhich remains undocumented !10:25
tristanAnd strangely sitting amongst the __special_python__(functions, such, as, __init__)10:26
tristaninteresting, python has intern strings too, natively ?10:27
benschubertyep, though I'm not sure how much we gain by that10:29
benschubertnor even if we gain10:29
benschubertbut lacking good benchmarks for that... :'D10:29
tristanOddly, we're using the interns for the values, not the keys :-/10:29
* tristan struggles to find the best pun about hiring these interns, and gives up10:31
valentindtristan, the problem is that most of variables are shared for all elements. Using sys.intern can help with using less memory.10:38
valentindAt least that was my understanding why sys.intern was used for the values.10:38
benschubertvalentind: correct, it also allows comparing them with a pointer comparison instead, which is much faster than __eq__. At least in theory10:59
tomazwhen I compile different versions of a software do I keep the cache or buildstream nukes everything?11:06
tristanbenschubert, right, we use intern strings in glib for address comparisons too... and the docs for sys.intern() in python mention that dictionaries are more performant when using them as dictionary keys (which makes sense)11:59
* tristan got caught up with a few other topics, guess I will get to this tomorrow finally :-S11:59
tristanAnyway... I'll step out for now, have a later meeting lined up12:00
coldtomtomaz: cache keys are based on the element definitions, so if you change the version of an element, it's no longer cached at all.12:01
coldtomif you're building in strict mode (the default), then you will have to build all of a changed element's reverse dependencies again too, in non-strict you will only have to rebuild the element itself12:01
tristanbenschubert, if you could also take a look at !1901 (juergbi will also take a look), that would be helpful, lets land this huge branch :)12:01
*** phildawson has joined #buildstream12:01
tristantomaz,https://docs.buildstream.build/master/using_config.html#local-cache-expiry12:02
tristanI hope those docs are still relevant, I would guess that they are, though12:03
tristantomaz, this is also supported in bst-1 if that's what you're using, expiry itself is more expensive in bst-1, though12:03
benschuberttristan: added to my todos for today12:06
tristanThanks !12:07
*** tristan has quit IRC12:17
*** lantw44 has joined #buildstream12:33
*** lantw44 has quit IRC12:35
*** xjuan has joined #buildstream12:54
Frazerhi im trying to do the BuildStream example but seem to be getting this error https://pastebin.com/eur6Q73K i seem to get it when trying to build freedesktop-sdk too13:48
douglaswinshipCan anyone shed any light on https://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/jobs/603658395#L1974 ?13:58
douglaswinshipI'm getting the error "linux32: failed to set personality to linux32: Invalid argument"13:58
douglaswinshipThat's on our gitlab-CI runners, for freedesktop-sdk13:58
douglaswinshipI tried googling for the error, and the only result was chat logs from this channel, from February13:59
douglaswinshipjuergbi: looks like you encountered it in some situation?13:59
juergbiFrazer: can you paste your ~/.config/buildstream.conf ?14:03
juergbidouglaswinship: this sounds like the CI server (kernel or hardware) doesn't support 32-bit ARM14:04
juergbior there is a bug14:04
Frazerjuergbi thanks, i think found the issue. was a broken .conf from previous testing14:04
juergbiFrazer: it would be good to fix the error message in such cases. can you please open issue? unless that's already fixed in master14:05
Frazerwill have a look14:06
juergbidouglaswinship: mayit could also be that you don't even want to run 32-bit ARM code and `build-arch` isn't set correctly in the sandbox config14:07
*** tristan has joined #buildstream14:17
*** ChanServ sets mode: +o tristan14:17
*** xjuan has quit IRC14:22
*** tpollard has joined #buildstream14:25
douglaswinshipSo I had an interesting overlap-whitelist issue.16:19
douglaswinshiphttps://gitlab.com/freedesktop-sdk/freedesktop-sdk/-/blob/master/elements/vm/config/resolved.bst#L2016:19
douglaswinshipThat line "- etc/systemd/resolved.conf", presumably works fine for the master branch of freedesktop-sdk (or it would have been fixed by now)16:20
douglaswinshipBut it didn't work for me on the bst 2 branch i'm trying.16:20
douglaswinshipI had to put a slash at the beginning.16:20
douglaswinshipI got an "overlap" complaint, and the build failed.16:20
douglaswinshipWhen I changed it to "- /etc/systemd/resolved.conf", it built okay.16:20
douglaswinship(at least locally).16:20
tpollardMaybe it enforces absolute paths now?16:21
douglaswinshipThat's just what I was thinking.16:21
douglaswinshipAlthough it didn't complain about the path being in the wrong format, or anything.16:22
douglaswinshipI was wondering if it was somehow treating it as a relative path, starting from some place that isn't root. So it was a valid statement but not the correct valid statement.16:22
douglaswinshipWas just wondering if anyone's familiar.16:23
*** tpollard has quit IRC16:26
tristandouglaswinship, that rings a bell16:37
tristandouglaswinship, 1ae1796854055f4b9e3202d9629e059b327f3a8d16:38
tristanhttps://gitlab.com/BuildStream/buildstream/-/issues/72116:38
douglaswinshipAha! thanks.16:39
douglaswinshipGood to know.16:39
tristanthat apparently was fixed a very long time ago though16:39
tristanmaybe only in master but not in 1.x16:39
tristanAh yes indeed16:40
tristandouglaswinship, note https://gitlab.com/BuildStream/buildstream/-/commit/3ae078ce0547842b26785638671a94bbd4854e5916:40
tristanthis backport to 1.x specifically continues to support lack of leading slash, for back compat in 1.x but not in master16:41
tristanmakes sense16:41
*** samwilson has quit IRC17:20
*** santi has quit IRC17:28
*** santi has joined #buildstream17:28
*** santi has quit IRC18:35
*** santi has joined #buildstream18:47
*** santi has quit IRC19:09
*** tomaz has quit IRC19:47
*** toscalix has joined #buildstream20:09
*** toscalix has quit IRC23:07

Generated by irclog2html.py 2.15.3 by Marius Gedminas - find it at mg.pov.lt!