vrtc / chorus (public) (License: CC0) (since 2023-08-12) (hash sha1)
World of Warcraft add-on stub. The overall goal is to create a specialized raid frame.
List of commits:
Subject Hash Author Date (UTC)
feat: Add solo unit buttons 4658af2b5142ff2ca86c2c4b48577879117a9ecc Vladyslav Bondarenko 2023-08-17 20:38:10
feat: Add power bar to raid unit button b25bd8d28c30cb003bf8cfe2886e2cfd8442d32f Vladyslav Bondarenko 2023-08-17 18:48:29
feat!: Add basic raid frame stub 66e27810a396b564cf7cd737e1f402f4f433b879 Vladyslav Bondarenko 2023-08-17 17:40:08
feat: Add raid frame stub 5fd737cef8e3fc700bab1e6a89ceb68c21495eea Vladyslav Bondarenko 2023-08-16 02:35:08
fix: Show auras correctly at startup 54136c9cedf83fa2a8559b879ab8410a6e28646c Vladyslav Bondarenko 2023-08-15 19:15:48
fix!: Shadowing correct functions 53991b2f7093e765993f8423377602ca22e234da Vladyslav Bondarenko 2023-08-15 18:22:56
fix: Add UnitClass shadowing local e87c61c3cae4cdb945714c67259a6304201968d0 Vladyslav Bondarenko 2023-08-15 18:21:32
feat!: Add unit name b8358f834b4a9c25a6d057d91ed56e3b4d7dc320 Vladyslav Bondarenko 2023-08-15 18:21:12
feat!: Add power bar 654fe43cb55a0e440bdead43d86e3d49bf331c3a Vladyslav Bondarenko 2023-08-15 17:43:59
feat!: Add health bar 16bcad2d2169a7caa2a0f17513202673d178fa98 Vladyslav Bondarenko 2023-08-14 21:59:43
feat!: Add target aura tracker 96105088fc793845cde21639e0221b82de897262 Vladyslav Bondarenko 2023-08-12 21:49:26
Commit 4658af2b5142ff2ca86c2c4b48577879117a9ecc - feat: Add solo unit buttons
Add player, target and focus unit buttons. Fixes some minor issues with
progress frame and aura frame, making them more robust.

There are still issues with aura frames not showing correctly in raid
frames.

There is still no unit popup context menu.

No effort was made to replace native PlayerFrame, TargetFrame etc.

