mergiraf - AST-Oorun irinṣẹ idapọmọra ọna mẹta ni Git

Itusilẹ ti iṣẹ akanṣe mergiraf 0.4 ni a ti tẹjade, idagbasoke awakọ kan fun Git pẹlu imuse ti iṣeeṣe ti idapọmọra-ọna mẹta. Mergiraf ṣe atilẹyin ipinnu ipinnu ọpọlọpọ awọn iru awọn ija apapọ ati pe o le ṣee lo fun ọpọlọpọ awọn ede siseto ati awọn ọna kika faili. O ṣee ṣe lati pe mergiraf lọtọ lati mu awọn ija ti o waye nigbati o ba n ṣiṣẹ pẹlu Git boṣewa, tabi rọpo olutọju apapọ ni Git lati faagun awọn agbara ti awọn aṣẹ bii apapọ, ipadabọ, ipilẹ ati ṣẹẹri-gbe. Awọn koodu ti wa ni pin labẹ awọn GPLv3 iwe-ašẹ. Ẹya tuntun ṣe afikun atilẹyin fun Python, TOML, Scala ati awọn ede Typescript, ati awọn iṣapeye iṣẹ.

Ni isalẹ ni apejuwe alaye ti awọn iṣoro ti a yanju nipa lilo mergiraf:

Software jẹ apẹẹrẹ akọkọ ti eto eka pupọ. Complex awọn ọna šiše ni ohun kan ninu wọpọ - ti won wa ni COMPLEX - ati awọn ti o ko ba le reti awọn eka ihuwasi ti o fẹ lati ṣẹlẹ nipa anfani. Dipo, awọn ọna ṣiṣe wọnyi wa lori akoko, ni igbese nipa igbese, ati pe iyipada kọọkan ni idanwo ni pẹkipẹki ni ipele kọọkan. Lati ṣaṣeyọri eyi, eto ti a ti ṣalaye daradara ati awọn irinṣẹ ti o yẹ ni a nilo. Awọn itankalẹ ti eyikeyi eka eto le wa ni wiwo bi igi ti a darí, ibi ti awọn root ti wa ni sofo ti ṣeto ti awọn iṣẹ ati ipade kọọkan-ayafi awọn root-jẹ abajade ti a lilo a iyipada si awọn obi rẹ.

Ni ipo ti awọn ọja, ipade kọọkan ni a pe ni “ẹya,” eyiti o duro fun eto iṣẹ kan pato ati awọn iṣẹ-egboogi. Eyikeyi iyipada si eto yii ni a ka si iyipada kan, ti o n ṣe eti kan ninu aworan acyclic ti a dari wa. Awọn wọnyi ni awọn iṣẹ ni o wa inherently áljẹbrà; wọn ko ṣe afihan taara awọn ọna ti awọn ọna ṣiṣe ti ara ṣiṣẹ, ṣugbọn kuku ṣe afihan bi awọn aṣoju ti oye ṣe akiyesi iwulo ti awọn eto wọnyẹn. Lati tumọ awọn imọran sinu awọn imuse gidi-aye, o nilo lati yi awọn apa aso rẹ soke ki o si lọ sinu * to * awọn alaye ipele kekere ti o le ṣafihan ati ṣalaye ni pato bi awọn nkan ṣe n ṣiṣẹ. Ninu idagbasoke sọfitiwia, awọn ipele kekere wọnyi nigbagbogbo jẹ aṣoju nipasẹ koodu orisun.

Lati maa gba koodu orisun wọn sinu ipo ti o ṣe afihan ihuwasi ti o fẹ, ati lati ṣe akosile bi wọn ṣe de ibẹ, awọn olupilẹṣẹ ṣe aṣoju iṣẹ wọn ni awọn ofin ti awọn aworan ati awọn iyipada. Aworan kan duro fun ipo ọja kan pato pẹlu gbogbo awọn alaye ipele-kekere, lakoko ti iyipada kan ṣe aṣoju iyipada laarin awọn aworan. Ni deede awọn aworan ifaworanhan jẹ jijẹ nipasẹ awọn iyipada ẹyọkan si awọn obi wọn, nitorinaa awọn aworan ifaworanhan wọnyi fẹrẹ jẹ aami nigbagbogbo bi ṣiṣe awọn iyipada ti o ṣẹda wọn, nitorinaa awọn ofin nigbagbogbo lo ni paarọ.

