OK, the recording is on. Welcome, everybody. Let's take a moment to pray together, and then we will get started. I am using my, I don't have my headset here today, so I'm just using the computer mic. So in case it's not very clear, please let me know. I'll try to adjust. OK, let's pray. And we will get started. Could somebody please unmute your mic? Just pray with all of us in the class, please. Thank you for this time. Lord, we humble ourselves before your presence. We pray, O God, that this time of learning would be beneficial for each one of us. We pray that we would be able to understand the significance and the steps how to develop the spirit that you have given us. We pray that it would impact our personal life, our ministry, and whatever things that you have interested us with God. And we pray for a fruitful time of learning in your presence. We thank you, Lord, in Jesus' name we pray. Amen. Thank you. Thank you. Right, so last week or in the previous two lectures, we emphasize the fact that we are primarily spiritual beings and that we have faculties and we also the spirit, the human spirit, has faculties and functions. So we want to progressively get into understanding how to develop those faculties, like the five faculties which we mentioned, just like in our human body. The human body has faculties, like what we can see, we can hear, we can smell, we can taste, we can touch. The physical faculties. But those faculties are developed over time. So we learn how to those faculties, we learn through those faculties. Also a function, so just like in the natural a human person has certain functions, in the spirit or in the spiritual, the human spirit has functions and we can learn and develop and nurture those functions. But in today's class, as we prepare to make that journey, I want us to understand that now we are going to speak from now on. We're going to speak very specifically about the believer. We're not talking about the unsaved person. We're not talking about somebody who doesn't know Jesus.  We're talking about the spirit of a believer, a born-again person. A person who's born-again, who has received light from God. What is it that really nurtures the spirit of a believer? So that's what we want to talk about today. And I want to share with us these seven important ways you could think about to develop the born-again human spirit. How to develop the born-again human spirit? Here we're talking about what is it that really helps develop the born-again human spirit. That means we're talking about the spirit of a believer. And just some examples, some scriptures for us as we get started. Luke chapter 2 was 14. It's talking about the Lord Jesus Christ. It's very interesting. It says, the child grew, that is his physical growth, and became strong in spirit, that is his spiritual growth, filled with wisdom, and the grace of God was upon him. Oh, this is something very, I mean, it's hard sometimes to even understand why. Because in the case of Jesus, this was God who became man. This is God who became man. And yet, when the Bible is talking about what Jesus says, the child grew, physical growth, that we can understand. The human body had to grow, that we can understand. But he's saying, in the spirit, he became strong. That means his spirit also was growing, was developing. That is sometimes very difficult to understand, because if this was God and man, he must have been God and spirit, like he was completely strong. Why did his spirit have to become strong, develop, grow? Why did he have to become full of, and it means he was increasing the wisdom? So what we can say is that he was truly God, but he left aside his powers of deity. And he fully took on the form of man, including the development as a man in all areas, spirit, soul, and body. He was developing as any human person. So even the Lord Jesus not only grew physically, the child grew, but was developed spiritually. That's why he had to go pray. If he was already perfect and complete and fully matured in spirit, the moment he was conceived, then he didn't need to pray, he didn't need to feed upon the Word, read the Scriptures. He didn't have to be filled with wisdom. But the Bible is saying he grew, he became strong in spirit, he became filled with wisdom. So even the Lord Jesus, in his earthly journey, submitted himself to that process of growth and development in spirit, soul, and body, fully. He didn't have to do it. He could have said, hello, I'm God, I'm here. But he chose to go through that same process, which is hard for our minds to understand and grasp why he would do this. But the Scriptures are indicating he didn't. Then, of course, talking about you and me, that we can understand. Ephesians 3, 16, the Apostle Paul is saying, he's praying for the believers. He's saying, I'm praying that God will grant you, according to the riches he has in his glory, that he will help you to be strengthened with might through his spirit in the inner mind.  But we can understand, yeah, as believers, we need to do that. That has to happen to us. We have to become strong in our spirit, in the inner man, with the help of the Holy Spirit. So how is this inner man or this human spirit, the born again human spirit, what are the things that help us develop? So I just want to place these before us so that we understand. And some of these will come as a reminder. But how are we going to become strong in our spirit? First of all, strength comes through fellowship with God, through prayer, worship, and the Word. That means we commune with God. We have fellowship with God. We share with God. We are engaging with God through worship and in the Word. And that strengthens our spirit.  So that's the first thing. We strengthen our spirit. And we talk about the born again. We talk about the believer. The unsaid man will not understand this. So we're saying, for the believer, the first thing in strengthening the inner man is fellowship with God. You spend time with God, engage with God. And as part of this fellowship, there's also this place of quietness and communion. That means just doing things in quietness. That means things like reflecting, meditating, communing, that means you're quietly talking with God. The Bible tells us in Isaiah chapter 30, verse 15, God is telling His people, in quietness, in returning and rest, you will be saved. In quietness and confidence will be your strength. In quietness and confidence, you will have strength. So just that quietness and communion, and we know the scripture, Isaiah 40, 28 to 31, they that wait upon the Lord shall renew their strength. Waiting upon the Lord. What is that? It is, so an example would be somebody waiting upon a guest. You're making yourself available, so you're waiting. Anything they need, anything they say you respond to. But you're there in their presence. You're there in their presence. And you are looking for what they indicate. If they say, I want more water, I want this. OK, immediately you get, you're waiting upon. So they that wait upon the Lord. That means they are in the presence of God, say, God, I'm here, I'm looking at you, my focus on you. Whatever you say, I will do. I'm ready to respond to anything you indicate. So I'm waiting upon. And the Bible says, in quietness and confidence, we will have strength. They wait upon the Lord. We will renew our strength. See, both of these things, quietness, waiting, increases our spiritual strength. And so, quietness and communion with God, OK? So fellowship with God, quietness and communion with God. Learn to just be quiet in his presence and let our spirit engage with his spirit.  And in that place, we receive strength. Third thing that we know strengthens the spirit man is to feed on the Word of God through meditation, feed on the Word of God. So we know what Jesus said in Matthew 4.4, man will not live by bread alone, but by every word that proceeds from the mouth of God. Man is going to live there.  You're going to go about living. So when we talk about living, we talk about activity. We talk about doing a lot of things. But that whole activity is going to happen, not just by physical food, but by spiritual food. So I need spiritual food so that my spirit can be strengthened to be engaged in activity, do things to live. So we feed on the Word of God through meditation. You meditate in the Word, you read the Word, you meditate in the Word, you chew on the Word, you take the Word of God into your spirit, let God speak to your heart through his Word, let him feed your spirit so your spirit can engage in activity and live, can do things. Now in Hebrews chapter 5 verses 12 to 14, Paul is talking about maturing to eat the solid food or the meat of the Word of God. So there God's Word is like meat or solid food. So once again, bring out the same idea that the Word of God is nurturing our spirit. It is solid food for our spirit to be our spirit. So then the spirit is strengthened to engage in activity, to do things. So we feed on the Word of God. The fourth thing that we can do to strengthen our spirit, to develop the spirit, is to confess the Word, speak the Word. Now God has, and I'm not expanding on each of these, each of these can be expanded and discussed in detail, but I'm outlining these things. So these are the things we do to develop our spirit and confess the Word. God has said that faith comes by hearing the Word. And one of the ways we can hear the Word is when we speak it ourselves. So I can speak the Word and I can hear the Word, cause the Word to go into my own spirit and build my own faith. So it's like I am intensely developing my own faith because faith comes by hearing and I can speak the Word myself. I can speak the Word. I can hear the Word. I can cause my spirit to hear the Word by me speaking the Word. And faith is developed in my heart, developed in my spirit as I keep speaking the Word or confessing the Word. So that's another way to develop a spirit.  Number four, a few more thoughts here on developing the human spirit, the born again human spirit. Number five is to pray on us. Again, we know this already. It says, he who speaks in unknown tongue edifies himself and he builds himself up. Where is he building himself up in his spirit?   Where am I building myself up in my spirit? So you're building yourself up as you're praying in tongues. So we just pray in tongues because we know if I pray in tongues, I'm going to build my spirit. So just engage, you know, on a regular basis. Every day, as often as we can just pray in tongues as much as we can, because as you pray in tongues, we are developing our spirit, we're building our spirit. So we know that praying in tongues will strengthen our spirit. Last two. So we must exercise, number six. We must exercise our faculties and functions. So obviously, when we think about in the natural, natural person, if the person doesn't use their faculties and doesn't function, let's do what they're supposed to do. That means they're not living, they're not doing anything. And they will stop using, basically, they're not functioning. So we must exercise the faculties and functions God has given us. And the more we do that, the more the spirit is developed. And so we'll talk about those things. We'll talk about the faculties and the functions of the spirit and how to, you know, work them out. But the point is, I need to exercise my faculties. I need to do my spiritual functions. I need to make use of them. And the Bible tells us very clearly that the greatest of these is to walk in love. That means the greatest thing my spirit can do is to walk in love. Because when you think about first Corinthians 13, follow me a second, I can speak in tongues of men and of angels. I can have faith to move mountains. I can prophesy. I can work miracles. I can give good things. I can give my body to be burned. I can give things to the poor. That means I can do all these, exercise all these faculties and functions. But then he says, but if I don't walk in love, I have nothing. That means while it is important to exercise the faculties and functions. It's good. It's good to exercise faith and move mountains. It is good to pray in tongues of men and of angels. And it's good to prophesy. And it is good to move mountains. And it is good to give things to the people. All these things are good. And the Bible teaches us to do all of that. All of that must be exercised in love with the love of God. So that is very important. So all our spiritual faculties and functions must operate with the love of God. We can just put it like this. We have to walk in love while we exercise our spiritual faculties and functions. And if we do that, then spiritually we can be in good shape. Spiritually we can keep developing. That means I cannot have spiritual development outside of walking in love. Number six. And lastly, seventh way to develop spiritually, to develop the born again human spirit is to receive spiritually through others. Number seven, to receive spiritually through others. So God has given, or he has put this in place in the church. So Paul is writing, for example, in Romans 11 verse 11 and 12, he writes to the believers in Rome.   So spiritual things can also be imparted or given as a gift. So that's impartation, given as a gift. But we need to understand how that happens. It doesn't happen arbitrarily, randomly, but it comes through that relationship. Example, Paul had a relationship with the church in Rome. So he's going there to serve them. His relationship with the church in Rome was primarily through Aquila and Chrysilla because they, Aquila and Chrysilla were a couple who, when there was persecution in Rome and the Jews were sent out of Rome, they came to Corinth. They happened to meet Paul in Corinth. They worked with Paul in Corinth. Then after some time, they went back to Rome to serve them when they were to go back. So they went back to Rome. And so I'm sure that over in Rome, they must have shared with all the believers in Rome about Paul and the ministry and the things that they had learned from Paul. And so it was through that that Paul had this relationship with the believers in Rome. Because he had very, he had imparted into the life of Aquila and Chrysilla who were also leaders there in Rome after they went back, leading the church in Rome. So now he's got this special relationship with the people there. And now we say, I want to come and impart to you spiritually. So the point is, we can receive spiritually but there is a way through which God does it. It is usually through the relationship, the association that we have. And as we receive through them spiritually, we can be nurtured. Or in Philemon 1 and verse 7, Paul is still in Philemon. You know that the inner, the bubbles of the believers are refreshed through the brother. So that means the way this brother is serving is actually spiritually refreshing are the beliefs. You know, so that he's giving it. So seven ways by which our born against spirit can become strong. And we need to understand this and we need to intentionally do this to build our spirit. So just quickly review this. First we said we had a fellowship with God. So intentionally take time to just go fellowship with God because that is something only we can do. Like I can't take your spirit, go before God's a God. I can't do that. You have to go, you haven't go before God. You have to fellowship with God, throw your bread and word and you have to be with him. Do spend time quietness and communion with God just being alone with God and quietness and communion. Three feet upon the word just through reading the word or meditating the word to putting that word in your heart, feet upon the word of God. Four confess the word, speak the word, continuously speak God's word. Number five, pray in the spirit, pray in tongues as much as you can. Now, again, somebody else cannot, somebody can pray for you, but somebody cannot pray instead of you. You have to pray. We have to, each one has to pray. So pray in the spirit. As you pray in the spirit, you're building up, you're in a manner. Number six, exercise spiritual faculties and functions, which we will learn as we go along how to do it and most importantly, do it in love. If I don't do it in love, then that exercise, Paul says, is as nothing. It is in a mountain. They will not have been found. It should have on my spirit. So whatever I do, I must do it in love. Then it'll bless my spirit, strengthen my spirit. And lastly, position ourselves to receive spiritually through other people, okay? So I've laid this outline before us and I wanna encourage us to start practicing this in our lives in order to develop our human spirit. Any questions on these seven things that we just mentioned and discussed? Any questions on this? Anybody? Latina? No questions? Anyone else in the class? Any questions? Rosalind, you have a question? No. Okay. Okay, fine. So now I'll go into the next chapter. I haven't shared the notes for the next chapter, but I'll just introduce that and we will continue the next chapter next week. In the next chapter, I'll just share this with you. In the next chapter, we're gonna talk chapter four or lesson number four. We're gonna talk about how the human spirit affects the soul and body. So this is very important. It means the condition of our human spirit. What is going on in the spirit affects the soul which is our emotional life and also affects the body. And we can look through scripture going from Genesis to Revelation and see this, okay. How is the spirit affecting soul and body? All right, so this is very useful for our own selves. It means if I understand this, then any problem I face in my body and any challenge I face in my soul, I can overcome from my spirit. If I understand this truth, because I can understand that the spirit is stronger than the soul and the body. And if I can keep my spirit strong, I may face challenges in my body and I may face challenges in my soul, but I can overcome it. And this is also important when we are ministering to other believers because if we can help them develop their spirit, then we can help them overcome the challenges they face in their soul and body. In their soul and body, right? So this is important. Understanding this is important both from a personal perspective, like, hey, if I can develop my spirit, I can overcome what I face in my soul and my body. Yes, sometimes my soul may be really parted with confusion and disturbances, all kind of things shaking my soul, but if I let my spirit dominate, I can, I won't be put down just because what I'm facing in my soul emotionally, obviously, and I can help other people. If I can build them up in the spirit, they can overcome what they face in their soul and body. So just follow along with me. We'll do a few today and we'll continue the rest next class and I'll give you this as a PDF. Here are some things we see in the Bible. For example, we see things like anguish of spirit. That means their spirit was broken or crushed. And so we look at the negative and positive, right? We'll see both sides. And good things happening in the spirit and bad things happening. Anguish of spirit, that means the spirit was broken, the spirit was crushed. And when they were in the anguish of spirit, you can see their behavior. In example, Exodus 6, they were unwilling to receive the message Moses was bringing them from God. So when Moses first came and was telling the people, hey, God wants to deliver you. God wants to take you to the promised land. They were unable to receive the promise. Why? Because in their spirit, they were already crushed. So Moses is coming with a message from God. With a promise from God or something better of God's purpose for his people. But at that moment, people were not ready to receive it while they were already crushed inside. Inside, they felt broken. Inside, they felt so suppressed, they couldn't even imagine coming out of their situation. So you see now, how what is going on in their heart is affecting how they're receiving a true promise from God. God has sent Moses. Moses, go tell my people, I'm going to bring you out. I'm going to take you to a land that I've prepared for you. People could not listen to it. So why? They were crushed inside. The anguished spirit. Spirit was already crushed. And it took a while. It took a while for them to be able to come to a place where they could receive the promise from God and back the bags and start the journey. It took a while. Moses had to keep coming back, God had to show all these signs and wonders and finally the people believed in Moses. Okay, God is here.  Yeah, this is real. Let's go. So we can understand this. Sometimes even when we speak to people, sometimes first time you say, they're not able to receive the promise from God. They don't think, hey, I don't think this can happen. I don't think God can take me to a better place. I don't think, you know, good things are there for me. I don't think, you know, I can come out of all of this. Why? Why are they like that? You can't blame them. They've been crushed inside. They seem like the children of Israel. There's an anguish of spirit. They've been broken on the inside. They cannot even imagine being in a better place. They cannot even imagine the promise of God actually happening in their lives. And just that, it's in the Bible, but to happen to them, it's very difficult. And so we need to encourage them, encourage them, encourage them, encourage them to bring them out of that place of being crushed, you know? So that is important. Same thing with Joe. You know, he was in that place where he was so, he was an anguish of spirit. And he began to complain out of the bitterness of what he was going through. We can see that the spirit can be against God. Sometimes in their spirit, people are against God. There is, the spirit can be angry. So we just, let's quickly move through a few things here. Spirit can be angered. And they can be, you know, having this feeling of anger in the spirit. So it's not only an emotional thing, but a spiritual thing. We see that sometimes in the spirit, we can feel bound or restrained. So this is what Paul was feeling. He says, I feel bound in the spirit. That means something is, he feels, in his spirit, he feels restrained, constrained. I don't feel comfortable. Like in English, we might say, I don't feel comfortable about this. Like if something inside me is disturbing it, I feel bound, I feel restrained. So Paul was expressing that, Acts 20. And he actually says, the Holy Spirit will come, we'll study this a little later when we talk about the faculties of the spirit. But it was a Holy Spirit was making him feel like that. It was a Holy Spirit was making him feel constrained. I feel constrained in my spirit about going, just, okay. So you can have that feeling in your spirit and that actually is coming. It could be in some certain cases, the Holy Spirit giving you that feeling, telling you, hey, be careful, don't do it, don't go on. Then we also see about brokenness or contrition in the spirit. That means we are in our spirit that is brokenness or contrition. Again, this can happen through or because of different situations. It can happen because we are repentant, we made a mistake, and so we are of a broken and contrite spirit. It can happen because we choose to be broken and contrite that is humble ourselves before God. And sometimes it can happen because of, like we said earlier, because of the circumstances and situations, broken. Now, each of these have a different effects. If I'm broken in my spirit because of repentance, it's a good thing. I go before God, I repent, He forgives. If I'm broken in my heart because I'm humbling myself before God, it's a good thing because then God exalts us on themselves. Suppose if a person is broken because of the crushing of the circumstances, that's where it says a broken spirit dries up bones. It would have a bad effect on his health also. A broken spirit dries up the bones. Sometimes the ill health can be connected to broken, a broken spirit has been crushed and they're wounded, they're hurt on the inside and therefore they are in that place. So I'm gonna pause here. I will give you this chapter as a PDF and we'll go through, we'll go through various conditions of the human spirit like I'm just, we'll go through this next week. And we see how this affects the way the person affects us in our soul and in our body. It's good to know this because both for our own person self and also as we speak to others. Any questions so far on this? Are you all with me or all following me? Pastor, the last point you mentioned, the broken spirit is it to do with personality or is it just because of the circumstances? Yeah, so the brokenness can be for different reasons. A broken spirit is something sometimes that we choose to take a posture one like we said maybe as a sign of repentance, they go before God and say, God, I'm sorry. Or it could be a posture we take in order to keep, to stay humble. So in that case, brokenness means I am choosing not to depend on myself. I say that I am broken meaning I need somebody to be with me too. So that's a place of humility. Broken, so God, that means we're choosing to be humble and God is close to those who are humble. But brokenness sometimes in some people's lives is forced, is inflicted. It's because people are hurt because circumstances crush them. Then that's a negative thing because it's not a posture choosing to take willingly in a healthy way. But that is something that is forced on them, they are hurt, it's inflicted on them. And that actually can keep them in a place of sorrow and it affects the soul and the body like we see in scripture. I'm not sure. Yes, yes, yes, thank you. Any other questions for now? Okay, so this is a little heavy chapter because we see in scripture many conditions of the spirit. On the condition of the spirit affects the soul and the body. So I just shared a few and I will upload this PDF later today and you can look at it and we'll go to some more in scriptures where we see if the spirit is having this condition, this is how it affects the person and affects maybe the relationship with God, maybe the way they face people and so on and so forth. Okay? All right. So we will close here today, we'll pause here a little early, I know we're a little early, we'll pause here and we'll pick this up next week, take it forward. Can somebody please close in prayer and then we will dismiss. Let's pray. If you can. Dear Heavenly Father, we come to you under the name of Jesus, we thank you for this day, thank you for the beautiful glass that we have. God, we thank you for the spirit that you have given us. God, as we are listening to the glass, help us to grow in our spirit, Jesus, just like how you grew strong in your spirit. God, we thank you that you came down here to this earth for us. God, we thank you for your amazing grace. God, as we are learning, make us strong in our spirit, help us to keep growing in our spirit and help us to open our eyes and heart and mind and understand your deep roots, Lord. We give you all the glory. Be with us and guide us in Jesus' name, I pray. Amen. Thank you. Thank you everyone for being on the class. See you again, God bless. Bye now.


