 Gord, welcome. This is the 7th of September 2022. It's get cash maintenance. Let's get started. Okay, so who should cash, which, which topics are most urgent on your mind, which are most of concern for you? I've got, I've got two, I'll offer two that I can. One is I think get client plug in is very close to ready to release, but I wanted to check that with you. And then the other was more about get plug in. And I, I've got some topics there. I want to be sure we discuss. Okay, regarding the merge of, you know, the get client plug in code, I was thinking of, like, you know, let's discuss about the prefetch command once again. So yesterday I was working on the prefetch command. And then we've discussed right about, you know, something related to the process being attached to a terminal. So I was thinking, in that case, if we directly run the get maintenance prefetch command, I think that would also fail in directly rather than calling or get LS remote is what I am thinking. Right. So we wouldn't, we wouldn't need to run LS remote is what I am feeling. Directly when we run the get maintenance or, you know, the prefetch command, I think it would fail automatically and it would skip on a skip and move on to the next cache. I like that. That's very simple. It's, it's probably no, no higher cost to attempt to get prefetch and have it fail than to try to do a get LS remote, because actually it may be more expensive to do get LS remote, because in order to do get LS remote, we have to ask questions about what is the, what is the remote origin, et cetera. So yeah, okay, I like that. Because when we tried it before, we were waiting for, you know, waiting to enter the SSH password, right? But that would have been happening only when we run the MVN HPI command. So if it would be like, you know, a Jenkins instance, which is already running without this command, I think it would fail. So, right. So when you get tries to establish a connection for prefetch for an authenticated repository, it won't, won't ask for the credentials, right, at the terminal or at the share, it won't stop the execution of the program, right? Well, okay, so, so for precision, what Ruchikesh discovered was while running in a debug or a development environment, so running Jenkins or Java minus jar Jenkins.war from a command line, or running Maven HPI call and run, in that case, if it's doing an SSH connection, it will actually stop and prompt. And, and that's unfortunate, but that's the, that's the nature of the SSH that's being used there. It's, it's command like it calls SSH, SSH looks at the terminal configuration says, ah, I could ask the user a question, I'd better do that. And, and so there is a setting that will, that can be used to switch off that capability to tell, to tell command or to tell SSH do not prompt, but that's not the default because I've been scared to make that the default, because who knows which command line get, or which get user in Jenkins has some strange dependency on exactly that behavior. That is true. That is true. So, so who should cash it sounds like you're okay with, with, I like the idea of let's just do the prefetch. And I assume we want to catch any upset exception, and turn the exception into a simple, a simple single line message that says, Hey, prefetch, prefetch, or exception and prefetch ignored. We certainly don't want to log the entire exception, because then we're going to waste an awful lot of logging with huge backtraces on exceptions. Okay. Good. That sounds good to me. So winding back one step to the get client plugin, are you okay if I mark that one as move it out of draft, and declare that it's ready for review? Oh, yesterday, I added, you know, a git ls remote, so I'll have to remove that. So once I remove that, I think it would, you know, it would be there. Yeah, then I would remove it as a from, you know, draft. Yeah. Oh, okay, great. That's fine. So you'll do that. Yeah, I'll do that. Okay, great. And you had some concerns regarding the get plugin? Oh, yes. So my concerns on the get plugin, several of them, I've pushed the changes myself without without even asking your permission, I just I just went ahead and did it. But others, I'm going to have to go learn from other people how to do it. So you had included an explicit dependency on on extreme. And what that did was that caused other transitive dependencies included. And the get plugin is somewhat special in that we like to keep its dependencies as small as possible, because other consumers treat the get plugin, the whole plugin as an API. And if I make the mistake, if we make the mistake of including some other API in it, they will start relying on it to be there. Because it's it's there in so many Jenkins installations, the extreme interface, as far as I understand it is already available from Jenkins core. So we don't have to include the extreme extreme jar file. Okay. So I deleted the extreme dependency, compiled, and confirmed that it compiles just fine. And I'm I'm actually running it, or we'll be running it shortly here. Also, so things are working as expected. Yes. Yeah. So and that and that's what I expected, because extreme is used so widely in Jenkins, that it has to exist already in probably exists in many places, it certainly exists in core. Okay. Oh, I didn't know about that. Because what I was doing was I was reading the documentation, and I didn't find any way of, you know, using extreme. So what I did was I just adding the dependency into the form file. And I think that's that was very resourceful of you well done. That was exactly and you're you're in an area where I'm particularly weak. So I'm going to go ask some experts, hey, how should, how should this be done so that we can we can get it get it to the point where something that's as widely used as the get plugin does things similarly to other parts of Jenkins. Yeah. Okay, so that was that was one. Then the other was I had seen that you had reordered some imports. And I just took the initiative and put them back. The reason I don't I don't make quite space based changes like that is because there are there is there are right now 20 pull requests pending for the get plugin. And in addition, there are probably another 30 or 40 that are not open, but we're proposed and event and closed because we couldn't review them. Every time I change white space, I risk breaking one of those other other pull requests. So all I did was and it did no, it did no change to compilation, it did no harm to anything all I did was put it back. Are you okay with that? Yeah, yeah, I'm fine. I'm fine. Like, did you change the like imports? I didn't get you exactly. Yeah, so so what had happened was in abstract get SCM source, there was a block at the top where there was a few there were a few Jenkins imports, and then a big chunk of Java imports and then another set of Jenkins imports. And you you did the logical thing you said, look, Jenkins import should be together. And so you move the Java imports down below. And I agree what you did was exactly the right thing in terms of what it would mean to maintain a code base clean and tidy. Unfortunately, the get plug-in has so much history that I intentionally leave it dirty. That's a terrible way to say it. But it is intentionally left dirty, because I don't want to I don't want to disrupt things there. Someday I dream that it will be automatically formatted by a program and will all look consistent. But I'm a long ways off from that. Okay, so yeah, I'm fine with that. Yeah. Okay. Let's see. And the other was, oh, yes, I was going to ask you. So when I was testing, I saw that there were a number of records where the the repository that was being maintained was reported of size zero. Well, if it's of size zero, can't we optimize away and just skip the maintenance? Okay, yeah, we can do something like that. I can add that to my to-do. So does that make sense to you? Yeah, it does, it does. Okay. I think there are temp folders, right, and you know, the caches directory. So I think that could be the reason. Right. At least there were many of them in my caches. I don't know if that's if that's typical for other people, but certainly in mine, there were many. And they seemed almost all of them seem to be zero size. So I don't know it's probably a bug in the get plug in or in something that they're not being deleted. But my thought was, hey, if they're if if you've computed the size and the size is zero, then there's no reason to bother iterating into that into that directory. There'll be no work to do. Yeah. Okay. And oh, I added one non null annotation. So Rishabh had asked a question in code review, can such and such ever be null? And and your answer was no, it can never be null. And so I added the spot bugs, non null annotation that says, all right, this is, we promise it will never be null. And now if someone attempts in the future to call that thing with a null pointer with a string that's null, they'll get a spot bugs error. Okay. Thanks. What was that, Rishabh? Oh, wait. So I think those were the things that now I've still got more to do. I apologize, I'm behind schedule on my reviews, but I've, I've got, well, there's a lot going on right now. You've probably decoded that. So I think that covered the topics that I had. I still haven't found the place where the, the greater than sign is being inserted into the UI. I'm sure it's there somewhere, but I haven't found it yet. I'll keep looking. I was, I was searching for it, but I also didn't find it. I don't know how is that being added into the table. Yeah. And it's got to be somewhere. I just, you know, that's why we do code review somehow or other. It's in there. I mean, it's, it's all source code. It's got to be somewhere in there. I just don't know where. Okay. Oh, oh, help. Okay. So the, the help text right now is not very verbose. Do you have time that you can add more verbose help text describing what is the commit graph and graph and what is garbage collection? I can do that from my end, but I wasn't able to add the help files into the UI. I can make. Oh, got it. That was the problem. It's that we don't yet have the question mark icon appearing in the UI at all. Okay. So that's one that needs to be worked on. Okay. But we'll have to find a way. That's one I think I may have to just do some wild guessing and get lucky. I tried doing it yesterday, but I couldn't, I, I, I, you know, let do nothing. I don't know why in the, I use, I've seen the same implementation in the Git plugin. I've tried using that, but it didn't work. Right. So, yeah. So I'll, I'll expand the, you know, help section. I'll add more definition to it, but adding it into the UI was something I was facing issues. No problem. That's, that's one to put. Let me put it on my list. I'd love to have your text inserted there, but I'm going to put an action item for me at mark weight needs to find the technique to add the help icon to the user interface. Users will expect to receive help to, to view help for the various options maintenance commands. Good. Okay. Added. All right. I think that covered all the questions I had. Rishabh, do you have other questions? So one question that I have related to the Git plugin releases since we're adding new functionality, we don't risk, we don't have unit tests, but we don't risk regression. Right. And this release, we just add a new such functionality to the Git client APIs that we have, you know, modifying any existing APIs that we offer. That's correct, but we've also got unit tests in the, so the Git client plugin has significant unit tests now and the Git plugin, I see several there. I haven't reviewed the Git plugin tests in detail, but I certainly did quite a bit of looking in depth, looking at the Git client plugin unit tests. So was that what you were asking, Rishabh, was about the Git client or about the Git plugin? Git client, Git client. Because that is what we want to release first. Right. Yes. It is the one that we'll release first. And it has, so as far as I could tell anyway, it has automated tests that exercise, I think it exercises almost every branch in the code that's been added. Now, it does not, I had to give up and this is kind of embarrassing, actually, and Rishikesh did a better job than I did. What Rishikesh coded was assertions to check that the maintenance was performed as expected. And that's a really, really good assertion. That's an excellent assertion. Unfortunately, that assertion is strongly coupled to the specific version of Git we're running. Because some versions of Git, when you say commit-graph, create a directory named commit-graphs. Other versions of Git, when you say the command commit-graph, create a file named commit-graph and no commit-graphs directory. And so the problem was I ended up actually having to step away from assert the specific behavior of the maintenance task. And instead, all it's doing now is asserting that the logged message says, yes, it reached success. So it's doing a flow control check. Not a, not a, did the desired effect actually happen? So when the code asks for a garbage collection, it does not check, did the garbage actually get collected? And so Rishikesh, I apologize for that, but I was so frustrated as I was looking at Git 22.17 on Debian 10 and Git 2.31 on Red Hat 8. And it was, I cannot possibly express all of these conditions. The test will be 10 times more complex than the code. So I gave up and just said, fine, we're going to assert that the message is done so that the flow control happened and we're going to hope that command-my-git does what it's supposed to. Makes sense. So did that answer your question, Rishabh? Yes. Yes, it did. So I guess I have one more, one more asking for permission. Rishikesh, do you mind if I run the formatter on the new code that's been added? I see that I thought I'd run the formatter and I look at it and it's, there are some places where obviously I didn't. So I'll do at least one more commit to the Git client plug-in. Is that okay with you? It'll just be a white space changes thing. That way, when we're adding this new thing, it will be formatted the way that the contributing guide says it should be. And I don't have to think about getting people submitting later pull requests proposing to reformat it. Yeah, I think I've gone with the guidelines. That's what I've done, added into my settings, but yeah, you can do that. That's not going to be sure. Yeah. So what it is is I see places where the spacing is just a little off and I know what NetBeans would do. And so I'm just going to go ahead and load it into my IDE, format that little section, save it and we're done. Okay. Good. Very good. Oh, yes. And I didn't mean to ask you actually, I assumed you're okay that I moved the tests of the Git client plug-in out of Git client test into their own dedicated file. And that was pure laziness. I needed to be able to run that thing in my IDE and I didn't want the overhead of all the other tests. That's actually very clean and efficient. I didn't think of it, I didn't think of doing it that way. So I added it into that big file, which at the end of that file. Well, and that's, you did exactly what I've done in the past very frequently. I need all the infrastructure that's on that thing. Just put it right there. And from execution, it makes sense. But for the diagnostic purposes, it was hard for me. So I just moved it. Good. All right. And I think, yes, so that, yeah, I think, and now you said that you had added some code for LS remote to the Git client. Yeah, that was just to test whether, you know, it's going to fail or not, you know. Got it. I see. Right. In prefetch, I see. And that's, okay, that's it. And that's why the formatting is wrong. Good. Okay. So I feel better now. It was you who put it in, not me. I feel better. Good. I was just checking whether, you know, what kind of error would be thrown if I run a prefetch. So that was good. Okay. Excellent. Thank you. All right. Now, in terms of timeline, so we are your official end date. Is it next Monday or the following Monday? Two weeks. Is it? No, it's this Monday. We're coming Monday. Okay. All right. So we are in the final week of coding. Good. All right. So this is the right time for these discussions then. Excellent. Now, John Mark reminded me, you are welcome to continue after the end of the Google Summer of Code. That doesn't mean you have to go away and leave. But I do understand university starting again. It's summer is over, et cetera. I'll be contributing. You know, making this better. Very good. Oh, one more question. Are you okay if I squash all the commits into a single commit? Yeah, that there's something we'll have to do. Okay. So you don't mind that the history will be compressed into a single thing and we'll just put it right there. Yeah. Yeah. That's fine. Great. Okay. So I've also fixed the expand button. We weren't one to 10. Yeah. So that has been fixed. Now it's working on all of them. Okay. So that was one thing I worked on. I wrote the Java docs for, like, the main things I've written for, I didn't write it for the UI part. Now, if you want, I can add it for that as well. And I didn't write the Java docs for the XML storing as well. So I thought, yeah, that also can be added. Okay. Other than that, I have to add a custom sort for, you know, the table where I was displaying data, one MB, two MB, three KB, that has been that's being sought that those are all string data types, right? So I'll have to add a custom sort where I can compare, which is better, which is larger and which is smaller. So that has to be done. I think other than that, I think, yeah, we are good to go. Oh, very good. So there's no way to present that data in terms of making it just a number. Could you simplify your life by converting the string to a number? Oh, but then I wouldn't get the MB, KB, right, that? Yeah. So now this is me being shameless again. So Rishabh can give his opinion. What if you just expressed everything in megabytes and put megabytes on the end? So it was .01 or 001 megabytes if it was a one K byte file. Okay. Yeah. That kind of makes sense. Well, I'm open to the string based sort as well. It's your choice. I was just thinking for me, numeric sorting is very clear, very obvious. We were talking about the repository sizes, right? Yeah, the thing isn't sorting properly because that's a string data type. And so what is the default size that we push there? Is it in KBs? Well, it's smart in that if they're kilobyte size, so if it's less than a megabyte, it shows it as KB. If it's more than a megabyte, it shows it as megabytes. I didn't attempt anything bigger than megabytes, so I didn't check a terabyte size repository, but I assume that it would show it as a thousand megabytes. But my thought was, okay, what if we just admitted for purposes of this thing, a megabyte based rendering is good enough? We may even say, and I guess that's another for your consideration, Hrushakesh, if the repository size is less than a hundred kilobytes, don't bother optimizing it. Okay. Just because there's probably not much in it, and maybe you make it 50 kilobytes, but it doesn't, super small repositories, even all the optimization in the world isn't going to make them that much faster, right? There's no amount of optimization can make zero smaller than zero. Zero is still pretty close to zero. That kind of makes sense. If we knew how much, I mean, what is the kind of optimization time that has been performed when we are looking at a certain size of a repository, then maybe we can find this threshold of where we should set it. Although hundred kbc and it seems like a reliable number, whether or not it won't make a difference. But I think your point is valid, Rishabh. It may be that the number should be 10 megabytes. I mean, if we were to gather real data, the real data might inform us that maintenance operations on a repository of less than 500 kilobytes is a waste of effort. It doesn't help enough to matter. The problem with that is, I don't know how we would gather that data. So is it possible for me to go into my Jenkins cache repository and just add, I mean, it has to be deep. It has to be deep repository within the cache, right? So if I am able to, let's say, create 100 more folders of a certain size within that cache and then I run Rishikesh's code, it would execute on those repositories, right? So I mean, what I'm trying to ask is, if I haven't added those repositories via Jenkins, I just added something in the cache, directories, which are deep repositories, caches. I have not gone through the Jenkins, I just added those folders within the cache. Would it still make the maintenance package would run on it, right? It would. In fact, there's a very specific technique that some very advanced users have used, where they will take a single folder and they will then get fetch into that folder from multiple different repositories. So what they're doing is creating a single folder, which is actually the union of several different repositories. And it's valid to do that. It's a little odd, but it's valid to do that. And so the idea you suggested, what if I go into a Git repository and make it grow by a significant amount? Say I fetch in a copy of the Linux kernel. Well, it will be now inside there. And that thing will now receive the next maintenance cycle, will compute the size based on actual disk size and say, there's a lot of work to do here, let's do it. So I mean, if it's something that is a priority to us, or would help, then I would like to do this experiment to help. That's something that we would want. Or maybe I could create a set data size, I could just create a simple table and then we could see how many like, what was the previous size and then what is the actual size and what is the operation and what is the time that it takes. So the amount of optimization in terms of percentage that it has done and the time that it has taken would then allow us to see what would be the size where we would say that it is negligent, the optimization is negligent versus the time that we say is something that we then would want to set the bar there, so that we avoid adding more, let's say operation time for the maintenance task. Yeah, I'm not, I don't object to it, but I fear that I would think that that effort will be an enormous amount of work for you, and I'm hesitant to sign you up for that much work. It just feels like there's a lot that you would be comparing and trying to find this and that. So I think I would love to see that kind of data that says, hey look, here is the cost of a repository that grows this much. And here's the impact on various operations. But for me that seems like that's going to be a complicated thing to gather and then for you to be sure you believe the data, that it's repeatable, reliable, that kind of stuff feels like it'll be complicated for you. Yeah, I mean I guess it depends on if it's something that we both need before. This is more of a good-to-have feature, it's not necessary for the plug-in, like we're iterating. I mean I could just try, if I end up spending more time than I think that I think, and then I can, we can just maybe look at the data, it's not necessary for us to encode any of the results within the code because it's, we're almost at the release time. I don't think we should just, yeah, look at an experiment maybe before that we need to do it. Great, yeah, if we just, I think we could look at. Would love to, I would love to have the results, I think that that could be very interesting. Yeah, and fully trust that if you find it's just taking too much time to do the experiment, you're perfectly welcome to say, I'm not going to do this any further. Just trust your judgment when you say, hey this is too much, not going to do it anymore. I'm trying to stay long. Great. So Hushakesh, to the things that you've got ahead for you writing more help, then there was, let's see is that it? Oh, skip maintenance for zero-size repository. Right, exactly. And that one I like because I would love to not have entries in the data table that show a size of zero. I just don't know what to do with them when the size is zero. Or I'll make it as 100k before now. Yeah, that's yeah, 50k, choose some number. Okay. And the sorting, you know, I think I'll do that other than that. The blog post, I've worked on the blog post. So you know, I have to make a blog post, you know, where I have all the data of what all have done. And so I've worked on that, still it's in pending. So I think I'll finish it by this week. Do I, I was not sure about this. So basically I have an architecture diagram and some kind of diagrams. Where do I upload those? Do I upload that in the blog post as well? Or do I create a draft PR and upload it there and close it, you know, adjust it? I think if you've got a diagram, it would be a good thing to put in the blog post. I certainly find diagrams make blog posts much more interesting. It helps me think more about it. Why did they put that there? So if you've got a diagram like that, by all means put it in the blog post. Yeah. So I have the same diagram as how it was implemented and a good plug in. So I think I'll add that. And I think that makes, that makes a lot of sense. That seems very good to me. Another small concern I had regarding main client maintenance was I was thinking of returning a Boolean whenever, you know, the maintenance has been executed in the get client plugin. Because there's no way of me knowing what you tell in the get plugin that the maintenance task has been executed because we are not throwing an exception in the get client plugin. So I was thinking of just changing that void to a Boolean so that we'll get information in the get plugin that the maintenance task has been executed. That sounds good to me. I mean, the get plugin could, well, the get plugin, if it, what you're saying, I think is you would like to know that the maintenance task was successful. And then a Boolean is a perfect way to do it. If all you care about is, did the task finish execution, then you could assume that if it reached the next instruction after the call to the maintenance task, then it had completed. But that won't tell you success or failure. So if you want to return a Boolean, yeah, that sounds fine. Yeah, because like yesterday, I was trying the pre-fetch command and the pre-fetch didn't run on a get cache, but it's saying it has been executed. So that's why I thought a lot of Boolean and you know, fix that issue. And that makes sense. And finally, I'll have to update the read me page though read me on the get plugin. I think these are the only tasks I have. Great. Yeah, I was just looking, I've confirmed that the expand works for more than 10 rows. Well done. So exactly as you said. And I've added the time for, you know, the amount of time it executes. I added a MMM, the SS and SSS, you know, a 0, 0, 0, 0, 0, 0. And that guy, I don't know if that is a good way of representing it, rather than, you know, throwing some random number, like I was throwing a number one, two, three, four, five. So I thought I'll display it in this way where the first three are the minutes, then the seconds, and then the milliseconds. If you want, we can change the size of it. So that makes sense to me, although I was a little surprised, I would have expected it to be hours, minutes, seconds, dot, fractions of seconds. And I think you're rendering it. Well, let's see. So I see three zeros, colon two zeros, colon three digits, colon two digits, colon three digits. So is that hours, minutes, seconds, or is it? It's minutes, three minutes. So I added three times a minute. So if it overflows the minute thing, it would get added like 120 minutes. I see. Okay. So this is minutes, seconds, fractions of a second. Or we could go with hours, minutes, seconds as well. But when I added hours, there are more many zeros because nothing is going to take that many hours. Right. Yeah. So that's why I changed it to minutes, seconds and milliseconds. Yeah. And I think so long as the heading is updated to give an indication that this is duration in, well, okay. What if you just made it duration in minutes? Oh, only minutes or you like you don't want seconds as well. Well, what if it were sections expressed as a fraction of the, no, that may be cheating. Okay. So I was just thinking in order to have a single number, if it were just minutes and representing the, the fractional part as two significant figures. So 5.17 minutes. No, no, I'm wrong. That people expect minutes and seconds. They really do. So, so different angle then what if, what if you just drop milliseconds entirely, hours, minutes, seconds, because these, these administrators, if they care about milliseconds, they're focused on the wrong things when it comes to these tasks. A few, a few maintenance tasks take less than a second. So that's another problem. Well, and, and so in that case, listed as 0, 0, 0, 0, 0, and it's, or, or round up to one, you know, rounded up to one second. Okay. If it's, if it's. Yeah. The command graph command already it has been executed and I assume if there's no updated command graph file, so there, there wouldn't be any update to it. So, right. And, and so if for me, it's the difference between 0, 0, 0, 0, 0 and 0, 0, 0, 1 is quite small. Right. It's, I'm not going to be distracted. It took, it took one second. Okay. That's, that's fast enough. I don't have to worry about optimizing it. So you're saying we go with minutes and seconds only, right? That's what I do. Rishabh, you okay with that idea? As I think you agree, we shouldn't overload the user then really second, especially when, you know, we can, as you said, round up to one second. So yeah, we should do that. Well, and, and I guess if it makes it any easier for Rishikesh, if you, if you say always round, round up, if it's, if it's greater than add one second, you know, if it rounded upwards always, even if it's only a 10th, only if it's, if it's 10 milliseconds greater than, than a second rounded to the next second, because whatever's easy in terms of getting it presented to the user, the, the, the precise value of it is, is not terribly important though. Yeah. Oh, Mike, you've muted yourself. It's looking very good. I was just staring at the, at the user interface. So So this is a, I mean, why have you featured? So usually when we release a blog post for the, I mean, as an end result of the project, we try to explain what we've done for the project, but the way that we can inform the users about, and educate them about this new feature is that you're going to add it, you're going to add it to the Git plugins read, right? You're going to add a section there. But I was just wondering if, since, you know, there are quite a few elements there, I mean, to what, what is the input that is expected from the user. And then, within the output, what do you see in the table and what, what all this column is means. And I mean, what the impact that you just talked about that would, would it warrant a separate blog just for the feature where you explain the user, what, you know, how do you use it and then what are the outcomes and something like that would get screenshots of the UI. So would that be a blog thing or should we just have him put that in the read me? I mean, we didn't read me. Can you, I mean, would you be able to explain that much? It's, it's the, it's the full documentation of the plugin in the read me right now. The thing is, is an embarrassing number of pages long. Hang on just a minute. Let me go find it to be sure, but last I checked, it has a picture for every, every one of the configuration screens and yeah, it's if I asked to print it, it takes 20 pages to print it. So, so I think there's lots of room for, but now the benefit of a blog post is it's a very, it's intensely focused on exactly this feature, whereas if it goes in the read me, maybe what it is is make it a blog post and then we copy that into the read me later. Yeah, we can link it in the read me as well. Right. Yeah, could also do that. Yeah, so I mean, this would not count as a, I mean, since you, as a deliverable, we might have one blog post for the project. And then obviously the code that you're submitting. So it may be something that you could do after that if you have the time, not necessary that you add it within the deliverability graph. But I believe as a user, if I want to understand what this new feature is going to do, where should I mean, I can go to the read me for the description, but I believe the way that you give the demo, right, where you actually explain how the whole process was sent, what do I expect from that table, which contains a lot of information, then either I have to go to a presentation that you've presented within the G socket. And I'm not sure if all the users or a section of users would know about that, but I didn't know if they would access that, or wouldn't find it convenient for me. Right, I think you're right. So shouldn't, I think it's valid. It's a valid thing to say, hey, let's, let's consider some way of getting the message out and maybe it is a separate blog post. Then I like that if you're willing, that would be a great way to highlight here. Here it is. So Rishabh, why not make it just part of if he's got time part of the of his Google Summer of Code blog post. And that's a key thing. Would that be okay? I think it would, but what I was thinking was when he's writing the final blog post, it would be more from a perspective of what he did. The entire project, he would be explaining how we went through what was delivered. As a user, I may not be more interested to understand the future that is there. That is what I was thinking. Right. I see your point. And I think you're correct. That makes sense. Yeah, because usually, I mean, when we were working on a G-soft project, I mean, as the, for example, when I did my project, it was not something where the user had to explicitly do a lot of things. And what we see is there's a lot of engagement with the feature itself. And yeah, I believe it will take a reference first. It makes sense. Any other topics we need to review as we're in this last week before, before end of project? Rishikesh, thank you very much. It's been a treat to be on this project with you. You've done great work. Thank you. Thank you for the support as well. When the word I had any kind of problems, you know, it was solved easily. I didn't face any kind of challenges this three months. It was a very wonderful journey. And it was really fun working on this project. Well, thank you for your contribution to the Jenkins project. And users, I'm sure, will thank you as well. The one thing which I learned in this project was time management. I never get up at eight in the morning for anything, you know, even college, I go one hour late, but I don't attend the class. So this was one of the biggest challenges I've faced. So, so thankfully in your professional career, if you, if you check with Rishab, he will probably tell you that everyone else in India time shifts to the end of the day. Is that am I right, Rishab, that it's in order to overlap with people in the U.S., you'll typically work late. You don't wake up and do early, right? So, so don't worry that this was, this was an oddity. You'll not have to tolerate this in your profession. This was just Mark Wait trying to fit in his personal schedule. You won't have to deal with this in your profession. That's true. Yeah, I would also want to be in the same sentiment that Mark has been a wonderful experience and I was quite surprised. When I was doing the project, I felt like I used to rely much on the mentors and I felt like you were, when I saw your phone and I, you know, the amount of questions that you asked me to get is I was quite surprised that, you know, you've written almost everything by, you know, by yourself, like the whole UI elements to it and the, you know, there's some quite relatively complicated things that are going on when you're locking these sources and, you know, you're buying concepts there, which are, yeah. So, yeah, I was really impressed by the whole journey that you've been through. Really great work. Yeah. Thank you. Yeah. Excellent. Thank you. Let's call it done for today. Enjoy the fact that you won't have to get up at this hour of the morning in the future. All right. Thanks.