Nigba miiran awọn aworan ifaworanhan wa ti o gba bi abajade ti awọn iyipada pupọ - awọn ifarapọ idapọ. Wọn nira lati ṣiṣẹ pẹlu wọn, nitorinaa a yago fun wọn nigbagbogbo. Awọn eto iṣakoso ẹya orisun ṣiṣi ode oni bii Git pese awọn agbara ipilẹ pupọ fun ṣiṣakoso awọn iṣan-iṣẹ idagbasoke. Wọn gba awọn olupilẹṣẹ laaye lati ṣeto awọn aworan aworan bi awọn aworan acyclic ti a ṣe itọsọna, ṣe alaye wọn pẹlu awọn asọye, ati tunto wọn bi o ti nilo.

Iṣẹ ṣiṣe yii ngbanilaaye awọn olupilẹṣẹ lati kọ itan-itumọ itumọ itumọ ti iṣẹ akanṣe naa, eyiti o ṣe pataki fun ṣiṣatunṣe ati idahun awọn ibeere bii “Kini idi ti alaye ipele-kekere yii (fun apẹẹrẹ oniyipada) ṣe afihan?”, “O fẹrẹ to ipin kini ilowosi mi si iṣẹ akanṣe yii jẹ ?”, “Tani ti gepa nipasẹ awọn imuse bukumaaki ati nigbawo?”,” “Iyipada ipele kekere wo ni o fọ iṣẹ yii (botilẹjẹpe o dabi pe ko yẹ ki o ni, a ṣayẹwo ohun gbogbo!?)”

Awọn ọna ṣiṣe iṣakoso ẹya ṣe afikun eyi pẹlu imọran ti ẹka kan, imọran ipele-kekere ti o tumọ nirọrun nkan kan ti itan-akọọlẹ ipele kekere ti iṣẹ akanṣe kan ti o ni itumọ itumọ si olupilẹṣẹ. Awọn ẹka ni a maa n lo fun awọn imuse kan pato ti awọn ẹya, nigbakan awọn ẹka pupọ ni a ṣẹda fun awọn imuse oludije ti ẹya kanna. Lilo awọn iṣan-iṣẹ iṣẹ ti ẹka (eyiti o jẹ adaṣe akọkọ ati boṣewa idagbasoke, ti a lo nibi gbogbo ati ibi gbogbo), olupilẹṣẹ kọọkan le ṣakoso ni imunadoko ọpọlọpọ awọn ẹka ikọlu ti iṣẹ akanṣe kan, ọkọọkan eyiti o yatọ ni idagbasoke tabi didara. Eyi n gba awọn olupilẹṣẹ laaye lati ṣajọpọ awọn abajade ti ara wọn ati iṣẹ eniyan miiran laisi titẹ ohun gbogbo pẹlu ọwọ ni gbogbo igba.

Ni deede, a ṣẹda ẹka titunto si ti o nsoju ọja “osise”, lati inu eyiti awọn ẹka ẹka fun ẹya kọọkan, eyiti o jẹ deede (apere lẹhin gbogbo adehun) ṣiṣẹpọ pẹlu ẹka akọkọ, gbigba awọn oludasilẹ lati ṣiṣẹ pẹlu ẹya tuntun ti ọja naa ati nigbakanna awọn ẹya ti wọn fẹ ni idagbasoke lọwọlọwọ nipasẹ wiwa awọn iṣoro ti o waye lati awọn iṣe ti awọn olupilẹṣẹ miiran ni kutukutu bi o ti ṣee.

Nigbati o ba n gbiyanju lati darapo awọn iṣẹ ti o yatọ si snapshots (eyiti o jẹ wiwa baba ti o wọpọ, ati lilo awọn iyipada ti o ṣe agbekalẹ wọn, ni atẹlera lori oke miiran, iṣẹ yii ni a pe ni rebase, dapọ jẹ bi isọdọtun, o kan ṣe agbekalẹ adehun naa. awọn aworan ti o yatọ, bi abajade ti o jẹ ki o rọrun fun wọn lati ṣe afọwọyi, nitorina wọn gbiyanju lati kọ awọn iṣọpọ silẹ ni ojurere ti awọn atunṣe) awọn iṣoro dide. Awọn ọna ṣiṣe iṣakoso ẹya ode oni (VCS) lo awọn algoridimu ti o dapọ ti inu ti o rọrun pin awọn faili si awọn laini kọọkan, tọju laini kọọkan bi ohun kikọ ati awọn faili bi awọn ọna ti wọn, ati lẹhinna lo awọn algoridimu lati dapọ wọn ti o wa lati bioinformatics.