As part of his reelection campaign, U.S. Senator Rand Paul spoke with local Kentuckians and Jenkins Tuesday about pressing issues within the state. Earlier, Mountaintops spoke with Senator Paul about some of these issues and his message to Kentuckians. We've been traveling around the eastern Kentucky mountains for the last couple days. We've been to hazard, we've been to Pikeville, Prestonsburg, and now we're down in Jenkins. And it's really, I think, one of hope and opportunity for the country that I think we're a resilient country. I think we can get beyond this COVID pandemic and begin to grow again. But we have to start being reasonable about it, trying to let our kids live free again, not overwhelm people with mandates. And I think people are ready for it. People are ready to get back started again. And I think that we're at a point where maybe we can get back to normal. Lastly, Senator Paul spoke on his stance on vaccine mandates and options for vaccination. I'm against vaccine mandates. I think people who are at risk should be vaccinated, but I think it should be their choice. Particularly people over 65, particularly people overweight, are at risk for this disease. And I think being vaccinated is good. One of the things, though, is if you're vaccinated, you can still get it. And it's very important for people watching this to know that there is a treatment for COVID. It's called monoclonal antibodies. It's an infusion. You have to go to a hospital or a clinic to get it. But if you go within the first couple of days of getting the virus as you're getting sick, 70 to 80 percent reduction in hospitalization and death. So people need to know there is a treatment. You have a very good chance you can survive this if you get it, but you got to call your doctor. You can't wait at home until you get too sick. For Mountain Top News, I'm Joel Chorjol.


