index.html 303 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433
  1. <!doctype html>
  2. <html lang="en" class="no-js">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <link rel="prev" href="../env/">
  7. <link rel="next" href="../../faq/">
  8. <link rel="icon" href="../../assets/images/favicon.png">
  9. <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.40">
  10. <title>Environment utils - SWE-agent documentation</title>
  11. <link rel="stylesheet" href="../../assets/stylesheets/main.8c3ca2c6.min.css">
  12. <link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
  13. <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  14. <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
  15. <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
  16. <link rel="stylesheet" href="../../assets/_mkdocstrings.css">
  17. <link rel="stylesheet" href="../../assets/custom.css">
  18. <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
  19. <link href="../../assets/stylesheets/glightbox.min.css" rel="stylesheet"/><style>
  20. html.glightbox-open { overflow: initial; height: 100%; }
  21. .gslide-title { margin-top: 0px; user-select: text; }
  22. .gslide-desc { color: #666; user-select: text; }
  23. .gslide-image img { background: white; }
  24. .gscrollbar-fixer { padding-right: 15px; }
  25. .gdesc-inner { font-size: 0.75rem; }
  26. body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color);}
  27. body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color);}
  28. body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color);}</style> <script src="../../assets/javascripts/glightbox.min.js"></script></head>
  29. <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
  30. <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
  31. <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
  32. <label class="md-overlay" for="__drawer"></label>
  33. <div data-md-component="skip">
  34. <a href="#environment-utils" class="md-skip">
  35. Skip to content
  36. </a>
  37. </div>
  38. <div data-md-component="announce">
  39. <aside class="md-banner">
  40. <div class="md-banner__inner md-grid md-typeset">
  41. <button class="md-banner__button md-icon" aria-label="Don't show this again">
  42. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
  43. </button>
  44. <!-- This link won't work in local preview -->
  45. <a href="SWE-agent/background#enigma" class="clickable-banner">
  46. <div>
  47. News: SWE-agent <span class="enigma">EniGMA</span> solves cybersecurity and CTF challanges to achieve <span class="enigma">3x improvement over previous SOTA!</span>
  48. </div>
  49. </a>
  50. </div>
  51. <script>var el=document.querySelector("[data-md-component=announce]");if(el){var content=el.querySelector(".md-typeset");__md_hash(content.innerHTML)===__md_get("__announce")&&(el.hidden=!0)}</script>
  52. </aside>
  53. </div>
  54. <header class="md-header md-header--shadow" data-md-component="header">
  55. <nav class="md-header__inner md-grid" aria-label="Header">
  56. <a href="../.." title="SWE-agent documentation" class="md-header__button md-logo" aria-label="SWE-agent documentation" data-md-component="logo">
  57. <img src="../../assets/swe-agent.svg" alt="logo">
  58. </a>
  59. <label class="md-header__button md-icon" for="__drawer">
  60. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
  61. </label>
  62. <div class="md-header__title" data-md-component="header-title">
  63. <div class="md-header__ellipsis">
  64. <div class="md-header__topic">
  65. <span class="md-ellipsis">
  66. SWE-agent documentation
  67. </span>
  68. </div>
  69. <div class="md-header__topic" data-md-component="header-topic">
  70. <span class="md-ellipsis">
  71. Environment utils
  72. </span>
  73. </div>
  74. </div>
  75. </div>
  76. <form class="md-header__option" data-md-component="palette">
  77. <input class="md-option" data-md-color-media="(prefers-color-scheme)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
  78. <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
  79. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m14.3 16-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zm-9.15 3.96h2.3L12 9z"/></svg>
  80. </label>
  81. <input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="deep-orange" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
  82. <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
  83. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
  84. </label>
  85. <input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="deep-orange" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_2">
  86. <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
  87. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
  88. </label>
  89. </form>
  90. <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
  91. <label class="md-header__button md-icon" for="__search">
  92. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
  93. </label>
  94. <div class="md-search" data-md-component="search" role="dialog">
  95. <label class="md-search__overlay" for="__search"></label>
  96. <div class="md-search__inner" role="search">
  97. <form class="md-search__form" name="search">
  98. <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
  99. <label class="md-search__icon md-icon" for="__search">
  100. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
  101. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
  102. </label>
  103. <nav class="md-search__options" aria-label="Search">
  104. <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
  105. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
  106. </button>
  107. </nav>
  108. </form>
  109. <div class="md-search__output">
  110. <div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
  111. <div class="md-search-result" data-md-component="search-result">
  112. <div class="md-search-result__meta">
  113. Initializing search
  114. </div>
  115. <ol class="md-search-result__list" role="presentation"></ol>
  116. </div>
  117. </div>
  118. </div>
  119. </div>
  120. </div>
  121. <div class="md-header__source">
  122. <a href="https://github.com/princeton-nlp/SWE-agent" title="Go to repository" class="md-source" data-md-component="source">
  123. <div class="md-source__icon md-icon">
  124. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
  125. </div>
  126. <div class="md-source__repository">
  127. princeton-nlp/SWE-agent
  128. </div>
  129. </a>
  130. </div>
  131. </nav>
  132. </header>
  133. <div class="md-container" data-md-component="container">
  134. <main class="md-main" data-md-component="main">
  135. <div class="md-main__inner md-grid">
  136. <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
  137. <div class="md-sidebar__scrollwrap">
  138. <div class="md-sidebar__inner">
  139. <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
  140. <label class="md-nav__title" for="__drawer">
  141. <a href="../.." title="SWE-agent documentation" class="md-nav__button md-logo" aria-label="SWE-agent documentation" data-md-component="logo">
  142. <img src="../../assets/swe-agent.svg" alt="logo">
  143. </a>
  144. SWE-agent documentation
  145. </label>
  146. <div class="md-nav__source">
  147. <a href="https://github.com/princeton-nlp/SWE-agent" title="Go to repository" class="md-source" data-md-component="source">
  148. <div class="md-source__icon md-icon">
  149. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
  150. </div>
  151. <div class="md-source__repository">
  152. princeton-nlp/SWE-agent
  153. </div>
  154. </a>
  155. </div>
  156. <ul class="md-nav__list" data-md-scrollfix>
  157. <li class="md-nav__item">
  158. <a href="../.." class="md-nav__link">
  159. <span class="md-ellipsis">
  160. Home
  161. </span>
  162. </a>
  163. </li>
  164. <li class="md-nav__item md-nav__item--nested">
  165. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
  166. <div class="md-nav__link md-nav__container">
  167. <a href="../../background/" class="md-nav__link ">
  168. <span class="md-ellipsis">
  169. Project Overview
  170. </span>
  171. </a>
  172. <label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="0">
  173. <span class="md-nav__icon md-icon"></span>
  174. </label>
  175. </div>
  176. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
  177. <label class="md-nav__title" for="__nav_2">
  178. <span class="md-nav__icon md-icon"></span>
  179. Project Overview
  180. </label>
  181. <ul class="md-nav__list" data-md-scrollfix>
  182. <li class="md-nav__item">
  183. <a href="../../background/aci/" class="md-nav__link">
  184. <span class="md-ellipsis">
  185. Agent-Computer Interface
  186. </span>
  187. </a>
  188. </li>
  189. <li class="md-nav__item">
  190. <a href="../../background/iat/" class="md-nav__link">
  191. <span class="md-ellipsis">
  192. Interactive Agent Tools
  193. </span>
  194. </a>
  195. </li>
  196. <li class="md-nav__item">
  197. <a href="../../background/architecture/" class="md-nav__link">
  198. <span class="md-ellipsis">
  199. Architecture
  200. </span>
  201. </a>
  202. </li>
  203. </ul>
  204. </nav>
  205. </li>
  206. <li class="md-nav__item md-nav__item--nested">
  207. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
  208. <div class="md-nav__link md-nav__container">
  209. <a href="../../installation/" class="md-nav__link ">
  210. <span class="md-ellipsis">
  211. Installation
  212. </span>
  213. </a>
  214. <label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="0">
  215. <span class="md-nav__icon md-icon"></span>
  216. </label>
  217. </div>
  218. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
  219. <label class="md-nav__title" for="__nav_3">
  220. <span class="md-nav__icon md-icon"></span>
  221. Installation
  222. </label>
  223. <ul class="md-nav__list" data-md-scrollfix>
  224. <li class="md-nav__item">
  225. <a href="../../installation/codespaces/" class="md-nav__link">
  226. <span class="md-ellipsis">
  227. Use in-browser
  228. </span>
  229. </a>
  230. </li>
  231. <li class="md-nav__item">
  232. <a href="../../installation/source/" class="md-nav__link">
  233. <span class="md-ellipsis">
  234. Install from source
  235. </span>
  236. </a>
  237. </li>
  238. <li class="md-nav__item">
  239. <a href="../../installation/docker/" class="md-nav__link">
  240. <span class="md-ellipsis">
  241. Run with docker
  242. </span>
  243. </a>
  244. </li>
  245. <li class="md-nav__item">
  246. <a href="../../installation/keys/" class="md-nav__link">
  247. <span class="md-ellipsis">
  248. API keys
  249. </span>
  250. </a>
  251. </li>
  252. <li class="md-nav__item">
  253. <a href="../../installation/tips/" class="md-nav__link">
  254. <span class="md-ellipsis">
  255. Installation tips
  256. </span>
  257. </a>
  258. </li>
  259. <li class="md-nav__item">
  260. <a href="../../installation/changelog/" class="md-nav__link">
  261. <span class="md-ellipsis">
  262. Changelog
  263. </span>
  264. </a>
  265. </li>
  266. </ul>
  267. </nav>
  268. </li>
  269. <li class="md-nav__item md-nav__item--nested">
  270. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
  271. <div class="md-nav__link md-nav__container">
  272. <a href="../../usage/" class="md-nav__link ">
  273. <span class="md-ellipsis">
  274. Usage
  275. </span>
  276. </a>
  277. <label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0">
  278. <span class="md-nav__icon md-icon"></span>
  279. </label>
  280. </div>
  281. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
  282. <label class="md-nav__title" for="__nav_4">
  283. <span class="md-nav__icon md-icon"></span>
  284. Usage
  285. </label>
  286. <ul class="md-nav__list" data-md-scrollfix>
  287. <li class="md-nav__item">
  288. <a href="../../usage/cl_tutorial/" class="md-nav__link">
  289. <span class="md-ellipsis">
  290. Command line usage
  291. </span>
  292. </a>
  293. </li>
  294. <li class="md-nav__item">
  295. <a href="../../usage/enigma/" class="md-nav__link">
  296. <span class="md-ellipsis">
  297. EnIGMA usage
  298. </span>
  299. </a>
  300. </li>
  301. <li class="md-nav__item">
  302. <a href="../../usage/coding_challenges/" class="md-nav__link">
  303. <span class="md-ellipsis">
  304. Solving coding challenges
  305. </span>
  306. </a>
  307. </li>
  308. <li class="md-nav__item">
  309. <a href="../../usage/web_ui/" class="md-nav__link">
  310. <span class="md-ellipsis">
  311. Using the web UI
  312. </span>
  313. </a>
  314. </li>
  315. <li class="md-nav__item">
  316. <a href="../../usage/trajectories/" class="md-nav__link">
  317. <span class="md-ellipsis">
  318. Trajectories
  319. </span>
  320. </a>
  321. </li>
  322. <li class="md-nav__item">
  323. <a href="../../usage/inspector/" class="md-nav__link">
  324. <span class="md-ellipsis">
  325. Trajectory inspector
  326. </span>
  327. </a>
  328. </li>
  329. <li class="md-nav__item">
  330. <a href="../../usage/usage_faq/" class="md-nav__link">
  331. <span class="md-ellipsis">
  332. FAQ
  333. </span>
  334. </a>
  335. </li>
  336. <li class="md-nav__item">
  337. <a href="../../usage/benchmarking/" class="md-nav__link">
  338. <span class="md-ellipsis">
  339. Benchmarking
  340. </span>
  341. </a>
  342. </li>
  343. </ul>
  344. </nav>
  345. </li>
  346. <li class="md-nav__item md-nav__item--nested">
  347. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
  348. <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
  349. <span class="md-ellipsis">
  350. Configuration
  351. </span>
  352. <span class="md-nav__icon md-icon"></span>
  353. </label>
  354. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
  355. <label class="md-nav__title" for="__nav_5">
  356. <span class="md-nav__icon md-icon"></span>
  357. Configuration
  358. </label>
  359. <ul class="md-nav__list" data-md-scrollfix>
  360. <li class="md-nav__item">
  361. <a href="../../config/config/" class="md-nav__link">
  362. <span class="md-ellipsis">
  363. Config files
  364. </span>
  365. </a>
  366. </li>
  367. <li class="md-nav__item">
  368. <a href="../../config/commands/" class="md-nav__link">
  369. <span class="md-ellipsis">
  370. Command definitions
  371. </span>
  372. </a>
  373. </li>
  374. <li class="md-nav__item">
  375. <a href="../../config/demonstrations/" class="md-nav__link">
  376. <span class="md-ellipsis">
  377. Demonstrations
  378. </span>
  379. </a>
  380. </li>
  381. <li class="md-nav__item">
  382. <a href="../../config/env/" class="md-nav__link">
  383. <span class="md-ellipsis">
  384. Environment variables
  385. </span>
  386. </a>
  387. </li>
  388. <li class="md-nav__item">
  389. <a href="../../config/docker/" class="md-nav__link">
  390. <span class="md-ellipsis">
  391. Docker images
  392. </span>
  393. </a>
  394. </li>
  395. <li class="md-nav__item">
  396. <a href="../../config/summarizers/" class="md-nav__link">
  397. <span class="md-ellipsis">
  398. Summarizers
  399. </span>
  400. </a>
  401. </li>
  402. </ul>
  403. </nav>
  404. </li>
  405. <li class="md-nav__item md-nav__item--nested">
  406. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
  407. <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
  408. <span class="md-ellipsis">
  409. Development
  410. </span>
  411. <span class="md-nav__icon md-icon"></span>
  412. </label>
  413. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
  414. <label class="md-nav__title" for="__nav_6">
  415. <span class="md-nav__icon md-icon"></span>
  416. Development
  417. </label>
  418. <ul class="md-nav__list" data-md-scrollfix>
  419. <li class="md-nav__item">
  420. <a href="../../dev/contribute/" class="md-nav__link">
  421. <span class="md-ellipsis">
  422. Contribution guide
  423. </span>
  424. </a>
  425. </li>
  426. <li class="md-nav__item">
  427. <a href="../../dev/formatting_conflicts/" class="md-nav__link">
  428. <span class="md-ellipsis">
  429. Formatting conflicts
  430. </span>
  431. </a>
  432. </li>
  433. </ul>
  434. </nav>
  435. </li>
  436. <li class="md-nav__item md-nav__item--active md-nav__item--nested">
  437. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" checked>
  438. <div class="md-nav__link md-nav__container">
  439. <a href="../" class="md-nav__link ">
  440. <span class="md-ellipsis">
  441. Reference
  442. </span>
  443. </a>
  444. <label class="md-nav__link " for="__nav_7" id="__nav_7_label" tabindex="0">
  445. <span class="md-nav__icon md-icon"></span>
  446. </label>
  447. </div>
  448. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="true">
  449. <label class="md-nav__title" for="__nav_7">
  450. <span class="md-nav__icon md-icon"></span>
  451. Reference
  452. </label>
  453. <ul class="md-nav__list" data-md-scrollfix>
  454. <li class="md-nav__item">
  455. <a href="../agent/" class="md-nav__link">
  456. <span class="md-ellipsis">
  457. Agent
  458. </span>
  459. </a>
  460. </li>
  461. <li class="md-nav__item">
  462. <a href="../models/" class="md-nav__link">
  463. <span class="md-ellipsis">
  464. Models
  465. </span>
  466. </a>
  467. </li>
  468. <li class="md-nav__item">
  469. <a href="../env/" class="md-nav__link">
  470. <span class="md-ellipsis">
  471. Environment
  472. </span>
  473. </a>
  474. </li>
  475. <li class="md-nav__item md-nav__item--active">
  476. <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
  477. <label class="md-nav__link md-nav__link--active" for="__toc">
  478. <span class="md-ellipsis">
  479. Environment utils
  480. </span>
  481. <span class="md-nav__icon md-icon"></span>
  482. </label>
  483. <a href="./" class="md-nav__link md-nav__link--active">
  484. <span class="md-ellipsis">
  485. Environment utils
  486. </span>
  487. </a>
  488. <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  489. <label class="md-nav__title" for="__toc">
  490. <span class="md-nav__icon md-icon"></span>
  491. Table of contents
  492. </label>
  493. <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
  494. <li class="md-nav__item">
  495. <a href="#sweagent.environment.utils" class="md-nav__link">
  496. <span class="md-ellipsis">
  497. utils
  498. </span>
  499. </a>
  500. </li>
  501. <li class="md-nav__item">
  502. <a href="#sweagent.environment.utils.InstanceBuilder" class="md-nav__link">
  503. <span class="md-ellipsis">
  504. InstanceBuilder
  505. </span>
  506. </a>
  507. <nav class="md-nav" aria-label="InstanceBuilder">
  508. <ul class="md-nav__list">
  509. <li class="md-nav__item">
  510. <a href="#sweagent.environment.utils.InstanceBuilder.__init__" class="md-nav__link">
  511. <span class="md-ellipsis">
  512. __init__
  513. </span>
  514. </a>
  515. </li>
  516. <li class="md-nav__item">
  517. <a href="#sweagent.environment.utils.InstanceBuilder.set_problem_statement" class="md-nav__link">
  518. <span class="md-ellipsis">
  519. set_problem_statement
  520. </span>
  521. </a>
  522. </li>
  523. <li class="md-nav__item">
  524. <a href="#sweagent.environment.utils.InstanceBuilder.set_problem_statement_from_challenge_json" class="md-nav__link">
  525. <span class="md-ellipsis">
  526. set_problem_statement_from_challenge_json
  527. </span>
  528. </a>
  529. </li>
  530. <li class="md-nav__item">
  531. <a href="#sweagent.environment.utils.InstanceBuilder.set_server_description" class="md-nav__link">
  532. <span class="md-ellipsis">
  533. set_server_description
  534. </span>
  535. </a>
  536. </li>
  537. </ul>
  538. </nav>
  539. </li>
  540. <li class="md-nav__item">
  541. <a href="#sweagent.environment.utils.PatchFormatter" class="md-nav__link">
  542. <span class="md-ellipsis">
  543. PatchFormatter
  544. </span>
  545. </a>
  546. <nav class="md-nav" aria-label="PatchFormatter">
  547. <ul class="md-nav__list">
  548. <li class="md-nav__item">
  549. <a href="#sweagent.environment.utils.PatchFormatter.__init__" class="md-nav__link">
  550. <span class="md-ellipsis">
  551. __init__
  552. </span>
  553. </a>
  554. </li>
  555. <li class="md-nav__item">
  556. <a href="#sweagent.environment.utils.PatchFormatter.concat_files_strings" class="md-nav__link">
  557. <span class="md-ellipsis">
  558. concat_files_strings
  559. </span>
  560. </a>
  561. </li>
  562. <li class="md-nav__item">
  563. <a href="#sweagent.environment.utils.PatchFormatter.format_file" class="md-nav__link">
  564. <span class="md-ellipsis">
  565. format_file
  566. </span>
  567. </a>
  568. </li>
  569. </ul>
  570. </nav>
  571. </li>
  572. <li class="md-nav__item">
  573. <a href="#sweagent.environment.utils.copy_anything_to_container" class="md-nav__link">
  574. <span class="md-ellipsis">
  575. copy_anything_to_container
  576. </span>
  577. </a>
  578. </li>
  579. <li class="md-nav__item">
  580. <a href="#sweagent.environment.utils.copy_file_to_container" class="md-nav__link">
  581. <span class="md-ellipsis">
  582. copy_file_to_container
  583. </span>
  584. </a>
  585. </li>
  586. <li class="md-nav__item">
  587. <a href="#sweagent.environment.utils.format_trajectory_markdown" class="md-nav__link">
  588. <span class="md-ellipsis">
  589. format_trajectory_markdown
  590. </span>
  591. </a>
  592. </li>
  593. <li class="md-nav__item">
  594. <a href="#sweagent.environment.utils.get_associated_commit_urls" class="md-nav__link">
  595. <span class="md-ellipsis">
  596. get_associated_commit_urls
  597. </span>
  598. </a>
  599. </li>
  600. <li class="md-nav__item">
  601. <a href="#sweagent.environment.utils.get_commit" class="md-nav__link">
  602. <span class="md-ellipsis">
  603. get_commit
  604. </span>
  605. </a>
  606. </li>
  607. <li class="md-nav__item">
  608. <a href="#sweagent.environment.utils.get_container" class="md-nav__link">
  609. <span class="md-ellipsis">
  610. get_container
  611. </span>
  612. </a>
  613. </li>
  614. <li class="md-nav__item">
  615. <a href="#sweagent.environment.utils.get_data_path_name" class="md-nav__link">
  616. <span class="md-ellipsis">
  617. get_data_path_name
  618. </span>
  619. </a>
  620. </li>
  621. <li class="md-nav__item">
  622. <a href="#sweagent.environment.utils.get_gh_issue_data" class="md-nav__link">
  623. <span class="md-ellipsis">
  624. get_gh_issue_data
  625. </span>
  626. </a>
  627. </li>
  628. <li class="md-nav__item">
  629. <a href="#sweagent.environment.utils.get_instances" class="md-nav__link">
  630. <span class="md-ellipsis">
  631. get_instances
  632. </span>
  633. </a>
  634. </li>
  635. <li class="md-nav__item">
  636. <a href="#sweagent.environment.utils.get_problem_statement_from_github_issue" class="md-nav__link">
  637. <span class="md-ellipsis">
  638. get_problem_statement_from_github_issue
  639. </span>
  640. </a>
  641. </li>
  642. <li class="md-nav__item">
  643. <a href="#sweagent.environment.utils.image_exists" class="md-nav__link">
  644. <span class="md-ellipsis">
  645. image_exists
  646. </span>
  647. </a>
  648. </li>
  649. <li class="md-nav__item">
  650. <a href="#sweagent.environment.utils.is_github_issue_url" class="md-nav__link">
  651. <span class="md-ellipsis">
  652. is_github_issue_url
  653. </span>
  654. </a>
  655. </li>
  656. <li class="md-nav__item">
  657. <a href="#sweagent.environment.utils.is_github_repo_url" class="md-nav__link">
  658. <span class="md-ellipsis">
  659. is_github_repo_url
  660. </span>
  661. </a>
  662. </li>
  663. <li class="md-nav__item">
  664. <a href="#sweagent.environment.utils.parse_gh_issue_url" class="md-nav__link">
  665. <span class="md-ellipsis">
  666. parse_gh_issue_url
  667. </span>
  668. </a>
  669. </li>
  670. <li class="md-nav__item">
  671. <a href="#sweagent.environment.utils.parse_gh_repo_url" class="md-nav__link">
  672. <span class="md-ellipsis">
  673. parse_gh_repo_url
  674. </span>
  675. </a>
  676. </li>
  677. <li class="md-nav__item">
  678. <a href="#sweagent.environment.utils.read_session_with_timeout" class="md-nav__link">
  679. <span class="md-ellipsis">
  680. read_session_with_timeout
  681. </span>
  682. </a>
  683. </li>
  684. <li class="md-nav__item">
  685. <a href="#sweagent.environment.utils.read_with_timeout" class="md-nav__link">
  686. <span class="md-ellipsis">
  687. read_with_timeout
  688. </span>
  689. </a>
  690. </li>
  691. <li class="md-nav__item">
  692. <a href="#sweagent.environment.utils.read_with_timeout_experimental" class="md-nav__link">
  693. <span class="md-ellipsis">
  694. read_with_timeout_experimental
  695. </span>
  696. </a>
  697. </li>
  698. </ul>
  699. </nav>
  700. </li>
  701. </ul>
  702. </nav>
  703. </li>
  704. <li class="md-nav__item">
  705. <a href="../../faq/" class="md-nav__link">
  706. <span class="md-ellipsis">
  707. FAQ
  708. </span>
  709. </a>
  710. </li>
  711. </ul>
  712. </nav>
  713. </div>
  714. </div>
  715. </div>
  716. <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
  717. <div class="md-sidebar__scrollwrap">
  718. <div class="md-sidebar__inner">
  719. <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  720. <label class="md-nav__title" for="__toc">
  721. <span class="md-nav__icon md-icon"></span>
  722. Table of contents
  723. </label>
  724. <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
  725. <li class="md-nav__item">
  726. <a href="#sweagent.environment.utils" class="md-nav__link">
  727. <span class="md-ellipsis">
  728. utils
  729. </span>
  730. </a>
  731. </li>
  732. <li class="md-nav__item">
  733. <a href="#sweagent.environment.utils.InstanceBuilder" class="md-nav__link">
  734. <span class="md-ellipsis">
  735. InstanceBuilder
  736. </span>
  737. </a>
  738. <nav class="md-nav" aria-label="InstanceBuilder">
  739. <ul class="md-nav__list">
  740. <li class="md-nav__item">
  741. <a href="#sweagent.environment.utils.InstanceBuilder.__init__" class="md-nav__link">
  742. <span class="md-ellipsis">
  743. __init__
  744. </span>
  745. </a>
  746. </li>
  747. <li class="md-nav__item">
  748. <a href="#sweagent.environment.utils.InstanceBuilder.set_problem_statement" class="md-nav__link">
  749. <span class="md-ellipsis">
  750. set_problem_statement
  751. </span>
  752. </a>
  753. </li>
  754. <li class="md-nav__item">
  755. <a href="#sweagent.environment.utils.InstanceBuilder.set_problem_statement_from_challenge_json" class="md-nav__link">
  756. <span class="md-ellipsis">
  757. set_problem_statement_from_challenge_json
  758. </span>
  759. </a>
  760. </li>
  761. <li class="md-nav__item">
  762. <a href="#sweagent.environment.utils.InstanceBuilder.set_server_description" class="md-nav__link">
  763. <span class="md-ellipsis">
  764. set_server_description
  765. </span>
  766. </a>
  767. </li>
  768. </ul>
  769. </nav>
  770. </li>
  771. <li class="md-nav__item">
  772. <a href="#sweagent.environment.utils.PatchFormatter" class="md-nav__link">
  773. <span class="md-ellipsis">
  774. PatchFormatter
  775. </span>
  776. </a>
  777. <nav class="md-nav" aria-label="PatchFormatter">
  778. <ul class="md-nav__list">
  779. <li class="md-nav__item">
  780. <a href="#sweagent.environment.utils.PatchFormatter.__init__" class="md-nav__link">
  781. <span class="md-ellipsis">
  782. __init__
  783. </span>
  784. </a>
  785. </li>
  786. <li class="md-nav__item">
  787. <a href="#sweagent.environment.utils.PatchFormatter.concat_files_strings" class="md-nav__link">
  788. <span class="md-ellipsis">
  789. concat_files_strings
  790. </span>
  791. </a>
  792. </li>
  793. <li class="md-nav__item">
  794. <a href="#sweagent.environment.utils.PatchFormatter.format_file" class="md-nav__link">
  795. <span class="md-ellipsis">
  796. format_file
  797. </span>
  798. </a>
  799. </li>
  800. </ul>
  801. </nav>
  802. </li>
  803. <li class="md-nav__item">
  804. <a href="#sweagent.environment.utils.copy_anything_to_container" class="md-nav__link">
  805. <span class="md-ellipsis">
  806. copy_anything_to_container
  807. </span>
  808. </a>
  809. </li>
  810. <li class="md-nav__item">
  811. <a href="#sweagent.environment.utils.copy_file_to_container" class="md-nav__link">
  812. <span class="md-ellipsis">
  813. copy_file_to_container
  814. </span>
  815. </a>
  816. </li>
  817. <li class="md-nav__item">
  818. <a href="#sweagent.environment.utils.format_trajectory_markdown" class="md-nav__link">
  819. <span class="md-ellipsis">
  820. format_trajectory_markdown
  821. </span>
  822. </a>
  823. </li>
  824. <li class="md-nav__item">
  825. <a href="#sweagent.environment.utils.get_associated_commit_urls" class="md-nav__link">
  826. <span class="md-ellipsis">
  827. get_associated_commit_urls
  828. </span>
  829. </a>
  830. </li>
  831. <li class="md-nav__item">
  832. <a href="#sweagent.environment.utils.get_commit" class="md-nav__link">
  833. <span class="md-ellipsis">
  834. get_commit
  835. </span>
  836. </a>
  837. </li>
  838. <li class="md-nav__item">
  839. <a href="#sweagent.environment.utils.get_container" class="md-nav__link">
  840. <span class="md-ellipsis">
  841. get_container
  842. </span>
  843. </a>
  844. </li>
  845. <li class="md-nav__item">
  846. <a href="#sweagent.environment.utils.get_data_path_name" class="md-nav__link">
  847. <span class="md-ellipsis">
  848. get_data_path_name
  849. </span>
  850. </a>
  851. </li>
  852. <li class="md-nav__item">
  853. <a href="#sweagent.environment.utils.get_gh_issue_data" class="md-nav__link">
  854. <span class="md-ellipsis">
  855. get_gh_issue_data
  856. </span>
  857. </a>
  858. </li>
  859. <li class="md-nav__item">
  860. <a href="#sweagent.environment.utils.get_instances" class="md-nav__link">
  861. <span class="md-ellipsis">
  862. get_instances
  863. </span>
  864. </a>
  865. </li>
  866. <li class="md-nav__item">
  867. <a href="#sweagent.environment.utils.get_problem_statement_from_github_issue" class="md-nav__link">
  868. <span class="md-ellipsis">
  869. get_problem_statement_from_github_issue
  870. </span>
  871. </a>
  872. </li>
  873. <li class="md-nav__item">
  874. <a href="#sweagent.environment.utils.image_exists" class="md-nav__link">
  875. <span class="md-ellipsis">
  876. image_exists
  877. </span>
  878. </a>
  879. </li>
  880. <li class="md-nav__item">
  881. <a href="#sweagent.environment.utils.is_github_issue_url" class="md-nav__link">
  882. <span class="md-ellipsis">
  883. is_github_issue_url
  884. </span>
  885. </a>
  886. </li>
  887. <li class="md-nav__item">
  888. <a href="#sweagent.environment.utils.is_github_repo_url" class="md-nav__link">
  889. <span class="md-ellipsis">
  890. is_github_repo_url
  891. </span>
  892. </a>
  893. </li>
  894. <li class="md-nav__item">
  895. <a href="#sweagent.environment.utils.parse_gh_issue_url" class="md-nav__link">
  896. <span class="md-ellipsis">
  897. parse_gh_issue_url
  898. </span>
  899. </a>
  900. </li>
  901. <li class="md-nav__item">
  902. <a href="#sweagent.environment.utils.parse_gh_repo_url" class="md-nav__link">
  903. <span class="md-ellipsis">
  904. parse_gh_repo_url
  905. </span>
  906. </a>
  907. </li>
  908. <li class="md-nav__item">
  909. <a href="#sweagent.environment.utils.read_session_with_timeout" class="md-nav__link">
  910. <span class="md-ellipsis">
  911. read_session_with_timeout
  912. </span>
  913. </a>
  914. </li>
  915. <li class="md-nav__item">
  916. <a href="#sweagent.environment.utils.read_with_timeout" class="md-nav__link">
  917. <span class="md-ellipsis">
  918. read_with_timeout
  919. </span>
  920. </a>
  921. </li>
  922. <li class="md-nav__item">
  923. <a href="#sweagent.environment.utils.read_with_timeout_experimental" class="md-nav__link">
  924. <span class="md-ellipsis">
  925. read_with_timeout_experimental
  926. </span>
  927. </a>
  928. </li>
  929. </ul>
  930. </nav>
  931. </div>
  932. </div>
  933. </div>
  934. <div class="md-content" data-md-component="content">
  935. <article class="md-content__inner md-typeset">
  936. <a href="https://github.com/princeton-nlp/SWE-agent/edit/main/docs/reference/env_utils.md" title="Edit this page" class="md-content__button md-icon">
  937. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
  938. </a>
  939. <h1 id="environment-utils">Environment utils</h1>
  940. <div class="doc doc-object doc-module">
  941. <a id="sweagent.environment.utils"></a>
  942. <div class="doc doc-contents first">
  943. <div class="doc doc-children">
  944. <div class="doc doc-object doc-class">
  945. <h2 id="sweagent.environment.utils.InstanceBuilder" class="doc doc-heading">
  946. <code>InstanceBuilder</code>
  947. </h2>
  948. <div class="doc doc-contents ">
  949. <details class="quote">
  950. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  951. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">712</span>
  952. <span class="normal">713</span>
  953. <span class="normal">714</span>
  954. <span class="normal">715</span>
  955. <span class="normal">716</span>
  956. <span class="normal">717</span>
  957. <span class="normal">718</span>
  958. <span class="normal">719</span>
  959. <span class="normal">720</span>
  960. <span class="normal">721</span>
  961. <span class="normal">722</span>
  962. <span class="normal">723</span>
  963. <span class="normal">724</span>
  964. <span class="normal">725</span>
  965. <span class="normal">726</span>
  966. <span class="normal">727</span>
  967. <span class="normal">728</span>
  968. <span class="normal">729</span>
  969. <span class="normal">730</span>
  970. <span class="normal">731</span>
  971. <span class="normal">732</span>
  972. <span class="normal">733</span>
  973. <span class="normal">734</span>
  974. <span class="normal">735</span>
  975. <span class="normal">736</span>
  976. <span class="normal">737</span>
  977. <span class="normal">738</span>
  978. <span class="normal">739</span>
  979. <span class="normal">740</span>
  980. <span class="normal">741</span>
  981. <span class="normal">742</span>
  982. <span class="normal">743</span>
  983. <span class="normal">744</span>
  984. <span class="normal">745</span>
  985. <span class="normal">746</span>
  986. <span class="normal">747</span>
  987. <span class="normal">748</span>
  988. <span class="normal">749</span>
  989. <span class="normal">750</span>
  990. <span class="normal">751</span>
  991. <span class="normal">752</span>
  992. <span class="normal">753</span>
  993. <span class="normal">754</span>
  994. <span class="normal">755</span>
  995. <span class="normal">756</span>
  996. <span class="normal">757</span>
  997. <span class="normal">758</span>
  998. <span class="normal">759</span>
  999. <span class="normal">760</span>
  1000. <span class="normal">761</span>
  1001. <span class="normal">762</span>
  1002. <span class="normal">763</span>
  1003. <span class="normal">764</span>
  1004. <span class="normal">765</span>
  1005. <span class="normal">766</span>
  1006. <span class="normal">767</span>
  1007. <span class="normal">768</span>
  1008. <span class="normal">769</span>
  1009. <span class="normal">770</span>
  1010. <span class="normal">771</span>
  1011. <span class="normal">772</span>
  1012. <span class="normal">773</span>
  1013. <span class="normal">774</span>
  1014. <span class="normal">775</span>
  1015. <span class="normal">776</span>
  1016. <span class="normal">777</span>
  1017. <span class="normal">778</span>
  1018. <span class="normal">779</span>
  1019. <span class="normal">780</span>
  1020. <span class="normal">781</span>
  1021. <span class="normal">782</span>
  1022. <span class="normal">783</span>
  1023. <span class="normal">784</span>
  1024. <span class="normal">785</span>
  1025. <span class="normal">786</span>
  1026. <span class="normal">787</span>
  1027. <span class="normal">788</span>
  1028. <span class="normal">789</span>
  1029. <span class="normal">790</span>
  1030. <span class="normal">791</span>
  1031. <span class="normal">792</span>
  1032. <span class="normal">793</span>
  1033. <span class="normal">794</span>
  1034. <span class="normal">795</span>
  1035. <span class="normal">796</span>
  1036. <span class="normal">797</span>
  1037. <span class="normal">798</span>
  1038. <span class="normal">799</span>
  1039. <span class="normal">800</span>
  1040. <span class="normal">801</span>
  1041. <span class="normal">802</span>
  1042. <span class="normal">803</span>
  1043. <span class="normal">804</span>
  1044. <span class="normal">805</span>
  1045. <span class="normal">806</span>
  1046. <span class="normal">807</span>
  1047. <span class="normal">808</span>
  1048. <span class="normal">809</span>
  1049. <span class="normal">810</span>
  1050. <span class="normal">811</span>
  1051. <span class="normal">812</span>
  1052. <span class="normal">813</span>
  1053. <span class="normal">814</span>
  1054. <span class="normal">815</span>
  1055. <span class="normal">816</span>
  1056. <span class="normal">817</span>
  1057. <span class="normal">818</span>
  1058. <span class="normal">819</span>
  1059. <span class="normal">820</span>
  1060. <span class="normal">821</span>
  1061. <span class="normal">822</span>
  1062. <span class="normal">823</span>
  1063. <span class="normal">824</span>
  1064. <span class="normal">825</span>
  1065. <span class="normal">826</span>
  1066. <span class="normal">827</span>
  1067. <span class="normal">828</span>
  1068. <span class="normal">829</span>
  1069. <span class="normal">830</span>
  1070. <span class="normal">831</span>
  1071. <span class="normal">832</span>
  1072. <span class="normal">833</span>
  1073. <span class="normal">834</span>
  1074. <span class="normal">835</span>
  1075. <span class="normal">836</span>
  1076. <span class="normal">837</span>
  1077. <span class="normal">838</span>
  1078. <span class="normal">839</span>
  1079. <span class="normal">840</span>
  1080. <span class="normal">841</span>
  1081. <span class="normal">842</span>
  1082. <span class="normal">843</span>
  1083. <span class="normal">844</span>
  1084. <span class="normal">845</span>
  1085. <span class="normal">846</span>
  1086. <span class="normal">847</span>
  1087. <span class="normal">848</span>
  1088. <span class="normal">849</span>
  1089. <span class="normal">850</span>
  1090. <span class="normal">851</span>
  1091. <span class="normal">852</span>
  1092. <span class="normal">853</span>
  1093. <span class="normal">854</span>
  1094. <span class="normal">855</span>
  1095. <span class="normal">856</span>
  1096. <span class="normal">857</span>
  1097. <span class="normal">858</span>
  1098. <span class="normal">859</span>
  1099. <span class="normal">860</span>
  1100. <span class="normal">861</span>
  1101. <span class="normal">862</span>
  1102. <span class="normal">863</span>
  1103. <span class="normal">864</span>
  1104. <span class="normal">865</span>
  1105. <span class="normal">866</span>
  1106. <span class="normal">867</span>
  1107. <span class="normal">868</span>
  1108. <span class="normal">869</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">InstanceBuilder</span><span class="p">:</span>
  1109. <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
  1110. <span class="w"> </span><span class="sd">&quot;&quot;&quot;This helper class is used to build the data for an instance object,</span>
  1111. <span class="sd"> retrieving problem statements from github issues or local files and setting</span>
  1112. <span class="sd"> repo paths from github urls or local paths.</span>
  1113. <span class="sd"> &quot;&quot;&quot;</span>
  1114. <span class="c1"># Args that will be passed to the Instance constructor</span>
  1115. <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="p">{}</span>
  1116. <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="n">token</span>
  1117. <span class="bp">self</span><span class="o">.</span><span class="n">_instance_id_problem_suffix</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
  1118. <span class="k">def</span> <span class="nf">set_problem_statement_from_gh_issue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">issue_url</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
  1119. <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span> <span class="o">=</span> <span class="n">parse_gh_issue_url</span><span class="p">(</span><span class="n">issue_url</span><span class="p">)</span>
  1120. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;problem_statement&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">get_problem_statement_from_github_issue</span><span class="p">(</span>
  1121. <span class="n">owner</span><span class="p">,</span>
  1122. <span class="n">repo</span><span class="p">,</span>
  1123. <span class="n">issue_number</span><span class="p">,</span>
  1124. <span class="n">token</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">,</span>
  1125. <span class="p">)</span>
  1126. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;instance_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s2">__</span><span class="si">{</span><span class="n">repo</span><span class="si">}</span><span class="s2">-i</span><span class="si">{</span><span class="n">issue_number</span><span class="si">}</span><span class="s2">&quot;</span>
  1127. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;problem_statement_source&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;online&quot;</span>
  1128. <span class="k">def</span> <span class="nf">set_server_description</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">server_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">port</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
  1129. <span class="w"> </span><span class="sd">&quot;&quot;&quot;For CTF challenges&quot;&quot;&quot;</span>
  1130. <span class="k">if</span> <span class="n">server_name</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">port</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1131. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;server_description&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
  1132. <span class="k">return</span>
  1133. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;category&quot;</span><span class="p">]</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">&quot;web&quot;</span><span class="p">,</span> <span class="s2">&quot;misc&quot;</span><span class="p">}</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;proto&quot;</span><span class="p">)</span> <span class="o">!=</span> <span class="s2">&quot;nc&quot;</span><span class="p">:</span>
  1134. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;server_description&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
  1135. <span class="sa">f</span><span class="s2">&quot;The challenge web server is running on `</span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2">` port `</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">` and you can access it from within the container environment using `curl http://</span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">`.&quot;</span>
  1136. <span class="p">)</span>
  1137. <span class="k">else</span><span class="p">:</span>
  1138. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;server_description&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
  1139. <span class="sa">f</span><span class="s2">&quot;The challenge web server is running on `</span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2">` port `</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">` and you can access it from within the container environment using `connect_start </span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">`.&quot;</span>
  1140. <span class="p">)</span>
  1141. <span class="k">def</span> <span class="nf">set_problem_statement_from_challenge_json</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
  1142. <span class="w"> </span><span class="sd">&quot;&quot;&quot;For CTF challenges&quot;&quot;&quot;</span>
  1143. <span class="n">challenge</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">read_text</span><span class="p">())</span>
  1144. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span>
  1145. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;files&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;files&quot;</span><span class="p">,</span> <span class="p">[])</span>
  1146. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;points&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;points&quot;</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
  1147. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;category_friendly&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">CTF_CHALLENGES_CATEGORIES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">challenge</span><span class="p">[</span><span class="s2">&quot;category&quot;</span><span class="p">])</span>
  1148. <span class="k">if</span> <span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">&quot;docker-compose.yml&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">():</span>
  1149. <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Found docker_compose file in </span><span class="si">{</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
  1150. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;docker_compose&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">&quot;docker-compose.yml&quot;</span>
  1151. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;port&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;internal_port&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;port&quot;</span><span class="p">)</span>
  1152. <span class="k">if</span> <span class="s2">&quot;box&quot;</span> <span class="ow">in</span> <span class="n">challenge</span><span class="p">:</span>
  1153. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;server_name&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="p">[</span><span class="s2">&quot;box&quot;</span><span class="p">]</span> <span class="ow">or</span> <span class="s2">&quot;127.0.0.1&quot;</span>
  1154. <span class="k">else</span><span class="p">:</span>
  1155. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;server_name&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
  1156. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;file_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">file_path</span>
  1157. <span class="bp">self</span><span class="o">.</span><span class="n">set_server_description</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;server_name&quot;</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;port&quot;</span><span class="p">])</span>
  1158. <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_text</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">challenge</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">challenge</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
  1159. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;instance_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
  1160. <span class="c1"># sanitize &#39;name&#39; to only alphanumeric characters</span>
  1161. <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;category&quot;</span><span class="p">,</span> <span class="s2">&quot;misc&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;_&quot;</span> <span class="o">+</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span> <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">isalnum</span><span class="p">())</span>
  1162. <span class="p">)</span>
  1163. <span class="k">def</span> <span class="nf">set_problem_statement_from_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
  1164. <span class="k">if</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;challenge.json&quot;</span><span class="p">:</span>
  1165. <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_challenge_json</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span>
  1166. <span class="k">else</span><span class="p">:</span>
  1167. <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_text</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">read_text</span><span class="p">())</span>
  1168. <span class="k">def</span> <span class="nf">set_problem_statement_from_text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
  1169. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;problem_statement&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">text</span>
  1170. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;instance_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;problem_statement&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()[:</span><span class="mi">6</span><span class="p">]</span>
  1171. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;problem_statement_source&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;local&quot;</span>
  1172. <span class="k">def</span> <span class="nf">set_problem_statement</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
  1173. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Get problem statement for a single instance from a github issue url or a</span>
  1174. <span class="sd"> path to a markdown or text file.</span>
  1175. <span class="sd"> &quot;&quot;&quot;</span>
  1176. <span class="k">if</span> <span class="n">data_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;text://&quot;</span><span class="p">):</span>
  1177. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_text</span><span class="p">(</span><span class="n">data_path</span><span class="o">.</span><span class="n">removeprefix</span><span class="p">(</span><span class="s2">&quot;text://&quot;</span><span class="p">))</span>
  1178. <span class="k">if</span> <span class="n">is_github_issue_url</span><span class="p">(</span><span class="n">data_path</span><span class="p">):</span>
  1179. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_gh_issue</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span>
  1180. <span class="k">if</span> <span class="n">Path</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">():</span>
  1181. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_file</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span>
  1182. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Not sure how to get problem statement from </span><span class="si">{</span><span class="n">data_path</span><span class="si">=}</span><span class="s2">.&quot;</span>
  1183. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  1184. <span class="k">def</span> <span class="nf">set_repo_info_from_gh_url</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">base_commit</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
  1185. <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span> <span class="o">=</span> <span class="n">parse_gh_repo_url</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
  1186. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;repo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">repo</span><span class="si">}</span><span class="s2">&quot;</span>
  1187. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;repo_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;github&quot;</span>
  1188. <span class="c1"># Always get commit hash, because base_commit can also be branch or tag</span>
  1189. <span class="n">api</span> <span class="o">=</span> <span class="n">GhApi</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">token</span><span class="p">)</span>
  1190. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;base_commit&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">get_commit</span><span class="p">(</span><span class="n">api</span><span class="p">,</span> <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">ref</span><span class="o">=</span><span class="n">base_commit</span><span class="p">)</span><span class="o">.</span><span class="n">sha</span>
  1191. <span class="k">if</span> <span class="n">base_commit</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;base_commit&quot;</span><span class="p">]:</span>
  1192. <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Base commit reference </span><span class="si">{</span><span class="n">base_commit</span><span class="si">}</span><span class="s2"> resolved to commit hash </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;base_commit&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
  1193. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;version&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;base_commit&quot;</span><span class="p">][:</span><span class="mi">7</span><span class="p">]</span>
  1194. <span class="k">def</span> <span class="nf">set_repo_info_from_local_path</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">base_commit</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
  1195. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;repo&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">path</span><span class="p">)</span><span class="o">.</span><span class="n">resolve</span><span class="p">())</span>
  1196. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;repo_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;local&quot;</span>
  1197. <span class="k">if</span> <span class="n">base_commit</span><span class="p">:</span>
  1198. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;base_commit&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">base_commit</span>
  1199. <span class="k">else</span><span class="p">:</span>
  1200. <span class="k">try</span><span class="p">:</span>
  1201. <span class="n">repo</span> <span class="o">=</span> <span class="n">Repo</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">search_parent_directories</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
  1202. <span class="k">except</span> <span class="n">InvalidGitRepositoryError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  1203. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Could not find git repository at </span><span class="si">{</span><span class="n">path</span><span class="si">=}</span><span class="s2">.&quot;</span>
  1204. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">e</span>
  1205. <span class="k">if</span> <span class="n">repo</span><span class="o">.</span><span class="n">is_dirty</span><span class="p">()</span> <span class="ow">and</span> <span class="s2">&quot;PYTEST_CURRENT_TEST&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
  1206. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Local git repository </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2"> is dirty. Please commit or stash changes.&quot;</span>
  1207. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  1208. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;base_commit&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">head</span><span class="o">.</span><span class="n">object</span><span class="o">.</span><span class="n">hexsha</span>
  1209. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;version&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;base_commit&quot;</span><span class="p">][:</span><span class="mi">7</span><span class="p">]</span>
  1210. <span class="k">def</span> <span class="nf">set_repo_info</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">repo</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">base_commit</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
  1211. <span class="k">if</span> <span class="n">is_github_repo_url</span><span class="p">(</span><span class="n">repo</span><span class="p">):</span>
  1212. <span class="bp">self</span><span class="o">.</span><span class="n">set_repo_info_from_gh_url</span><span class="p">(</span><span class="n">repo</span><span class="p">,</span> <span class="n">base_commit</span><span class="o">=</span><span class="n">base_commit</span><span class="p">)</span>
  1213. <span class="k">elif</span> <span class="n">Path</span><span class="p">(</span><span class="n">repo</span><span class="p">)</span><span class="o">.</span><span class="n">is_dir</span><span class="p">():</span>
  1214. <span class="bp">self</span><span class="o">.</span><span class="n">set_repo_info_from_local_path</span><span class="p">(</span><span class="n">repo</span><span class="p">,</span> <span class="n">base_commit</span><span class="o">=</span><span class="n">base_commit</span><span class="p">)</span>
  1215. <span class="k">else</span><span class="p">:</span>
  1216. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Could not determine repo path from </span><span class="si">{</span><span class="n">repo</span><span class="si">=}</span><span class="s2">.&quot;</span>
  1217. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  1218. <span class="k">def</span> <span class="nf">set_from_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance_dict</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]):</span>
  1219. <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">|=</span> <span class="n">instance_dict</span>
  1220. <span class="k">def</span> <span class="nf">set_missing_fields</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1221. <span class="c1"># TODO: This field is only needed while swe_env is using some questionable logic</span>
  1222. <span class="c1"># to determine whether to clone from a mirror or not. This should be removed in the future.</span>
  1223. <span class="c1"># Values: &#39;swe-bench&#39; (loaded from json/jsonl for swe-bench style inference),</span>
  1224. <span class="c1"># &#39;online&#39; (loaded from github issue or similar) or &#39;local&#39; (loaded from local file)</span>
  1225. <span class="k">if</span> <span class="s2">&quot;problem_statement_source&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
  1226. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;problem_statement_source&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;swe-bench&quot;</span>
  1227. <span class="k">if</span> <span class="s2">&quot;repo_type&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
  1228. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;repo_type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;github&quot;</span>
  1229. <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1230. <span class="n">required_fields</span> <span class="o">=</span> <span class="p">[</span>
  1231. <span class="s2">&quot;problem_statement&quot;</span><span class="p">,</span>
  1232. <span class="s2">&quot;instance_id&quot;</span><span class="p">,</span>
  1233. <span class="s2">&quot;repo&quot;</span><span class="p">,</span>
  1234. <span class="s2">&quot;repo_type&quot;</span><span class="p">,</span>
  1235. <span class="s2">&quot;base_commit&quot;</span><span class="p">,</span>
  1236. <span class="s2">&quot;version&quot;</span><span class="p">,</span>
  1237. <span class="s2">&quot;problem_statement_source&quot;</span><span class="p">,</span>
  1238. <span class="p">]</span>
  1239. <span class="k">if</span> <span class="ow">not</span> <span class="nb">all</span><span class="p">(</span><span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">required_fields</span><span class="p">):</span>
  1240. <span class="n">missing</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">required_fields</span><span class="p">)</span> <span class="o">-</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
  1241. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Missing required fields: </span><span class="si">{</span><span class="n">missing</span><span class="si">=}</span><span class="s2">&quot;</span>
  1242. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  1243. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;repo_type&quot;</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">&quot;github&quot;</span><span class="p">,</span> <span class="s2">&quot;local&quot;</span><span class="p">}:</span>
  1244. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Invalid repo type: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;repo_type&#39;</span><span class="p">]</span><span class="si">=}</span><span class="s2">&quot;</span>
  1245. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  1246. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;repo_type&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;github&quot;</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;repo&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
  1247. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Invalid repo format for </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;repo_type&#39;</span><span class="p">]</span><span class="si">=}</span><span class="s2">: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;repo&#39;</span><span class="p">]</span><span class="si">=}</span><span class="s2">&quot;</span>
  1248. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  1249. <span class="k">def</span> <span class="nf">build</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
  1250. <span class="bp">self</span><span class="o">.</span><span class="n">set_missing_fields</span><span class="p">()</span>
  1251. <span class="bp">self</span><span class="o">.</span><span class="n">validate</span><span class="p">()</span>
  1252. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
  1253. </code></pre></div></td></tr></table></div>
  1254. </details>
  1255. <div class="doc doc-children">
  1256. <div class="doc doc-object doc-function">
  1257. <h3 id="sweagent.environment.utils.InstanceBuilder.__init__" class="doc doc-heading">
  1258. <code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
  1259. </h3>
  1260. <div class="doc doc-contents ">
  1261. <p>This helper class is used to build the data for an instance object,
  1262. retrieving problem statements from github issues or local files and setting
  1263. repo paths from github urls or local paths.</p>
  1264. <details class="quote">
  1265. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  1266. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">713</span>
  1267. <span class="normal">714</span>
  1268. <span class="normal">715</span>
  1269. <span class="normal">716</span>
  1270. <span class="normal">717</span>
  1271. <span class="normal">718</span>
  1272. <span class="normal">719</span>
  1273. <span class="normal">720</span>
  1274. <span class="normal">721</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
  1275. <span class="w"> </span><span class="sd">&quot;&quot;&quot;This helper class is used to build the data for an instance object,</span>
  1276. <span class="sd"> retrieving problem statements from github issues or local files and setting</span>
  1277. <span class="sd"> repo paths from github urls or local paths.</span>
  1278. <span class="sd"> &quot;&quot;&quot;</span>
  1279. <span class="c1"># Args that will be passed to the Instance constructor</span>
  1280. <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="p">{}</span>
  1281. <span class="bp">self</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="n">token</span>
  1282. <span class="bp">self</span><span class="o">.</span><span class="n">_instance_id_problem_suffix</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
  1283. </code></pre></div></td></tr></table></div>
  1284. </details>
  1285. </div>
  1286. </div>
  1287. <div class="doc doc-object doc-function">
  1288. <h3 id="sweagent.environment.utils.InstanceBuilder.set_problem_statement" class="doc doc-heading">
  1289. <code class="highlight language-python"><span class="n">set_problem_statement</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span></code>
  1290. </h3>
  1291. <div class="doc doc-contents ">
  1292. <p>Get problem statement for a single instance from a github issue url or a
  1293. path to a markdown or text file.</p>
  1294. <details class="quote">
  1295. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  1296. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">782</span>
  1297. <span class="normal">783</span>
  1298. <span class="normal">784</span>
  1299. <span class="normal">785</span>
  1300. <span class="normal">786</span>
  1301. <span class="normal">787</span>
  1302. <span class="normal">788</span>
  1303. <span class="normal">789</span>
  1304. <span class="normal">790</span>
  1305. <span class="normal">791</span>
  1306. <span class="normal">792</span>
  1307. <span class="normal">793</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">set_problem_statement</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
  1308. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Get problem statement for a single instance from a github issue url or a</span>
  1309. <span class="sd"> path to a markdown or text file.</span>
  1310. <span class="sd"> &quot;&quot;&quot;</span>
  1311. <span class="k">if</span> <span class="n">data_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;text://&quot;</span><span class="p">):</span>
  1312. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_text</span><span class="p">(</span><span class="n">data_path</span><span class="o">.</span><span class="n">removeprefix</span><span class="p">(</span><span class="s2">&quot;text://&quot;</span><span class="p">))</span>
  1313. <span class="k">if</span> <span class="n">is_github_issue_url</span><span class="p">(</span><span class="n">data_path</span><span class="p">):</span>
  1314. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_gh_issue</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span>
  1315. <span class="k">if</span> <span class="n">Path</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">():</span>
  1316. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_file</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span>
  1317. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Not sure how to get problem statement from </span><span class="si">{</span><span class="n">data_path</span><span class="si">=}</span><span class="s2">.&quot;</span>
  1318. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  1319. </code></pre></div></td></tr></table></div>
  1320. </details>
  1321. </div>
  1322. </div>
  1323. <div class="doc doc-object doc-function">
  1324. <h3 id="sweagent.environment.utils.InstanceBuilder.set_problem_statement_from_challenge_json" class="doc doc-heading">
  1325. <code class="highlight language-python"><span class="n">set_problem_statement_from_challenge_json</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span></code>
  1326. </h3>
  1327. <div class="doc doc-contents ">
  1328. <p>For CTF challenges</p>
  1329. <details class="quote">
  1330. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  1331. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">748</span>
  1332. <span class="normal">749</span>
  1333. <span class="normal">750</span>
  1334. <span class="normal">751</span>
  1335. <span class="normal">752</span>
  1336. <span class="normal">753</span>
  1337. <span class="normal">754</span>
  1338. <span class="normal">755</span>
  1339. <span class="normal">756</span>
  1340. <span class="normal">757</span>
  1341. <span class="normal">758</span>
  1342. <span class="normal">759</span>
  1343. <span class="normal">760</span>
  1344. <span class="normal">761</span>
  1345. <span class="normal">762</span>
  1346. <span class="normal">763</span>
  1347. <span class="normal">764</span>
  1348. <span class="normal">765</span>
  1349. <span class="normal">766</span>
  1350. <span class="normal">767</span>
  1351. <span class="normal">768</span>
  1352. <span class="normal">769</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">set_problem_statement_from_challenge_json</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
  1353. <span class="w"> </span><span class="sd">&quot;&quot;&quot;For CTF challenges&quot;&quot;&quot;</span>
  1354. <span class="n">challenge</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">read_text</span><span class="p">())</span>
  1355. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span>
  1356. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;files&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;files&quot;</span><span class="p">,</span> <span class="p">[])</span>
  1357. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;points&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;points&quot;</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
  1358. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;category_friendly&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">CTF_CHALLENGES_CATEGORIES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">challenge</span><span class="p">[</span><span class="s2">&quot;category&quot;</span><span class="p">])</span>
  1359. <span class="k">if</span> <span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">&quot;docker-compose.yml&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">():</span>
  1360. <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Found docker_compose file in </span><span class="si">{</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
  1361. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;docker_compose&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="s2">&quot;docker-compose.yml&quot;</span>
  1362. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;port&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;internal_port&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;port&quot;</span><span class="p">)</span>
  1363. <span class="k">if</span> <span class="s2">&quot;box&quot;</span> <span class="ow">in</span> <span class="n">challenge</span><span class="p">:</span>
  1364. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;server_name&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">challenge</span><span class="p">[</span><span class="s2">&quot;box&quot;</span><span class="p">]</span> <span class="ow">or</span> <span class="s2">&quot;127.0.0.1&quot;</span>
  1365. <span class="k">else</span><span class="p">:</span>
  1366. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;server_name&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
  1367. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;file_path&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">file_path</span>
  1368. <span class="bp">self</span><span class="o">.</span><span class="n">set_server_description</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;server_name&quot;</span><span class="p">],</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;port&quot;</span><span class="p">])</span>
  1369. <span class="bp">self</span><span class="o">.</span><span class="n">set_problem_statement_from_text</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">challenge</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">challenge</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
  1370. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;instance_id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
  1371. <span class="c1"># sanitize &#39;name&#39; to only alphanumeric characters</span>
  1372. <span class="n">challenge</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;category&quot;</span><span class="p">,</span> <span class="s2">&quot;misc&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;_&quot;</span> <span class="o">+</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">a</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;name&quot;</span><span class="p">]</span> <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">isalnum</span><span class="p">())</span>
  1373. <span class="p">)</span>
  1374. </code></pre></div></td></tr></table></div>
  1375. </details>
  1376. </div>
  1377. </div>
  1378. <div class="doc doc-object doc-function">
  1379. <h3 id="sweagent.environment.utils.InstanceBuilder.set_server_description" class="doc doc-heading">
  1380. <code class="highlight language-python"><span class="n">set_server_description</span><span class="p">(</span><span class="n">server_name</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span></code>
  1381. </h3>
  1382. <div class="doc doc-contents ">
  1383. <p>For CTF challenges</p>
  1384. <details class="quote">
  1385. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  1386. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">734</span>
  1387. <span class="normal">735</span>
  1388. <span class="normal">736</span>
  1389. <span class="normal">737</span>
  1390. <span class="normal">738</span>
  1391. <span class="normal">739</span>
  1392. <span class="normal">740</span>
  1393. <span class="normal">741</span>
  1394. <span class="normal">742</span>
  1395. <span class="normal">743</span>
  1396. <span class="normal">744</span>
  1397. <span class="normal">745</span>
  1398. <span class="normal">746</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">set_server_description</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">server_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">port</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
  1399. <span class="w"> </span><span class="sd">&quot;&quot;&quot;For CTF challenges&quot;&quot;&quot;</span>
  1400. <span class="k">if</span> <span class="n">server_name</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">port</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1401. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;server_description&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
  1402. <span class="k">return</span>
  1403. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;category&quot;</span><span class="p">]</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">&quot;web&quot;</span><span class="p">,</span> <span class="s2">&quot;misc&quot;</span><span class="p">}</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;proto&quot;</span><span class="p">)</span> <span class="o">!=</span> <span class="s2">&quot;nc&quot;</span><span class="p">:</span>
  1404. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;server_description&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
  1405. <span class="sa">f</span><span class="s2">&quot;The challenge web server is running on `</span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2">` port `</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">` and you can access it from within the container environment using `curl http://</span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">`.&quot;</span>
  1406. <span class="p">)</span>
  1407. <span class="k">else</span><span class="p">:</span>
  1408. <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;challenge&quot;</span><span class="p">][</span><span class="s2">&quot;server_description&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span>
  1409. <span class="sa">f</span><span class="s2">&quot;The challenge web server is running on `</span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2">` port `</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">` and you can access it from within the container environment using `connect_start </span><span class="si">{</span><span class="n">server_name</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">`.&quot;</span>
  1410. <span class="p">)</span>
  1411. </code></pre></div></td></tr></table></div>
  1412. </details>
  1413. </div>
  1414. </div>
  1415. </div>
  1416. </div>
  1417. </div>
  1418. <div class="doc doc-object doc-class">
  1419. <h2 id="sweagent.environment.utils.PatchFormatter" class="doc doc-heading">
  1420. <code>PatchFormatter</code>
  1421. </h2>
  1422. <div class="doc doc-contents ">
  1423. <details class="quote">
  1424. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  1425. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1015</span>
  1426. <span class="normal">1016</span>
  1427. <span class="normal">1017</span>
  1428. <span class="normal">1018</span>
  1429. <span class="normal">1019</span>
  1430. <span class="normal">1020</span>
  1431. <span class="normal">1021</span>
  1432. <span class="normal">1022</span>
  1433. <span class="normal">1023</span>
  1434. <span class="normal">1024</span>
  1435. <span class="normal">1025</span>
  1436. <span class="normal">1026</span>
  1437. <span class="normal">1027</span>
  1438. <span class="normal">1028</span>
  1439. <span class="normal">1029</span>
  1440. <span class="normal">1030</span>
  1441. <span class="normal">1031</span>
  1442. <span class="normal">1032</span>
  1443. <span class="normal">1033</span>
  1444. <span class="normal">1034</span>
  1445. <span class="normal">1035</span>
  1446. <span class="normal">1036</span>
  1447. <span class="normal">1037</span>
  1448. <span class="normal">1038</span>
  1449. <span class="normal">1039</span>
  1450. <span class="normal">1040</span>
  1451. <span class="normal">1041</span>
  1452. <span class="normal">1042</span>
  1453. <span class="normal">1043</span>
  1454. <span class="normal">1044</span>
  1455. <span class="normal">1045</span>
  1456. <span class="normal">1046</span>
  1457. <span class="normal">1047</span>
  1458. <span class="normal">1048</span>
  1459. <span class="normal">1049</span>
  1460. <span class="normal">1050</span>
  1461. <span class="normal">1051</span>
  1462. <span class="normal">1052</span>
  1463. <span class="normal">1053</span>
  1464. <span class="normal">1054</span>
  1465. <span class="normal">1055</span>
  1466. <span class="normal">1056</span>
  1467. <span class="normal">1057</span>
  1468. <span class="normal">1058</span>
  1469. <span class="normal">1059</span>
  1470. <span class="normal">1060</span>
  1471. <span class="normal">1061</span>
  1472. <span class="normal">1062</span>
  1473. <span class="normal">1063</span>
  1474. <span class="normal">1064</span>
  1475. <span class="normal">1065</span>
  1476. <span class="normal">1066</span>
  1477. <span class="normal">1067</span>
  1478. <span class="normal">1068</span>
  1479. <span class="normal">1069</span>
  1480. <span class="normal">1070</span>
  1481. <span class="normal">1071</span>
  1482. <span class="normal">1072</span>
  1483. <span class="normal">1073</span>
  1484. <span class="normal">1074</span>
  1485. <span class="normal">1075</span>
  1486. <span class="normal">1076</span>
  1487. <span class="normal">1077</span>
  1488. <span class="normal">1078</span>
  1489. <span class="normal">1079</span>
  1490. <span class="normal">1080</span>
  1491. <span class="normal">1081</span>
  1492. <span class="normal">1082</span>
  1493. <span class="normal">1083</span>
  1494. <span class="normal">1084</span>
  1495. <span class="normal">1085</span>
  1496. <span class="normal">1086</span>
  1497. <span class="normal">1087</span>
  1498. <span class="normal">1088</span>
  1499. <span class="normal">1089</span>
  1500. <span class="normal">1090</span>
  1501. <span class="normal">1091</span>
  1502. <span class="normal">1092</span>
  1503. <span class="normal">1093</span>
  1504. <span class="normal">1094</span>
  1505. <span class="normal">1095</span>
  1506. <span class="normal">1096</span>
  1507. <span class="normal">1097</span>
  1508. <span class="normal">1098</span>
  1509. <span class="normal">1099</span>
  1510. <span class="normal">1100</span>
  1511. <span class="normal">1101</span>
  1512. <span class="normal">1102</span>
  1513. <span class="normal">1103</span>
  1514. <span class="normal">1104</span>
  1515. <span class="normal">1105</span>
  1516. <span class="normal">1106</span>
  1517. <span class="normal">1107</span>
  1518. <span class="normal">1108</span>
  1519. <span class="normal">1109</span>
  1520. <span class="normal">1110</span>
  1521. <span class="normal">1111</span>
  1522. <span class="normal">1112</span>
  1523. <span class="normal">1113</span>
  1524. <span class="normal">1114</span>
  1525. <span class="normal">1115</span>
  1526. <span class="normal">1116</span>
  1527. <span class="normal">1117</span>
  1528. <span class="normal">1118</span>
  1529. <span class="normal">1119</span>
  1530. <span class="normal">1120</span>
  1531. <span class="normal">1121</span>
  1532. <span class="normal">1122</span>
  1533. <span class="normal">1123</span>
  1534. <span class="normal">1124</span>
  1535. <span class="normal">1125</span>
  1536. <span class="normal">1126</span>
  1537. <span class="normal">1127</span>
  1538. <span class="normal">1128</span>
  1539. <span class="normal">1129</span>
  1540. <span class="normal">1130</span>
  1541. <span class="normal">1131</span>
  1542. <span class="normal">1132</span>
  1543. <span class="normal">1133</span>
  1544. <span class="normal">1134</span>
  1545. <span class="normal">1135</span>
  1546. <span class="normal">1136</span>
  1547. <span class="normal">1137</span>
  1548. <span class="normal">1138</span>
  1549. <span class="normal">1139</span>
  1550. <span class="normal">1140</span>
  1551. <span class="normal">1141</span>
  1552. <span class="normal">1142</span>
  1553. <span class="normal">1143</span>
  1554. <span class="normal">1144</span>
  1555. <span class="normal">1145</span>
  1556. <span class="normal">1146</span>
  1557. <span class="normal">1147</span>
  1558. <span class="normal">1148</span>
  1559. <span class="normal">1149</span>
  1560. <span class="normal">1150</span>
  1561. <span class="normal">1151</span>
  1562. <span class="normal">1152</span>
  1563. <span class="normal">1153</span>
  1564. <span class="normal">1154</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span> <span class="nc">PatchFormatter</span><span class="p">:</span>
  1565. <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
  1566. <span class="bp">self</span><span class="p">,</span>
  1567. <span class="n">patch</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
  1568. <span class="n">read_method</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="nb">str</span><span class="p">],</span> <span class="nb">str</span><span class="p">],</span>
  1569. <span class="p">):</span>
  1570. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Given the final patch and access to the container that contains the repository,</span>
  1571. <span class="sd"> extract relevant lines from the modified file.</span>
  1572. <span class="sd"> Args:</span>
  1573. <span class="sd"> patch: The patch as a string.</span>
  1574. <span class="sd"> read_method: Callable with path to file (relative to repository root) as argument</span>
  1575. <span class="sd"> that returns the file content as a string.</span>
  1576. <span class="sd"> &quot;&quot;&quot;</span>
  1577. <span class="bp">self</span><span class="o">.</span><span class="n">_patch</span> <span class="o">=</span> <span class="n">PatchSet</span><span class="p">(</span><span class="n">patch</span><span class="p">)</span>
  1578. <span class="bp">self</span><span class="o">.</span><span class="n">_patched_files</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
  1579. <span class="bp">self</span><span class="o">.</span><span class="n">_original_files</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
  1580. <span class="bp">self</span><span class="o">.</span><span class="n">_patch_applied</span> <span class="o">=</span> <span class="kc">True</span>
  1581. <span class="bp">self</span><span class="o">.</span><span class="n">_read_file</span> <span class="o">=</span> <span class="n">read_method</span>
  1582. <span class="bp">self</span><span class="o">.</span><span class="n">_read_files</span><span class="p">(</span><span class="n">original</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
  1583. <span class="nd">@staticmethod</span>
  1584. <span class="k">def</span> <span class="nf">_merge_intervals</span><span class="p">(</span><span class="n">starts</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="n">stops</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]]:</span>
  1585. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Given two lists of integers, starts and stops, merges all overlapping intervals.</span>
  1586. <span class="sd"> For example `starts=[1, 5, 18]`, `stops=[10, 13, 20]`</span>
  1587. <span class="sd"> should return `starts=[1, 18]`, `stops=[13, 20]`</span>
  1588. <span class="sd"> &quot;&quot;&quot;</span>
  1589. <span class="n">intervals</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">))</span>
  1590. <span class="n">merged</span> <span class="o">=</span> <span class="p">[]</span>
  1591. <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">stop</span> <span class="ow">in</span> <span class="n">intervals</span><span class="p">:</span>
  1592. <span class="k">if</span> <span class="ow">not</span> <span class="n">merged</span> <span class="ow">or</span> <span class="n">merged</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">start</span><span class="p">:</span>
  1593. <span class="c1"># No overlap</span>
  1594. <span class="n">merged</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">start</span><span class="p">,</span> <span class="n">stop</span><span class="p">])</span>
  1595. <span class="k">else</span><span class="p">:</span>
  1596. <span class="c1"># Overlap</span>
  1597. <span class="n">merged</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">merged</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">],</span> <span class="n">stop</span><span class="p">)</span>
  1598. <span class="c1"># Unzip again</span>
  1599. <span class="n">merged_starts</span><span class="p">,</span> <span class="n">merged_stops</span> <span class="o">=</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">merged</span><span class="p">)</span>
  1600. <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">merged_starts</span><span class="p">),</span> <span class="nb">list</span><span class="p">(</span><span class="n">merged_stops</span><span class="p">)</span>
  1601. <span class="k">def</span> <span class="nf">format_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">starts</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="n">stops</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="o">*</span><span class="p">,</span> <span class="n">linenos</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
  1602. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Reads file and returns string representation of the relevant lines.</span>
  1603. <span class="sd"> Args:</span>
  1604. <span class="sd"> path: The path to the file within the repo location</span>
  1605. <span class="sd"> starts: The starting line numbers of the relevant lines. The first line is line 1.</span>
  1606. <span class="sd"> stops: The stopping line numbers of the relevant lines. The stop is not inclusive.</span>
  1607. <span class="sd"> The first line is line 1.</span>
  1608. <span class="sd"> linenos: Whether to include line numbers</span>
  1609. <span class="sd"> &quot;&quot;&quot;</span>
  1610. <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">starts</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">stops</span><span class="p">)</span>
  1611. <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">start</span> <span class="o">&gt;=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">start</span> <span class="ow">in</span> <span class="n">starts</span><span class="p">)</span>
  1612. <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">start</span> <span class="o">&lt;</span> <span class="n">stop</span> <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">stop</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">))</span>
  1613. <span class="n">starts</span><span class="p">,</span> <span class="n">stops</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_merge_intervals</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">)</span>
  1614. <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">hunk1_start</span> <span class="o">&lt;</span> <span class="n">hunk2_start</span> <span class="k">for</span> <span class="n">hunk1_start</span><span class="p">,</span> <span class="n">hunk2_start</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">starts</span><span class="p">[</span><span class="mi">1</span><span class="p">:]))</span>
  1615. <span class="n">out</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
  1616. <span class="k">if</span> <span class="n">starts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
  1617. <span class="c1"># Count from 1</span>
  1618. <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;[</span><span class="si">{</span><span class="n">starts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="si">}</span><span class="s2"> lines above omitted]&quot;</span><span class="p">)</span>
  1619. <span class="n">last_stop</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
  1620. <span class="n">lines</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
  1621. <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">stop</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">):</span>
  1622. <span class="k">assert</span> <span class="n">start</span> <span class="o">&gt;=</span> <span class="mi">1</span>
  1623. <span class="k">if</span> <span class="n">last_stop</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1624. <span class="n">n_omitted</span> <span class="o">=</span> <span class="n">start</span> <span class="o">-</span> <span class="n">last_stop</span>
  1625. <span class="c1"># Check that we have non-overlapping hunks</span>
  1626. <span class="k">assert</span> <span class="n">n_omitted</span> <span class="o">&gt;=</span> <span class="mi">0</span>
  1627. <span class="k">if</span> <span class="n">n_omitted</span><span class="p">:</span>
  1628. <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">[</span><span class="si">{</span><span class="n">n_omitted</span><span class="si">}</span><span class="s2"> lines omitted]</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
  1629. <span class="c1"># Count from 1</span>
  1630. <span class="n">these_lines</span> <span class="o">=</span> <span class="n">lines</span><span class="p">[</span><span class="n">start</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">:</span> <span class="n">stop</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
  1631. <span class="k">if</span> <span class="n">linenos</span><span class="p">:</span>
  1632. <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">i</span><span class="si">:</span><span class="s2">6d</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">l</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">l</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">these_lines</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="n">start</span><span class="p">)]))</span>
  1633. <span class="k">else</span><span class="p">:</span>
  1634. <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">these_lines</span><span class="p">))</span>
  1635. <span class="n">last_stop</span> <span class="o">=</span> <span class="n">stop</span>
  1636. <span class="k">if</span> <span class="n">last_stop</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">):</span>
  1637. <span class="c1"># Stop is not inclusive</span>
  1638. <span class="n">omitted</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">-</span> <span class="n">last_stop</span>
  1639. <span class="k">assert</span> <span class="n">omitted</span> <span class="o">&gt;</span> <span class="mi">0</span>
  1640. <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;[</span><span class="si">{</span><span class="n">omitted</span><span class="si">}</span><span class="s2"> lines below omitted]&quot;</span><span class="p">)</span>
  1641. <span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
  1642. <span class="k">def</span> <span class="nf">_get_hunk_lines</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">original</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">context_length</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]]]:</span>
  1643. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the starts and stops for all files in the patch.</span>
  1644. <span class="sd"> Args:</span>
  1645. <span class="sd"> original: Whether to read the original file or the patched file</span>
  1646. <span class="sd"> context_length: The number of lines to include above and below the hunk</span>
  1647. <span class="sd"> Returns:</span>
  1648. <span class="sd"> A dictionary with the file path as key and a tuple of lists of starts and stops as value.</span>
  1649. <span class="sd"> &quot;&quot;&quot;</span>
  1650. <span class="n">out</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]]]</span> <span class="o">=</span> <span class="p">{}</span>
  1651. <span class="k">for</span> <span class="n">patch</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_patch</span><span class="p">:</span>
  1652. <span class="k">if</span> <span class="ow">not</span> <span class="n">patch</span><span class="o">.</span><span class="n">is_modified_file</span><span class="p">:</span>
  1653. <span class="k">continue</span>
  1654. <span class="n">starts</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
  1655. <span class="n">stops</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
  1656. <span class="k">for</span> <span class="n">hunk</span> <span class="ow">in</span> <span class="n">patch</span><span class="p">:</span>
  1657. <span class="k">if</span> <span class="n">original</span><span class="p">:</span>
  1658. <span class="c1"># 1 is the lowest line number</span>
  1659. <span class="n">start</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">hunk</span><span class="o">.</span><span class="n">source_start</span> <span class="o">-</span> <span class="n">context_length</span><span class="p">)</span>
  1660. <span class="n">stop</span> <span class="o">=</span> <span class="n">hunk</span><span class="o">.</span><span class="n">source_start</span> <span class="o">+</span> <span class="n">hunk</span><span class="o">.</span><span class="n">source_length</span> <span class="o">+</span> <span class="n">context_length</span>
  1661. <span class="k">else</span><span class="p">:</span>
  1662. <span class="n">start</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">hunk</span><span class="o">.</span><span class="n">target_start</span> <span class="o">-</span> <span class="n">context_length</span><span class="p">)</span>
  1663. <span class="n">stop</span> <span class="o">=</span> <span class="n">hunk</span><span class="o">.</span><span class="n">target_start</span> <span class="o">+</span> <span class="n">hunk</span><span class="o">.</span><span class="n">target_length</span> <span class="o">+</span> <span class="n">context_length</span>
  1664. <span class="n">starts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">start</span><span class="p">)</span>
  1665. <span class="n">stops</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">stop</span><span class="p">)</span>
  1666. <span class="n">out</span><span class="p">[</span><span class="n">patch</span><span class="o">.</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">)</span>
  1667. <span class="k">return</span> <span class="n">out</span>
  1668. <span class="k">def</span> <span class="nf">_read_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">original</span><span class="p">:</span> <span class="nb">bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
  1669. <span class="k">for</span> <span class="n">patch</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_patch</span><span class="p">:</span>
  1670. <span class="n">path</span> <span class="o">=</span> <span class="n">patch</span><span class="o">.</span><span class="n">path</span>
  1671. <span class="k">if</span> <span class="ow">not</span> <span class="n">patch</span><span class="o">.</span><span class="n">is_modified_file</span><span class="p">:</span>
  1672. <span class="k">continue</span>
  1673. <span class="k">if</span> <span class="n">original</span><span class="p">:</span>
  1674. <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;Original file reading not implemented&quot;</span>
  1675. <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  1676. <span class="k">else</span><span class="p">:</span>
  1677. <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_patch_applied</span>
  1678. <span class="bp">self</span><span class="o">.</span><span class="n">_patched_files</span><span class="p">[</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_file</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
  1679. <span class="nd">@staticmethod</span>
  1680. <span class="k">def</span> <span class="nf">concat_files_strings</span><span class="p">(</span><span class="n">files</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
  1681. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Concatenate multiple `read_files` outputs into a single string.&quot;&quot;&quot;</span>
  1682. <span class="n">out</span> <span class="o">=</span> <span class="p">[]</span>
  1683. <span class="k">for</span> <span class="n">path</span><span class="p">,</span> <span class="n">content</span> <span class="ow">in</span> <span class="n">files</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
  1684. <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;[File: </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">]</span><span class="se">\n</span><span class="si">{</span><span class="n">content</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
  1685. <span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
  1686. <span class="k">def</span> <span class="nf">get_files_str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">original</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span> <span class="n">context_length</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="mi">50</span><span class="p">,</span> <span class="n">linenos</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
  1687. <span class="n">hunk_lines</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_hunk_lines</span><span class="p">(</span><span class="n">original</span><span class="o">=</span><span class="n">original</span><span class="p">,</span> <span class="n">context_length</span><span class="o">=</span><span class="n">context_length</span><span class="p">)</span>
  1688. <span class="n">sources</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_original_files</span> <span class="k">if</span> <span class="n">original</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">_patched_files</span>
  1689. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">concat_files_strings</span><span class="p">(</span>
  1690. <span class="p">{</span><span class="n">path</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">format_file</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="o">*</span><span class="n">hunk_lines</span><span class="p">[</span><span class="n">path</span><span class="p">],</span> <span class="n">linenos</span><span class="o">=</span><span class="n">linenos</span><span class="p">)</span> <span class="k">for</span> <span class="n">path</span><span class="p">,</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">sources</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
  1691. <span class="p">)</span>
  1692. </code></pre></div></td></tr></table></div>
  1693. </details>
  1694. <div class="doc doc-children">
  1695. <div class="doc doc-object doc-function">
  1696. <h3 id="sweagent.environment.utils.PatchFormatter.__init__" class="doc doc-heading">
  1697. <code class="highlight language-python"><span class="fm">__init__</span><span class="p">(</span><span class="n">patch</span><span class="p">,</span> <span class="n">read_method</span><span class="p">)</span></code>
  1698. </h3>
  1699. <div class="doc doc-contents ">
  1700. <p>Given the final patch and access to the container that contains the repository,
  1701. extract relevant lines from the modified file.</p>
  1702. <p><span class="doc-section-title">Parameters:</span></p>
  1703. <table>
  1704. <thead>
  1705. <tr>
  1706. <th>Name</th>
  1707. <th>Type</th>
  1708. <th>Description</th>
  1709. <th>Default</th>
  1710. </tr>
  1711. </thead>
  1712. <tbody>
  1713. <tr class="doc-section-item">
  1714. <td><code>patch</code></td>
  1715. <td>
  1716. <code>str</code>
  1717. </td>
  1718. <td>
  1719. <div class="doc-md-description">
  1720. <p>The patch as a string.</p>
  1721. </div>
  1722. </td>
  1723. <td>
  1724. <em>required</em>
  1725. </td>
  1726. </tr>
  1727. <tr class="doc-section-item">
  1728. <td><code>read_method</code></td>
  1729. <td>
  1730. <code><span title="typing.Callable">Callable</span>[[str], str]</code>
  1731. </td>
  1732. <td>
  1733. <div class="doc-md-description">
  1734. <p>Callable with path to file (relative to repository root) as argument
  1735. that returns the file content as a string.</p>
  1736. </div>
  1737. </td>
  1738. <td>
  1739. <em>required</em>
  1740. </td>
  1741. </tr>
  1742. </tbody>
  1743. </table>
  1744. <details class="quote">
  1745. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  1746. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1016</span>
  1747. <span class="normal">1017</span>
  1748. <span class="normal">1018</span>
  1749. <span class="normal">1019</span>
  1750. <span class="normal">1020</span>
  1751. <span class="normal">1021</span>
  1752. <span class="normal">1022</span>
  1753. <span class="normal">1023</span>
  1754. <span class="normal">1024</span>
  1755. <span class="normal">1025</span>
  1756. <span class="normal">1026</span>
  1757. <span class="normal">1027</span>
  1758. <span class="normal">1028</span>
  1759. <span class="normal">1029</span>
  1760. <span class="normal">1030</span>
  1761. <span class="normal">1031</span>
  1762. <span class="normal">1032</span>
  1763. <span class="normal">1033</span>
  1764. <span class="normal">1034</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
  1765. <span class="bp">self</span><span class="p">,</span>
  1766. <span class="n">patch</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
  1767. <span class="n">read_method</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="nb">str</span><span class="p">],</span> <span class="nb">str</span><span class="p">],</span>
  1768. <span class="p">):</span>
  1769. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Given the final patch and access to the container that contains the repository,</span>
  1770. <span class="sd"> extract relevant lines from the modified file.</span>
  1771. <span class="sd"> Args:</span>
  1772. <span class="sd"> patch: The patch as a string.</span>
  1773. <span class="sd"> read_method: Callable with path to file (relative to repository root) as argument</span>
  1774. <span class="sd"> that returns the file content as a string.</span>
  1775. <span class="sd"> &quot;&quot;&quot;</span>
  1776. <span class="bp">self</span><span class="o">.</span><span class="n">_patch</span> <span class="o">=</span> <span class="n">PatchSet</span><span class="p">(</span><span class="n">patch</span><span class="p">)</span>
  1777. <span class="bp">self</span><span class="o">.</span><span class="n">_patched_files</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
  1778. <span class="bp">self</span><span class="o">.</span><span class="n">_original_files</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
  1779. <span class="bp">self</span><span class="o">.</span><span class="n">_patch_applied</span> <span class="o">=</span> <span class="kc">True</span>
  1780. <span class="bp">self</span><span class="o">.</span><span class="n">_read_file</span> <span class="o">=</span> <span class="n">read_method</span>
  1781. <span class="bp">self</span><span class="o">.</span><span class="n">_read_files</span><span class="p">(</span><span class="n">original</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
  1782. </code></pre></div></td></tr></table></div>
  1783. </details>
  1784. </div>
  1785. </div>
  1786. <div class="doc doc-object doc-function">
  1787. <h3 id="sweagent.environment.utils.PatchFormatter.concat_files_strings" class="doc doc-heading">
  1788. <code class="highlight language-python"><span class="n">concat_files_strings</span><span class="p">(</span><span class="n">files</span><span class="p">)</span></code>
  1789. <span class="doc doc-labels">
  1790. <small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
  1791. </span>
  1792. </h3>
  1793. <div class="doc doc-contents ">
  1794. <p>Concatenate multiple <code>read_files</code> outputs into a single string.</p>
  1795. <details class="quote">
  1796. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  1797. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1141</span>
  1798. <span class="normal">1142</span>
  1799. <span class="normal">1143</span>
  1800. <span class="normal">1144</span>
  1801. <span class="normal">1145</span>
  1802. <span class="normal">1146</span>
  1803. <span class="normal">1147</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="nd">@staticmethod</span>
  1804. <span class="k">def</span> <span class="nf">concat_files_strings</span><span class="p">(</span><span class="n">files</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
  1805. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Concatenate multiple `read_files` outputs into a single string.&quot;&quot;&quot;</span>
  1806. <span class="n">out</span> <span class="o">=</span> <span class="p">[]</span>
  1807. <span class="k">for</span> <span class="n">path</span><span class="p">,</span> <span class="n">content</span> <span class="ow">in</span> <span class="n">files</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
  1808. <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;[File: </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">]</span><span class="se">\n</span><span class="si">{</span><span class="n">content</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
  1809. <span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
  1810. </code></pre></div></td></tr></table></div>
  1811. </details>
  1812. </div>
  1813. </div>
  1814. <div class="doc doc-object doc-function">
  1815. <h3 id="sweagent.environment.utils.PatchFormatter.format_file" class="doc doc-heading">
  1816. <code class="highlight language-python"><span class="n">format_file</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">linenos</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></code>
  1817. </h3>
  1818. <div class="doc doc-contents ">
  1819. <p>Reads file and returns string representation of the relevant lines.</p>
  1820. <p><span class="doc-section-title">Parameters:</span></p>
  1821. <table>
  1822. <thead>
  1823. <tr>
  1824. <th>Name</th>
  1825. <th>Type</th>
  1826. <th>Description</th>
  1827. <th>Default</th>
  1828. </tr>
  1829. </thead>
  1830. <tbody>
  1831. <tr class="doc-section-item">
  1832. <td><code>path</code></td>
  1833. <td>
  1834. </td>
  1835. <td>
  1836. <div class="doc-md-description">
  1837. <p>The path to the file within the repo location</p>
  1838. </div>
  1839. </td>
  1840. <td>
  1841. <em>required</em>
  1842. </td>
  1843. </tr>
  1844. <tr class="doc-section-item">
  1845. <td><code>starts</code></td>
  1846. <td>
  1847. <code>list[int]</code>
  1848. </td>
  1849. <td>
  1850. <div class="doc-md-description">
  1851. <p>The starting line numbers of the relevant lines. The first line is line 1.</p>
  1852. </div>
  1853. </td>
  1854. <td>
  1855. <em>required</em>
  1856. </td>
  1857. </tr>
  1858. <tr class="doc-section-item">
  1859. <td><code>stops</code></td>
  1860. <td>
  1861. <code>list[int]</code>
  1862. </td>
  1863. <td>
  1864. <div class="doc-md-description">
  1865. <p>The stopping line numbers of the relevant lines. The stop is not inclusive.
  1866. The first line is line 1.</p>
  1867. </div>
  1868. </td>
  1869. <td>
  1870. <em>required</em>
  1871. </td>
  1872. </tr>
  1873. <tr class="doc-section-item">
  1874. <td><code>linenos</code></td>
  1875. <td>
  1876. <code>bool</code>
  1877. </td>
  1878. <td>
  1879. <div class="doc-md-description">
  1880. <p>Whether to include line numbers</p>
  1881. </div>
  1882. </td>
  1883. <td>
  1884. <code>True</code>
  1885. </td>
  1886. </tr>
  1887. </tbody>
  1888. </table>
  1889. <details class="quote">
  1890. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  1891. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1057</span>
  1892. <span class="normal">1058</span>
  1893. <span class="normal">1059</span>
  1894. <span class="normal">1060</span>
  1895. <span class="normal">1061</span>
  1896. <span class="normal">1062</span>
  1897. <span class="normal">1063</span>
  1898. <span class="normal">1064</span>
  1899. <span class="normal">1065</span>
  1900. <span class="normal">1066</span>
  1901. <span class="normal">1067</span>
  1902. <span class="normal">1068</span>
  1903. <span class="normal">1069</span>
  1904. <span class="normal">1070</span>
  1905. <span class="normal">1071</span>
  1906. <span class="normal">1072</span>
  1907. <span class="normal">1073</span>
  1908. <span class="normal">1074</span>
  1909. <span class="normal">1075</span>
  1910. <span class="normal">1076</span>
  1911. <span class="normal">1077</span>
  1912. <span class="normal">1078</span>
  1913. <span class="normal">1079</span>
  1914. <span class="normal">1080</span>
  1915. <span class="normal">1081</span>
  1916. <span class="normal">1082</span>
  1917. <span class="normal">1083</span>
  1918. <span class="normal">1084</span>
  1919. <span class="normal">1085</span>
  1920. <span class="normal">1086</span>
  1921. <span class="normal">1087</span>
  1922. <span class="normal">1088</span>
  1923. <span class="normal">1089</span>
  1924. <span class="normal">1090</span>
  1925. <span class="normal">1091</span>
  1926. <span class="normal">1092</span>
  1927. <span class="normal">1093</span>
  1928. <span class="normal">1094</span>
  1929. <span class="normal">1095</span>
  1930. <span class="normal">1096</span>
  1931. <span class="normal">1097</span>
  1932. <span class="normal">1098</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">format_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">starts</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="n">stops</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">],</span> <span class="o">*</span><span class="p">,</span> <span class="n">linenos</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
  1933. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Reads file and returns string representation of the relevant lines.</span>
  1934. <span class="sd"> Args:</span>
  1935. <span class="sd"> path: The path to the file within the repo location</span>
  1936. <span class="sd"> starts: The starting line numbers of the relevant lines. The first line is line 1.</span>
  1937. <span class="sd"> stops: The stopping line numbers of the relevant lines. The stop is not inclusive.</span>
  1938. <span class="sd"> The first line is line 1.</span>
  1939. <span class="sd"> linenos: Whether to include line numbers</span>
  1940. <span class="sd"> &quot;&quot;&quot;</span>
  1941. <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">starts</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">stops</span><span class="p">)</span>
  1942. <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">start</span> <span class="o">&gt;=</span> <span class="mi">1</span> <span class="k">for</span> <span class="n">start</span> <span class="ow">in</span> <span class="n">starts</span><span class="p">)</span>
  1943. <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">start</span> <span class="o">&lt;</span> <span class="n">stop</span> <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">stop</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">))</span>
  1944. <span class="n">starts</span><span class="p">,</span> <span class="n">stops</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_merge_intervals</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">)</span>
  1945. <span class="k">assert</span> <span class="nb">all</span><span class="p">(</span><span class="n">hunk1_start</span> <span class="o">&lt;</span> <span class="n">hunk2_start</span> <span class="k">for</span> <span class="n">hunk1_start</span><span class="p">,</span> <span class="n">hunk2_start</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">starts</span><span class="p">[</span><span class="mi">1</span><span class="p">:]))</span>
  1946. <span class="n">out</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
  1947. <span class="k">if</span> <span class="n">starts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
  1948. <span class="c1"># Count from 1</span>
  1949. <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;[</span><span class="si">{</span><span class="n">starts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="si">}</span><span class="s2"> lines above omitted]&quot;</span><span class="p">)</span>
  1950. <span class="n">last_stop</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
  1951. <span class="n">lines</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
  1952. <span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">stop</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">starts</span><span class="p">,</span> <span class="n">stops</span><span class="p">):</span>
  1953. <span class="k">assert</span> <span class="n">start</span> <span class="o">&gt;=</span> <span class="mi">1</span>
  1954. <span class="k">if</span> <span class="n">last_stop</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1955. <span class="n">n_omitted</span> <span class="o">=</span> <span class="n">start</span> <span class="o">-</span> <span class="n">last_stop</span>
  1956. <span class="c1"># Check that we have non-overlapping hunks</span>
  1957. <span class="k">assert</span> <span class="n">n_omitted</span> <span class="o">&gt;=</span> <span class="mi">0</span>
  1958. <span class="k">if</span> <span class="n">n_omitted</span><span class="p">:</span>
  1959. <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">[</span><span class="si">{</span><span class="n">n_omitted</span><span class="si">}</span><span class="s2"> lines omitted]</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
  1960. <span class="c1"># Count from 1</span>
  1961. <span class="n">these_lines</span> <span class="o">=</span> <span class="n">lines</span><span class="p">[</span><span class="n">start</span> <span class="o">-</span> <span class="mi">1</span> <span class="p">:</span> <span class="n">stop</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
  1962. <span class="k">if</span> <span class="n">linenos</span><span class="p">:</span>
  1963. <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">i</span><span class="si">:</span><span class="s2">6d</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">l</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">l</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">these_lines</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="n">start</span><span class="p">)]))</span>
  1964. <span class="k">else</span><span class="p">:</span>
  1965. <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">these_lines</span><span class="p">))</span>
  1966. <span class="n">last_stop</span> <span class="o">=</span> <span class="n">stop</span>
  1967. <span class="k">if</span> <span class="n">last_stop</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">):</span>
  1968. <span class="c1"># Stop is not inclusive</span>
  1969. <span class="n">omitted</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">-</span> <span class="n">last_stop</span>
  1970. <span class="k">assert</span> <span class="n">omitted</span> <span class="o">&gt;</span> <span class="mi">0</span>
  1971. <span class="n">out</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;[</span><span class="si">{</span><span class="n">omitted</span><span class="si">}</span><span class="s2"> lines below omitted]&quot;</span><span class="p">)</span>
  1972. <span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
  1973. </code></pre></div></td></tr></table></div>
  1974. </details>
  1975. </div>
  1976. </div>
  1977. </div>
  1978. </div>
  1979. </div>
  1980. <div class="doc doc-object doc-function">
  1981. <h2 id="sweagent.environment.utils.copy_anything_to_container" class="doc doc-heading">
  1982. <code class="highlight language-python"><span class="n">copy_anything_to_container</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">host_path</span><span class="p">,</span> <span class="n">container_path</span><span class="p">)</span></code>
  1983. </h2>
  1984. <div class="doc doc-contents ">
  1985. <p>Copy files or directories from host to container</p>
  1986. <p>Note: Will need to set ownership on the copied files in the container.</p>
  1987. <details class="quote">
  1988. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  1989. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">122</span>
  1990. <span class="normal">123</span>
  1991. <span class="normal">124</span>
  1992. <span class="normal">125</span>
  1993. <span class="normal">126</span>
  1994. <span class="normal">127</span>
  1995. <span class="normal">128</span>
  1996. <span class="normal">129</span>
  1997. <span class="normal">130</span>
  1998. <span class="normal">131</span>
  1999. <span class="normal">132</span>
  2000. <span class="normal">133</span>
  2001. <span class="normal">134</span>
  2002. <span class="normal">135</span>
  2003. <span class="normal">136</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">copy_anything_to_container</span><span class="p">(</span><span class="n">container</span><span class="p">:</span> <span class="n">Container</span><span class="p">,</span> <span class="n">host_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">container_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
  2004. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Copy files or directories from host to container</span>
  2005. <span class="sd"> Note: Will need to set ownership on the copied files in the container.</span>
  2006. <span class="sd"> &quot;&quot;&quot;</span>
  2007. <span class="k">if</span> <span class="ow">not</span> <span class="n">Path</span><span class="p">(</span><span class="n">host_path</span><span class="p">)</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
  2008. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Path </span><span class="si">{</span><span class="n">host_path</span><span class="si">}</span><span class="s2"> does not exist, cannot copy it to container.&quot;</span>
  2009. <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  2010. <span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;docker&quot;</span><span class="p">,</span> <span class="s2">&quot;cp&quot;</span><span class="p">,</span> <span class="n">host_path</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">container</span><span class="o">.</span><span class="n">id</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">container_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">]</span>
  2011. <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Copying </span><span class="si">{</span><span class="n">host_path</span><span class="si">}</span><span class="s2"> to container at </span><span class="si">{</span><span class="n">container_path</span><span class="si">}</span><span class="s2"> with command: </span><span class="si">{</span><span class="n">shlex</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
  2012. <span class="k">try</span><span class="p">:</span>
  2013. <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
  2014. <span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  2015. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Error copying </span><span class="si">{</span><span class="n">host_path</span><span class="si">}</span><span class="s2"> to container at </span><span class="si">{</span><span class="n">container_path</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span>
  2016. <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">e</span>
  2017. </code></pre></div></td></tr></table></div>
  2018. </details>
  2019. </div>
  2020. </div>
  2021. <div class="doc doc-object doc-function">
  2022. <h2 id="sweagent.environment.utils.copy_file_to_container" class="doc doc-heading">
  2023. <code class="highlight language-python"><span class="n">copy_file_to_container</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">contents</span><span class="p">,</span> <span class="n">container_path</span><span class="p">)</span></code>
  2024. </h2>
  2025. <div class="doc doc-contents ">
  2026. <p>Copies a given string into a Docker container at a specified path.</p>
  2027. <p><span class="doc-section-title">Parameters:</span></p>
  2028. <table>
  2029. <thead>
  2030. <tr>
  2031. <th>Name</th>
  2032. <th>Type</th>
  2033. <th>Description</th>
  2034. <th>Default</th>
  2035. </tr>
  2036. </thead>
  2037. <tbody>
  2038. <tr class="doc-section-item">
  2039. <td><code>container</code></td>
  2040. <td>
  2041. <code><span title="docker.models.containers.Container">Container</span></code>
  2042. </td>
  2043. <td>
  2044. <div class="doc-md-description">
  2045. <p>Docker SDK container object.</p>
  2046. </div>
  2047. </td>
  2048. <td>
  2049. <em>required</em>
  2050. </td>
  2051. </tr>
  2052. <tr class="doc-section-item">
  2053. <td><code>contents</code></td>
  2054. <td>
  2055. <code>str</code>
  2056. </td>
  2057. <td>
  2058. <div class="doc-md-description">
  2059. <p>The string to copy into the container.</p>
  2060. </div>
  2061. </td>
  2062. <td>
  2063. <em>required</em>
  2064. </td>
  2065. </tr>
  2066. <tr class="doc-section-item">
  2067. <td><code>container_path</code></td>
  2068. <td>
  2069. <code>str</code>
  2070. </td>
  2071. <td>
  2072. <div class="doc-md-description">
  2073. <p>The path inside the container where the string should be copied to.</p>
  2074. </div>
  2075. </td>
  2076. <td>
  2077. <em>required</em>
  2078. </td>
  2079. </tr>
  2080. </tbody>
  2081. </table>
  2082. <p><span class="doc-section-title">Returns:</span></p>
  2083. <table>
  2084. <thead>
  2085. <tr>
  2086. <th>Type</th>
  2087. <th>Description</th>
  2088. </tr>
  2089. </thead>
  2090. <tbody>
  2091. <tr class="doc-section-item">
  2092. <td>
  2093. <code>None</code>
  2094. </td>
  2095. <td>
  2096. <div class="doc-md-description">
  2097. <p>None</p>
  2098. </div>
  2099. </td>
  2100. </tr>
  2101. </tbody>
  2102. </table>
  2103. <details class="quote">
  2104. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  2105. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 77</span>
  2106. <span class="normal"> 78</span>
  2107. <span class="normal"> 79</span>
  2108. <span class="normal"> 80</span>
  2109. <span class="normal"> 81</span>
  2110. <span class="normal"> 82</span>
  2111. <span class="normal"> 83</span>
  2112. <span class="normal"> 84</span>
  2113. <span class="normal"> 85</span>
  2114. <span class="normal"> 86</span>
  2115. <span class="normal"> 87</span>
  2116. <span class="normal"> 88</span>
  2117. <span class="normal"> 89</span>
  2118. <span class="normal"> 90</span>
  2119. <span class="normal"> 91</span>
  2120. <span class="normal"> 92</span>
  2121. <span class="normal"> 93</span>
  2122. <span class="normal"> 94</span>
  2123. <span class="normal"> 95</span>
  2124. <span class="normal"> 96</span>
  2125. <span class="normal"> 97</span>
  2126. <span class="normal"> 98</span>
  2127. <span class="normal"> 99</span>
  2128. <span class="normal">100</span>
  2129. <span class="normal">101</span>
  2130. <span class="normal">102</span>
  2131. <span class="normal">103</span>
  2132. <span class="normal">104</span>
  2133. <span class="normal">105</span>
  2134. <span class="normal">106</span>
  2135. <span class="normal">107</span>
  2136. <span class="normal">108</span>
  2137. <span class="normal">109</span>
  2138. <span class="normal">110</span>
  2139. <span class="normal">111</span>
  2140. <span class="normal">112</span>
  2141. <span class="normal">113</span>
  2142. <span class="normal">114</span>
  2143. <span class="normal">115</span>
  2144. <span class="normal">116</span>
  2145. <span class="normal">117</span>
  2146. <span class="normal">118</span>
  2147. <span class="normal">119</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">copy_file_to_container</span><span class="p">(</span><span class="n">container</span><span class="p">:</span> <span class="n">Container</span><span class="p">,</span> <span class="n">contents</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">container_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
  2148. <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
  2149. <span class="sd"> Copies a given string into a Docker container at a specified path.</span>
  2150. <span class="sd"> Args:</span>
  2151. <span class="sd"> container: Docker SDK container object.</span>
  2152. <span class="sd"> contents: The string to copy into the container.</span>
  2153. <span class="sd"> container_path: The path inside the container where the string should be copied to.</span>
  2154. <span class="sd"> Returns:</span>
  2155. <span class="sd"> None</span>
  2156. <span class="sd"> &quot;&quot;&quot;</span>
  2157. <span class="n">temp_file_name</span> <span class="o">=</span> <span class="kc">None</span>
  2158. <span class="k">try</span><span class="p">:</span>
  2159. <span class="c1"># Create a temporary file</span>
  2160. <span class="k">with</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">NamedTemporaryFile</span><span class="p">(</span><span class="n">delete</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="k">as</span> <span class="n">temp_file</span><span class="p">:</span>
  2161. <span class="n">temp_file_name</span> <span class="o">=</span> <span class="n">temp_file</span><span class="o">.</span><span class="n">name</span>
  2162. <span class="c1"># Write the string to the temporary file and ensure it&#39;s written to disk</span>
  2163. <span class="n">temp_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">contents</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">))</span>
  2164. <span class="n">temp_file</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
  2165. <span class="n">os</span><span class="o">.</span><span class="n">fsync</span><span class="p">(</span><span class="n">temp_file</span><span class="o">.</span><span class="n">fileno</span><span class="p">())</span>
  2166. <span class="c1"># Create a TAR archive in memory containing the temporary file</span>
  2167. <span class="k">with</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">NamedTemporaryFile</span><span class="p">():</span>
  2168. <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">temp_file_name</span><span class="p">,</span> <span class="s2">&quot;rb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">temp_file</span><span class="p">:</span>
  2169. <span class="c1"># Prepare the TAR archive</span>
  2170. <span class="k">with</span> <span class="n">BytesIO</span><span class="p">()</span> <span class="k">as</span> <span class="n">tar_stream</span><span class="p">:</span>
  2171. <span class="k">with</span> <span class="n">tarfile</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">fileobj</span><span class="o">=</span><span class="n">tar_stream</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s2">&quot;w&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">tar</span><span class="p">:</span>
  2172. <span class="n">tar_info</span> <span class="o">=</span> <span class="n">tarfile</span><span class="o">.</span><span class="n">TarInfo</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">Path</span><span class="p">(</span><span class="n">container_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
  2173. <span class="n">tar_info</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">temp_file_name</span><span class="p">)</span><span class="o">.</span><span class="n">stat</span><span class="p">()</span><span class="o">.</span><span class="n">st_size</span>
  2174. <span class="n">tar</span><span class="o">.</span><span class="n">addfile</span><span class="p">(</span><span class="n">tarinfo</span><span class="o">=</span><span class="n">tar_info</span><span class="p">,</span> <span class="n">fileobj</span><span class="o">=</span><span class="n">temp_file</span><span class="p">)</span>
  2175. <span class="n">tar_stream</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
  2176. <span class="c1"># Copy the TAR stream to the container</span>
  2177. <span class="n">container</span><span class="o">.</span><span class="n">put_archive</span><span class="p">(</span><span class="n">path</span><span class="o">=</span><span class="n">Path</span><span class="p">(</span><span class="n">container_path</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">tar_stream</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
  2178. <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  2179. <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;An error occurred: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
  2180. <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">())</span>
  2181. <span class="k">finally</span><span class="p">:</span>
  2182. <span class="c1"># Cleanup: Remove the temporary file if it was created</span>
  2183. <span class="k">if</span> <span class="n">temp_file_name</span> <span class="ow">and</span> <span class="n">Path</span><span class="p">(</span><span class="n">temp_file_name</span><span class="p">)</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
  2184. <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">temp_file_name</span><span class="p">)</span>
  2185. </code></pre></div></td></tr></table></div>
  2186. </details>
  2187. </div>
  2188. </div>
  2189. <div class="doc doc-object doc-function">
  2190. <h2 id="sweagent.environment.utils.format_trajectory_markdown" class="doc doc-heading">
  2191. <code class="highlight language-python"><span class="n">format_trajectory_markdown</span><span class="p">(</span><span class="n">trajectory</span><span class="p">)</span></code>
  2192. </h2>
  2193. <div class="doc doc-contents ">
  2194. <p>Format a trajectory as a markdown string for use in gh PR description.</p>
  2195. <details class="quote">
  2196. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  2197. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 989</span>
  2198. <span class="normal"> 990</span>
  2199. <span class="normal"> 991</span>
  2200. <span class="normal"> 992</span>
  2201. <span class="normal"> 993</span>
  2202. <span class="normal"> 994</span>
  2203. <span class="normal"> 995</span>
  2204. <span class="normal"> 996</span>
  2205. <span class="normal"> 997</span>
  2206. <span class="normal"> 998</span>
  2207. <span class="normal"> 999</span>
  2208. <span class="normal">1000</span>
  2209. <span class="normal">1001</span>
  2210. <span class="normal">1002</span>
  2211. <span class="normal">1003</span>
  2212. <span class="normal">1004</span>
  2213. <span class="normal">1005</span>
  2214. <span class="normal">1006</span>
  2215. <span class="normal">1007</span>
  2216. <span class="normal">1008</span>
  2217. <span class="normal">1009</span>
  2218. <span class="normal">1010</span>
  2219. <span class="normal">1011</span>
  2220. <span class="normal">1012</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">format_trajectory_markdown</span><span class="p">(</span><span class="n">trajectory</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]]):</span>
  2221. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Format a trajectory as a markdown string for use in gh PR description.&quot;&quot;&quot;</span>
  2222. <span class="n">prefix</span> <span class="o">=</span> <span class="p">[</span>
  2223. <span class="s2">&quot;&lt;details&gt;&quot;</span><span class="p">,</span>
  2224. <span class="s2">&quot;&lt;summary&gt;Thought process (&#39;trajectory&#39;) of SWE-agent (click to expand)&lt;/summary&gt;&quot;</span><span class="p">,</span>
  2225. <span class="s2">&quot;&quot;</span><span class="p">,</span>
  2226. <span class="s2">&quot;&quot;</span><span class="p">,</span>
  2227. <span class="p">]</span>
  2228. <span class="n">steps</span> <span class="o">=</span> <span class="p">[]</span>
  2229. <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">step</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">trajectory</span><span class="p">):</span>
  2230. <span class="n">step_strs</span> <span class="o">=</span> <span class="p">[</span>
  2231. <span class="sa">f</span><span class="s2">&quot;**🧑‍🚒 Response (</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">)**: &quot;</span><span class="p">,</span>
  2232. <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">step</span><span class="p">[</span><span class="s1">&#39;response&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
  2233. <span class="sa">f</span><span class="s2">&quot;**👀‍ Observation (</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">)**:&quot;</span><span class="p">,</span>
  2234. <span class="s2">&quot;```&quot;</span><span class="p">,</span>
  2235. <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">remove_triple_backticks</span><span class="p">(</span><span class="n">step</span><span class="p">[</span><span class="s1">&#39;observation&#39;</span><span class="p">])</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
  2236. <span class="s2">&quot;```&quot;</span><span class="p">,</span>
  2237. <span class="p">]</span>
  2238. <span class="n">steps</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">step_strs</span><span class="p">))</span>
  2239. <span class="n">suffix</span> <span class="o">=</span> <span class="p">[</span>
  2240. <span class="s2">&quot;&quot;</span><span class="p">,</span>
  2241. <span class="s2">&quot;&lt;/details&gt;&quot;</span><span class="p">,</span>
  2242. <span class="p">]</span>
  2243. <span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">prefix</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n\n</span><span class="s2">---</span><span class="se">\n\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">steps</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">suffix</span><span class="p">)</span>
  2244. </code></pre></div></td></tr></table></div>
  2245. </details>
  2246. </div>
  2247. </div>
  2248. <div class="doc doc-object doc-function">
  2249. <h2 id="sweagent.environment.utils.get_associated_commit_urls" class="doc doc-heading">
  2250. <code class="highlight language-python"><span class="n">get_associated_commit_urls</span><span class="p">(</span><span class="n">org</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">token</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span></code>
  2251. </h2>
  2252. <div class="doc doc-contents ">
  2253. <p>Return the URLs of commits that would close an issue.</p>
  2254. <details class="quote">
  2255. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  2256. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">966</span>
  2257. <span class="normal">967</span>
  2258. <span class="normal">968</span>
  2259. <span class="normal">969</span>
  2260. <span class="normal">970</span>
  2261. <span class="normal">971</span>
  2262. <span class="normal">972</span>
  2263. <span class="normal">973</span>
  2264. <span class="normal">974</span>
  2265. <span class="normal">975</span>
  2266. <span class="normal">976</span>
  2267. <span class="normal">977</span>
  2268. <span class="normal">978</span>
  2269. <span class="normal">979</span>
  2270. <span class="normal">980</span>
  2271. <span class="normal">981</span>
  2272. <span class="normal">982</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_associated_commit_urls</span><span class="p">(</span><span class="n">org</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">repo</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
  2273. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Return the URLs of commits that would close an issue.&quot;&quot;&quot;</span>
  2274. <span class="n">api</span> <span class="o">=</span> <span class="n">GhApi</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="n">token</span><span class="p">)</span>
  2275. <span class="c1"># Strangely the &quot;pull_request&quot; field of api.issues.get is often not set</span>
  2276. <span class="c1"># so we have to go through the events to check if there&#39;s a commit</span>
  2277. <span class="n">events</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">issues</span><span class="o">.</span><span class="n">list_events</span><span class="p">(</span><span class="n">org</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">)</span>
  2278. <span class="n">commit_urls</span> <span class="o">=</span> <span class="p">[]</span>
  2279. <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">events</span><span class="p">:</span>
  2280. <span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">event</span> <span class="o">!=</span> <span class="s2">&quot;referenced&quot;</span><span class="p">:</span>
  2281. <span class="k">continue</span>
  2282. <span class="k">if</span> <span class="ow">not</span> <span class="n">event</span><span class="o">.</span><span class="n">commit_id</span><span class="p">:</span>
  2283. <span class="k">continue</span>
  2284. <span class="n">commit</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">repos</span><span class="o">.</span><span class="n">get_commit</span><span class="p">(</span><span class="n">org</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">event</span><span class="o">.</span><span class="n">commit_id</span><span class="p">)</span>
  2285. <span class="n">message</span> <span class="o">=</span> <span class="n">commit</span><span class="o">.</span><span class="n">commit</span><span class="o">.</span><span class="n">message</span>
  2286. <span class="k">if</span> <span class="sa">f</span><span class="s2">&quot;fixes #</span><span class="si">{</span><span class="n">issue_number</span><span class="si">}</span><span class="s2">&quot;</span> <span class="ow">in</span> <span class="n">message</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">or</span> <span class="sa">f</span><span class="s2">&quot;closes #</span><span class="si">{</span><span class="n">issue_number</span><span class="si">}</span><span class="s2">&quot;</span> <span class="ow">in</span> <span class="n">message</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
  2287. <span class="n">commit_urls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">commit</span><span class="o">.</span><span class="n">html_url</span><span class="p">)</span>
  2288. <span class="k">return</span> <span class="n">commit_urls</span>
  2289. </code></pre></div></td></tr></table></div>
  2290. </details>
  2291. </div>
  2292. </div>
  2293. <div class="doc doc-object doc-function">
  2294. <h2 id="sweagent.environment.utils.get_commit" class="doc doc-heading">
  2295. <code class="highlight language-python"><span class="n">get_commit</span><span class="p">(</span><span class="n">api</span><span class="p">,</span> <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">ref</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span></code>
  2296. </h2>
  2297. <div class="doc doc-contents ">
  2298. <p>Get commit object from github api</p>
  2299. <p><span class="doc-section-title">Parameters:</span></p>
  2300. <table>
  2301. <thead>
  2302. <tr>
  2303. <th>Name</th>
  2304. <th>Type</th>
  2305. <th>Description</th>
  2306. <th>Default</th>
  2307. </tr>
  2308. </thead>
  2309. <tbody>
  2310. <tr class="doc-section-item">
  2311. <td><code>api</code></td>
  2312. <td>
  2313. <code><span title="ghapi.all.GhApi">GhApi</span></code>
  2314. </td>
  2315. <td>
  2316. <div class="doc-md-description">
  2317. </div>
  2318. </td>
  2319. <td>
  2320. <em>required</em>
  2321. </td>
  2322. </tr>
  2323. <tr class="doc-section-item">
  2324. <td><code>owner</code></td>
  2325. <td>
  2326. <code>str</code>
  2327. </td>
  2328. <td>
  2329. <div class="doc-md-description">
  2330. <p>Repo owner, e.g., "princeton-nlp"</p>
  2331. </div>
  2332. </td>
  2333. <td>
  2334. <em>required</em>
  2335. </td>
  2336. </tr>
  2337. <tr class="doc-section-item">
  2338. <td><code>repo</code></td>
  2339. <td>
  2340. <code>str</code>
  2341. </td>
  2342. <td>
  2343. <div class="doc-md-description">
  2344. <p>Repo, e.g., "SWE-agent"</p>
  2345. </div>
  2346. </td>
  2347. <td>
  2348. <em>required</em>
  2349. </td>
  2350. </tr>
  2351. <tr class="doc-section-item">
  2352. <td><code>ref</code></td>
  2353. <td>
  2354. <code>str</code>
  2355. </td>
  2356. <td>
  2357. <div class="doc-md-description">
  2358. <p>Branch, tag or commit hash</p>
  2359. </div>
  2360. </td>
  2361. <td>
  2362. <code>None</code>
  2363. </td>
  2364. </tr>
  2365. </tbody>
  2366. </table>
  2367. <p><span class="doc-section-title">Returns:</span></p>
  2368. <table>
  2369. <thead>
  2370. <tr>
  2371. <th>Name</th> <th>Type</th>
  2372. <th>Description</th>
  2373. </tr>
  2374. </thead>
  2375. <tbody>
  2376. <tr class="doc-section-item">
  2377. <td><code>_type_</code></td> <td>
  2378. </td>
  2379. <td>
  2380. <div class="doc-md-description">
  2381. <p><em>description</em></p>
  2382. </div>
  2383. </td>
  2384. </tr>
  2385. </tbody>
  2386. </table>
  2387. <details class="quote">
  2388. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  2389. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">636</span>
  2390. <span class="normal">637</span>
  2391. <span class="normal">638</span>
  2392. <span class="normal">639</span>
  2393. <span class="normal">640</span>
  2394. <span class="normal">641</span>
  2395. <span class="normal">642</span>
  2396. <span class="normal">643</span>
  2397. <span class="normal">644</span>
  2398. <span class="normal">645</span>
  2399. <span class="normal">646</span>
  2400. <span class="normal">647</span>
  2401. <span class="normal">648</span>
  2402. <span class="normal">649</span>
  2403. <span class="normal">650</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_commit</span><span class="p">(</span><span class="n">api</span><span class="p">:</span> <span class="n">GhApi</span><span class="p">,</span> <span class="n">owner</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">repo</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">ref</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span>
  2404. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Get commit object from github api</span>
  2405. <span class="sd"> Args:</span>
  2406. <span class="sd"> api (GhApi):</span>
  2407. <span class="sd"> owner (str): Repo owner, e.g., &quot;princeton-nlp&quot;</span>
  2408. <span class="sd"> repo (str): Repo, e.g., &quot;SWE-agent&quot;</span>
  2409. <span class="sd"> ref (str, optional): Branch, tag or commit hash</span>
  2410. <span class="sd"> Returns:</span>
  2411. <span class="sd"> _type_: _description_</span>
  2412. <span class="sd"> &quot;&quot;&quot;</span>
  2413. <span class="k">if</span> <span class="n">ref</span><span class="p">:</span>
  2414. <span class="k">return</span> <span class="n">api</span><span class="o">.</span><span class="n">repos</span><span class="o">.</span><span class="n">get_commit</span><span class="p">(</span><span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">ref</span><span class="p">)</span>
  2415. <span class="k">return</span> <span class="n">api</span><span class="o">.</span><span class="n">repos</span><span class="o">.</span><span class="n">list_commits</span><span class="p">(</span><span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
  2416. </code></pre></div></td></tr></table></div>
  2417. </details>
  2418. </div>
  2419. </div>
  2420. <div class="doc doc-object doc-function">
  2421. <h2 id="sweagent.environment.utils.get_container" class="doc doc-heading">
  2422. <code class="highlight language-python"><span class="n">get_container</span><span class="p">(</span><span class="n">ctr_name</span><span class="p">,</span> <span class="n">image_name</span><span class="p">,</span> <span class="n">container_mounts</span><span class="p">,</span> <span class="n">persistent</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></code>
  2423. </h2>
  2424. <div class="doc doc-contents ">
  2425. <p>Get a container object for a given container name and image name</p>
  2426. <p><span class="doc-section-title">Parameters:</span></p>
  2427. <table>
  2428. <thead>
  2429. <tr>
  2430. <th>Name</th>
  2431. <th>Type</th>
  2432. <th>Description</th>
  2433. <th>Default</th>
  2434. </tr>
  2435. </thead>
  2436. <tbody>
  2437. <tr class="doc-section-item">
  2438. <td><code>ctr_name</code></td>
  2439. <td>
  2440. <code>str</code>
  2441. </td>
  2442. <td>
  2443. <div class="doc-md-description">
  2444. <p>Name of container</p>
  2445. </div>
  2446. </td>
  2447. <td>
  2448. <em>required</em>
  2449. </td>
  2450. </tr>
  2451. <tr class="doc-section-item">
  2452. <td><code>image_name</code></td>
  2453. <td>
  2454. <code>str</code>
  2455. </td>
  2456. <td>
  2457. <div class="doc-md-description">
  2458. <p>Name of image</p>
  2459. </div>
  2460. </td>
  2461. <td>
  2462. <em>required</em>
  2463. </td>
  2464. </tr>
  2465. <tr class="doc-section-item">
  2466. <td><code>persistent</code></td>
  2467. <td>
  2468. <code>bool</code>
  2469. </td>
  2470. <td>
  2471. <div class="doc-md-description">
  2472. <p>Whether to use a persistent container or not</p>
  2473. </div>
  2474. </td>
  2475. <td>
  2476. <code>False</code>
  2477. </td>
  2478. </tr>
  2479. </tbody>
  2480. </table>
  2481. <p>Returns:
  2482. Container object</p>
  2483. <details class="quote">
  2484. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  2485. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">569</span>
  2486. <span class="normal">570</span>
  2487. <span class="normal">571</span>
  2488. <span class="normal">572</span>
  2489. <span class="normal">573</span>
  2490. <span class="normal">574</span>
  2491. <span class="normal">575</span>
  2492. <span class="normal">576</span>
  2493. <span class="normal">577</span>
  2494. <span class="normal">578</span>
  2495. <span class="normal">579</span>
  2496. <span class="normal">580</span>
  2497. <span class="normal">581</span>
  2498. <span class="normal">582</span>
  2499. <span class="normal">583</span>
  2500. <span class="normal">584</span>
  2501. <span class="normal">585</span>
  2502. <span class="normal">586</span>
  2503. <span class="normal">587</span>
  2504. <span class="normal">588</span>
  2505. <span class="normal">589</span>
  2506. <span class="normal">590</span>
  2507. <span class="normal">591</span>
  2508. <span class="normal">592</span>
  2509. <span class="normal">593</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_container</span><span class="p">(</span>
  2510. <span class="n">ctr_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">image_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">container_mounts</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span> <span class="n">persistent</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
  2511. <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">tuple</span><span class="p">[</span><span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">,</span> <span class="nb">set</span><span class="p">]:</span>
  2512. <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
  2513. <span class="sd"> Get a container object for a given container name and image name</span>
  2514. <span class="sd"> Arguments:</span>
  2515. <span class="sd"> ctr_name (str): Name of container</span>
  2516. <span class="sd"> image_name (str): Name of image</span>
  2517. <span class="sd"> persistent (bool): Whether to use a persistent container or not</span>
  2518. <span class="sd"> Returns:</span>
  2519. <span class="sd"> Container object</span>
  2520. <span class="sd"> &quot;&quot;&quot;</span>
  2521. <span class="k">if</span> <span class="ow">not</span> <span class="n">image_exists</span><span class="p">(</span><span class="n">image_name</span><span class="p">):</span>
  2522. <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
  2523. <span class="sa">f</span><span class="s2">&quot;Image </span><span class="si">{</span><span class="n">image_name</span><span class="si">}</span><span class="s2"> not found. Please ensure it is built and available. &quot;</span>
  2524. <span class="s2">&quot;Please double-check that you followed all installation/setup instructions from the &quot;</span>
  2525. <span class="s2">&quot;readme.&quot;</span>
  2526. <span class="p">)</span>
  2527. <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  2528. <span class="k">if</span> <span class="n">persistent</span><span class="p">:</span>
  2529. <span class="k">return</span> <span class="n">_get_persistent_container</span><span class="p">(</span><span class="n">ctr_name</span><span class="p">,</span> <span class="n">image_name</span><span class="p">,</span> <span class="n">container_mounts</span><span class="o">=</span><span class="n">container_mounts</span><span class="p">)</span>
  2530. <span class="k">else</span><span class="p">:</span>
  2531. <span class="k">return</span> <span class="n">_get_non_persistent_container</span><span class="p">(</span><span class="n">ctr_name</span><span class="p">,</span> <span class="n">image_name</span><span class="p">,</span> <span class="n">container_mounts</span><span class="o">=</span><span class="n">container_mounts</span><span class="p">)</span>
  2532. </code></pre></div></td></tr></table></div>
  2533. </details>
  2534. </div>
  2535. </div>
  2536. <div class="doc doc-object doc-function">
  2537. <h2 id="sweagent.environment.utils.get_data_path_name" class="doc doc-heading">
  2538. <code class="highlight language-python"><span class="n">get_data_path_name</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span></code>
  2539. </h2>
  2540. <div class="doc doc-contents ">
  2541. <p>if data_path is a file, return the file stem
  2542. elif it's a github url, return the owner__repo_name</p>
  2543. <details class="quote">
  2544. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  2545. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">51</span>
  2546. <span class="normal">52</span>
  2547. <span class="normal">53</span>
  2548. <span class="normal">54</span>
  2549. <span class="normal">55</span>
  2550. <span class="normal">56</span>
  2551. <span class="normal">57</span>
  2552. <span class="normal">58</span>
  2553. <span class="normal">59</span>
  2554. <span class="normal">60</span>
  2555. <span class="normal">61</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_data_path_name</span><span class="p">(</span><span class="n">data_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
  2556. <span class="w"> </span><span class="sd">&quot;&quot;&quot;if data_path is a file, return the file stem</span>
  2557. <span class="sd"> elif it&#39;s a github url, return the owner__repo_name</span>
  2558. <span class="sd"> &quot;&quot;&quot;</span>
  2559. <span class="k">if</span> <span class="n">data_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;text://&quot;</span><span class="p">):</span>
  2560. <span class="k">return</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">(</span><span class="n">data_path</span><span class="o">.</span><span class="n">removeprefix</span><span class="p">(</span><span class="s2">&quot;text://&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()[:</span><span class="mi">6</span><span class="p">]</span>
  2561. <span class="n">match</span> <span class="o">=</span> <span class="n">GITHUB_ISSUE_URL_PATTERN</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span>
  2562. <span class="k">if</span> <span class="n">match</span><span class="p">:</span>
  2563. <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
  2564. <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">owner</span><span class="si">}</span><span class="s2">__</span><span class="si">{</span><span class="n">repo</span><span class="si">}</span><span class="s2">&quot;</span>
  2565. <span class="k">return</span> <span class="n">Path</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span><span class="o">.</span><span class="n">stem</span>
  2566. </code></pre></div></td></tr></table></div>
  2567. </details>
  2568. </div>
  2569. </div>
  2570. <div class="doc doc-object doc-function">
  2571. <h2 id="sweagent.environment.utils.get_gh_issue_data" class="doc doc-heading">
  2572. <code class="highlight language-python"><span class="n">get_gh_issue_data</span><span class="p">(</span><span class="n">issue_url</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">token</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span></code>
  2573. </h2>
  2574. <div class="doc doc-contents ">
  2575. <p>Returns github issue data in the form of a dictionary.
  2576. See <a href="https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#get-an-issue">https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#get-an-issue</a>
  2577. for return format</p>
  2578. <details class="quote">
  2579. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  2580. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">693</span>
  2581. <span class="normal">694</span>
  2582. <span class="normal">695</span>
  2583. <span class="normal">696</span>
  2584. <span class="normal">697</span>
  2585. <span class="normal">698</span>
  2586. <span class="normal">699</span>
  2587. <span class="normal">700</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_gh_issue_data</span><span class="p">(</span><span class="n">issue_url</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">):</span>
  2588. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Returns github issue data in the form of a dictionary.</span>
  2589. <span class="sd"> See https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#get-an-issue</span>
  2590. <span class="sd"> for return format</span>
  2591. <span class="sd"> &quot;&quot;&quot;</span>
  2592. <span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span> <span class="o">=</span> <span class="n">parse_gh_issue_url</span><span class="p">(</span><span class="n">issue_url</span><span class="p">)</span>
  2593. <span class="n">api</span> <span class="o">=</span> <span class="n">GhApi</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="n">token</span><span class="p">)</span>
  2594. <span class="k">return</span> <span class="n">api</span><span class="o">.</span><span class="n">issues</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">)</span>
  2595. </code></pre></div></td></tr></table></div>
  2596. </details>
  2597. </div>
  2598. </div>
  2599. <div class="doc doc-object doc-function">
  2600. <h2 id="sweagent.environment.utils.get_instances" class="doc doc-heading">
  2601. <code class="highlight language-python"><span class="n">get_instances</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">base_commit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">split</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">token</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">repo_path</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span></code>
  2602. </h2>
  2603. <div class="doc doc-contents ">
  2604. <p>Getter function for handling json, jsonl files</p>
  2605. <p><span class="doc-section-title">Parameters:</span></p>
  2606. <table>
  2607. <thead>
  2608. <tr>
  2609. <th>Name</th>
  2610. <th>Type</th>
  2611. <th>Description</th>
  2612. <th>Default</th>
  2613. </tr>
  2614. </thead>
  2615. <tbody>
  2616. <tr class="doc-section-item">
  2617. <td><code>file_path</code></td>
  2618. <td>
  2619. <code>str</code>
  2620. </td>
  2621. <td>
  2622. <div class="doc-md-description">
  2623. <p>Path to file</p>
  2624. </div>
  2625. </td>
  2626. <td>
  2627. <em>required</em>
  2628. </td>
  2629. </tr>
  2630. </tbody>
  2631. </table>
  2632. <p><span class="doc-section-title">Returns:</span></p>
  2633. <table>
  2634. <thead>
  2635. <tr>
  2636. <th>Type</th>
  2637. <th>Description</th>
  2638. </tr>
  2639. </thead>
  2640. <tbody>
  2641. <tr class="doc-section-item">
  2642. <td>
  2643. <code>list[dict[str, <span title="typing.Any">Any</span>]]</code>
  2644. </td>
  2645. <td>
  2646. <div class="doc-md-description">
  2647. <p>List of instances as dictionaries</p>
  2648. </div>
  2649. </td>
  2650. </tr>
  2651. </tbody>
  2652. </table>
  2653. <details class="quote">
  2654. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  2655. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">872</span>
  2656. <span class="normal">873</span>
  2657. <span class="normal">874</span>
  2658. <span class="normal">875</span>
  2659. <span class="normal">876</span>
  2660. <span class="normal">877</span>
  2661. <span class="normal">878</span>
  2662. <span class="normal">879</span>
  2663. <span class="normal">880</span>
  2664. <span class="normal">881</span>
  2665. <span class="normal">882</span>
  2666. <span class="normal">883</span>
  2667. <span class="normal">884</span>
  2668. <span class="normal">885</span>
  2669. <span class="normal">886</span>
  2670. <span class="normal">887</span>
  2671. <span class="normal">888</span>
  2672. <span class="normal">889</span>
  2673. <span class="normal">890</span>
  2674. <span class="normal">891</span>
  2675. <span class="normal">892</span>
  2676. <span class="normal">893</span>
  2677. <span class="normal">894</span>
  2678. <span class="normal">895</span>
  2679. <span class="normal">896</span>
  2680. <span class="normal">897</span>
  2681. <span class="normal">898</span>
  2682. <span class="normal">899</span>
  2683. <span class="normal">900</span>
  2684. <span class="normal">901</span>
  2685. <span class="normal">902</span>
  2686. <span class="normal">903</span>
  2687. <span class="normal">904</span>
  2688. <span class="normal">905</span>
  2689. <span class="normal">906</span>
  2690. <span class="normal">907</span>
  2691. <span class="normal">908</span>
  2692. <span class="normal">909</span>
  2693. <span class="normal">910</span>
  2694. <span class="normal">911</span>
  2695. <span class="normal">912</span>
  2696. <span class="normal">913</span>
  2697. <span class="normal">914</span>
  2698. <span class="normal">915</span>
  2699. <span class="normal">916</span>
  2700. <span class="normal">917</span>
  2701. <span class="normal">918</span>
  2702. <span class="normal">919</span>
  2703. <span class="normal">920</span>
  2704. <span class="normal">921</span>
  2705. <span class="normal">922</span>
  2706. <span class="normal">923</span>
  2707. <span class="normal">924</span>
  2708. <span class="normal">925</span>
  2709. <span class="normal">926</span>
  2710. <span class="normal">927</span>
  2711. <span class="normal">928</span>
  2712. <span class="normal">929</span>
  2713. <span class="normal">930</span>
  2714. <span class="normal">931</span>
  2715. <span class="normal">932</span>
  2716. <span class="normal">933</span>
  2717. <span class="normal">934</span>
  2718. <span class="normal">935</span>
  2719. <span class="normal">936</span>
  2720. <span class="normal">937</span>
  2721. <span class="normal">938</span>
  2722. <span class="normal">939</span>
  2723. <span class="normal">940</span>
  2724. <span class="normal">941</span>
  2725. <span class="normal">942</span>
  2726. <span class="normal">943</span>
  2727. <span class="normal">944</span>
  2728. <span class="normal">945</span>
  2729. <span class="normal">946</span>
  2730. <span class="normal">947</span>
  2731. <span class="normal">948</span>
  2732. <span class="normal">949</span>
  2733. <span class="normal">950</span>
  2734. <span class="normal">951</span>
  2735. <span class="normal">952</span>
  2736. <span class="normal">953</span>
  2737. <span class="normal">954</span>
  2738. <span class="normal">955</span>
  2739. <span class="normal">956</span>
  2740. <span class="normal">957</span>
  2741. <span class="normal">958</span>
  2742. <span class="normal">959</span>
  2743. <span class="normal">960</span>
  2744. <span class="normal">961</span>
  2745. <span class="normal">962</span>
  2746. <span class="normal">963</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_instances</span><span class="p">(</span>
  2747. <span class="n">file_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
  2748. <span class="n">base_commit</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
  2749. <span class="n">split</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
  2750. <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
  2751. <span class="o">*</span><span class="p">,</span>
  2752. <span class="n">repo_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
  2753. <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]]:</span>
  2754. <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
  2755. <span class="sd"> Getter function for handling json, jsonl files</span>
  2756. <span class="sd"> Args:</span>
  2757. <span class="sd"> file_path (str): Path to file</span>
  2758. <span class="sd"> Returns:</span>
  2759. <span class="sd"> List of instances as dictionaries</span>
  2760. <span class="sd"> &quot;&quot;&quot;</span>
  2761. <span class="k">def</span> <span class="nf">instance_from_dict</span><span class="p">(</span><span class="n">instances</span><span class="p">):</span>
  2762. <span class="n">ib</span> <span class="o">=</span> <span class="n">InstanceBuilder</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="n">token</span><span class="p">)</span>
  2763. <span class="n">ib</span><span class="o">.</span><span class="n">set_from_dict</span><span class="p">(</span><span class="n">instances</span><span class="p">)</span>
  2764. <span class="k">return</span> <span class="n">ib</span><span class="o">.</span><span class="n">build</span><span class="p">()</span>
  2765. <span class="k">def</span> <span class="nf">postproc_instance_list</span><span class="p">(</span><span class="n">instances</span><span class="p">):</span>
  2766. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">instances</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
  2767. <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;Expected a list of instances, got a dictionary.&quot;</span>
  2768. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  2769. <span class="k">return</span> <span class="p">[</span><span class="n">instance_from_dict</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">instances</span><span class="p">]</span>
  2770. <span class="c1"># The next if statement is very brittle logic to determine if we&#39;re processing a single instance</span>
  2771. <span class="k">if</span> <span class="p">(</span>
  2772. <span class="n">file_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;text://&quot;</span><span class="p">)</span>
  2773. <span class="ow">or</span> <span class="p">(</span>
  2774. <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">is_file</span><span class="p">()</span>
  2775. <span class="ow">and</span> <span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">suffix</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;.md&quot;</span><span class="p">,</span> <span class="s2">&quot;.txt&quot;</span><span class="p">]</span> <span class="ow">or</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;challenge.json&quot;</span><span class="p">)</span>
  2776. <span class="p">)</span>
  2777. <span class="ow">or</span> <span class="n">is_github_issue_url</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span>
  2778. <span class="p">):</span>
  2779. <span class="n">ib</span> <span class="o">=</span> <span class="n">InstanceBuilder</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="n">token</span><span class="p">)</span>
  2780. <span class="n">ib</span><span class="o">.</span><span class="n">set_problem_statement</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span>
  2781. <span class="k">if</span> <span class="n">repo_path</span><span class="p">:</span>
  2782. <span class="n">ib</span><span class="o">.</span><span class="n">set_repo_info</span><span class="p">(</span><span class="n">repo_path</span><span class="p">,</span> <span class="n">base_commit</span><span class="o">=</span><span class="n">base_commit</span><span class="p">)</span>
  2783. <span class="k">elif</span> <span class="n">is_github_repo_url</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
  2784. <span class="n">ib</span><span class="o">.</span><span class="n">set_repo_info_from_gh_url</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">base_commit</span><span class="o">=</span><span class="n">base_commit</span><span class="p">)</span>
  2785. <span class="k">else</span><span class="p">:</span>
  2786. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Could not determine repo path from </span><span class="si">{</span><span class="n">file_path</span><span class="si">=}</span><span class="s2">, </span><span class="si">{</span><span class="n">repo_path</span><span class="si">=}</span><span class="s2">&quot;</span>
  2787. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  2788. <span class="k">return</span> <span class="p">[</span><span class="n">ib</span><span class="o">.</span><span class="n">build</span><span class="p">()]</span>
  2789. <span class="k">if</span> <span class="n">base_commit</span><span class="p">:</span>
  2790. <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;base_commit must be empty if running over multiple problem statements&quot;</span>
  2791. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  2792. <span class="k">if</span> <span class="n">repo_path</span><span class="p">:</span>
  2793. <span class="k">if</span> <span class="ow">not</span> <span class="n">Path</span><span class="p">(</span><span class="n">repo_path</span><span class="p">)</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
  2794. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Specified repository path </span><span class="si">{</span><span class="n">repo_path</span><span class="si">}</span><span class="s2"> does not exist&quot;</span>
  2795. <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  2796. <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;repo_path must be empty if running over multiple problem statements&quot;</span>
  2797. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  2798. <span class="c1"># If file_path is a directory, attempt load from disk</span>
  2799. <span class="k">if</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">is_dir</span><span class="p">():</span>
  2800. <span class="k">try</span><span class="p">:</span>
  2801. <span class="n">dataset_or_dict</span> <span class="o">=</span> <span class="n">load_from_disk</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span>
  2802. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dataset_or_dict</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
  2803. <span class="k">return</span> <span class="n">postproc_instance_list</span><span class="p">(</span><span class="n">dataset_or_dict</span><span class="p">[</span><span class="n">split</span><span class="p">])</span>
  2804. <span class="k">return</span> <span class="n">postproc_instance_list</span><span class="p">(</span><span class="n">dataset_or_dict</span><span class="p">)</span>
  2805. <span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
  2806. <span class="c1"># Raised by load_from_disk if the directory is not a dataset directory</span>
  2807. <span class="k">pass</span>
  2808. <span class="k">if</span> <span class="n">base_commit</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  2809. <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;base_commit must be None if data_path is not a github issue url&quot;</span>
  2810. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  2811. <span class="c1"># If file_path is a file, load the file</span>
  2812. <span class="k">if</span> <span class="n">file_path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;.json&quot;</span><span class="p">):</span>
  2813. <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span>
  2814. <span class="k">return</span> <span class="n">postproc_instance_list</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">file</span><span class="p">))</span>
  2815. <span class="k">if</span> <span class="n">file_path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;.jsonl&quot;</span><span class="p">):</span>
  2816. <span class="k">return</span> <span class="n">postproc_instance_list</span><span class="p">([</span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span><span class="o">.</span><span class="n">read_text</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">(</span><span class="n">keepends</span><span class="o">=</span><span class="kc">True</span><span class="p">)])</span>
  2817. <span class="c1"># Attempt load from HF datasets as a last resort</span>
  2818. <span class="k">try</span><span class="p">:</span>
  2819. <span class="k">return</span> <span class="n">postproc_instance_list</span><span class="p">(</span><span class="n">load_dataset</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">split</span><span class="o">=</span><span class="n">split</span><span class="p">))</span>
  2820. <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  2821. <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
  2822. <span class="sa">f</span><span class="s2">&quot;Could not load instances from </span><span class="si">{</span><span class="n">file_path</span><span class="si">}</span><span class="s2">. &quot;</span>
  2823. <span class="s2">&quot;Please ensure --data_path is a GitHub URL, a SWE-bench HuggingFace dataset, or a JSON/JSONL file.&quot;</span>
  2824. <span class="p">)</span>
  2825. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">e</span>
  2826. </code></pre></div></td></tr></table></div>
  2827. </details>
  2828. </div>
  2829. </div>
  2830. <div class="doc doc-object doc-function">
  2831. <h2 id="sweagent.environment.utils.get_problem_statement_from_github_issue" class="doc doc-heading">
  2832. <code class="highlight language-python"><span class="n">get_problem_statement_from_github_issue</span><span class="p">(</span><span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">token</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">)</span></code>
  2833. </h2>
  2834. <div class="doc doc-contents ">
  2835. <p>Return problem statement from github issue</p>
  2836. <details class="quote">
  2837. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  2838. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">703</span>
  2839. <span class="normal">704</span>
  2840. <span class="normal">705</span>
  2841. <span class="normal">706</span>
  2842. <span class="normal">707</span>
  2843. <span class="normal">708</span>
  2844. <span class="normal">709</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">get_problem_statement_from_github_issue</span><span class="p">(</span><span class="n">owner</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">repo</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
  2845. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Return problem statement from github issue&quot;&quot;&quot;</span>
  2846. <span class="n">api</span> <span class="o">=</span> <span class="n">GhApi</span><span class="p">(</span><span class="n">token</span><span class="o">=</span><span class="n">token</span><span class="p">)</span>
  2847. <span class="n">issue</span> <span class="o">=</span> <span class="n">api</span><span class="o">.</span><span class="n">issues</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">owner</span><span class="p">,</span> <span class="n">repo</span><span class="p">,</span> <span class="n">issue_number</span><span class="p">)</span>
  2848. <span class="n">title</span> <span class="o">=</span> <span class="n">issue</span><span class="o">.</span><span class="n">title</span> <span class="k">if</span> <span class="n">issue</span><span class="o">.</span><span class="n">title</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
  2849. <span class="n">body</span> <span class="o">=</span> <span class="n">issue</span><span class="o">.</span><span class="n">body</span> <span class="k">if</span> <span class="n">issue</span><span class="o">.</span><span class="n">body</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
  2850. <span class="k">return</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">title</span><span class="si">}</span><span class="se">\n</span><span class="si">{</span><span class="n">body</span><span class="si">}</span><span class="se">\n</span><span class="s2">&quot;</span>
  2851. </code></pre></div></td></tr></table></div>
  2852. </details>
  2853. </div>
  2854. </div>
  2855. <div class="doc doc-object doc-function">
  2856. <h2 id="sweagent.environment.utils.image_exists" class="doc doc-heading">
  2857. <code class="highlight language-python"><span class="n">image_exists</span><span class="p">(</span><span class="n">image_name</span><span class="p">)</span></code>
  2858. </h2>
  2859. <div class="doc doc-contents ">
  2860. <p>Check that the image exists and give some better error messages.</p>
  2861. <p><span class="doc-section-title">Parameters:</span></p>
  2862. <table>
  2863. <thead>
  2864. <tr>
  2865. <th>Name</th>
  2866. <th>Type</th>
  2867. <th>Description</th>
  2868. <th>Default</th>
  2869. </tr>
  2870. </thead>
  2871. <tbody>
  2872. <tr class="doc-section-item">
  2873. <td><code>image_name</code></td>
  2874. <td>
  2875. <code>str</code>
  2876. </td>
  2877. <td>
  2878. <div class="doc-md-description">
  2879. <p>Name of image</p>
  2880. </div>
  2881. </td>
  2882. <td>
  2883. <em>required</em>
  2884. </td>
  2885. </tr>
  2886. </tbody>
  2887. </table>
  2888. <p>Returns:
  2889. bool: True if image exists</p>
  2890. <details class="quote">
  2891. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  2892. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">596</span>
  2893. <span class="normal">597</span>
  2894. <span class="normal">598</span>
  2895. <span class="normal">599</span>
  2896. <span class="normal">600</span>
  2897. <span class="normal">601</span>
  2898. <span class="normal">602</span>
  2899. <span class="normal">603</span>
  2900. <span class="normal">604</span>
  2901. <span class="normal">605</span>
  2902. <span class="normal">606</span>
  2903. <span class="normal">607</span>
  2904. <span class="normal">608</span>
  2905. <span class="normal">609</span>
  2906. <span class="normal">610</span>
  2907. <span class="normal">611</span>
  2908. <span class="normal">612</span>
  2909. <span class="normal">613</span>
  2910. <span class="normal">614</span>
  2911. <span class="normal">615</span>
  2912. <span class="normal">616</span>
  2913. <span class="normal">617</span>
  2914. <span class="normal">618</span>
  2915. <span class="normal">619</span>
  2916. <span class="normal">620</span>
  2917. <span class="normal">621</span>
  2918. <span class="normal">622</span>
  2919. <span class="normal">623</span>
  2920. <span class="normal">624</span>
  2921. <span class="normal">625</span>
  2922. <span class="normal">626</span>
  2923. <span class="normal">627</span>
  2924. <span class="normal">628</span>
  2925. <span class="normal">629</span>
  2926. <span class="normal">630</span>
  2927. <span class="normal">631</span>
  2928. <span class="normal">632</span>
  2929. <span class="normal">633</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">image_exists</span><span class="p">(</span><span class="n">image_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
  2930. <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
  2931. <span class="sd"> Check that the image exists and give some better error messages.</span>
  2932. <span class="sd"> Arguments:</span>
  2933. <span class="sd"> image_name: Name of image</span>
  2934. <span class="sd"> Returns:</span>
  2935. <span class="sd"> bool: True if image exists</span>
  2936. <span class="sd"> &quot;&quot;&quot;</span>
  2937. <span class="k">try</span><span class="p">:</span>
  2938. <span class="n">client</span> <span class="o">=</span> <span class="n">docker</span><span class="o">.</span><span class="n">from_env</span><span class="p">()</span>
  2939. <span class="k">except</span> <span class="n">docker</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">DockerException</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  2940. <span class="n">docker_not_running</span> <span class="o">=</span> <span class="nb">any</span><span class="p">(</span>
  2941. <span class="p">(</span>
  2942. <span class="s2">&quot;connection aborted&quot;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span>
  2943. <span class="s2">&quot;connection refused&quot;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span>
  2944. <span class="s2">&quot;error while fetching server api version&quot;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span>
  2945. <span class="p">),</span>
  2946. <span class="p">)</span>
  2947. <span class="k">if</span> <span class="n">docker_not_running</span><span class="p">:</span>
  2948. <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
  2949. <span class="s2">&quot;Probably the Docker daemon is not running. Please start the Docker daemon and try again. &quot;</span>
  2950. <span class="s2">&quot;If Docker issues persist, please check out https://princeton-nlp.github.io/SWE-agent/installation/tips/&quot;</span>
  2951. <span class="p">)</span>
  2952. <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">e</span>
  2953. <span class="k">raise</span>
  2954. <span class="n">filterred_images</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">images</span><span class="o">.</span><span class="n">list</span><span class="p">(</span><span class="n">filters</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;reference&quot;</span><span class="p">:</span> <span class="n">image_name</span><span class="p">})</span>
  2955. <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">filterred_images</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
  2956. <span class="k">return</span> <span class="kc">False</span>
  2957. <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">filterred_images</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
  2958. <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Multiple images found for </span><span class="si">{</span><span class="n">image_name</span><span class="si">}</span><span class="s2">, that&#39;s weird.&quot;</span><span class="p">)</span>
  2959. <span class="n">attrs</span> <span class="o">=</span> <span class="n">filterred_images</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">attrs</span>
  2960. <span class="k">if</span> <span class="n">attrs</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  2961. <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
  2962. <span class="sa">f</span><span class="s2">&quot;Found image </span><span class="si">{</span><span class="n">image_name</span><span class="si">}</span><span class="s2"> with tags: </span><span class="si">{</span><span class="n">attrs</span><span class="p">[</span><span class="s1">&#39;RepoTags&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">, created: </span><span class="si">{</span><span class="n">attrs</span><span class="p">[</span><span class="s1">&#39;Created&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> &quot;</span>
  2963. <span class="sa">f</span><span class="s2">&quot;for </span><span class="si">{</span><span class="n">attrs</span><span class="p">[</span><span class="s1">&#39;Os&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">attrs</span><span class="p">[</span><span class="s1">&#39;Architecture&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">,</span>
  2964. <span class="p">)</span>
  2965. <span class="k">return</span> <span class="kc">True</span>
  2966. </code></pre></div></td></tr></table></div>
  2967. </details>
  2968. </div>
  2969. </div>
  2970. <div class="doc doc-object doc-function">
  2971. <h2 id="sweagent.environment.utils.is_github_issue_url" class="doc doc-heading">
  2972. <code class="highlight language-python"><span class="n">is_github_issue_url</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span></code>
  2973. </h2>
  2974. <div class="doc doc-contents ">
  2975. <p>Check if data_path is an URL pointing to a github issue</p>
  2976. <details class="quote">
  2977. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  2978. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">64</span>
  2979. <span class="normal">65</span>
  2980. <span class="normal">66</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">is_github_issue_url</span><span class="p">(</span><span class="n">data_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
  2981. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Check if data_path is an URL pointing to a github issue&quot;&quot;&quot;</span>
  2982. <span class="k">return</span> <span class="n">GITHUB_ISSUE_URL_PATTERN</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
  2983. </code></pre></div></td></tr></table></div>
  2984. </details>
  2985. </div>
  2986. </div>
  2987. <div class="doc doc-object doc-function">
  2988. <h2 id="sweagent.environment.utils.is_github_repo_url" class="doc doc-heading">
  2989. <code class="highlight language-python"><span class="n">is_github_repo_url</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span></code>
  2990. </h2>
  2991. <div class="doc doc-contents ">
  2992. <p>Check if data_path is an URL pointing to a github repository.
  2993. Paths to issues or PRs will also match this pattern.</p>
  2994. <details class="quote">
  2995. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  2996. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">69</span>
  2997. <span class="normal">70</span>
  2998. <span class="normal">71</span>
  2999. <span class="normal">72</span>
  3000. <span class="normal">73</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">is_github_repo_url</span><span class="p">(</span><span class="n">data_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
  3001. <span class="w"> </span><span class="sd">&quot;&quot;&quot;Check if data_path is an URL pointing to a github repository.</span>
  3002. <span class="sd"> Paths to issues or PRs will also match this pattern.</span>
  3003. <span class="sd"> &quot;&quot;&quot;</span>
  3004. <span class="k">return</span> <span class="n">GITHUB_REPO_URL_PATTERN</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">data_path</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
  3005. </code></pre></div></td></tr></table></div>
  3006. </details>
  3007. </div>
  3008. </div>
  3009. <div class="doc doc-object doc-function">
  3010. <h2 id="sweagent.environment.utils.parse_gh_issue_url" class="doc doc-heading">
  3011. <code class="highlight language-python"><span class="n">parse_gh_issue_url</span><span class="p">(</span><span class="n">issue_url</span><span class="p">)</span></code>
  3012. </h2>
  3013. <div class="doc doc-contents ">
  3014. <p><span class="doc-section-title">Returns:</span></p>
  3015. <table>
  3016. <thead>
  3017. <tr>
  3018. <th>Name</th> <th>Type</th>
  3019. <th>Description</th>
  3020. </tr>
  3021. </thead>
  3022. <tbody>
  3023. <tr class="doc-section-item">
  3024. <td><code>owner</code></td> <td>
  3025. <code>str</code>
  3026. </td>
  3027. <td>
  3028. <div class="doc-md-description">
  3029. <p>Repo owner</p>
  3030. </div>
  3031. </td>
  3032. </tr>
  3033. <tr class="doc-section-item">
  3034. <td><code>repo</code></td> <td>
  3035. <code>str</code>
  3036. </td>
  3037. <td>
  3038. <div class="doc-md-description">
  3039. <p>Repo name</p>
  3040. </div>
  3041. </td>
  3042. </tr>
  3043. <tr class="doc-section-item">
  3044. <td></td> <td>
  3045. <code>str</code>
  3046. </td>
  3047. <td>
  3048. <div class="doc-md-description">
  3049. <p>issue number: Issue number as str</p>
  3050. </div>
  3051. </td>
  3052. </tr>
  3053. </tbody>
  3054. </table>
  3055. <p><span class="doc-section-title">Raises:</span></p>
  3056. <table>
  3057. <thead>
  3058. <tr>
  3059. <th>Type</th>
  3060. <th>Description</th>
  3061. </tr>
  3062. </thead>
  3063. <tbody>
  3064. <tr class="doc-section-item">
  3065. <td>
  3066. <code><span title="sweagent.environment.utils.InvalidGithubURL">InvalidGithubURL</span></code>
  3067. </td>
  3068. <td>
  3069. <div class="doc-md-description">
  3070. <p>If the URL is not a valid github issue URL</p>
  3071. </div>
  3072. </td>
  3073. </tr>
  3074. </tbody>
  3075. </table>
  3076. <details class="quote">
  3077. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  3078. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">656</span>
  3079. <span class="normal">657</span>
  3080. <span class="normal">658</span>
  3081. <span class="normal">659</span>
  3082. <span class="normal">660</span>
  3083. <span class="normal">661</span>
  3084. <span class="normal">662</span>
  3085. <span class="normal">663</span>
  3086. <span class="normal">664</span>
  3087. <span class="normal">665</span>
  3088. <span class="normal">666</span>
  3089. <span class="normal">667</span>
  3090. <span class="normal">668</span>
  3091. <span class="normal">669</span>
  3092. <span class="normal">670</span>
  3093. <span class="normal">671</span>
  3094. <span class="normal">672</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">parse_gh_issue_url</span><span class="p">(</span><span class="n">issue_url</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
  3095. <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
  3096. <span class="sd"> Returns:</span>
  3097. <span class="sd"> owner: Repo owner</span>
  3098. <span class="sd"> repo: Repo name</span>
  3099. <span class="sd"> issue number: Issue number as str</span>
  3100. <span class="sd"> Raises:</span>
  3101. <span class="sd"> InvalidGithubURL: If the URL is not a valid github issue URL</span>
  3102. <span class="sd"> &quot;&quot;&quot;</span>
  3103. <span class="n">match</span> <span class="o">=</span> <span class="n">GITHUB_ISSUE_URL_PATTERN</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">issue_url</span><span class="p">)</span>
  3104. <span class="k">if</span> <span class="ow">not</span> <span class="n">match</span><span class="p">:</span>
  3105. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Invalid GitHub issue URL: </span><span class="si">{</span><span class="n">issue_url</span><span class="si">}</span><span class="s2">&quot;</span>
  3106. <span class="k">raise</span> <span class="n">InvalidGithubURL</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  3107. <span class="n">res</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
  3108. <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="o">==</span> <span class="mi">3</span>
  3109. <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="c1"># type: ignore</span>
  3110. </code></pre></div></td></tr></table></div>
  3111. </details>
  3112. </div>
  3113. </div>
  3114. <div class="doc doc-object doc-function">
  3115. <h2 id="sweagent.environment.utils.parse_gh_repo_url" class="doc doc-heading">
  3116. <code class="highlight language-python"><span class="n">parse_gh_repo_url</span><span class="p">(</span><span class="n">repo_url</span><span class="p">)</span></code>
  3117. </h2>
  3118. <div class="doc doc-contents ">
  3119. <p><span class="doc-section-title">Returns:</span></p>
  3120. <table>
  3121. <thead>
  3122. <tr>
  3123. <th>Name</th> <th>Type</th>
  3124. <th>Description</th>
  3125. </tr>
  3126. </thead>
  3127. <tbody>
  3128. <tr class="doc-section-item">
  3129. <td><code>owner</code></td> <td>
  3130. <code>str</code>
  3131. </td>
  3132. <td>
  3133. <div class="doc-md-description">
  3134. <p>Repo owner/org</p>
  3135. </div>
  3136. </td>
  3137. </tr>
  3138. <tr class="doc-section-item">
  3139. <td><code>repo</code></td> <td>
  3140. <code>str</code>
  3141. </td>
  3142. <td>
  3143. <div class="doc-md-description">
  3144. <p>Repo name</p>
  3145. </div>
  3146. </td>
  3147. </tr>
  3148. </tbody>
  3149. </table>
  3150. <p><span class="doc-section-title">Raises:</span></p>
  3151. <table>
  3152. <thead>
  3153. <tr>
  3154. <th>Type</th>
  3155. <th>Description</th>
  3156. </tr>
  3157. </thead>
  3158. <tbody>
  3159. <tr class="doc-section-item">
  3160. <td>
  3161. <code><span title="sweagent.environment.utils.InvalidGithubURL">InvalidGithubURL</span></code>
  3162. </td>
  3163. <td>
  3164. <div class="doc-md-description">
  3165. <p>If the URL is not a valid github repo URL</p>
  3166. </div>
  3167. </td>
  3168. </tr>
  3169. </tbody>
  3170. </table>
  3171. <details class="quote">
  3172. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  3173. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">675</span>
  3174. <span class="normal">676</span>
  3175. <span class="normal">677</span>
  3176. <span class="normal">678</span>
  3177. <span class="normal">679</span>
  3178. <span class="normal">680</span>
  3179. <span class="normal">681</span>
  3180. <span class="normal">682</span>
  3181. <span class="normal">683</span>
  3182. <span class="normal">684</span>
  3183. <span class="normal">685</span>
  3184. <span class="normal">686</span>
  3185. <span class="normal">687</span>
  3186. <span class="normal">688</span>
  3187. <span class="normal">689</span>
  3188. <span class="normal">690</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">parse_gh_repo_url</span><span class="p">(</span><span class="n">repo_url</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
  3189. <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
  3190. <span class="sd"> Returns:</span>
  3191. <span class="sd"> owner: Repo owner/org</span>
  3192. <span class="sd"> repo: Repo name</span>
  3193. <span class="sd"> Raises:</span>
  3194. <span class="sd"> InvalidGithubURL: If the URL is not a valid github repo URL</span>
  3195. <span class="sd"> &quot;&quot;&quot;</span>
  3196. <span class="n">match</span> <span class="o">=</span> <span class="n">GITHUB_REPO_URL_PATTERN</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">repo_url</span><span class="p">)</span>
  3197. <span class="k">if</span> <span class="ow">not</span> <span class="n">match</span><span class="p">:</span>
  3198. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Invalid GitHub issue URL: </span><span class="si">{</span><span class="n">repo_url</span><span class="si">}</span><span class="s2">&quot;</span>
  3199. <span class="k">raise</span> <span class="n">InvalidGithubURL</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  3200. <span class="n">res</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
  3201. <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span>
  3202. <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="c1"># type: ignore</span>
  3203. </code></pre></div></td></tr></table></div>
  3204. </details>
  3205. </div>
  3206. </div>
  3207. <div class="doc doc-object doc-function">
  3208. <h2 id="sweagent.environment.utils.read_session_with_timeout" class="doc doc-heading">
  3209. <code class="highlight language-python"><span class="n">read_session_with_timeout</span><span class="p">(</span><span class="n">session</span><span class="p">,</span> <span class="n">terminal_pattern</span><span class="p">,</span> <span class="n">timeout_duration</span><span class="p">,</span> <span class="n">no_output_timeout_duration</span><span class="p">)</span></code>
  3210. </h2>
  3211. <div class="doc doc-contents ">
  3212. <p>Read data from a subprocess with a timeout.
  3213. This function uses a file descriptor to read data from the subprocess in a non-blocking way.</p>
  3214. <p><span class="doc-section-title">Parameters:</span></p>
  3215. <table>
  3216. <thead>
  3217. <tr>
  3218. <th>Name</th>
  3219. <th>Type</th>
  3220. <th>Description</th>
  3221. <th>Default</th>
  3222. </tr>
  3223. </thead>
  3224. <tbody>
  3225. <tr class="doc-section-item">
  3226. <td><code>session</code></td>
  3227. <td>
  3228. <code><span title="subprocess.Popen">Popen</span></code>
  3229. </td>
  3230. <td>
  3231. <div class="doc-md-description">
  3232. <p>The session subprocess.</p>
  3233. </div>
  3234. </td>
  3235. <td>
  3236. <em>required</em>
  3237. </td>
  3238. </tr>
  3239. <tr class="doc-section-item">
  3240. <td><code>terminal_pattern</code></td>
  3241. <td>
  3242. <code>str</code>
  3243. </td>
  3244. <td>
  3245. <div class="doc-md-description">
  3246. <p>the terminal pattern to indicate end of output.</p>
  3247. </div>
  3248. </td>
  3249. <td>
  3250. <em>required</em>
  3251. </td>
  3252. </tr>
  3253. <tr class="doc-section-item">
  3254. <td><code>timeout_duration</code></td>
  3255. <td>
  3256. <code>int | float</code>
  3257. </td>
  3258. <td>
  3259. <div class="doc-md-description">
  3260. <p>The timeout duration in seconds.</p>
  3261. </div>
  3262. </td>
  3263. <td>
  3264. <em>required</em>
  3265. </td>
  3266. </tr>
  3267. </tbody>
  3268. </table>
  3269. <p><span class="doc-section-title">Returns:</span></p>
  3270. <table>
  3271. <thead>
  3272. <tr>
  3273. <th>Type</th>
  3274. <th>Description</th>
  3275. </tr>
  3276. </thead>
  3277. <tbody>
  3278. <tr class="doc-section-item">
  3279. <td>
  3280. <code>str</code>
  3281. </td>
  3282. <td>
  3283. <div class="doc-md-description">
  3284. <p>Output</p>
  3285. </div>
  3286. </td>
  3287. </tr>
  3288. </tbody>
  3289. </table>
  3290. <p><span class="doc-section-title">Raises:</span></p>
  3291. <table>
  3292. <thead>
  3293. <tr>
  3294. <th>Type</th>
  3295. <th>Description</th>
  3296. </tr>
  3297. </thead>
  3298. <tbody>
  3299. <tr class="doc-section-item">
  3300. <td>
  3301. <code>TimeoutError</code>
  3302. </td>
  3303. <td>
  3304. <div class="doc-md-description">
  3305. <p>If the timeout duration is reached while reading from the subprocess.</p>
  3306. </div>
  3307. </td>
  3308. </tr>
  3309. </tbody>
  3310. </table>
  3311. <details class="quote">
  3312. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  3313. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">299</span>
  3314. <span class="normal">300</span>
  3315. <span class="normal">301</span>
  3316. <span class="normal">302</span>
  3317. <span class="normal">303</span>
  3318. <span class="normal">304</span>
  3319. <span class="normal">305</span>
  3320. <span class="normal">306</span>
  3321. <span class="normal">307</span>
  3322. <span class="normal">308</span>
  3323. <span class="normal">309</span>
  3324. <span class="normal">310</span>
  3325. <span class="normal">311</span>
  3326. <span class="normal">312</span>
  3327. <span class="normal">313</span>
  3328. <span class="normal">314</span>
  3329. <span class="normal">315</span>
  3330. <span class="normal">316</span>
  3331. <span class="normal">317</span>
  3332. <span class="normal">318</span>
  3333. <span class="normal">319</span>
  3334. <span class="normal">320</span>
  3335. <span class="normal">321</span>
  3336. <span class="normal">322</span>
  3337. <span class="normal">323</span>
  3338. <span class="normal">324</span>
  3339. <span class="normal">325</span>
  3340. <span class="normal">326</span>
  3341. <span class="normal">327</span>
  3342. <span class="normal">328</span>
  3343. <span class="normal">329</span>
  3344. <span class="normal">330</span>
  3345. <span class="normal">331</span>
  3346. <span class="normal">332</span>
  3347. <span class="normal">333</span>
  3348. <span class="normal">334</span>
  3349. <span class="normal">335</span>
  3350. <span class="normal">336</span>
  3351. <span class="normal">337</span>
  3352. <span class="normal">338</span>
  3353. <span class="normal">339</span>
  3354. <span class="normal">340</span>
  3355. <span class="normal">341</span>
  3356. <span class="normal">342</span>
  3357. <span class="normal">343</span>
  3358. <span class="normal">344</span>
  3359. <span class="normal">345</span>
  3360. <span class="normal">346</span>
  3361. <span class="normal">347</span>
  3362. <span class="normal">348</span>
  3363. <span class="normal">349</span>
  3364. <span class="normal">350</span>
  3365. <span class="normal">351</span>
  3366. <span class="normal">352</span>
  3367. <span class="normal">353</span>
  3368. <span class="normal">354</span>
  3369. <span class="normal">355</span>
  3370. <span class="normal">356</span>
  3371. <span class="normal">357</span>
  3372. <span class="normal">358</span>
  3373. <span class="normal">359</span>
  3374. <span class="normal">360</span>
  3375. <span class="normal">361</span>
  3376. <span class="normal">362</span>
  3377. <span class="normal">363</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">read_session_with_timeout</span><span class="p">(</span>
  3378. <span class="n">session</span><span class="p">:</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">,</span>
  3379. <span class="n">terminal_pattern</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
  3380. <span class="n">timeout_duration</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span><span class="p">,</span>
  3381. <span class="n">no_output_timeout_duration</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span><span class="p">,</span>
  3382. <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
  3383. <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
  3384. <span class="sd"> Read data from a subprocess with a timeout.</span>
  3385. <span class="sd"> This function uses a file descriptor to read data from the subprocess in a non-blocking way.</span>
  3386. <span class="sd"> Args:</span>
  3387. <span class="sd"> session: The session subprocess.</span>
  3388. <span class="sd"> terminal_pattern: the terminal pattern to indicate end of output.</span>
  3389. <span class="sd"> timeout_duration: The timeout duration in seconds.</span>
  3390. <span class="sd"> Returns:</span>
  3391. <span class="sd"> Output</span>
  3392. <span class="sd"> Raises:</span>
  3393. <span class="sd"> TimeoutError: If the timeout duration is reached while reading from the subprocess.</span>
  3394. <span class="sd"> &quot;&quot;&quot;</span>
  3395. <span class="n">buffer</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span>
  3396. <span class="n">fd</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
  3397. <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
  3398. <span class="n">end_time</span> <span class="o">=</span> <span class="n">start_time</span> <span class="o">+</span> <span class="n">timeout_duration</span>
  3399. <span class="n">end_time_no_output</span> <span class="o">=</span> <span class="n">start_time</span> <span class="o">+</span> <span class="n">no_output_timeout_duration</span>
  3400. <span class="c1"># Select is not available on windows</span>
  3401. <span class="kn">import</span> <span class="nn">select</span>
  3402. <span class="k">def</span> <span class="nf">ready_to_read</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
  3403. <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span><span class="n">fd</span><span class="p">],</span> <span class="p">[],</span> <span class="p">[],</span> <span class="mf">0.01</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
  3404. <span class="n">command_done</span> <span class="o">=</span> <span class="kc">False</span>
  3405. <span class="k">while</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">&lt;</span> <span class="nb">min</span><span class="p">(</span><span class="n">end_time</span><span class="p">,</span> <span class="n">end_time_no_output</span><span class="p">)</span> <span class="ow">and</span> <span class="n">session</span><span class="o">.</span><span class="n">poll</span><span class="p">()</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  3406. <span class="k">if</span> <span class="n">ready_to_read</span><span class="p">(</span><span class="n">fd</span><span class="p">):</span>
  3407. <span class="k">try</span><span class="p">:</span>
  3408. <span class="n">data</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mi">4096</span><span class="p">)</span>
  3409. <span class="k">except</span> <span class="ne">BlockingIOError</span><span class="p">:</span>
  3410. <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;BlockingIOError while reading from subprocess.&quot;</span><span class="p">,</span> <span class="n">exc_info</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
  3411. <span class="k">break</span>
  3412. <span class="k">if</span> <span class="n">data</span><span class="p">:</span>
  3413. <span class="n">end_time_no_output</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">no_output_timeout_duration</span>
  3414. <span class="n">buffer</span> <span class="o">+=</span> <span class="n">data</span>
  3415. <span class="k">if</span> <span class="n">terminal_pattern</span> <span class="ow">in</span> <span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">&quot;backslashreplace&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\r\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">):</span>
  3416. <span class="n">command_done</span> <span class="o">=</span> <span class="kc">True</span>
  3417. <span class="k">break</span>
  3418. <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.01</span><span class="p">)</span> <span class="c1"># Prevents CPU hogging</span>
  3419. <span class="n">decoded</span> <span class="o">=</span> <span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">&quot;backslashreplace&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\r\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
  3420. <span class="n">body</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">decoded</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">terminal_pattern</span><span class="p">))</span>
  3421. <span class="k">if</span> <span class="n">session</span><span class="o">.</span><span class="n">poll</span><span class="p">()</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  3422. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Subprocess exited unexpectedly.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">decoded</span><span class="si">}</span><span class="s2">&quot;</span>
  3423. <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
  3424. <span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
  3425. <span class="k">if</span> <span class="ow">not</span> <span class="n">command_done</span> <span class="ow">and</span> <span class="n">current_time</span> <span class="o">&gt;=</span> <span class="nb">min</span><span class="p">(</span><span class="n">end_time</span><span class="p">,</span> <span class="n">end_time_no_output</span><span class="p">):</span>
  3426. <span class="k">if</span> <span class="n">current_time</span> <span class="o">&gt;=</span> <span class="n">end_time</span><span class="p">:</span>
  3427. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Timeout reached while reading from subprocess.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">decoded</span><span class="si">}</span><span class="s2">&quot;</span>
  3428. <span class="k">raise</span> <span class="ne">TimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
  3429. <span class="k">else</span><span class="p">:</span>
  3430. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;No output timeout reached while reading from subprocess.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">decoded</span><span class="si">}</span><span class="s2">&quot;</span>
  3431. <span class="k">raise</span> <span class="n">NoOutputTimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
  3432. <span class="k">return</span> <span class="n">body</span>
  3433. </code></pre></div></td></tr></table></div>
  3434. </details>
  3435. </div>
  3436. </div>
  3437. <div class="doc doc-object doc-function">
  3438. <h2 id="sweagent.environment.utils.read_with_timeout" class="doc doc-heading">
  3439. <code class="highlight language-python"><span class="n">read_with_timeout</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">pid_func</span><span class="p">,</span> <span class="n">timeout_duration</span><span class="p">)</span></code>
  3440. </h2>
  3441. <div class="doc doc-contents ">
  3442. <p>Read data from a subprocess with a timeout.
  3443. This function uses a file descriptor to read data from the subprocess in a non-blocking way.</p>
  3444. <p><span class="doc-section-title">Parameters:</span></p>
  3445. <table>
  3446. <thead>
  3447. <tr>
  3448. <th>Name</th>
  3449. <th>Type</th>
  3450. <th>Description</th>
  3451. <th>Default</th>
  3452. </tr>
  3453. </thead>
  3454. <tbody>
  3455. <tr class="doc-section-item">
  3456. <td><code>container</code></td>
  3457. <td>
  3458. <code><span title="subprocess.Popen">Popen</span></code>
  3459. </td>
  3460. <td>
  3461. <div class="doc-md-description">
  3462. <p>The subprocess container.</p>
  3463. </div>
  3464. </td>
  3465. <td>
  3466. <em>required</em>
  3467. </td>
  3468. </tr>
  3469. <tr class="doc-section-item">
  3470. <td><code>pid_func</code></td>
  3471. <td>
  3472. <code><span title="typing.Callable">Callable</span></code>
  3473. </td>
  3474. <td>
  3475. <div class="doc-md-description">
  3476. <p>A function that returns a list of process IDs (except the PID of the main process).</p>
  3477. </div>
  3478. </td>
  3479. <td>
  3480. <em>required</em>
  3481. </td>
  3482. </tr>
  3483. <tr class="doc-section-item">
  3484. <td><code>timeout_duration</code></td>
  3485. <td>
  3486. <code>int | float</code>
  3487. </td>
  3488. <td>
  3489. <div class="doc-md-description">
  3490. <p>The timeout duration in seconds.</p>
  3491. </div>
  3492. </td>
  3493. <td>
  3494. <em>required</em>
  3495. </td>
  3496. </tr>
  3497. </tbody>
  3498. </table>
  3499. <p><span class="doc-section-title">Returns:</span></p>
  3500. <table>
  3501. <thead>
  3502. <tr>
  3503. <th>Name</th> <th>Type</th>
  3504. <th>Description</th>
  3505. </tr>
  3506. </thead>
  3507. <tbody>
  3508. <tr class="doc-section-item">
  3509. <td><code>output</code></td> <td>
  3510. <code>str</code>
  3511. </td>
  3512. <td>
  3513. <div class="doc-md-description">
  3514. <p>The data read from the subprocess, stripped of trailing newline characters.</p>
  3515. </div>
  3516. </td>
  3517. </tr>
  3518. </tbody>
  3519. </table>
  3520. <p><span class="doc-section-title">Raises:</span></p>
  3521. <table>
  3522. <thead>
  3523. <tr>
  3524. <th>Type</th>
  3525. <th>Description</th>
  3526. </tr>
  3527. </thead>
  3528. <tbody>
  3529. <tr class="doc-section-item">
  3530. <td>
  3531. <code>TimeoutError</code>
  3532. </td>
  3533. <td>
  3534. <div class="doc-md-description">
  3535. <p>If the timeout duration is reached while reading from the subprocess.</p>
  3536. </div>
  3537. </td>
  3538. </tr>
  3539. </tbody>
  3540. </table>
  3541. <details class="quote">
  3542. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  3543. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">139</span>
  3544. <span class="normal">140</span>
  3545. <span class="normal">141</span>
  3546. <span class="normal">142</span>
  3547. <span class="normal">143</span>
  3548. <span class="normal">144</span>
  3549. <span class="normal">145</span>
  3550. <span class="normal">146</span>
  3551. <span class="normal">147</span>
  3552. <span class="normal">148</span>
  3553. <span class="normal">149</span>
  3554. <span class="normal">150</span>
  3555. <span class="normal">151</span>
  3556. <span class="normal">152</span>
  3557. <span class="normal">153</span>
  3558. <span class="normal">154</span>
  3559. <span class="normal">155</span>
  3560. <span class="normal">156</span>
  3561. <span class="normal">157</span>
  3562. <span class="normal">158</span>
  3563. <span class="normal">159</span>
  3564. <span class="normal">160</span>
  3565. <span class="normal">161</span>
  3566. <span class="normal">162</span>
  3567. <span class="normal">163</span>
  3568. <span class="normal">164</span>
  3569. <span class="normal">165</span>
  3570. <span class="normal">166</span>
  3571. <span class="normal">167</span>
  3572. <span class="normal">168</span>
  3573. <span class="normal">169</span>
  3574. <span class="normal">170</span>
  3575. <span class="normal">171</span>
  3576. <span class="normal">172</span>
  3577. <span class="normal">173</span>
  3578. <span class="normal">174</span>
  3579. <span class="normal">175</span>
  3580. <span class="normal">176</span>
  3581. <span class="normal">177</span>
  3582. <span class="normal">178</span>
  3583. <span class="normal">179</span>
  3584. <span class="normal">180</span>
  3585. <span class="normal">181</span>
  3586. <span class="normal">182</span>
  3587. <span class="normal">183</span>
  3588. <span class="normal">184</span>
  3589. <span class="normal">185</span>
  3590. <span class="normal">186</span>
  3591. <span class="normal">187</span>
  3592. <span class="normal">188</span>
  3593. <span class="normal">189</span>
  3594. <span class="normal">190</span>
  3595. <span class="normal">191</span>
  3596. <span class="normal">192</span>
  3597. <span class="normal">193</span>
  3598. <span class="normal">194</span>
  3599. <span class="normal">195</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">read_with_timeout</span><span class="p">(</span><span class="n">container</span><span class="p">:</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">,</span> <span class="n">pid_func</span><span class="p">:</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">timeout_duration</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
  3600. <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
  3601. <span class="sd"> Read data from a subprocess with a timeout.</span>
  3602. <span class="sd"> This function uses a file descriptor to read data from the subprocess in a non-blocking way.</span>
  3603. <span class="sd"> Args:</span>
  3604. <span class="sd"> container: The subprocess container.</span>
  3605. <span class="sd"> pid_func: A function that returns a list of process IDs (except the PID of the main process).</span>
  3606. <span class="sd"> timeout_duration: The timeout duration in seconds.</span>
  3607. <span class="sd"> Returns:</span>
  3608. <span class="sd"> output: The data read from the subprocess, stripped of trailing newline characters.</span>
  3609. <span class="sd"> Raises:</span>
  3610. <span class="sd"> TimeoutError: If the timeout duration is reached while reading from the subprocess.</span>
  3611. <span class="sd"> &quot;&quot;&quot;</span>
  3612. <span class="n">buffer</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span>
  3613. <span class="n">fd</span> <span class="o">=</span> <span class="n">container</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
  3614. <span class="n">end_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout_duration</span>
  3615. <span class="c1"># Select is not available on windows</span>
  3616. <span class="n">is_windows</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">system</span><span class="p">()</span> <span class="o">==</span> <span class="s2">&quot;Windows&quot;</span>
  3617. <span class="k">if</span> <span class="ow">not</span> <span class="n">is_windows</span><span class="p">:</span>
  3618. <span class="kn">import</span> <span class="nn">select</span>
  3619. <span class="k">else</span><span class="p">:</span>
  3620. <span class="n">os</span><span class="o">.</span><span class="n">set_blocking</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
  3621. <span class="k">def</span> <span class="nf">ready_to_read</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
  3622. <span class="k">if</span> <span class="n">is_windows</span><span class="p">:</span>
  3623. <span class="c1"># We can&#39;t do the extra check</span>
  3624. <span class="k">return</span> <span class="kc">True</span>
  3625. <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span><span class="n">fd</span><span class="p">],</span> <span class="p">[],</span> <span class="p">[],</span> <span class="mf">0.01</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
  3626. <span class="k">while</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">&lt;</span> <span class="n">end_time</span><span class="p">:</span>
  3627. <span class="n">pids</span> <span class="o">=</span> <span class="n">pid_func</span><span class="p">()</span>
  3628. <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">pids</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
  3629. <span class="c1"># There are still PIDs running</span>
  3630. <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.05</span><span class="p">)</span>
  3631. <span class="k">continue</span>
  3632. <span class="k">if</span> <span class="n">ready_to_read</span><span class="p">(</span><span class="n">fd</span><span class="p">):</span>
  3633. <span class="n">data</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mi">4096</span><span class="p">)</span>
  3634. <span class="k">if</span> <span class="n">data</span><span class="p">:</span>
  3635. <span class="n">buffer</span> <span class="o">+=</span> <span class="n">data</span>
  3636. <span class="k">else</span><span class="p">:</span>
  3637. <span class="c1"># No more data to read</span>
  3638. <span class="k">break</span>
  3639. <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.05</span><span class="p">)</span> <span class="c1"># Prevents CPU hogging</span>
  3640. <span class="k">if</span> <span class="n">container</span><span class="o">.</span><span class="n">poll</span><span class="p">()</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  3641. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Subprocess exited unexpectedly.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span>
  3642. <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  3643. <span class="k">if</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">&gt;=</span> <span class="n">end_time</span><span class="p">:</span>
  3644. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Timeout reached while reading from subprocess.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="s2">Running PIDs: </span><span class="si">{</span><span class="n">pids</span><span class="si">}</span><span class="s2">&quot;</span>
  3645. <span class="k">raise</span> <span class="ne">TimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  3646. <span class="n">decoded</span> <span class="o">=</span> <span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">&quot;backslashreplace&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\r\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
  3647. <span class="k">return</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">decoded</span><span class="o">.</span><span class="n">splitlines</span><span class="p">())</span>
  3648. </code></pre></div></td></tr></table></div>
  3649. </details>
  3650. </div>
  3651. </div>
  3652. <div class="doc doc-object doc-function">
  3653. <h2 id="sweagent.environment.utils.read_with_timeout_experimental" class="doc doc-heading">
  3654. <code class="highlight language-python"><span class="n">read_with_timeout_experimental</span><span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">timeout_duration</span><span class="p">,</span> <span class="n">no_output_timeout_duration</span><span class="p">)</span></code>
  3655. </h2>
  3656. <div class="doc doc-contents ">
  3657. <p>Read data from a subprocess with a timeout.
  3658. This function uses a file descriptor to read data from the subprocess in a non-blocking way.</p>
  3659. <p>NOTE: This is an experimental implementation that is faster than <code>read_with_timeout</code>, but
  3660. has not been thoroughly tested.</p>
  3661. <p><span class="doc-section-title">Parameters:</span></p>
  3662. <table>
  3663. <thead>
  3664. <tr>
  3665. <th>Name</th>
  3666. <th>Type</th>
  3667. <th>Description</th>
  3668. <th>Default</th>
  3669. </tr>
  3670. </thead>
  3671. <tbody>
  3672. <tr class="doc-section-item">
  3673. <td><code>container</code></td>
  3674. <td>
  3675. <code><span title="subprocess.Popen">Popen</span></code>
  3676. </td>
  3677. <td>
  3678. <div class="doc-md-description">
  3679. <p>The subprocess container.</p>
  3680. </div>
  3681. </td>
  3682. <td>
  3683. <em>required</em>
  3684. </td>
  3685. </tr>
  3686. <tr class="doc-section-item">
  3687. <td><code>timeout_duration</code></td>
  3688. <td>
  3689. <code>int | float</code>
  3690. </td>
  3691. <td>
  3692. <div class="doc-md-description">
  3693. <p>The timeout duration in seconds.</p>
  3694. </div>
  3695. </td>
  3696. <td>
  3697. <em>required</em>
  3698. </td>
  3699. </tr>
  3700. <tr class="doc-section-item">
  3701. <td><code>no_output_timeout_duration</code></td>
  3702. <td>
  3703. <code>int | float</code>
  3704. </td>
  3705. <td>
  3706. <div class="doc-md-description">
  3707. <p>The timeout duration to wait if no output is produced, in seconds.</p>
  3708. </div>
  3709. </td>
  3710. <td>
  3711. <em>required</em>
  3712. </td>
  3713. </tr>
  3714. </tbody>
  3715. </table>
  3716. <p><span class="doc-section-title">Returns:</span></p>
  3717. <table>
  3718. <thead>
  3719. <tr>
  3720. <th>Type</th>
  3721. <th>Description</th>
  3722. </tr>
  3723. </thead>
  3724. <tbody>
  3725. <tr class="doc-section-item">
  3726. <td>
  3727. <code>tuple[str, str]</code>
  3728. </td>
  3729. <td>
  3730. <div class="doc-md-description">
  3731. <p>Output and exit code, both as strings (!)</p>
  3732. </div>
  3733. </td>
  3734. </tr>
  3735. </tbody>
  3736. </table>
  3737. <p><span class="doc-section-title">Raises:</span></p>
  3738. <table>
  3739. <thead>
  3740. <tr>
  3741. <th>Type</th>
  3742. <th>Description</th>
  3743. </tr>
  3744. </thead>
  3745. <tbody>
  3746. <tr class="doc-section-item">
  3747. <td>
  3748. <code>TimeoutError</code>
  3749. </td>
  3750. <td>
  3751. <div class="doc-md-description">
  3752. <p>If the timeout duration is reached while reading from the subprocess.</p>
  3753. </div>
  3754. </td>
  3755. </tr>
  3756. </tbody>
  3757. </table>
  3758. <details class="quote">
  3759. <summary>Source code in <code>sweagent/environment/utils.py</code></summary>
  3760. <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">217</span>
  3761. <span class="normal">218</span>
  3762. <span class="normal">219</span>
  3763. <span class="normal">220</span>
  3764. <span class="normal">221</span>
  3765. <span class="normal">222</span>
  3766. <span class="normal">223</span>
  3767. <span class="normal">224</span>
  3768. <span class="normal">225</span>
  3769. <span class="normal">226</span>
  3770. <span class="normal">227</span>
  3771. <span class="normal">228</span>
  3772. <span class="normal">229</span>
  3773. <span class="normal">230</span>
  3774. <span class="normal">231</span>
  3775. <span class="normal">232</span>
  3776. <span class="normal">233</span>
  3777. <span class="normal">234</span>
  3778. <span class="normal">235</span>
  3779. <span class="normal">236</span>
  3780. <span class="normal">237</span>
  3781. <span class="normal">238</span>
  3782. <span class="normal">239</span>
  3783. <span class="normal">240</span>
  3784. <span class="normal">241</span>
  3785. <span class="normal">242</span>
  3786. <span class="normal">243</span>
  3787. <span class="normal">244</span>
  3788. <span class="normal">245</span>
  3789. <span class="normal">246</span>
  3790. <span class="normal">247</span>
  3791. <span class="normal">248</span>
  3792. <span class="normal">249</span>
  3793. <span class="normal">250</span>
  3794. <span class="normal">251</span>
  3795. <span class="normal">252</span>
  3796. <span class="normal">253</span>
  3797. <span class="normal">254</span>
  3798. <span class="normal">255</span>
  3799. <span class="normal">256</span>
  3800. <span class="normal">257</span>
  3801. <span class="normal">258</span>
  3802. <span class="normal">259</span>
  3803. <span class="normal">260</span>
  3804. <span class="normal">261</span>
  3805. <span class="normal">262</span>
  3806. <span class="normal">263</span>
  3807. <span class="normal">264</span>
  3808. <span class="normal">265</span>
  3809. <span class="normal">266</span>
  3810. <span class="normal">267</span>
  3811. <span class="normal">268</span>
  3812. <span class="normal">269</span>
  3813. <span class="normal">270</span>
  3814. <span class="normal">271</span>
  3815. <span class="normal">272</span>
  3816. <span class="normal">273</span>
  3817. <span class="normal">274</span>
  3818. <span class="normal">275</span>
  3819. <span class="normal">276</span>
  3820. <span class="normal">277</span>
  3821. <span class="normal">278</span>
  3822. <span class="normal">279</span>
  3823. <span class="normal">280</span>
  3824. <span class="normal">281</span>
  3825. <span class="normal">282</span>
  3826. <span class="normal">283</span>
  3827. <span class="normal">284</span>
  3828. <span class="normal">285</span>
  3829. <span class="normal">286</span>
  3830. <span class="normal">287</span>
  3831. <span class="normal">288</span>
  3832. <span class="normal">289</span>
  3833. <span class="normal">290</span>
  3834. <span class="normal">291</span>
  3835. <span class="normal">292</span>
  3836. <span class="normal">293</span>
  3837. <span class="normal">294</span>
  3838. <span class="normal">295</span>
  3839. <span class="normal">296</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span> <span class="nf">read_with_timeout_experimental</span><span class="p">(</span>
  3840. <span class="n">container</span><span class="p">:</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">,</span> <span class="n">timeout_duration</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span><span class="p">,</span> <span class="n">no_output_timeout_duration</span><span class="p">:</span> <span class="nb">int</span> <span class="o">|</span> <span class="nb">float</span>
  3841. <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
  3842. <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
  3843. <span class="sd"> Read data from a subprocess with a timeout.</span>
  3844. <span class="sd"> This function uses a file descriptor to read data from the subprocess in a non-blocking way.</span>
  3845. <span class="sd"> NOTE: This is an experimental implementation that is faster than `read_with_timeout`, but</span>
  3846. <span class="sd"> has not been thoroughly tested.</span>
  3847. <span class="sd"> Args:</span>
  3848. <span class="sd"> container: The subprocess container.</span>
  3849. <span class="sd"> timeout_duration: The timeout duration in seconds.</span>
  3850. <span class="sd"> no_output_timeout_duration: The timeout duration to wait if no output is produced, in seconds.</span>
  3851. <span class="sd"> Returns:</span>
  3852. <span class="sd"> Output and exit code, both as strings (!)</span>
  3853. <span class="sd"> Raises:</span>
  3854. <span class="sd"> TimeoutError: If the timeout duration is reached while reading from the subprocess.</span>
  3855. <span class="sd"> &quot;&quot;&quot;</span>
  3856. <span class="n">buffer</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">&quot;&quot;</span>
  3857. <span class="n">fd</span> <span class="o">=</span> <span class="n">container</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
  3858. <span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
  3859. <span class="n">end_time</span> <span class="o">=</span> <span class="n">start_time</span> <span class="o">+</span> <span class="n">timeout_duration</span>
  3860. <span class="n">end_time_no_output</span> <span class="o">=</span> <span class="n">start_time</span> <span class="o">+</span> <span class="n">no_output_timeout_duration</span>
  3861. <span class="c1"># Select is not available on windows</span>
  3862. <span class="n">is_windows</span> <span class="o">=</span> <span class="n">platform</span><span class="o">.</span><span class="n">system</span><span class="p">()</span> <span class="o">==</span> <span class="s2">&quot;Windows&quot;</span>
  3863. <span class="k">if</span> <span class="ow">not</span> <span class="n">is_windows</span><span class="p">:</span>
  3864. <span class="kn">import</span> <span class="nn">select</span>
  3865. <span class="k">else</span><span class="p">:</span>
  3866. <span class="n">os</span><span class="o">.</span><span class="n">set_blocking</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
  3867. <span class="k">def</span> <span class="nf">ready_to_read</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
  3868. <span class="k">if</span> <span class="n">is_windows</span><span class="p">:</span>
  3869. <span class="c1"># We can&#39;t do the extra check</span>
  3870. <span class="k">return</span> <span class="kc">True</span>
  3871. <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span><span class="n">fd</span><span class="p">],</span> <span class="p">[],</span> <span class="p">[],</span> <span class="mf">0.01</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
  3872. <span class="n">process_done</span> <span class="o">=</span> <span class="kc">False</span>
  3873. <span class="k">while</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">&lt;</span> <span class="nb">min</span><span class="p">(</span><span class="n">end_time</span><span class="p">,</span> <span class="n">end_time_no_output</span><span class="p">):</span>
  3874. <span class="k">if</span> <span class="n">ready_to_read</span><span class="p">(</span><span class="n">fd</span><span class="p">):</span>
  3875. <span class="k">try</span><span class="p">:</span>
  3876. <span class="n">data</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="mi">4096</span><span class="p">)</span>
  3877. <span class="k">except</span> <span class="ne">BlockingIOError</span><span class="p">:</span>
  3878. <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;BlockingIOError while reading from subprocess.&quot;</span><span class="p">,</span> <span class="n">exc_info</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
  3879. <span class="k">break</span>
  3880. <span class="k">if</span> <span class="n">data</span><span class="p">:</span>
  3881. <span class="n">end_time_no_output</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">no_output_timeout_duration</span>
  3882. <span class="n">buffer</span> <span class="o">+=</span> <span class="n">data</span>
  3883. <span class="k">if</span> <span class="n">PROCESS_DONE_MARKER_START</span> <span class="ow">in</span> <span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">&quot;backslashreplace&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\r\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">):</span>
  3884. <span class="n">process_done</span> <span class="o">=</span> <span class="kc">True</span>
  3885. <span class="k">break</span>
  3886. <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.01</span><span class="p">)</span> <span class="c1"># Prevents CPU hogging</span>
  3887. <span class="n">decoded</span> <span class="o">=</span> <span class="n">buffer</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;utf-8&quot;</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">&quot;backslashreplace&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\r\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">)</span>
  3888. <span class="n">body</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">decoded</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">PROCESS_DONE_MARKER_START</span><span class="p">))</span>
  3889. <span class="k">if</span> <span class="n">container</span><span class="o">.</span><span class="n">poll</span><span class="p">()</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  3890. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Subprocess exited unexpectedly.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">decoded</span><span class="si">}</span><span class="s2">&quot;</span>
  3891. <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
  3892. <span class="n">current_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
  3893. <span class="k">if</span> <span class="ow">not</span> <span class="n">process_done</span> <span class="ow">and</span> <span class="n">current_time</span> <span class="o">&gt;=</span> <span class="nb">min</span><span class="p">(</span><span class="n">end_time</span><span class="p">,</span> <span class="n">end_time_no_output</span><span class="p">):</span>
  3894. <span class="k">if</span> <span class="n">current_time</span> <span class="o">&gt;=</span> <span class="n">end_time</span><span class="p">:</span>
  3895. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Timeout reached while reading from subprocess.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">decoded</span><span class="si">}</span><span class="s2">&quot;</span>
  3896. <span class="k">raise</span> <span class="ne">TimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
  3897. <span class="k">else</span><span class="p">:</span>
  3898. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;No output timeout reached while reading from subprocess.</span><span class="se">\n</span><span class="s2">Current buffer: </span><span class="si">{</span><span class="n">decoded</span><span class="si">}</span><span class="s2">&quot;</span>
  3899. <span class="k">raise</span> <span class="n">NoOutputTimeoutError</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
  3900. <span class="n">_check_for_too_many_non_unicode_bytes</span><span class="p">(</span><span class="n">buffer</span><span class="o">=</span><span class="n">buffer</span><span class="p">)</span>
  3901. <span class="n">_results</span> <span class="o">=</span> <span class="n">PROCESS_DONE_REGEX</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">decoded</span><span class="p">)</span>
  3902. <span class="k">if</span> <span class="n">_results</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  3903. <span class="n">msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Could not find process done marker in last line: </span><span class="si">{</span><span class="n">decoded</span><span class="si">=}</span><span class="s2">, </span><span class="si">{</span><span class="n">body</span><span class="si">=}</span><span class="s2">&quot;</span>
  3904. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
  3905. <span class="n">exit_code</span> <span class="o">=</span> <span class="n">_results</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
  3906. <span class="k">return</span> <span class="n">body</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">PROCESS_DONE_MARKER_START</span><span class="si">}{</span><span class="n">exit_code</span><span class="si">}{</span><span class="n">PROCESS_DONE_MARKER_END</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">),</span> <span class="n">exit_code</span>
  3907. </code></pre></div></td></tr></table></div>
  3908. </details>
  3909. </div>
  3910. </div>
  3911. </div>
  3912. </div>
  3913. </div>
  3914. </article>
  3915. </div>
  3916. <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
  3917. </div>
  3918. </main>
  3919. <footer class="md-footer">
  3920. <nav class="md-footer__inner md-grid" aria-label="Footer" >
  3921. <a href="../env/" class="md-footer__link md-footer__link--prev" aria-label="Previous: Environment">
  3922. <div class="md-footer__button md-icon">
  3923. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
  3924. </div>
  3925. <div class="md-footer__title">
  3926. <span class="md-footer__direction">
  3927. Previous
  3928. </span>
  3929. <div class="md-ellipsis">
  3930. Environment
  3931. </div>
  3932. </div>
  3933. </a>
  3934. <a href="../../faq/" class="md-footer__link md-footer__link--next" aria-label="Next: FAQ">
  3935. <div class="md-footer__title">
  3936. <span class="md-footer__direction">
  3937. Next
  3938. </span>
  3939. <div class="md-ellipsis">
  3940. FAQ
  3941. </div>
  3942. </div>
  3943. <div class="md-footer__button md-icon">
  3944. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
  3945. </div>
  3946. </a>
  3947. </nav>
  3948. <div class="md-footer-meta md-typeset">
  3949. <div class="md-footer-meta__inner md-grid">
  3950. <div class="md-copyright">
  3951. Made with
  3952. <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
  3953. Material for MkDocs
  3954. </a>
  3955. </div>
  3956. </div>
  3957. </div>
  3958. </footer>
  3959. </div>
  3960. <div class="md-dialog" data-md-component="dialog">
  3961. <div class="md-dialog__inner md-typeset"></div>
  3962. </div>
  3963. <script id="__config" type="application/json">{"base": "../..", "features": ["navigation.indexes", "content.action.edit", "navigation.footer", "content.code.copy", "content.footnote.tooltips", "header.autohide", "announce.dismiss"], "search": "../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
  3964. <script src="../../assets/javascripts/bundle.525ec568.min.js"></script>
  3965. <script id="init-glightbox">const lightbox = GLightbox({"touchNavigation": true, "loop": false, "zoomable": true, "draggable": true, "openEffect": "zoom", "closeEffect": "zoom", "slideEffect": "slide"});
  3966. document$.subscribe(() => { lightbox.reload() });
  3967. </script></body>
  3968. </html>