Laanu, aṣoju ila-ila-ila ti koodu orisun ko ni nkankan lati ṣe pẹlu akoonu rẹ. Awọn anfani rẹ nikan ni pe o rọrun ati gbogbo agbaye. Aiṣedeede nyorisi awọn ija, jijẹ orisun efori nigbagbogbo fun awọn olupilẹṣẹ. Ipinnu rogbodiyan nilo olupilẹṣẹ lati farabalẹ ṣe iwadi awọn ẹya mejeeji ti koodu naa, kii ṣe awọn apakan ti a pinnu nipasẹ laini laini algoridimu bi “iyipada” tabi “ija,” ṣugbọn o ṣee ṣe gbogbo iṣẹ akanṣe naa.

Olùgbéejáde gbọ́dọ̀ lóye àwọn ìyípadà náà, kọ koodu àkópọ̀ pẹ̀lú ọwọ́, kí o sì yanjú àwọn àìṣedéédéé èyíkéyìí. Awọn iṣoro naa paapaa ni iṣoro diẹ sii nigbati ọpa ila-laini ṣe afihan awọn iyipada ti ko tọ, eyiti o maa n ṣẹlẹ pẹlu awọn iyipada nla, pẹlu awọn ohun ti o kere julọ gẹgẹbi atunṣe koodu. Ti awọn ayipada atẹle ko ba le lo si koodu ti a dapọ pẹlu ọwọ, ipo naa di alaburuku pipe. Laibikita awọn ọran ti o ni ẹru, algorithm laini-laini ṣiṣẹ ni ọpọlọpọ igba, paapaa ti awọn olupilẹṣẹ ba n gbiyanju lati ma fa awọn iṣoro fun. Ọna kan lati dinku iru awọn iṣoro bẹ ni lati nilo awọn koodu orisun lati ni ilọsiwaju pẹlu awọn irinṣẹ isọdọtun bii dudu.

Nitoribẹẹ, ojutu ti o tọ si awọn ọran ẹru (ati ni gbogbogbo, kii ṣe fun wọn nikan, laini-laini algorithm jẹ heuristic, o le ja si lainidi si koodu ti o fọ, fun apẹẹrẹ, olupilẹṣẹ kan fun lorukọmii oniyipada, ati omiiran ni akoko kanna kowe kan nkan ti koodu titun nipa lilo ti oniyipada, rogbodiyan nibẹ ni yio je ko si dapọ / rebasing nibi, ṣugbọn awọn esi yoo di ti kii-ṣiṣẹ) - yi ni awọn lilo ti awọn ti o tọ ti abẹnu awoṣe.

Bíótilẹ o daju pe iwadi ni agbegbe yii ti nlọ lọwọ fun ọdun 30, ati pe o ti yorisi ẹda ti ọpọlọpọ awọn ọja iṣowo ti ara ẹni, iwadi yii ko ti yipada si awọn ọja orisun ṣiṣi ti o wulo titi laipẹ. Pupọ ti awọn solusan sọfitiwia orisun ṣiṣi bẹrẹ lati dagbasoke ni ibẹrẹ awọn ọdun 2010, ati pe wọn dojukọ ni pataki lori ede Java.

Imuse ọfẹ ti o ṣe pataki julọ ti akoko yẹn, GumTree, ni a ṣẹda nipasẹ oniwadi kan pẹlu ipilẹ ile-ẹkọ kan, ti a kọ ni Java, ni aṣoju inu inu ti ara rẹ ti o ṣaju awọn igi igi, ati pe o ni awọn ẹhin mejeeji ti o da lori igi igi ati ti o da lori awọn irinṣẹ miiran fun orisun sisọ. koodu sinu áljẹbrà asoju. Eto yii le ṣe ipilẹṣẹ nikan (ni irisi akọọlẹ iṣẹlẹ ọrọ kan; API tun wa ti o le ni irọrun pe lati eyikeyi ede ti o ni awọn asopọ si Java) ati wo awọn ayipada. Sibẹsibẹ, fun awọn iyipada ti o dapọ, ati fun wiwo awọn faili iyatọ ti ipilẹṣẹ nipasẹ rẹ, ko wulo lati inu apoti (sibẹsibẹ, o ṣee ṣe pe awọn iyatọ ikojọpọ le ṣee ṣe nipasẹ API).

