Portál AbcLinuxu, 7. května 2025 19:53

Dotaz: SVN detekce změny v konkrétní funkci

Beda0 avatar 31.10.2017 09:49 Beda0 | skóre: 29
SVN detekce změny v konkrétní funkci
Přečteno: 677×
Odpovědět | Admin
Zdravím, potřeboval bych "nějak" zjistit, jestli došlo ke změně v konkrétní funkci v jednom ze souborů v SVN (C# zdrojáky).

Nějakým skriptem, který budu spouštět přes make, bych potřeboval zjistit, jestli v jedné (časem asi i ve více) funkcích nedošlo ke změně... SVN umí zjistit změny v souboru, k těm ale dochází dost často - na jiných místech. Potřeboval bych nějak detekovat jen změny v konkrétní C# funkci.

Napadlo mě zaznamenat začátek definice funkce a její délku (počet řádků). V původní revizi najít začátek funkce a zkopírovat daný počet řádků. To samé v aktuální revizi. Pokud jsou texty stejné je to OK, jinak vyhodit nějakou hlášku / poslat mail...

Připadá mi to jako docela běžný požadavek, ale nenarazil jsem na hotové řešení. Existuje něco? Jde to nějak jednodušeji?

Díky

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

31.10.2017 10:20 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: SVN detekce změny v konkrétní funkci
Odpovědět | | Sbalit | Link | Blokovat | Admin
Běžným požadavkem je mít každou třídu a každou funkci v samostatném souboru.

Pokud k těm změnám souboru dochází každou chvíli na různých místech, zamyslel bych se nad SRP, který tě těchto skopičin zbaví.

BTW: V C# se používají nějaké funkce?
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Beda0 avatar 31.10.2017 11:29 Beda0 | skóre: 29
Rozbalit Rozbalit vše Re: SVN detekce změny v konkrétní funkci
Myslel jsem metody... Bylo by hezké, kdyby byly zdrojáky členěny tak jak mají. Bohužel to nemůžu ovlivnit - musím s tím jen občas pracovat.
31.10.2017 11:51 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: SVN detekce změny v konkrétní funkci
Odpovědět | | Sbalit | Link | Blokovat | Admin
Napiš si na tu metodu jednotkový test. Pokud neprojde, tak máš jistotu, že v té metodě došlo k nějaké změně.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Beda0 avatar 31.10.2017 12:09 Beda0 | skóre: 29
Rozbalit Rozbalit vše Re: SVN detekce změny v konkrétní funkci
Ale pokud projde, nemám jistotu, že k žádné změně nedošlo ;-)

Navíc je to C# pro windows, na linuxu to nezkompiluju.
2.11.2017 18:15 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: SVN detekce změny v konkrétní funkci
na linuxu to nezkompiluju.

To je tak složitý projekt, že ho Mono prostě nedá? :-) Většinou to nějak jde.

Beda0 avatar 3.11.2017 07:43 Beda0 | skóre: 29
Rozbalit Rozbalit vše Re: SVN detekce změny v konkrétní funkci
Ano, je to tak složitý (několik tisíc zdrojáků, některé s několika desítkami tisíc řádků) - proto dělám celou tuhle šaškárnu s hledáním změn v metodách... Navíc i kdybych obětoval hromadu času abych to "nějak" rozběhal s mono (což podle mě stejně nepůjde kvůli závislostem), tak mi to s problémem nepomůže.
Řešení 1× (Beda0 (tazatel))
Jendа avatar 31.10.2017 17:50 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: SVN detekce změny v konkrétní funkci
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nějak (nejčistší by bylo udělat parser ve Flexu, ale i nějaké naprasení typu regexp + počítání otevíracích a uzavíracích závorek by mělo rozumně fungovat) zjistit rozsah řádků funkce a pak se podívat na dané řádky svn blame.
Beda0 avatar 3.11.2017 07:52 Beda0 | skóre: 29
Rozbalit Rozbalit vše Re: SVN detekce změny v konkrétní funkci
Díky na nasměrování, vyřešeno.

Splácal jsem to vy pythonu. Do csv si ukládám kus řádku s definicí metody - návratový typ a jméno, cestu ke zdrojáku a poslední revizi ve které došlo ke změně o které vím. Regexpem vytáhnu celou funkci a spočítám počet řádků, grepem najdu první řádek a z "svn blame -x -b" zjistim revize - vezmu max a mam hotovo.

Kouzelnej regexp na počítání řádků:

method = "bool methodName"
methodregex = method.replace(' ', '\s+') + r"[^{}]+(?<rec>\{(?:[^{}]++|(?&rec))*\})"
result = regex.search(methodregex,text,flags=regex.VERBOSE)
nlines = int(result.captures('rec')[-1].count('\n') + 1)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.