Welcome. This is Google Summer of Code Jenkins get cash maintenance. It is the 28th of June, 2022. Rishikesh, are there any particular topics you'd like to discuss? Yeah, yeah, can you share the screen so that I can tell you what progress of me this entire week. Yes, absolutely. Here we go. So let's look at this one. Let me bring up, would it be best if I bring up the GitHub repository? Yeah. Okay. And let's look at the open pull request. And here it is. Okay. So this week I added that, you know, getting all the caches from the, you know, on the Jenkins controller that logic has been added, and I am able to run the maintenance tasks on all the caches. Okay. So that's what has been, that's what I've done. And then yesterday I worked on, you know, we have discussed about form validation, like, you know, where we can store incorrect data also into the file and then validate them whenever we are executing the maintenance tasks. So that's what I have worked in this, like in this part in the past. Thank you. That's wonderful. So, so let's, are you okay if we take a look at it? Yeah, sure. Okay. All right. So this one looks like. Oh, okay, so you're intentionally maintaining the ordering by using a linked hash map and the idea there is you want to execute with a particular order. No, the thing is in the UI, right? If I don't use a linked hash map, whenever I refresh the page, all the order of the maintenance task is getting shuffled because I don't have a particular order when I'm iterating through the hash map. I see. Okay, so this, this assures that that makes sense. Good. All right. And then silly scroll bar. Here we go. So, this is for the Chrome syntax validation. This is for the form validation, which, which we have discussed, you know, not to like, which allows saving of incorrect data but it verifies when I'm running, executing the maintenance tasks. So that, that's the logic for this in this comment. Very good. Okay. Now we will. Oh, and this is I assume just a diagnostic thing to help you as your. But you may you may in fact want to use a system or a logging system, because then you can read it and the user if they ever have a question could increase the logging level and see it telling us or decrease the logging level to say oh it's not happening. I had it out regarding logging so that's why I haven't proceeded with that like, how would I implemented each class would have a logger or like how would it would each class would have a logger, and then you use that classes logger that allows the administrator to do very fine control of which things they want to log to see proof that something's happening. So this one might be a an info level or a, let's see I have to have to look at the logger levels. Yeah, so this one could be a debug level even where you say hey, only show this when we're doing debugging debugging level logging. But this, the technique you're using with small commits looks very, very good. That's, that's exactly the right way to do it. So, and, and you've added tests. Excellent. Yeah, I don't know. So, yes, congratulations very okay so so now tell me what you what you learned how did you. What did you have to do in order to allow it to support the the rather Jenkins specific way of describing it. Actually, I didn't do anything I tried it once again and it started working I don't know why it didn't work that day so. Okay, alright so it's, it should be easy to test good very good interest okay now this one. Okay this test I'm not sure is doing what you expect it to do. Yeah, it's throwing an error so that's what I wanted it to do. It is but the problem is, you're iterating over a loop and the first call on the loop will throw the exception and test none of the others. Oh it won't. Oh, okay. Right so I thought it would so. Well and you could you could for instance you could do this if you were instead to switch and use a parameterized test. Then you could make these invalid invalid syntax items each parameters, and then you do the same syntax you say I expect to throw antler exception. And all you do then is in the test you call task scheduler dot get contact list. And it will, it will then use that so so that's this one won't have the behavior you want right now but it's pretty easy. You just split it out into a separate file task scheduler parameterized tests, and then make the parameters your incorrect syntax that has the nicety that then it's, it's easy to see what the test is asserting because all it's asserting is that this exact statement will throw an exception. Okay, I do that I do that I didn't know it would only get the first one so. Good for you, good for you for writing tests well done for sure cash this is really great. All right, so in that and this one, I assume is just an evolution of the earlier file we were looking at. I deleted all of that in the previous one and added it to. So did you want to do you want me to take this for a test drive and show show that it's, it's working should we use that for, or are there more things you would like to show tonight today before, before we finish our session. So actually, there are two ways of like how I want the session to be at the first thing is I never like the maintenance tasks are running okay but I never ran it properly. Like I never run around all the maintenance tasks like I like you know setting it like for one hour, and then setting setting it for like two hours, running every two hours. One thing which I haven't done but the maintenance tasks are running it's getting a lock. It's using that lock running running the maintenance tasks on that cache and then getting unlocked. So that logic has been written but I haven't tested it completely. Okay, the other thing which I wanted in this session was where like regarding legacy get maintenance okay for versions less than 2.30. Where do I write the logic for it, do I write it in the get plugin or the get client plugin, because if I wanted it to, if I want to write it in the get plugin right. I am not getting the get version I'm not able to use the get version underlying get version or CLI version so that that that's something I was not able to proceed. Good, okay that's a very good point so I think what you're noting is get is it get client version. I forget even the name of the function. No, but there's some version thing in it. Let's look for the word version private in the client plugin. Here we go this is at least version. Right, that's the, that's the one thing that knows about version numbers. I thought there was something in in command, you're in the in the get plugin as well. Okay, let's, you okay if I do some quick exploring. Yes. Alright, so. Okay, that's not a whole lot of help. So, version ID, big version, get lab version, get version of that still get that specific unexpected get major version. Oh okay so this thing is doing some work with the get version but it's entirely inside a test. Okay, so, so the get plugin has logic in it but it's right now it's completely inside of a test to determine which version of get and maybe we ought to look at that and see sample repo. Yeah, there's again another test usage. Check out with. Okay. Okay, let's do one more source slash main. Oh, yes, let's use correct syntax. Okay, so. Okay, config version is no help. Temp version all inside the get lab browser is looking at get lab version help files. Okay, yeah so it doesn't. It doesn't have. Any way of getting the. Okay, so the choices are are. Well, do you have a preference because you could for instance, just create a new API somewhere in the get plugin that you can use to determine what version of command line get your is available. You could put it inside the caching mechanism you could put it. Most anywhere you'd like because there's an example right here of how to do it. Right so here is here is code that knows how to do that. And what exactly is wrong. Is it like something. I assume it's a convenience method inside this inside this or inside in another. Inside the parent yeah so it's it's a convenience method that knows how to do a fork, or a fork and exec. Let's see let's look at it and see so abstract sample dbcs repo. This is where I really need a tags file. Okay so it is coming from another place so Jenkins Java doc. Let's see if we can find that SM API plugin. Okay. That doesn't help me at all but let's look at Jenkins GitHub, SM API. Sorry I'm staring in another screen I'll be right there in just a moment. SM API plugin. Here we go. Okay so what does run do here. Let's find the real run the real run is abstract sample repo. So in case you can't tell we have to look at this one. Now here there will be a run yeah so it creates a launcher and then makes the call and and this you certainly could do. And then inside the get plugin it's quite allowed because in your case you I think we are confident that we don't that we always want to use command line get to perform the maintenance operations. Yeah, yeah, because I sent you the link of a forum yesterday right where I asked about Jake it, and they were like they don't have maintenance tasks ready in that thing so. Yeah, right. And I agree with, I don't think we even if they did have it, it would probably only be in the j get six family, and we're not ready to adopt that yet. So, so, for me it's this is too early for us to be forced on to j get six. So even if they had it, it would probably not have arrived until j get six right now I think they're about to release j get six dot three. Okay. So can I call this method directly like wherever I needed to you know get the version of the get, you know, to get a good portion. I think you could right. So I was assuming that the play you would probably want to, to isolate the knowledge of get versions and which things do maintenance inside of your maintenance tasks. I mean it's implementation which whichever one that is inside that class but if you need it in multiple places you could certainly either put it in a, in a utilities class, and use the use the utilities class statically, or copy it if you need to. It's terrible because I wanted to even show the version of which it was being used in the UI. So that's why I wanted it to be in the kit plug in so that I can get the version and you know, it would be useful even in the UI. Well, and I think, I think that's a that's a good thing. I, if we look at this at this code it's doing exactly that right so the knowledge of this thing is it's doing logging to tell us if it couldn't parse the get version into a major version or a minor version and a patch version. And, and if you find this kind of thing helpful you're certainly welcome to make this an API that's somehow available, at least package protected inside the get plugin. I'm not sure we want to make it a publicly accessible API, because I really would rather not have get plug in consumers have any logic about what version of command line get there using. It's, it's, it's bad enough that that the get plug in the get client plug in have to know about command line get versions. Let's not leak that information to our callers if we can avoid it. If, if you would like to make this, this into a package protected method somewhere in the get plug in, you have my full support, it's, I know how important it's been, I'm embarrassed to admit how important it's been to me to see things like here I'll show you the one that that that has mattered to us when the, when the command, when the version of command line get is logged into the Jenkins build log that is actually quite precious information. Oh, here, let's just do CI Jenkins.io that'll be good enough. So for instance, let's look at this plug in here. When it performs a checkout in the log we're going to see Oh, it's even using JGit so that doesn't help me. Okay, let's use something else like this one. But what it does is it reports the command line get version, and by reporting the command line get version. I'm able to diagnose quite a number of problems, much more easily so you have my full support for logging the version of command line get that's being used in the, in the, in the task scheduling logging. Absolutely. Okay, so now I have a doubt regarding, you know, logging. So, like, when I log it, will I be displaying it where where would I be displaying or would I be storing it in a file or would I be displaying it in the terminal. Excellent question. Very good question. Are you okay if I show a demo of how logging works in Jenkins and why I think it's so great. Yeah, sure, sure. Okay, so, so this is my, my Jenkins controller. And, and what I want to show you now, sorry it's running dark mode is dark mode. Okay. Yeah, thanks. Okay. So, so here is my Jenkins controller. And it has some interesting jobs on it. If I go if I want to change what's happened or if I want to see what's happening with logging, I go to manage Jenkins. And now if I scroll downwards there will be a system log thing here. So, the system log gives me access to, to Jenkins log messages from the web page. So when I click all Jenkins logs, it shows me. Oh, here it was upgrading Jenkins last was 356 we're running 357. And it, it talks about oh hey I loaded an attached plugin this thing. And now it's reconnecting agents so so the logging is is already available to me from the web UI so you can see what's happening. Now the, the more elegant thing here is that maybe I need something even more detailed. So I can go to log recorders. And I can add a new log recorder and I'm going to call it get SCM. So I'm going to log something from get that well it's, let's choose a better one maybe we should choose. Let's look for one that will logger. Okay, so Warren tempter value sample. So these are tests. I would like something in Maine, here we go. Yeah, there we go. Okay so in get tool configurator. Let's see if we can find something that it might tell us logged. Now this may be too. Yes, and to I need something much more verbose just a minute. Let's do a quick search. That might be good enough. So let's just turn on the logger for get SCM. And we're going to go so get SCM I'm going to say create a new log a new this is creating a new logger, and it says alright what, what would I like. And I'm going to say I want the class that I'm logging to be this one. So else. Now it will help me along the way and I like that it helps me. So I'm going to say Hudson dot plugins dot. I'm going to say it again it was Hudson dot plugins dot get. Get SCM so here it is prompting me along the way. And I would like finer logging which is as is dangerously close to as verbose as you can get. I haven't run this for a long time because this could potentially slow things down and be rather painful, but now while that's that's set to do logging.  Maybe hosting providers get hub. And I'm going to build each of these jobs. So now that the build has started, we should see in their logs. Oh, except it's not. Okay, this one's running. And it's performing some operations. Good. Now let's see if anybody else is running. Okay this one's cute so this one has run today. Good. So now if we go back here and look at log records. This is something that it logged it says not adding get tag action to build nine. Likewise to build 24, and it performed a checkout. So that's how I see the logs. So if I were to add new logging statements, the output will appear here or if I want to. Maybe I want to do. Let's look at the log on the maintenance task right so let's check out this one. Okay, so now is there something that we where we might benefit from a log entry. Yeah, for instance, you might choose, hey, to log something at fine. The size of the cash entries, something like that. Hey, returned this many cash entries and you could do that here. That kind of thing and then you would see it by turning on the logging for abstract get a CM source. Okay. So does, does that address your question. One, then I have a doubt like now what do I have to consider like to log, like, what kind of information should I log into the using the log. Like do I have to like log all the procedure whatever is happening or like. I think it's up to you. My, my, my past experience was, I seem to have made the continual mistake of never logging enough. It may sound really terrible but but very frequently when I've, when I'm when someone is reporting a problem that's out in the world and saying hey, I'm running Jenkins in this in some environment. And of course they never tell us all the details of their environment they never tell us nearly enough. They tell us, hey I'm running this and I've got this problem. And if I could have said, hey, turn on to increase the logging level of this class, so that we can see what happens on your system, I would have been, it would have been much easier to diagnose the problem. So, so for me at least I found that the more I do this the more often I'll put simple little statements in that tell me how things are progressing so that I can know it and put them at a relatively fine grain logging level so that they're not on by default. So they're not costing anything, but if I needed to ask someone hey please turn up the logging on this thing, they've already got the code, and I'm not having to deploy have them deploy a new debug build to get it. Okay, so I can use that logging level and then find grain based on what has to be displayed and what doesn't. So, so that one of the techniques that I found for me most recently helpful was, I would put the logging statements in there. And then actually turn the logging on to watch for myself that the code was executing the way I expected, without using a debugger to do it. And it turned out it as it's the result for me was it's easier than for me to know that logging is useful, and it's saying the right thing, and the code is executing the right thing. Okay, so that kind of helps me. Oh, I have another doubt here, like if you go to the task scheduler class. Okay, there's a class task scheduler. There I have a try catch. Okay, and now it was assumed like for some reason there's an error which has been thrown. What do I do with that error do I just log it or because I can't connect it with the UI because the UI is now a separate entity here. So, what do I do with that do I just log it or for now for for now I think yeah you should just log it. Now, ultimately, we may want in in a later part of the project for you to give a location on the UI where we can show that to users, because there certainly are locations in Jenkins where people can see diagnostic information right that that logging page is one example of diagnostics. This support core page is another that can give give diagnostic help. So, so for now, I would just write it to the log. And then in the future, if, if things continue is at the pace you're going, we may have enough time that you'll be able to add that as a feature into the into the page Jenkins page that you're creating. Okay. So, okay, so yeah, so that that was one thing I was like, you know, not sure what to do about. Okay. And does my answer help there or do we need to discuss further. No, no, that thing actually absolutely. Yeah. One more thing. Can you act. So when I am using this incremental build. Okay. My ID is not a supporting, you know, one or two dependencies like the jg dependencies and being supported like only the ID but when I am building the project is running. It is successful, but the ID throws a lot of errors like I'm using IntelliJ right now. It says jagged, you know dependency not found, and then all kind of red files and deadlines everywhere. It doesn't let me run the test. Okay, so you may want to so there if you're willing, post post that as a question to the Jenkins developer list, because there are many, many people who are using IntelliJ. And, and they should they'll probably be able to give you much better guidance that I could. I'm not an IntelliJ user. And because I'm not an IntelliJ user and, and I don't spend nearly enough time in the ID anyway. So, so my problem is, I'm also not a full time developer. I manage professionally and so development is my hobby. And therefore, I'm not a good voice to tell you how to configure IntelliJ but there are lots of people who are using IntelliJ and they should be able to, to answer oh you need to do this magic step or that magic step. I thought there was some, some configuration or some compilation thing that you have to do in order to make it, make it find all the things that you're seeking. So, I think I'll send a mail. And then, you know, I think that could help me out because I wasn't able to test anything then I had to use the previous version of it and comment all these to test the things and then I can then comment it. So, yeah. And I have a doubt or regard, like, if can you open the file, you know, a task executor file, you know, the class. Sure. You bet. So task executor. So here, if you can scroll down the get get client method, the get get client method here, it takes in, you know, get utils dot resolve get tool. So based on this parameter that is default, I get the default, you know, get tool on the Jenkins controller. But now here I only want to get, you know, a CLI get okay. So, what is the parameter I need to pass here only to get a get CLI like CLI command command. Yeah, it's a good question. I'm not sure if there, if there is a way from here to to say please give me command line get because because this thing. Good observation on your part. This thing says, ask the Jenkins controller for its default get implementation, and they default get implementation could be configured to be J get. Yeah, we have, we have CI that Jenkins that IO for instance that I believe is configured exactly that way, where it's intentionally using J get rather than command line get. So, so let's see what we okay so how would we. Let's see. Maybe there's somebody already doing this. Okay, so we're at least doing instance of checks. And we're doing casts. So there are some things that know how to. Yeah, okay. Oh, look. So maybe this is already. The thing that you need without having to put the command line method inside command line get, or inside the get plugin. Look at this thing right here line here, just do it like this line 115. So what it does. Because CLI get API implementation is a. Oh, that's terrifying. CLI get API implementation is a public class. It can be used and that's what it's doing here so it's taking. In this case it's trusting that the get client can be cast in this case safely to a CLI get API implementation. There must be something else elsewhere here that guarantees that that that works. I have no idea. I haven't looked at the code recently to see how it does that but, but this thing is being converted to a command line get implementation. Now is that is that a valid cast. Yeah, the get client know the CLI API, the implementation, you know that implements this interface. Okay, and the get client plugin that I have seen. Okay. All right so then this so this would at least if you if you can if the logic you need to express in your version check can be expressed as a. If you use it at least this version, then you you could probably use this technique so long as you can, you can be assured and, and you could certainly do a right you could do a. Let's put it in here. I actually didn't understand this techniques. Get instance of something like this where you say hey, I'm going to check that get client, or is implementing whatever the whatever the construct is linguistically check to see is it the right type is the cast safe and if it is. Then this thing just cast it and decides yes that's okay. What am I broken here. Apparently, I have lost the ability to write decent code. There we go. Okay. But in my thing I will I would like I am constructing the get client, you know, the get client here whatever the type. Okay, so can I directly, you know, converted to CLI get API. If it is of if it is an instance of CLI get API input yes. Okay. Okay. So so I would be taking the default only then. So, you know, well and that's where we've got to find the answer to your question. Right, how do we how do we ask for, or, or maybe, maybe it's different. Maybe. Well, let's see. Yeah, I mean, if, if, yeah, wait a sec, wait a sec, isn't don't we I think we have the answer here. If the controller is configured to have J get as its default implementation and has no other implementation of get, we can't run maintenance. Right, because we were blocked. So, so I would think what that means is you want to ask for default. And if default is not an instance of CLI get, then we can't run maintenance. Okay, but then on an administrator, you know, wants to set J get as his default but you know, and still has CLI get on his machine. Then what we would need to do is, if it's possible, is it possible to iterate over the, the implementations. I don't remember. I thought there was a facility that would allow iteration over the, the get implementations. Let's see that was get tool wasn't it. Task executor, this one. So if we take a quick look at get utils and is get utils in this cloud. Okay, now I really need my just a minute. Get Alice files. Now I have my index ready. So this one. Okay, so get utils. So here is a constructor resolved by name. And we would need to ask on the built in agent. I use the next next method. Yeah, but I think I think in your case don't you really want to check for it on the built in. Because if you're node agnostic, that may not be available on the controller right. What exactly is not agnostic here. So what what node agnostic is trying to say is list list me a get tool that's available. I don't know which node I'll be on. But you know which node you'll be on because you want to execute on. So here it says, when you know the node you're going to be on and you do because you want to be running on built in you want to be running on the central controller nowhere else. And so in that case it's saying hey you want to use this thing and as the node value you want to get the default, the built in node and there's a, there's a method on the Jenkins object that will tell you give you a node for the built in node. I don't know if that helped but but I think the question we were trying to ask is, is there a way to get the list of all tools and I do. I don't know of a way. Because I've seen in the UI you can set various kinds of, you know, get versions also CLI get version at a 2.3 version at 2.1 version to, you know, 1.8 version so now which version do I use internally. Right exactly well so so and and wouldn't just looking at this code. Wouldn't you want to pass in the get tool as null so that you always call get tool dot get default installation, rather than using the word default rather than using the string default. Like, like you did, why not just allow this method that you're calling. If we call it with null. Interesting yeah and this does the same thing. So if you call it with get tool equals no. Then you're going to. It will call its own get the default installation without you and having to know the string that describes what is the default installation. In this case, as if any administrator uses a default implementation as J get he can't they can't run maintenance tasks right. That that's what that's yeah that I think I would take that as a safe assumption for now. Because we we really cannot do maintenance with J get. And if they're going to choose to use J get as their default implementation, and we the get plug in documentation tells them that the canonical the reference implementation for the get plug in is command line get. It has known limitations, they are welcome to use it but it has no limitations if they use it they choose to accept those limitations compared to command line get. Okay, so, okay, so yeah, okay that that thing answers my question then so I'll be using the default implement you know the default get tool which is used Jenkins and based on that I can schedule the maintenance tasks or throw a log error saying you know update so do right. You're not. I cannot. The message, the message really is I cannot run maintenance with J get. And realistically we can't I don't. I think even though J get implements garbage collection.  I'd much rather we just use command line get for all of it. So in the gets CLI the get client tool, sorry in the get client plugin, wherever there's a you know I implement the methods maintenance. Okay, do I like just return null or do I just log something there and leave it like in the get client. Yes, I think that makes sense just if someone if someone attempts to perform a maintenance operation using J get just say unsupported. And, and I would do it by logging rather than I think it's better to do it by logging than by than by throwing an exception, but if you look in the get client plugin you'll see both both techniques used. Sometimes when a request to do something is silently ignored. And there are other times where request to do something that J get can't do throws an immediate exception, and I think users have been better satisfied by the silence, then they have by by throwing the exception. Let's see, I think if we look here we can see some examples. Okay, so. Oh, well, yeah these these give us some hints. Now they're only tests. Okay, let's do that maybe there we go. Yeah, here's an example. If you attempt to do a sparse checkout with J get. It will tell you sorry, J get doesn't the J get implementation Jenkins does not support sparse checkout, or here's a I think a more friendly way to do it. This one throws an exception. And that's, that's not very friendly to the user, but it makes sure they know you asked for something that can't be done. This one is I think more friendly to the user it says you asked for large file support, but our J get implementation does not support large file support. Okay. Yeah, yeah that that answered my question. I have another doubt. How is a task listener similar to a logger or how was it different from logger. Yeah, so it's the same. No it has it has some very important differences task listeners are intended for things that might fail. And they are it is a way to log at something lower than the system level for a thing that might fail like a build. So in the case of in the case of the get client, most of the references to a listener are being written directly to the build log. So this message warning J get doesn't support LFS checkout is written to the build log of the job job that attempted to use it. You know now I'm kind of confused should I use the locker or do I have to use a task listener. If, if a task listener is available, you're welcome to use a task listener but the maintenance tasks probably won't have a task listener will there because they're they because I didn't, I didn't think anyway that you had implemented anything that would let it have the concept of a of a task a set of tasks that you're running as separate things right I thought you were just run it and log it and therefore for that you need to use the system Yes, okay so I yeah there's nothing like I am not getting anything like a task listener from any class which I am using so I have nothing like I don't have a task listener, but however I have to pass a task listener to the get, you know, CLI, you know CLI command line get. So I, for now I, you know, parser empty tasks on all tasks listener. So, oh, oh, and, and that's one where you may want to rather than pass an empty task listener, you might want to pass a task listener that would allow you to take the results and send them to a logger. A system level logger. Can you repeat that once again. So, so you've got a task listener. You've so the get client takes task listeners right and it will log to that task listener, and you might want to pass in a task listener that will let you optionally write the results to the system log, so that you can see it because you don't really have a concept of a task yet, at least. And, and so, but writing the information that the get client would be logging to the system log may be helpful. Okay. So basically it would be similar to the log which we were using above rate at the normal log. That was the idea at least that I had you, you probably want to check it to be sure hey does it behave that way. But I think that's, it's worth trying that because having this kind of message appear in your system log for maintenance tasks could be very helpful. And it could be quite quite a good diagnostic to have to say, oops, there was a problem here somehow or other. J get was an attempt was made to call J get during, during a maintenance task, and then the question is why. Okay, so yeah, okay, I understand the flow right now so. Okay, so I think I'll create a task listener which you know, I can logs it back you know uses a system log only so that we can log it. Very good. And then there's another. Okay, these are the major questions for this week. One more thing I had a doubt. Now if I build a project right. I'm running all the test cases successfully on my computer, but on the, you know, on GitHub, the tests are failing as one test which is failing in particular. Okay, well so let's take a look. So this is get plug in me bring it over here and let's take a look at the pull request. So it should be the most recent pull request now right which is. I don't remember it's pull request number just to let's look. So is it 1282. Nope, that's not it. Okay, so it must be the other one. Yes. Okay, good. So this one you say is failing tests. Now the question is why test get caches get a CM maintenance test line 63. So this is saying it didn't find the caches. That's really strange because you did create them right I mean that's what this is doing. My local computer is running. Well, so is it failing on a particular Java version. No, it's failing on all, although it is. Okay, so, so it fails on all three configurations only failing on Linux, or on Java 11 and Java eight but it's failing on Java 17. Let's let's do a quick double check just a moment. I'd like to see this in blue ocean, because I have a thought that it may be. Okay, so it passed on Java 17, but the test fail. Oh, I wonder are these run where these running concurrently on the same agent. It could be that one, one of the tests was running in parallel to another, and they trampled on each other's temporary files. Okay, so this 17 was running on Ubuntu 20 Windows eight. Where's Linux, there was the other one so Ubuntu 20, eight C1640. And I don't have an explanation for that failure either. You're okay if we try to run it from my environment. Yeah, sure. Okay, so where is the test test latest test result. Okay, so the thing we want to run is that thing. It's been forever since I've seen a green check okay where all the tests have been passed so well and that's not a good thing right that's a terrible thing so. Alright, so. Okay, no failure there. Why else would that test fail, and it can't be a concurrent thing because it's failing on Windows and we only ever run once on Windows. There must be something else going on. So you may just have to put some debugging statements some printing some output statements to see what the condition is around the system when that fails because that that surprises me. The thing is the test doesn't failing on my computer so I don't even know like what would be there. Right which which means that means you've really got to put debugging print statements and let it run on CI to see if you can identify what's different between your environment and CI dot Jenkins.io because you're right it should fail on your computer as well I mean if there's a if there's a real failure it shouldn't be somehow tied to CI dot Jenkins.io, and it's certainly passing for me on all three all three Java versions. Now maybe there's something about. Is it regarding the fight path or something something which is different on Windows, could be, although I don't see any Oh look, I wonder. It's saying it's using master so it's okay it's not invoking the other problem. It's possible that this message here. I assume this message is probably not happening on your computer is it. I don't know. It's certainly not happening on mine this is a message you get with the latest release of get and on Windows, we're we're using command line get to dot 36 so very a very recent version on Linux. The Linux version is much older, but it's also failing. So when it fails. What's the message on Linux. It's got the same message because it's using a new and yes, it's using a nice new command line get version on Linux as well. Interesting. And the 1717. Good question. Very good. It's also using a new one. This is 11. Oh, whoops. Did I get that. Let's try this again. 118. Okay, 17 passing. It's using the same version and giving the same message. Hmm. So I think you may just have to add some diagnostic print statements to debug by telegram in this case to debug remotely. So I have to add or print or print statements and push my or or logging statements system logger statements that should if I remember I'd appear in the city. Yeah, so in this case these things. I think if you use the logger they will appear but you can check for yourself when you're running. And I have another few more questions. Yes. So, can you open the, you know, task executor test I guess task executor test. Okay, this one. Yeah. Oops. Okay. Oh, here I wanted to use. Can you scroll a bit. Okay, not the task executor. It was sorry get maintenance SCM I guess I named it like that. Yeah, in this one. So the I added the yeah in this only the test is failing. Okay, I added the logic to run this. Okay. And then I go down. Okay. If you go to the next test. Okay. Yeah, I commented this because it's throwing errors. It's like the tests are failing. So here I wanted to test whether there are no caches present on the Jenkins controller. I wanted to verify whether this thing returns no caches. But in the previous method, the previous test already caches were being made. Okay, like created. So now in this whenever I try to run this it throws an error because already there are caches run present on the. No. Yeah, so couldn't you if if you would like to test like that. Can't you do something like this where put that there and then do an app before public void. Erase or destroy caches. And then in this method destroy all the caches. What this would do is say every every test now has to reconstruct its caches. Okay, so before every method runs I think this method would be running right. That's correct right that's what it before does is it says, I want this test I want this public method to be invoked prior to each test that's running this in this file. Okay, so I look into this I'll add this thing so that you know these tests also start, you know, you know, finished. So now I have the, you know, so now this week I'll have to be working on legacy get maintenance. Okay, but for that I would be needing the versions of you know the one which version. I even sent a mail to the, you know, office to the gift in the guitar. For forms. Okay, and then they have given a response, which was very complicated. Okay, they will like go to the get CLI use some command to find in which version it has been released and all. So I couldn't follow with that so because they were you were trying to determine which versions of command line get implemented portions of maintenance. Yes, yes. Right yeah and, and that if it will help you if had we had I given you access to mark PC. Oh, I forgot about you know sending my public key. So if you want to send your public key to me I can give you access to it, at least then you have, then you can access an assortment of get versions it's not all get versions but it's an interesting assortment. And how would I be using it like after I give you the public, after I send you the public key how would I be using that. Then what you would do is you would, you would do this. I'll show what you, well, the easy way is you would do this you'd say SSH. Okay, I'm going to fake your name by saying mine, you would do that. That logs me in. I like after I log in that then like, you know, then what do I do? Well, so then there's an additional argument you add to the command line here which, which is the thing that creates a tunnel. And now I've got to look it up to see what the command line argument is to create a tunnel and I'll, I would include that in my email to you so it's SSH tunnel. Okay, nope. Define a tunnel with SSH. Okay, there we go. Okay. What is an SSH tunnel. How can you use it. And now configure an example here we go. So, okay, forward apart from the client to the server. What I'm going to do here is minus L source port. So, yeah, so I think we would write it like this. It wasn't minus capital L is that what it said. Yeah, yeah. Okay, good so minus capital so do minus capital L. 8080 colon mark dash PC to mark weight net colon. And what this then says is on my computer or 8080 so local host colon 80 will actually be routed to this thing in behind Mark's firewall. Okay. And then, like, how do I determine the bit like there's so many plugins and so many things on your machine right so. Yeah, so then then what you do is is on my computer, you would go here to Jenkins Jenkins home. Oh, and I think mine's turned off right now so let's let's do it this way home. Is it off it is I need to start it. Just a minute. On that computer, or on that on that Jenkins installation. I have assigned labels to the agents that describe precisely the git version that's installed on each agent. So this UI would be coming on mice. It would be right so when you ran local host colon 8080 like that, you would see Jenkins, just like I'm seeing it here. And here we come. So, here then what you would do is you go to build executor status. And let's look at something that has that shows something other than not applicable. So that this is an agent that's connected this edamame. So when I click on that. I see labels that tell me this thing is labeled get one dot eight plus two dot 11 plus one dot night. Oh, there it is get two dot 17. This is the one without a plus. That's the label that's assigned to this agent. And so this, this agent has git version two dot 17 installed on as do several other agents. Now if I look instead at let's look at some other computer like this one. It has git two dot 35 install lot. And then I have to create a job on this, you know, to check whether maintenance us exists or not right. Correct, right. And so then what you would do is, is you create a job like here I've got one right here. Let me maybe we should just create it for you right now. We can already do that. No, we. Yeah, there is get get maintenance help. This one I think is the job we created. Let's see what it says. And it tells us and figure where is that figure. Yeah, so it's, it's actually attempting to do that for me. So, so maybe we've got it started already so get get maintenance help is right here. What we're trying to do is saying get version GC minus minus help. So it's trying maintenance commands to see if we can get output from them. So any changes have to do it in this file right or or you create a job that does these kinds of that's better because I can I can take this exact text. Let's let's do that. Let's take that exact text and create a new copy of this job that's not using. So, new item, get get maintenance help pipeline. So it's a pipeline, and we're going to paste that text there. And I just want to use this. Okay, so what it's going to do now if I got it correct is it's outputting get help. This is easier than you know going through all the five. Well, it at least it gives you some sampling of, hey, there here are some machines that mark has, and these machines that mark has are reporting this. It also gives you a nice indicator with the red square of things that don't have the get maintenance command. Okay. So which which which versions do I have to target like which all versions are present while looking to all of them. I think so because what you need to know is for for okay here on a to mommy, this agent. It failed the job so if we, if we configure that differently we can make it so it doesn't fail but it will still give us the output we need. So if we instead said something like this. All right now that should not fail. But you'll have to read the output for each of those to decide what did it actually do. It says it failed even so. Now shame on me. Okay, there's get click. And get. Why did. Okay so apparently I'm not really good at shell scripting hang on Russia cash let's fix this figure. Okay, here we'll do it. Sorry if this is terribly painful for you to watch me diagnosing my mistake. Okay, so now we try it. That was more what I expected. However, when we look at the output from this top one, what you'll see is it's going to have a message. Okay it says get GC that worked. So GC is available.   So you know for this version get 2.17.1. It doesn't have commit dash graph. Yeah, okay. So I'll try this out if I am facing any problems. You know, send a message in the guitar channel. All right. And finally, as I think I'm digging a lot of time of yours. That's what it is. Now, I've written the code for the maintenance. How do we know like it's properly working and all like do we test it like run it on some caches whichever are present so that you know, we can know whether everything is going. Yes, expected. Yes, and that's where Mark PC to is a good choice because here are some get caches. Okay, so I think that this week I'll add the logs log files. Okay, so that we get that thing. Once that's ready, we can start testing, you know, everything on the system and then check whether everything is working as expected. Yeah, that sounds very good to me. I'll also try adding the, you know, get legacy maintenance, you know, for versions less than 2.30. So that would be the agenda for this week. And I can even next week. Yeah. Very good. Yeah, that that that's it from that those are the questions. Sorry for you know, asking too many questions that you know, at the time. I'm delighted that you're asking questions for you guys this is wonderful thank you for the progress you're making. Let's keep going and, and we'll check in. If you need this this coming weekend is a holiday weekend here in the United States it's a public holiday. And so I will, I'm less likely to be available particularly because my grandchildren will be in town. They'll be visiting here from Texas and so so I if you need help, reach out to Rishabh and see if Rishabh can assist. If neither Rishabh nor I are available. You're welcome to ping me on Gitter and I may check occasionally it just I'll be playing with small children and having a lot of fun. You'll be available next week. Yes, yes, I certainly will be available next week. Oh, thank you. All right. Yeah. Thanks Rishabh anything else. Nothing nothing from my thing. All right, have a great day. Thanks again. Thank you.