It's an idea to upgrade ChorusAuraFrame to dynamically adjust the
quantity of visible aura buttons according to the size of the parent
frame.
Author: Vladyslav Bondarenko
Author date (UTC): 2023-08-17 20:38
Committer name: Vladyslav Bondarenko
Committer date (UTC): 2023-08-17 20:38
Parent(s): b25bd8d28c30cb003bf8cfe2886e2cfd8442d32f
Signer:
Signing key: EFF9624877D25D02
Signing status: E
Tree: ee311376ae6f85730f2a29097c402659953aaae6
File Lines added Lines deleted
etc/luacheckrc.lua 2 0
src/ChorusAuraButtonTemplate.lua 23 10
src/ChorusAuraFrameTemplate.lua 17 1
src/ChorusProgressFrameTemplate.lua 14 18
src/ChorusProgressFrameTemplate.xml 0 15
src/ChorusRaidUnitButtonTemplate.lua 3 1
src/ChorusRaidUnitButtonTemplate.xml 15 9
src/ChorusTestFrame.xml 65 3
File etc/luacheckrc.lua changed (mode: 100644) (index 46736be..a204806)
... ... stds.wow = {
21 21 'UnitIsEnemy', 'UnitIsEnemy',
22 22 'UnitIsFriend', 'UnitIsFriend',
23 23 'UnitIsGhost', 'UnitIsGhost',
24 'UnitIsPlayer',
25 'UnitName',
24 26 'UnitPower', 'UnitPower',
25 27 'UnitPowerMax', 'UnitPowerMax',
26 28 'UnitPowerType', 'UnitPowerType',
File src/ChorusAuraButtonTemplate.lua changed (mode: 100644) (index b760491..a9ce20b)
... ... local UnitExists = UnitExists
5 5
6 6 local Chorus = Chorus local Chorus = Chorus
7 7
8 local function getUnit(f)
9 local p = f:GetParent()
10 local u = f.unit or f:GetAttribute('unit')
11 if not u and p then
12 u = p.unit or p:GetAttribute('unit')
13 end
14 return u
15 end
16
8 17 local function auraButtonValidate(auraButton) local function auraButtonValidate(auraButton)
9 18 assert(auraButton ~= nil) assert(auraButton ~= nil)
10 19
 
... ... local function applyOverlay(auraButton, category)
65 74
66 75 local overlay = auraButton.overlay local overlay = auraButton.overlay
67 76 assert(overlay ~= nil) assert(overlay ~= nil)
68
69 overlay:SetVertexColor(r, g, b)
70 77
78 overlay:SetVertexColor(r, g, b)
71 79 end end
72 80
73 81 local function applyDuration(auraButton, now, durationSec, expirationInstance) local function applyDuration(auraButton, now, durationSec, expirationInstance)
 
... ... local function applyDuration(auraButton, now, durationSec, expirationInstance)
112 120 end end
113 121
114 122 local function auraButtonUpdateProcessor(self) local function auraButtonUpdateProcessor(self)
115 if not self.unit or not self.index then
123 local unitDesignation = getUnit(self)
124 if not unitDesignation or not self.index then
116 125 return return
117 126 end end
118 local name, _, _, _, _, durationSec, expirationInstance = UnitAura(self.unit, self.index, self.filter)
127 local name, _, _, _, _, durationSec, expirationInstance = UnitAura(unitDesignation, self.index, self.filter)
119 128 if not name then if not name then
120 129 return return
121 130 end end
 
... ... local function apply(auraButton, unitDesignation, auraIndex, filter)
184 193 return return
185 194 end end
186 195
187 local name, _, artworkFile, quantity, category, durationSec, expirationInstance, owner = UnitAura(unitDesignation, auraIndex, filter)
196 local name, _, artworkFile, _, category, durationSec, expirationInstance,
197 owner = UnitAura(unitDesignation, auraIndex, filter)
188 198 if name then if name then
189 199 auraButton:Show() auraButton:Show()
190 200 auraButton:SetScript('OnUpdate', auraButtonUpdateProcessor) auraButton:SetScript('OnUpdate', auraButtonUpdateProcessor)
 
... ... local function auraButtonEventProcessor(self, eventCategory)
211 221
212 222 local p = self:GetParent() local p = self:GetParent()
213 223
214 local u = self.unit
215 if not u and p then
216 u = p.unit
217 end
218 u = u or 'none'
224 local u = getUnit(self) or 'none'
219 225 assert(u ~= nil) assert(u ~= nil)
220 226 assert('string' == type(u)) assert('string' == type(u))
221 227 u = string.lower(strtrim(u)) u = string.lower(strtrim(u))
222 228 assert(string.len(u) >= 1) assert(string.len(u) >= 1)
223 229 assert(string.len(u) <= 256) assert(string.len(u) <= 256)
224 230
231 if UnitExists(u) then
232 self:Show()
233 else
234 self:Hide()
235 return
236 end
237
225 238 local i = self.index or 0 local i = self.index or 0
226 239 assert(i ~= nil) assert(i ~= nil)
227 240 assert('number' == type(i)) assert('number' == type(i))
File src/ChorusAuraFrameTemplate.lua changed (mode: 100644) (index b29f754..3f93a2c)
... ... local auraWeightMap = {
57 57
58 58 Chorus.auraWeightMap = auraWeightMap Chorus.auraWeightMap = auraWeightMap
59 59
60 local function getUnit(f)
61 local p = f:GetParent()
62 local u = f.unit or f:GetAttribute('unit')
63 if not u and p then
64 u = p.unit or p:GetAttribute('unit')
65 end
66 return u
67 end
68
60 69 local function getAuraWeight(unitDesignation, auraIndex, filter) local function getAuraWeight(unitDesignation, auraIndex, filter)
61 70 local name, _, _, _, category, durationSec, owner = UnitAura(unitDesignation, auraIndex, filter) local name, _, _, _, category, durationSec, owner = UnitAura(unitDesignation, auraIndex, filter)
62 71 if not name then if not name then
 
... ... end
116 125 local function auraFrameEventProcessor(self, eventCategory, ...) local function auraFrameEventProcessor(self, eventCategory, ...)
117 126 assert(self ~= nil) assert(self ~= nil)
118 127
119 local unitDesignation = self.unit or 'none'
128 local unitDesignation = getUnit(self) or 'none'
120 129 assert(unitDesignation ~= nil) assert(unitDesignation ~= nil)
121 130 assert('string' == type(unitDesignation)) assert('string' == type(unitDesignation))
122 131 unitDesignation = string.lower(strtrim(unitDesignation)) unitDesignation = string.lower(strtrim(unitDesignation))
123 132 assert(string.len(unitDesignation) >= 1) assert(string.len(unitDesignation) >= 1)
124 133 assert(string.len(unitDesignation) <= 256) assert(string.len(unitDesignation) <= 256)
125 134
135 if UnitExists(unitDesignation) then
136 self:Show()
137 else
138 self:Hide()
139 return
140 end
141
126 142 if 'UNIT_AURA' == eventCategory then if 'UNIT_AURA' == eventCategory then
127 143 local u = select(1, ...) local u = select(1, ...)
128 144 if u and 'string' == type(u) and unitDesignation ~= u then if u and 'string' == type(u) and unitDesignation ~= u then
File src/ChorusProgressFrameTemplate.lua changed (mode: 100644) (index 920cebf..65c17c2)
... ... local UnitPowerType = UnitPowerType
14 14
15 15 local Chorus = Chorus local Chorus = Chorus
16 16
17 local function getUnit(f)
18 local p = f:GetParent()
19 local u = f.unit or f:GetAttribute('unit')
20 if not u and p then
21 u = p.unit or p:GetAttribute('unit')
22 end
23 return u
24 end
25
17 26 local function validateProgressFrame(self) local function validateProgressFrame(self)
18 27 assert(self ~= nil) assert(self ~= nil)
19 28
 
... ... local function validateProgressFrame(self)
36 45 assert(string.len(strategy) >= 1) assert(string.len(strategy) >= 1)
37 46 assert(string.len(strategy) <= 8192) assert(string.len(strategy) <= 8192)
38 47
39 local unitDesignation = self.unit or 'none'
48 local unitDesignation = getUnit(self) or 'none'
40 49 assert('string' == type(unitDesignation)) assert('string' == type(unitDesignation))
41 50 unitDesignation = string.lower(strtrim(unitDesignation)) unitDesignation = string.lower(strtrim(unitDesignation))
42 51 assert(string.len(unitDesignation) >= 1) assert(string.len(unitDesignation) >= 1)
 
... ... local function progressFrameUpdateProcessor(self)
73 82 artwork:Show() artwork:Show()
74 83 artwork:SetPoint('BOTTOMLEFT', 0, 0) artwork:SetPoint('BOTTOMLEFT', 0, 0)
75 84 artwork:SetPoint('TOPLEFT', 0, 0) artwork:SetPoint('TOPLEFT', 0, 0)
76 artwork:SetWidth(self:GetWidth() * ratio)
85 artwork:SetPoint('BOTTOMRIGHT', self, 'BOTTOMLEFT', self:GetWidth() * ratio, 0)
77 86 else else
78 87 artwork:Hide() artwork:Hide()
79 88 end end
 
... ... end
268 277 local function healthFrameEventProcessor(self) local function healthFrameEventProcessor(self)
269 278 validateProgressFrame(self) validateProgressFrame(self)
270 279
271 local p = self:GetParent()
272
273 local unitDesignation = self.unit
274 if not unitDesignation and p then
275 unitDesignation = unitDesignation or p.unit
276 end
277
278 unitDesignation = unitDesignation or 'none'
280 local unitDesignation = getUnit(self) or 'none'
279 281
280 282 assert(unitDesignation ~= nil) assert(unitDesignation ~= nil)
281 283 assert('string' == type(unitDesignation)) assert('string' == type(unitDesignation))
 
... ... end
341 343 local function powerFrameEventProcessor(self) local function powerFrameEventProcessor(self)
342 344 validateProgressFrame(self) validateProgressFrame(self)
343 345
344 local p = self:GetParent()
345
346 local unitDesignation = self.unit
347 if not unitDesignation and p then
348 unitDesignation = unitDesignation or p.unit or p:GetAttribute('unit')
349 end
346 local unitDesignation = getUnit(self) or 'none'
350 347
351 348 assert(unitDesignation ~= nil) assert(unitDesignation ~= nil)
352 349 assert('string' == type(unitDesignation)) assert('string' == type(unitDesignation))
 
... ... end
433 430 function Chorus.healthFrameMain(self, ...) function Chorus.healthFrameMain(self, ...)
434 431 Chorus.progressFrameMain(self, ...) Chorus.progressFrameMain(self, ...)
435 432 self.strategy = 'UnitIsFriend' self.strategy = 'UnitIsFriend'
436 self.unit = 'none'
437 433 self:SetScript('OnEvent', healthFrameEventProcessor) self:SetScript('OnEvent', healthFrameEventProcessor)
438 434
439 435 self:RegisterEvent('UNIT_HEALTH') self:RegisterEvent('UNIT_HEALTH')
436 --[[ TODO Add health deficit label ]]--
440 437 end end
441 438
442 439 function Chorus.powerFrameMain(self, ...) function Chorus.powerFrameMain(self, ...)
443 440 Chorus.progressFrameMain(self, ...) Chorus.progressFrameMain(self, ...)
444 441 self.strategy = 'UnitPowerType' self.strategy = 'UnitPowerType'
445 self.unit = 'none'
446 442 self:SetScript('OnEvent', powerFrameEventProcessor) self:SetScript('OnEvent', powerFrameEventProcessor)
447 443
448 444 self:RegisterEvent('UNIT_ENERGY') self:RegisterEvent('UNIT_ENERGY')
File src/ChorusProgressFrameTemplate.xml changed (mode: 100644) (index 026906c..07527fe)
2 2 <Ui xmlns="http://www.blizzard.com/wow/ui/"> <Ui xmlns="http://www.blizzard.com/wow/ui/">
3 3 <Script file="ChorusProgressFrameTemplate.lua"/> <Script file="ChorusProgressFrameTemplate.lua"/>
4 4 <Frame name="ChorusProgressFrameTemplate" virtual="true"> <Frame name="ChorusProgressFrameTemplate" virtual="true">
5 <Size>
6 <AbsDimension x="144" y="24"/>
7 </Size>
8 5 <Layers> <Layers>
9 6 <Layer level="ARTWORK"> <Layer level="ARTWORK">
10 7 <Texture name="$parentArtwork" nonBlocking="true" setAllPoints="true"> <Texture name="$parentArtwork" nonBlocking="true" setAllPoints="true">
11 8 <Color r="1" g="0" b="1" a="1"/> <Color r="1" g="0" b="1" a="1"/>
12 <Anchors>
13 <Anchor point="BOTTOMLEFT">
14 <Offset>
15 <AbsDimension x="0" y="0"/>
16 </Offset>
17 </Anchor>
18 <Anchor point="TOPLEFT">
19 <Offset>
20 <AbsDimension x="0" y="0"/>
21 </Offset>
22 </Anchor>
23 </Anchors>
24 9 </Texture> </Texture>
25 10 </Layer> </Layer>
26 11 <Layer level="BACKGROUND"> <Layer level="BACKGROUND">
File src/ChorusRaidUnitButtonTemplate.lua changed (mode: 100644) (index 79ee895..08a5a40)
... ... function Chorus.raidUnitButtonMain(self)
47 47 healthFrame.strategy = 'UnitClass' healthFrame.strategy = 'UnitClass'
48 48
49 49 self:RegisterForClicks('AnyUp') self:RegisterForClicks('AnyUp')
50 self:SetAttribute('unit', 'none')
50
51 51 self:SetAttribute('type1', 'target') self:SetAttribute('type1', 'target')
52
53 Chorus.raidUnitButtonAttributeChangedProcessor(self, 'unit', self:GetAttribute('unit'))
52 54 --[[ TODO Add menu popup for unit frames ]]-- --[[ TODO Add menu popup for unit frames ]]--
53 55 end end
File src/ChorusRaidUnitButtonTemplate.xml changed (mode: 100644) (index 0688b53..be4dbe3)
14 14 </Layers> </Layers>
15 15 <Frames> <Frames>
16 16 <Frame name="$parentUnitNameFrame" inherits="ChorusUnitNameFrameTemplate"> <Frame name="$parentUnitNameFrame" inherits="ChorusUnitNameFrameTemplate">
17 <Size>
18 <AbsDimension x="72" y="24"/>
19 </Size>
20 17 <Anchors> <Anchors>
21 18 <Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
22 19 <Offset> <Offset>
23 20 <AbsDimension x="0" y="0"/> <AbsDimension x="0" y="0"/>
24 21 </Offset> </Offset>
25 22 </Anchor> </Anchor>
23 <Anchor point="BOTTOMRIGHT" relativeTo="$parent" relativePoint="TOPLEFT">
24 <Offset>
25 <AbsDimension x="144" y="-24"/>
26 </Offset>
27 </Anchor>
26 28 </Anchors> </Anchors>
27 29 </Frame> </Frame>
28 30 <Frame name="$parentHealthFrame" inherits="ChorusHealthFrameTemplate" setAllPoints="true"> <Frame name="$parentHealthFrame" inherits="ChorusHealthFrameTemplate" setAllPoints="true">
29 <Size>
30 <AbsDimension x="144" y="36"/>
31 </Size>
32 31 <Anchors> <Anchors>
33 32 <Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
34 33 <Offset> <Offset>
35 34 <AbsDimension x="0" y="0"/> <AbsDimension x="0" y="0"/>
36 35 </Offset> </Offset>
37 36 </Anchor> </Anchor>
37 <Anchor point="BOTTOMRIGHT" relativeTo="$parent" relativePoint="TOPRIGHT">
38 <Offset>
39 <AbsDimension x="0" y="-36"/>
40 </Offset>
41 </Anchor>
38 42 </Anchors> </Anchors>
39 43 </Frame> </Frame>
40 44 <Frame name="$parentPowerFrame" inherits="ChorusPowerFrameTemplate"> <Frame name="$parentPowerFrame" inherits="ChorusPowerFrameTemplate">
41 <Size>
42 <AbsDimension x="144" y="6"/>
43 </Size>
44 45 <Anchors> <Anchors>
45 46 <Anchor point="TOPLEFT" relativeTo="$parentHealthFrame" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="$parentHealthFrame" relativePoint="BOTTOMLEFT">
46 47 <Offset> <Offset>
47 48 <AbsDimension x="0" y="0"/> <AbsDimension x="0" y="0"/>
48 49 </Offset> </Offset>
49 50 </Anchor> </Anchor>
51 <Anchor point="BOTTOMRIGHT" relativeTo="$parentHealthFrame" relativePoint="BOTTOMRIGHT">
52 <Offset>
53 <AbsDimension x="0" y="-6"/>
54 </Offset>
55 </Anchor>
50 56 </Anchors> </Anchors>
51 57 </Frame> </Frame>
52 58 <Frame name="$parentBuffFrame" inherits="ChorusAuraFrameTemplate"> <Frame name="$parentBuffFrame" inherits="ChorusAuraFrameTemplate">
File src/ChorusTestFrame.xml changed (mode: 100644) (index 72d8826..5671905)
32 32 </Frame> </Frame>
33 33 <Frame name="ChorusRaidFrameGroupFrame" inherits="SecureRaidGroupHeaderTemplate" virtual="true"> <Frame name="ChorusRaidFrameGroupFrame" inherits="SecureRaidGroupHeaderTemplate" virtual="true">
34 34 <Size> <Size>
35 <AbsDimension x="800" y="144"/>
35 <AbsDimension x="768" y="144"/>
36 36 </Size> </Size>
37 37 <Attributes> <Attributes>
38 38 <Attribute name="columnAnchorPoint" type="string" value="LEFT"/> <Attribute name="columnAnchorPoint" type="string" value="LEFT"/>
 
46 46 </Frame> </Frame>
47 47 <Frame name="ChorusRaidFrame"> <Frame name="ChorusRaidFrame">
48 48 <Size> <Size>
49 <AbsDimension x="800" y="600"/>
49 <AbsDimension x="768" y="512"/>
50 50 </Size> </Size>
51 51 <Anchors> <Anchors>
52 52 <Anchor point="CENTER"> <Anchor point="CENTER">
 
56 56 </Anchor> </Anchor>
57 57 <Anchor point="BOTTOM"> <Anchor point="BOTTOM">
58 58 <Offset> <Offset>
59 <AbsDimension x="0" y="0"/>
59 <AbsDimension x="0" y="96"/>
60 60 </Offset> </Offset>
61 61 </Anchor> </Anchor>
62 62 </Anchors> </Anchors>
 
189 189
190 190 </Frames> </Frames>
191 191 </Frame> </Frame>
192 <Button name="ChorusPlayerButton" inherits="ChorusRaidUnitButtonTemplate" frameStrata="TOOLTIP">
193 <Size>
194 <AbsDimension x="256" y="96"/>
195 </Size>
196 <Anchors>
197 <Anchor point="CENTER">
198 <Offset>
199 <AbsDimension x="-256" y="0"/>
200 </Offset>
201 </Anchor>
202 <Anchor point="BOTTOM">
203 <Offset>
204 <AbsDimension x="0" y="0"/>
205 </Offset>
206 </Anchor>
207 </Anchors>
208 <Attributes>
209 <Attribute name="unit" type="string" value="player"/>
210 </Attributes>
211 </Button>
212 <Button name="ChorusTargetButton" inherits="ChorusRaidUnitButtonTemplate" frameStrata="TOOLTIP">
213 <Size>
214 <AbsDimension x="256" y="96"/>
215 </Size>
216 <Anchors>
217 <Anchor point="BOTTOMLEFT" relativeTo="ChorusPlayerButton" relativePoint="BOTTOMRIGHT">
218 <Offset>
219 <AbsDimension x="0" y="0"/>
220 </Offset>
221 </Anchor>
222 </Anchors>
223 <Attributes>
224 <Attribute name="unit" type="string" value="target"/>
225 </Attributes>
226 </Button>
227 <Button name="ChorusFocusButton" inherits="ChorusRaidUnitButtonTemplate" frameStrata="TOOLTIP">
228 <Size>
229 <AbsDimension x="256" y="96"/>
230 </Size>
231 <Anchors>
232 <Anchor point="BOTTOMLEFT" relativeTo="ChorusTargetButton" relativePoint="BOTTOMRIGHT">
233 <Offset>
234 <AbsDimension x="0" y="0"/>
235 </Offset>
236 </Anchor>
237 </Anchors>
238 <Attributes>
239 <Attribute name="unit" type="string" value="focus"/>
240 </Attributes>
241 </Button>
192 242 <Frame name="ChorusTestFrame"> <Frame name="ChorusTestFrame">
193 243 <Size> <Size>
194 244 <AbsDimension x="800" y="600"/> <AbsDimension x="800" y="600"/>
 
202 252 </Anchors> </Anchors>
203 253 <Scripts> <Scripts>
204 254 <OnLoad> <OnLoad>
255 ChorusPlayerButtonBuffFrame.filter = 'HELPFUL'
256 ChorusPlayerButtonDebuffFrame.filter = 'HARMFUL'
257 ChorusPlayerButtonHealthFrame.strategy = 'UnitClass'
258
259 ChorusTargetButtonBuffFrame.filter = 'HELPFUL'
260 ChorusTargetButtonDebuffFrame.filter = 'HARMFUL'
261 ChorusTargetButtonHealthFrame.strategy = 'UnitIsFriend'
262
263 ChorusFocusButtonBuffFrame.filter = 'HELPFUL'
264 ChorusFocusButtonDebuffFrame.filter = 'HARMFUL'
265 ChorusFocusButtonHealthFrame.strategy = 'UnitIsFriend'
266
205 267 ChorusSoloFrame:Show(); ChorusSoloFrame:Show();
206 268
207 269 ChorusPartyFrame:Show(); ChorusPartyFrame:Show();
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/vrtc/chorus

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/vrtc/chorus

Clone this repository using git:
git clone git://git.rocketgit.com/user/vrtc/chorus

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main