рд▓рдХреНрд╖реНрдп рд╢реНрд░реЛрддрд╛, рдкреНрд░реЗрд░рдгрд╛
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ рдордзреНрдпрдо рд╕реНрддрд░ рдкрд░ рдЧрд┐рдЯ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрддрд░ рдкрд░ рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпреВрдирд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред
рдореЗрд░реА рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдХреЛ рд╕рдВрдЧрдардирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдирдП рдирд┐рдпрдореЛрдВ рдХрд╛ рдареАрдХ рд╕реЗ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдЬреНрдЮрд╛рди рдХреЗ рдЖрдзрд╛рд░ рдореЗрдВ рдПрдХ рдкреГрд╖реНрда рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдореИрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЧрдП рдкреБрд╢ рдХреЛ рдЬрдмрд░рди рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкрд╛рдпрдерди рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рднрд╛рд╖рд╛ рдЕрдкрдиреЗ рд╡рд┐рдХрд╕рд┐рдд рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЕрдиреБрднрд╡ рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦрдиреЗ рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рдХреНрд╖реНрдп рд░рдЦрдиреЗ рд╕реЗ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдЬреНрдЮрд╛рдд рдХреЗ рдбрд░ рдХреЛ рдПрдХ рддрд░рдл рд░рдЦрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдЕрдкрд░рд┐рдЪрд┐рдд рднрд╛рд╖рд╛ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдЙрдкрдХреНрд░рдо рдХрд┐рдпрд╛ред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░ рджреВрдВрдЧрд╛ рдХрд┐ рдкреЛрд╕реНрдЯ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рдЖрдк рдкрд╛рда рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
Git Interceptors
Git рд╕рд┐рд╕реНрдЯрдо рд╣реБрдХ рдХрд╛ рдПрдХ рд╕рдореГрджреНрдз рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╕рд╣реА рд╕рдордп рдкрд░, рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рджреЛрдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдЙрд╕ рдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рд░реНрд╡рд░ рдкрд░
push
рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ
hooks
рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ
update
рдлрд╛рдЗрд▓ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рд╕рд░реНрд╡рд░ рдкрд░ рдзрдХреЗрд▓ рджреА рдЧрдИ рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП рд▓реЙрдиреНрдЪ рдХреА рдЧрдИ рд╣реИред
update
рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ:
- рдЙрд╕ рд╢рд╛рдЦрд╛ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ рдЬрд┐рд╕ рдкрд░
push
рд╣реЛрддрд╛ рд╣реИред push
рд╢рд╛рдЦрд╛ рдореЗрдВ рдЕрдВрддрд┐рдо рдкреНрд░рддрд┐рдмрджреНрдз рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ;- рд╢рд╛рдЦрд╛ рдХреЛ рднреЗрдЬреЗ рдЧрдП рдЕрдВрддрд┐рдо рд╡рдЪрди рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХред
рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рдПрдХ рдкреВрд░реНрдг рдХреЛрдб рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: 0 -
push
рд╕рдХреНрд╖рдо рдХрд░реЗрдВ, 1 - рдЕрдХреНрд╖рдо
push
ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рд╡реЗрдм рдкрд░ рдЙрдЪрд┐рдд рд░рд╛рдп рдФрд░ рдХрдВрдкрдиреА рджреНрд╡рд╛рд░рд╛ рдЕрдкрдирд╛рдИ рдЧрдИ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВред
рд╡реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ:
projectName-taskId action annotation detailsString1 detailsString2 ... detailsStringN
рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг:
projectName-taskId
- рдЬреАрд░рд╛ рдореЗрдВ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ;action
- рд╡реИрдз рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕реВрдЪреА рд╕реЗ рд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╡рдЪрди рдХрд╛ рд╕рд╛рд░ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдкрджрдирд╛рдо: рд╕реБрд╡рд┐рдзрд╛, рдлрд┐рдХреНрд╕, рд╕реНрдЯрд╛рдЗрд▓, рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░, рдЖрджрд┐ред рдпрджрд┐ рдкреНрд░рддрд┐рдмрджреНрдз рдХреЗ рд▓рд┐рдП рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рддреЛ рд╢рдмреНрджреЛрдВ рдХреЛ рдПрдХ рд╕реНрд▓реИрд╢ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд┐рдХреНрд╕ / рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░);annotation
- рдкреНрд░рддрд┐рдмрджреНрдз рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг;- рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреА рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ 100 рд╡рд░реНрдг рд╣реИ;
details
- рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрдиреБрднрд╛рдЧред рдпрд╣ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛рдУрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд░реНрдгрди рд╣реИ (рдЕрдзрд┐рдХрддрдо рд▓рд╛рдЗрди рдХреА рд▓рдВрдмрд╛рдИ 80 рд╡рд░реНрдг рд╣реИ)ред рд╕рдВрджреЗрд╢ рдХреЗ рдЗрд╕ рдЦрдВрдб рдХреЛ рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмреАрдЪ рдПрдХ рдЦрд╛рд▓реА рд▓рд╛рдЗрди рд░рдЦреА рдЧрдИ рд╣реИ;annotation
рдФрд░ details
рдмреАрдЪ рдПрдХ рдЦрд╛рд▓реА рд░реЗрдЦрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдкреНрд░рд╛рд░реВрдк рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЙрднрд░рддрд╛ рд╣реИ:
- рдЙрди рд╕рднреА рдХрдорд┐рдЯреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЬреЛ
push
рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЧрдП рдереЗ (рдпрд╣ git rev-list
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ); - рдкреНрд░рддреНрдпреЗрдХ рд╡рдЪрди рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ (
git cat-file
рдФрд░ sed рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛) рдФрд░ рдкреНрд░рд╛рд░реВрдк рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ (рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛); - рдПрдХ рдкреВрд░реНрдгрддрд╛ рдХреЛрдб рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдФрд░, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдПрдХ рд╕рдВрджреЗрд╢ рдЬреЛ рдпрд╣ рд╕рдордЭрд╛рддрд╛ рд╣реИ рдХрд┐
push
рдХреНрдпреЛрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдкрд╛рдпрдерди рд╕реНрдЯреИрдВрдбрд░реНрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдХреЛрдбрд┐рдВрдЧ
рдпрд╣ рдЦрдВрдб рдорд╛рдирдХ рднрд╛рд╖рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ Git рдХрдорд╛рдВрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдкрд╛рда рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд▓рд┐рдВрдХ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдореБрдЦреНрдп рд▓рд╛рдЗрдиреЗрдВ:
import sys ... if __name__ == "__main__": sys.exit(main())
рдкреНрд░рддреНрдпреЗрдХ .py рдлрд╝рд╛рдЗрд▓ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ - рдбреЗрдЯрд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯред
__name__
рдХреА рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рд╢реЗрд╖ рдорд╛рди
__main__
рд╕реЗрдЯ рд╣реИред рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ,
__name__
рдореЗрдВ рдЖрдпрд╛рддрд┐рдд рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рд╣реЛрдЧрд╛ред рдЙрдкрд░реЛрдХреНрдд рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдлрд╝рд╛рдЗрд▓ рдХреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
sys.exit()
рд╕реНрдХреНрд░рд┐рдкреНрдЯ
sys.exit()
рдХреЛрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ
main()
рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдореБрдЦреНрдп рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрд╕реЛрд▓ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
import subprocess ... def runBash(commandLine): process = subprocess.Popen(commandLine, shell=True, stdout=subprocess.PIPE) out = process.stdout.read().strip() return out
subprocess.Popen()
рдПрдХ рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛрд╕реЗрд╕ рдмрдирд╛рддрд╛ рд╣реИ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рддрд░реНрдХреЛрдВ рдореЗрдВ рджреА рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд╛рдирдХ рдХрдорд╛рдВрдб рд╢реЗрд▓ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпреВрдирд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмреИрд╢),
commandLine
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрд╕реЗ
commandLine
, рдХрдорд╛рдВрдб рдХрд╛ рдкрд╛рда рдкрд░рд┐рдгрд╛рдо рдЪрд╛рдЗрд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЦреЛрд▓реЗ рдЧрдП рдЪреИрдирд▓ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд░ рджреА рдЬрд╛рддреА рд╣реИред
strip()
рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдХреЗ рдкреНрд░рдореБрдЦ рдФрд░ рдЕрдиреБрдЧрд╛рдореА рдХреЗ рдмрд┐рдирд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЕрдм,
runBash()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣
runBash()
рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд░рд▓ рд╣реИ:
import sys ... COMMAND_LIST = "git rev-list {}..{}" ... def main(): refOld = sys.argv[2] revNew = sys.argv[3] commits = runBash(COMMAND_LIST.format(refOld, revNew)).split("\n") ... for commit in commits: ...
sys.argv
рд╕рд░рдгреА рдореЗрдВ Git рдХреЛ рдкрд╛рд╕ рдХреА рдЧрдИ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреА рджрд▓реАрд▓реЗрдВ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдлрд╝рдВрдХреНрд╢рди
format()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЧрд┐рдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╛рдо рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рдХреНрд░рдорд╢рдГ, рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдо рд▓рд┐рдЦрдирд╛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕
git config --add project.name HABR
рддрдм рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╛рдо рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
COMMAND_PROJECT_NAME = "git config project.name" ... def getProjectName(): return runBash('git config project.name')
рдПрдХрд▓ рдкреНрд░рддрд┐рдмрджреНрдз рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп:
COMMAND_COMMIT_MESSAGE = "git cat-file commit {} | sed '1,/^$/d'" ... def checkCommit(hash): commitMessage = runBash(COMMAND_COMMIT_MESSAGE.format(hash)) return checkMessage(commitMessage)
рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдВрджреЗрд╢ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреА рдЬрд╛рдБрдЪ:
import re ... def checkFirstLine(line): ... expression = r"^({0}\-\d+ )?({1})(\/({1}))* .*".format( getProjectName(), AVAILABLE_ACTIONS ) if not re.match(expression, line): ...
рдФрд░ рдЖрдЦрд┐рд░реА рдмрд╛рд░реАрдХрд┐рдпрд╛рдБред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкрд╛рдпрдерди рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг 2.7 рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА UTF-8 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрди рджреЛ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рдВрдмрд╛рдИ рдХреЛ
decode()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ:
if len(line.decode("utf-8")) > LENGTH_MAX: ...
рдкрд░реАрдХреНрд╖рдг, рд╕реБрдзрд╛рд░
рдПрдХ
push
рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рджреМрд░рд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рдкрд╣рд▓реЗ рд╣реА рджрд┐рди, рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдерд╛:
fatal: Invalid revision range 0000000000000000000000000000000000000000..b12e460740edf4ea41984a676834bee71479aa52
рдХрдорд┐рдЯ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдереЗ, рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рдереА рдХрд┐ рдПрдХ рдирдИ рд╢рд╛рдЦрд╛ рд╕рд░реНрд╡рд░ рдкрд░ рдзрдХреЗрд▓ рджреА рдЧрдИ рдереАред
git rev-list
рдХрдорд╛рдВрдб рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдореБрдЭреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдерд╛:
import sys ... COMMAND_LIST = "git rev-list {}..{}" COMMAND_FOR_EACH = "git for-each-ref --format='%(objectname)' 'refs/heads/*'" COMMAND_LOG = "git log {} --pretty=%H --not {}" ... ref = sys.argv[1] refOld = sys.argv[2] revNew = sys.argv[3] if refOld == REF_EMPTY: headList = runBash(COMMAND_FOR_EACH) heads = headList.replace(ref + "\n", "").replace("\n", " ") commits = runBash(COMMAND_LOG.format(revNew, heads)).split("\n") else: commits = runBash(COMMAND_LIST.format(refOld, revNew)).split("\n")
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рддрдм рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдерд╛ рдЬрдм рдПрдХ рдирдИ рд╢рд╛рдЦрд╛ рдХреЛ рдмрд┐рдирд╛ рд╣рдВрдЧрд╛рдореЗ рдХреЗ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрд╛ рдЧрдпрд╛:
usage: git cat-file (-t|-s|-e|-p|<type>|--textconv) <object> or: git cat-file (--batch|--batch-check) < <list_of_objects>
рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдорд┐рдЯреНрд╕ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХ рд╕рдлрд▓ рд╕рдорд╛рдкрди рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
for commit in commits: if len(commit) == 0: sys.exit(0)
рдирд┐рд╖реНрдХрд░реНрд╖
рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╛рдпрдерди рдФрд░ рдЧрд┐рдЯ рд╢рд┐рдХреНрд╖рд╛рд░реНрдереА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрдорд┐рдЯ рдореЗрдВ рдирд┐рд╣рд┐рдд XML рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд╛рддрд╛рд╡рд░рдг рдЬрд┐рд╕рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рддреА рд╣реИ:
- рдлреНрд░реАрдмреАрдПрд╕рдбреА 9.1 amd64
- рдЕрдЬрдЧрд░ 2.7.3
- рез. G.реи
рд╕рдВрджрд░реНрдн
рдкреБрдирд╢реНрдЪ
рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдЦрдХ рд╣рдореЗрд╢рд╛ рд╣реАрд░рд╛рдмреЗ рдкрд░ рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдХреЗ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд░рдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреАрдПрдо рдХреЗ рдкрд╛рда рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдЦрд╛рдорд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рднреА рдХрд┐рдпрд╛ред :)
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдореБрдЭреЗ рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╕реБрдирдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА, рд╕рд╛рде рд╣реА рдкрд╛рдпрдерди 3 рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХреИрд╕реЗ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА (рдХреНрдпрд╛ рдореБрдЭреЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
# -*- coding: utf-8 -*-
рдФрд░
decode()
рдХреЙрд▓)?)ред