Ọdọmọkunrin ati imuse ilowo diẹ sii ti difftastic ni a kọ sinu Rust, da lori igi-igi, ati idojukọ lori ṣiṣẹda awọn iyatọ ti o ni afihan ninu console. Eto yii tun jẹ ifọkansi ni wiwo awọn iyatọ ati pe ko ṣe ifọkansi gbogbogbo lati dapọ awọn ayipada tabi lo awọn abulẹ.

Iṣẹ akanṣe mergiraf ti han laipẹ ati pe o n dagbasoke ni itara. Ọpa yii, ti a kọ sinu Rust (21 MiB!), Tun da lori igi-igi, eyiti o ti di idiwọn pupọ fun awọn olutọpa-ọrọ-ọrọ-ọrọ-ọrọ ni awọn irinṣẹ idagbasoke bi LLVM ti di fun iṣapeye awọn aṣoju itọnisọna ipele-kekere. Ko dabi awọn oludije rẹ, mergiraf n pese awọn iṣẹ kii ṣe fun ṣiṣẹda awọn iyatọ, ṣugbọn fun ipinnu awọn ija idapọpọ laifọwọyi. Labẹ hood, mergiraf nlo imuse ti algorithm ti a lo ninu GumTree lati ṣe awọn abulẹ, ati fun ohun elo, imuse ti algorithm ti a lo ninu spork, ti ​​o baamu fun awọn ẹya igi igi.

Serialization ti awọn abulẹ sinu awọn faili ti o le lo nigbamii, laanu, ko ni imuse (ṣugbọn o ṣee ṣe pe o le ṣe imuse nipasẹ sisọ awọn akọọlẹ iṣẹlẹ ti ipilẹṣẹ nipasẹ GumTree). Ọna miiran ti o ni ileri lati lo awọn iyatọ yoo jẹ lati lo awọn iyatọ kii ṣe nipasẹ awọn abulẹ, ṣugbọn nipasẹ iṣẹ-ṣiṣe atunṣe ti awọn olupin LSP, eyi ti o le ṣe iranlọwọ lati ṣawari awọn ija ni ipele ti o pọju. Iworan nikan ni atilẹyin fun awọn ija.

Apeere ni ibi iṣẹ: baba ti o wọpọ "base.py" (awọn taabu indented, afikun ila ni ibẹrẹ) foo = 1 defi akọkọ (): tẹjade (foo + 2 + 3) "a.py" (awọn taabu indented ṣi, 2 afikun ila ni ibẹrẹ, dipo ọkan, ile-ikawe icecream ni a lo fun titẹ yokokoro, kilasi “baz” ti wa ni afikun: lati agbewọle icecream ic foo = 1 def main(): ic (foo + 2 + 3) kilasi baz: def __init__ (ara): """baz""""b.py" (ayipada "foo" fun lorukọmii si "bar", ti a ṣe pẹlu "dudu" lẹhin awọn iyipada, ti o mu ki o wọle pẹlu awọn aaye ati afikun. awọn ila ti wa ni ge): igi = 1 defi akọkọ (): tẹjade (ọpa + 2 + 3) Ipe ./mergiraf dapọ ./base.py ./a.py ./b.py -x a.py -y b.py -s base.py -o ./res.py yoo fun awọn wọnyi esi lati icecream agbewọle ic bar = 1 defi akọkọ (): ic (bar + 2 + 3) kilasi baz: def __init__ (ara): """baz"" (fun titẹ sita yokokoro, ile-ikawe "icecream" ni a lo, oniyipada "foo" ni a tunrukọ si "ọti", ti a ṣe pẹlu "dudu" lẹhin awọn iyipada, ti o mu ki o wọle si - awọn aaye ati awọn ila afikun ge jade, adalu awọn taabu ati awọn aaye fun indentation, ṣugbọn fọọmu ti a gba laaye).

Aini ọpa kan han lẹsẹkẹsẹ. Ilana iwe-aṣẹ jẹ tunto nigbagbogbo ni awọn faili .editorconfig, ati awọn iyipada ara agbaye, gẹgẹbi iyipada awọn taabu si awọn aaye ati gbigba ara dudu bi a ti ṣe ni b.py, nigbagbogbo pẹlu awọn iyipada ni .editorconfig. Nitorina, fun awọn kan diẹ ti o tọ ohun elo ti iru awọn ayipada, awọn ọpa gbọdọ ni a Erongba fun a agbaye "aiyipada" ara, ati ki o ni anfani lati fa soke eto lati ".editorconfig".

orisun: opennet.ru

Fi ọrọìwòye kun