 Okay, welcome. This is Google summer of code 2022. It's the get cash maintenance project and it's the 14th of June. So who should cash I had notes on updating the project page details and as far as I can tell that is done and merged. Yeah. And did you were your questions regarding UI UI answered or is there more to be discussed there. No, actually, you know, check the, you know, pull request which I've done, you know, can you download it and run it on your computer. I thought I was working on a different topic on the get plugin today so I have not but I certainly will. You want me to do that right now. Yeah, you know so that we can go through what exactly I have done and how we can proceed forward. Super hang on while I do that. I need to stash something. Okay, get lucky and. All right, so let me show you my screen. All right, here we go. So, first, pull in all the copies. GHPR list. GHPR check out 1277. Okay, and then you'd like to see it running. Yeah. HPI colon run. Okay. Oops. Maven. Oh, fine. I have to bring up a different window. Just a minute for cash. There we go. Maven cleaning minus D Jenkins that version equals 36. HPI colon run. Okay, here we go. And I didn't even bother to ask you what, what is the minimum Jenkins version that is currently configured in the palm. I, okay, I, I, what, what was using something reasonably modern. Yeah, yeah, yeah. Okay, so I didn't need to set it to 2.346, but it shouldn't do us any harm. Compiling now. Okay, maybe not quite downloading another half of the internet and then compiling. Let's make the terminal window bigger so that we can see it. Your internet is pretty fast. Mine takes a lot of time to download. Yeah, well, and it's, sorry, that's that's one. Yeah, we're, we're, we're in a competition right now. In the area where I live. To see if the company that provides my internet currently can keep up with the local government that is bringing fiber to our homes and so yes, it should be fast because they're in a race and if they lose the race they lose money so All right, so this is ready and now if we go to local post 8080 slash Jenkins. I remember correctly that will now give us a Jenkins that's running. Come on. There we go. Okay, so if we do manage Jenkins and just for fun, let's look at the installed version of the get plug in. And it should tell us some snapshot version. Yes. Okay. Good. So what would you like me to Can you scroll? Can you scroll up? There's the get maintenance. Oh, very nice. Okay. And, and this is the basic UI. So if you check that, if you enter the Crohn syntax in the incorrect Crohn syntax, there's form validation as well like a basic. And then like that. Oh, good. So it does the thing that Jenkins does and says, are you sure you mean that. And if you render incorrect Crohn syntax as well or you know it doesn't go no. Good. Okay. So if I do. So I can I'm also allowed to enter a value. Now do the field shrink based on screen with they do. So even if we go very narrow nice. Okay, very good. Let's see. So, 99 99. Oh, very good. So it won't even take 60 because that's not valid. And it won't take negative one, I bet. Nice. Very good. Okay, now I don't see any online help question mark here so. Yeah, that is one of the tasks which it doesn't work. I tried adding that but that isn't working. I don't know why. Yeah, so that is one problem I was facing. I was thinking of the check checkbox kind of a thing you know where I if I take this only then the maintenance task will run instead of like if we don't have this checkbox with then users won't have control. So I was thinking of adding a checkbox like this. Submit the, you know, save. Yeah, save it and then it'll get printed in the terminal there. Okay, so here's where it says all right here are the settings that were passed. Yeah, here I'm not able to you know but whichever cross syntax is incorrect I'm not able to you know stop it from submitting the form that's something I was facing an issue in. Well, but I think that's that's also common for other Jenkins forms is is the the the hints are only hints they're not barriers. So, so if we say 59 59 59 59. And that will say no, the. Let's see minutes hours so this one must be 23. No line position seven okay so. Minutes, or no, let's say minutes hours. Let's say it's the same syntax so 59 minutes, 23 hours. Or no is it seconds. No, no, it's minute it starts from minutes. Okay, so minutes. 23 hours 59 minutes and any. Okay yeah. Okay so this says. Okay, if you'd like to see and that is the correct recommendation. All right now when I do. But if I put an invalid. And now do a save it will save you but I didn't execute, you press the execute button. Oh, even better. Okay, so save. Here we go. And here it says, whoops. Oh, it says saving. I didn't have data in there okay 23 59. 59 isn't all right right right let's be sure that's there. That's better. Now save. And then this was safe. Yeah. But if you enter an incorrect one also it gets submitted so. And there it is. Yeah. Invalid, which means when you're reading from the, when you're reading stored values from the disk you have to be willing to you can't crash when you see something invalid. Good. Okay. Now, right now you're it's not yet persisting to storage. Let's just send I had a doubt I asked it in the Gitter channel, whether should I use global configuration to store the data in XML files. But I didn't get a response so I didn't continue with that. Okay yeah and I think, at least I think this should be global. I think really get maintenance tasks you've put it the right place right here is a very reasonable place to do it. We may want to get you a different icon but that's that's a great icon for now and and then. And now what happens if I give no value. Does it have it still like I told you I didn't do any odd. I was thinking of having a default, but then it was like you know we'll have will test it on your computer or something like that so then I didn't work on that as well. And then that's, that's quite fine. Yeah. Good. Okay. So, should I be using the global configuration class, which I sent in the Gitter channel, you know to store the data internally. I would think so. I've, I've, let's, let's take a look at the other code in the plugin and see how it does it. But I thought it was already using the global configuration class and so that would mean make a reasonable thing to do. Okay so get plug in silly program okay fine. Let's I'm so used to running on Linux, I'm going to have to go switch to Linux for now just a minute. Okay, so now I wanted to see how it stores its configuration already. So, here we go something that uses a global config value. Yeah, here we are global dot jelly. And it's using a field called global config name. So let's find global config name. Again, get SCM, and what it's got is a descriptor implementation. That's inside and it's using that so I don't think it's using a oh no there it is okay. Sorry, let's try this again. The descriptor is where. Okay, so get global config name and get global config email. Okay, so it's just using a descriptor. So I don't see any mention of anything global here, but now this is I guess this is the problem that I've never. I don't have experience taking the approach you've taken but I prefer your approach I think it's exactly the right thing to do. So you've got the benefit that what you're doing is you've created a separate panel in here in the system configuration so it's very clear to people what they're editing and they don't have to have the horrible this experience is very fast. They can see it immediately whereas if they click this one, they wait and they wait and they wait and they keep waiting and they're still waiting. And then finally somewhere deep in the heart of this thing is a get configuration page. And so I like your technique much better. Whatever technique let's see we've I what which things do I know that do this kind of thing implied labels is doing doing exactly the sort of thing you're doing it has a panel here for the implied label and then has a editing. So let's go do a quick look at the implied labels plug in and see how it does it. My inspiration was from code as configuration, you know the same. They have used the global configuration so even I thought. And I think that sounds great to me because if it's if that's working for you, I am, I am fully fully up with that that's not yes I think that's wonderful. I'd still want to take a look at global configuration just are implied implied labels. Just to see how it does it. Nope. Okay, so it doesn't have. It doesn't have anything named global in it. Interesting. So how is it doing it so implied labels plug in as a thing called. A config and a configure dot jelly. So I think this and this are how they implement theirs. And the config class is a management link. Yeah. So is that what you're using management. Okay, good. Then, then you're doing it the way the way the way that I think is best to do it so that we have a just like you did on the UI. We have a separate page where did it go. Nice separate page here for get maintenance and very fast user interface dedicated to exactly this thing. But this is looking looking really great, great for Shikesh. Thank you. Oh, yeah, that was about it. So I think I'll proceed with global configuration, you know to store the data internally in Jenkins. The other thing I wanted to discuss was about this UI, I was thinking of you know, based on the get wash, like get version present on the system. You know those maintenance, like those fields only would be displaced or assume if I get 2.20 and only commit graph and incremental repack is supported only those two fields would be displayed and the other three wouldn't be displayed on the UI. It's very sophisticated. I like that because you can check the thing, the place we're doing the maintenance tasks is on the controller only so it doesn't matter what get version is on the agent. That's a good observation. You know the controller has this version and if it's running some ancient version that can't do maintenance tasks. You don't show that one. So yeah, now we should always be able to do garbage collection right. Yeah, yeah. Okay, and I think we can always do prefetch because the way it seemed to be described to me was that's something we could implement even without help from command line get. But the others commit graph definitely right that is one that you have to have a certain certain a more modern get version. Okay. So that was what I was thinking so I wanted your opinion like should we should I go ahead with that or not. I think so I think that's a good choice. Okay. Yeah, I think then I think I'll proceed with that. Yeah, another doubt I had was you know if you go to the pull request on GitHub, there are there are a few tests which are failing and I don't know why it's failing. It's based on some Java 17 or Java 18 version which is but let's check and see that may give us some interesting, interesting questions to ask, because the tests are definitely passing on on on the primary branch on the master branch. Oh, oh, right. No failed to serialize. Okay, so this would seem to indicate that you had changed a definition of something such that it can't be serialized at all. Let's take a look really briefly. So here we've got this one. I just changed the you know Jenkins version in the palm file. So, I don't know if that cause an issue. It shouldn't oh well okay I guess they're there are a couple of things we can we can adjust here. But this I don't think will it will actually break anything so where is that Jenkins stop Java dot level. We don't need that anymore. What exactly is this job. It's a. It was a way of declaring which what is the minimum Java version that the plugin supports. Okay, but that's already inferred by the version number of this parent palm. And so putting Java dot level was was redundant doesn't help. So now let's do that diff again just to see. Okay, so here we see are you've excluded error prone annotations source code encodings fine filing. Okay. And I am not entirely sure why we need the encoding but did you find there was a reason why it was required. Oh, I did I add that I didn't add that I just added one line that the Jenkins version. I don't know what the important. Oh well okay well so then let's, let's, let's make the change. So what you're saying is, all you intended to change was Jenkins version. Yeah. Okay, let's do that then. And you wanted to add the exclusion for error. Yeah, yeah, yeah, otherwise it doesn't get in the way I'm not able to build it so. Okay, good. Yeah, very good. So now let's do let's go whoops. Yeah, we'll leave it as this for now so reduce diffs. All right, let's see if I broke something with the change I made. And are you okay if I push this to your branch so that yeah yeah that's fine. Okay. Okay, I expose wrap. Yeah, there are some, you know, with the spot bug issues which I haven't fixed. I have to fix them. And I like, I like those to be fixed, whoops, because usually they're telling us something that isn't useful for us to know this one. The warning that it's exposing internal implementation is, I think probably accurate. And so you'll need to, you'll need to do the make the change let's see. It's too late in the nighttime. Okay, so it was 932. And it says this is returning internal. Oh yes, and that's a modifiable map so I'm not sure you want that. What what prompted well so so for now we're going to have to suppress it. Because otherwise it will fail. It will fail tests, it will fail the checks, but you certainly don't want long term to suppress it. And now if you come, if you comment this or something then there'll be other functions which would you know, throw errors because it's dependent on this. Right. You're saying me do you like it should be an immutable map right. I'm sorry ask your question again. Like, basically should be an immutable map right because this map can be modifiable. Well, the question, I guess the question to you is, do you, let's, if we look at what the spot bugs warning is reporting if I remember correctly what what it says when it reports that is. I expose rep here we go so let's read what they say and my recollection is what they say is this class is exposing the internal representation to the two collars and the danger of exposing internal representation to collars is they could do harm. Now so where is that here we go. Returning a reference to a mutable object value stored in a field exposes internal representation. And so the danger here is, you're going to someone else could modify the object without using your interfaces. Now, do you need a map, do you need to return both keys and values right. Yeah, but I don't think it would like if I, I want to, I want to change the data, you know data in the map inside that. So if I would return a mutable map, I think it would, you know, our people, you know, elements outside that class can just use the data to read it, but not, you know, change it. Yeah, they have to call a method in this class. And that makes sense so that so there is a way to to monitor to declare that I am returning an immutable map, right so so if you can do that, that sounds great. I do that. All right, and so if I suppress that warning. That was. And now I need to go find the warning suppression import. Oh really, I know I've got at least one suppression in this code. There we know. There it is okay. And I'm doing something you should not do, right, much better if you would resolve the issue for right now we do it that way we can, we can keep going and answer more questions. Okay, see what the change looks like. Fix. Fix me. Don't ship with this suppress. Resolve the issue. Okay, now back to our maven command. I haven't solved the thing that we originally were trying to answer which is why does the test fail right now let's go look at that specific test and see if we still see it failing I assume we will. Okay, so the test that's failing is test is get SCM test dot that. Okay. So, and that was on the specific Java version, right. Oh, was it so is it limited to Java 17. Yeah, yeah, yeah. Okay, well so let's do this. Let's prove that I don't see the failure on Java 11 and then I'll switch to Java 17 and watch it fail. That is most interesting so. Okay, so now I'm using Java 17. Okay, and I don't see the failure. Okay, so how has it failed repeatedly in that way or was this a single time accident. No, it failed like when what I did all you know, yeah, I kept feeling for like. Interesting. All right, so what might be going on here. Okay, so it's, it's reporting a an unstable build on Java 17 and a failed build on windows running Java eight. Okay, what you know what I'm going to push my change. You're okay if I push it. Yeah, yeah. Okay, this will let it get started now. And 15 or 20 minutes from now we should be able to see the next run. 10 should already have started. Okay, good. Here it is 10 is starting. All right. So what other questions do we need to answer while we wait for that to continue. So other things like I'm kind of new to testing so the test I've done test driven development but I'm not sure how good are my tests so if you you know, like whenever you're free or something if you like your review the test which I've written so that you know, so that I can improve on whatever tests I've written, or you know change the test. I'm not sure about that. Okay, yeah, so let's, let's take a look at the tests. I just saw one pattern that I was. Okay, no, no equals method. This, this actually looks quite good to me. Oh, oh, I bet I know why those file names are not working. I bet I have a guess why the help is not working. Because it chooses things based on field name and the field names you've got are are different than the file name that you use. Okay. So let's see it is for example. Where is the as the hill for incremental underscore read back. I don't know what is that. Okay, so you're using an enum here for the type of the task. But then how will we. So, where is the jelly. This must be it. Because the user. Yeah, what is doing is you're going, you're iterating over each of the maintenance tasks types. Yeah. Interesting. Okay, so in that case, then I don't, I think you won't be able to use the built in. Association of help to fields because you're generating the fields dynamically. Okay. Interesting. Okay, so, so I think if you want the benefit of being able to just do a simply named file here. We may have to do some, we have to change this instead of using an iterator over over each of the maintenance tasks. You may have to call each one out individually. Oh, I didn't understand so. Let's let's see if we can try it here. Are you okay. Is this interesting to you or would you are there other things that you'd rather we be doing rather than this exploration of health. No, no, this is fine. This is fine with me. Okay, so let's try this. And what I'm going to do is I'm going to cheat and put something in. As a. I'm going to put junk in that will distract us. I'm going to do it. Copy of this. Up here. And instead of, so I'm going to call this. Mark weight. Fake. They were inside the form. The title. And field crown syntax. Okay, so this is the association. With where it should be writing, which is correct, right. Yeah. But then this. Instead of my, wouldn't it be it. My, my, I've read the documentation and it was written as my. Okay, good. So then we stay with my, okay, good. Now where is. So where is the name of the field. It's this thing, right is the entry. All right. So F colon entry field equals. All right. So that was the syntax. Field equals. Cron syntax. How do we do this then? Because. We look at this one. How is it providing the help? There was other way of adding the help. Thing by, you know, adding a head. You know, attribute to that tag. But that is not the best practice. Kind of a thing. So. Right. And, and, and here it is. So here's the, so you see here is push only if success for the field. And then this thing. Push only if success. Actually, let's try this. Maybe it's enough for us. Whoops. What if. We create a file named. Help dash. Cron syntax. Had you already tried that. I tried something. But it didn't come. You can try it again. Cron syntax. Help. In very large letters. And if I remember, always separate it with it. Surround it with a div. Okay. Is the dev one necessary or something? My understanding is it's required. Okay. Now, but I could be wrong. So don't, don't. I'm very often wrong. I'm going to add that. Yeah. And, and I don't think that's why it's not, not appearing. So let's. Let's try this just to see. Okay. That's why it's not, not appearing. So let's, let's try this just to see how would I do this. I need to get that change. Onto a place where I'm actually doing work. Because right now I'm looking at it on my Linux computer and that doesn't help us at all. Let's go back here. So we need a file named. Help Cron syntax. In that location. Source main resources, Jenkins. Plugins get. Maintenance. All right. Now here we have. Help commit graph. And we're going to write a new file named help dash con. Syntax. Okay. So now back to where we were. Because somewhere here. We have a Jenkins running. We want to interrupt and start again. Yes. Terminate the batch job. And up our web browser. And manage Jenkins. Get maintenance. Still no help. It was a nice thought. Okay. Needs more investigation needs more exploring. Yeah. I tried that also. I didn't get it. I thought I was doing something. Yeah. And, and. But we do see the index dot jelly, right? Because that file is working. So if I were to do something like. Since we're right here, let's just try and experiment. We're inside the form. Yeah. Go ahead. I don't see that entry, which I've done in this file. So is it the reason why it doesn't come? I, I undid the, the change. Okay. Yeah. So this file is unmodified. Actually let's make the change in a place where. We can see it live. Let's do it here. Okay. I think we should insert. A new div. Inside the form. Okay. And now we want an entry. And the thing we want is title equals. Very scary. And the field equals. Like that, right? So then we end the entry. Okay. Now if that worked when I reload that page in my web browser. There is very scary. Yeah, but no hell. Oh, because it's got no right because it doesn't have a text box. Okay. Right. I need to give it someplace to write data. All I did was title the thing. But now the problem here is. I think we can remove the name check URL and check method and, you know, Right. Well, and, and I think, isn't it that. Is, isn't this field here. No help. Because what I've got is a title, but there's nowhere to store it. The thing that does the story. Storing is in the text box that asks for the data. And so if I take this off, why? Okay. No way to say, oh, no, no, no, this field must be necessary. Because that's how that's how it knows. What should be associated with the text box and the text box doesn't have its own field value. Hmm. Okay. Well, let's see what happens. That's why we can experiment here together. Okay. So reload. This is a field. And it's doing no validation where this one is doing validation so that disabling the validation really did have the effect that you expected. Is it not because help dash. Let's try it again. Just to see. There's, there's this very scary. Yeah, help for help for feature very scary. That's not very helpful though. You add a help attribute to that. I did. Yes. Okay. But, but it's. You need to pass it. I guess, you know, as a value. Ah, okay. So you're thinking that that it's, it's not enough just to have made it entirely local. I need to say. Because what I got there was a help icon, but it doesn't have the text. Okay. So, see if I can find somebody. My search function is broken. Shame on me. Just a moment. Let's get a real get session. Okay. And I don't have it in this one. So that's not very helpful. I don't know what it's searching. It's so large, but I don't know. What would it be a dash. What I was looking for was something in a jelly file that you specifically calls out. What I don't understand is why this is so slow. It's very fast that way. I have few other questions. There we go. F entry help equals. And you're right. It really does use full path name. And here it's putting it in source main web app. That's a really strange place to put it. But let's try experiment. We'll throw it away. It's part of this game. Okay, so, and it was called index. It was called help dash. Clones index. Okay, so if we do. Let's just assume. It's source main. What do you think we could do? Could we safely assume this is it? And I think it should be plugins. Oh, right. Right. Yeah. That makes sense. Okay, let's try that. So here. The idea is do that. Right. Yeah. Oops. Thank you. Okay. If we were lucky. No, that is not what I wanted. We want this. We'll refresh this page. Error failed to load help file, not found. Okay. So I didn't get it right that time. Let's make some more guesses. I'm going to guess Jenkins. Actually, I'm going to guess that I may need to recompile. Because I'm adding a new file, aren't I? Yeah. So it may not be good enough to just reload. You know what else we could do is we could look at the package jar file. And see where it puts it. Because that's how it's looking how it's finding it is inside the file. Are the in the packaged HPI file. So here we are again. Error failed to load help file, not found. Okay, back to our earlier experiment experiment. So we've got the icon. What we lack is the online help. But I think, I think that's the right track. It just needs more experimenting to find it. Yeah. Sorry that it's taking me so long here who should cash. I can do some investigation later or you, you may be better suited to do the investigation on your own. Okay. I've tried all kinds of ways, but I haven't found anything. That's why. Oh, okay. Well, then let's not, let's not squander more of your time on help. Let's let me take it up and see if I can find a way to, to get that answer so that we've got help for it. Okay. And a few other questions. You know, like my laptop charging. Yeah. A few, another question. You know, it's very difficult for me to get to know when exactly which maintenance command has been released in the, you know, in which kit version. It's very hard for me. I've tried going through that kit, you know, repository, the official repository to try finding it. But I haven't found in which version was which, like, you know, which maintenance task has been released, you know, for the legacy kit. So you do you have like any idea about that? I've got a way I think that we could, we could discover it empirically, we could discover it by an experiment. Let's, here's, here's my idea if you're willing to just use what the infrastructure I've already got. So I've got a Jenkins controller here that has a bunch of types of various types, free BST, sentos, et cetera. And what we could do is on each of them, we could do get maintenance minus, minus help. Okay. And see what does it tell us. And then we, we, we use try that. And let's, let's see which ones offer. If you get maintenance help, you'd think it would probably list the tasks, wouldn't it? Yeah. So let me, let's try creating a job really quickly. If it's below 2.30 version, there's no maintenance itself. So even better, it will fail very, very bluntly then, right? It'll, it'll just crash and say, sorry, I don't know how to do that. So let's, let's do the following. Let's create a new job called. Get. Get maintenance. Maintenance. Help. Does that seem okay? And then what we're going to do is we're going to copy this other job, get tools that happens to do this already for me. And now instead of doing this, I'm going to borrow. Get. Get maintenance. Help. Okay, so this is where I'll do a quick change to a. Separate repository and let's talk about. How we do that. So here. All right, so I was doing get tools. And the command that I said that I wanted to name it was. Get me needs help. Okay. So in my fat fingers at 11pm. All right, so this says. Any agent. Let's say any agent. At all. It's going to iterate over each of them. Yet maintenance. Let's do that. Okay. And we don't even need to do a checkout SCM. Do we? We just say. Yet minus minus version. Yet maintenance. Maintenance. Maintenance. Minus minus help. Yeah. Right. That should be good enough. And that's the SH one. And then here we say yet minus minus version. Get maintenance. Minus minus help. We think that will work, right? Yeah. Okay, let's try it. At a report. Get maintenance. Help. Okay, now let's run the job. But we would get to know or like on a better that version supports get maintenance or not. Right. But get maintenance was released in 2.30 version. But the thing here, I wanted to know like in which version was, you know, comment graph released, you know, which version was, you know, GC released. So wouldn't we, wouldn't we see that by looking at the get maintenance help for that specific version. So let's, let's, let's test that here is. Let's find a machine that has a so get. Maintenance. Minus minus help. And what it does is it lists the tasks here. And so this version. Has one, two, three, four, five, six tasks. Yeah. So my thought was if we do get, get minus minus version and get maintenance, minus, minus help. It will tell us. If, if that. If that version first, it will fail. If get maintenance, minus, minus help. Fails because there's no get maintenance command. We know all that version doesn't have it. And because we output the version number, we then can remember, oh, this was the version. Does, does that make sense? But then how would I know, like which version? No, so basically what was the, you know, the whole point of asking this question was because now if I have to implement get maintenance for legacy systems, you know, I need to know which version it was introduced so that from that version to, you know, the latest version, like below 2.30, I can run this command that was the whole idea behind it. Okay, I'm not sure I'm understanding. So, so you what I think what you want is you want to generate a list. That says for this command line get version, it has these get maintenance commands, right? Yeah. And so what I was trying to do here was looking at the actual distributions that we've got, I've got installed. We could very quickly assemble a subset of that list at least by, by doing this to see what, how the get maintenance commands are distributed. Which get maintenance commands are available on which get versions. So you're okay if I try this just for a minute and then we'll, we'll, we can give up quickly if it doesn't work out. Yeah, sure. So build now. Okay, now it's building on several. And let's watch what its command line does get version, get maintenance, minus, minus help. Okay. So here it is. The get version is 2.30.2 And it has the following commands commit graph, prefetch, GC. So I think it did what I was hoping it would do. And then all right, here's one where it failed. Here's several where it failed. Let's pick one that failed and see what the failure tells us. And what the failure will tell us is it was running get version 2.17 and get maintenance is not a command. Yeah. Now I wanted to know, like, and this get version, like what maintenance commands would be supported? Like would a GC be supported in this or would a, you know, commit graph be supported in this? That is what is my question. So, so couldn't we take a variant of that then and say, let's, so let's do the same thing and say instead, which things do we think should be supported like. Get GC. Yeah. Yeah. And now you said. Get youth commit graph is a separate command. Yeah. Okay. So then, then we can do the same thing. And say, and now if we were really sophisticated, we would replace on the shell at least. The semicolons with ampersands and say on the first failure stop. So what we'll see is it will say. It will report the version. It will see if it can give help for GC, help for commit graph, and then it will try to give help for maintenance. Now I don't remember how to do that for, for windows. So we're stuck with windows. I'll just, I'll just have to put up with that. Stop on first failure. Okay. So. If we look in our friendly local blue ocean. And what we see is Debian. On its environment says. Here's the help for GC. Here's the help for commit graph. And let's prove it. This one is what get version. It is. 2.30. So it was predictably a good, a good one. Now, if we go to one of the failures. Adam army. I think this one's running. We're going to 18. And it's get version is. 2.17. And it has GC. But it does not have commit graph. Okay. So that's, so that would, I think that may suggest. We ought to give you access to my environment so that you could run these kind of tests yourself. If are you willing to do that? Do you mind using my equipment? You'd have to SSH into the system. But then you can create your own jobs and run them. Yeah. That's fine. I can do that. If you're willing to send me by email, a public key. Okay. So an SSH public key and usually it's. It could be RSA. It could be ED 25519. It could be. ECDSA, if you prefer those. Just email me a public key, not the private key. I don't want the private key that's secure and you keep that. But send me a public key and I'll give you an account. Oh, and what username you would like. Rishi 20 would do. Yeah. You send that in the email. I'm unfortunately not able to remember that. Sure. I'll send it by email. Great. Oh, on, on, on, finally, a few last leg, you know, not in much of the time. I know it's 11 in the, you know, I don't know. I don't know. I don't know. Go ahead. Our Saturdays and Sundays, like you work on Saturdays and some, because I, you know, I send a message and then I keep waiting the entire time, you know, because I'm stuck and then there was, like, you know, no message because I was free during that time. And then I, you know, I couldn't get any work done. So if Saturday and Sunday is like, if you're on leave, then I wouldn't put a message in the group so that, you know, don't, don't be shy about putting those messages. Last week I was unavailable on Saturday and Sunday because I had just returned from a business trip. Most times I'm online at least sometime during the day, Saturday, less likely on Sunday, but still frequently on Sunday as well. Okay. Now, and remembering that I'm 12 hours. What is it? Am I 12 hours ahead of you or 12 hours behind? I'm 12 hours behind you, right? Because you're on the other side of the, you're on the high side of the international daylight. I'm on the low side of the international daylight. So that's what I wanted to ask because, you know, I was worried like, what do I do? So I couldn't get anything done that time. So, yeah. And my apologies for that. I am sincerely sorry that these first two weeks, the most crucial, crucial and important period called community bonding. I was off on business trips and on personal vacation. So let's, let's do our best to fix that by meeting more frequently and being sure that we get, I get you the information you need. If it will help you, we could meet two times a week. We can meet. I'm even open to meeting on weekends if that helps you. Okay. If there's anything like that, I'll let you know. Great. Yeah. So this week's agenda would be to stay save all the, you know, data, which the administrator enters into the, you know, configuration files. That was what would be the agenda. And I would, I think I'll start working on, you know, scheduling maintenance tasks initially for get versions greater than 2.3 zero. Excellent. I think that sounds great. That gives us something for experiments very quickly. And, and it means you're already actively working on some of the largest and most interesting objects in the system. So the, you're actually getting real work and we're, you've got, we've got a rudimentary UI and the UI is good enough to allow us to do things that you can switch focus to the, to the logic behind it. Yeah. Great. Anything else for us to cash. That's it from my side. All right. Well, I'm going to go ahead and stop. I will try to upload this recording tomorrow. I need to go to bed now. So thanks very much. And, and it's a pleasure working with you. Same with you. Thank you. Bye-bye.