Która wersja X wprowadziła funkcję Y?

10

Duża część mojej codziennej pracy jest rozwój oprogramowania do użytku na komputerach z różnymi wersjami tego samego oprogramowania, jak bash, findi grep. W przypadku funkcji, która byłaby przydatna na przykład w celu uproszczenia kodu, ważne jest, aby wiedzieć, czy ta funkcja jest dostępna w najstarszych zainstalowanych narzędziach. W przypadku krytycznych rzeczy warto byłoby wiedzieć, czy ta funkcja była nowa, czy istnieje od lat w najstarszych zainstalowanych narzędziach.

Jakie są szybkie sposoby na autorytatywną odpowiedź na to w przypadku narzędzi Linux, szczególnie GNU Core Utils? Niektóre możliwości w kolejności malejącej dokładności:

  • Binarne wyszukiwanie binarne (sic) poprzez uruchamianie różnych wersji jest oczywiście ostateczną odpowiedzią, ale jest zdecydowanie najbardziej czasochłonne. Starsze instalacje często nie są dostępne ze względów bezpieczeństwa.
  • Czytanie kodu jest prawie tak samo dobre, ale może być zaborczo czasochłonne, jeśli funkcja ma niejasną nazwę, nazwa nie odpowiada bezpośrednio nazwie zmiennej / funkcji / obiektu lub została zaimplementowana przed jej włączeniem.
  • Dzienniki zmian , jeśli są dostępne, zwykle łączą zmiany funkcji z wersjami oprogramowania.
  • Dzienniki zatwierdzania mogą zawierać wskazówki, ale nie wiedzą, w której wersji zostaną uwzględnione.
  • strony podręcznika rzadko wspominają o datach.
  • To samo dotyczy Googlingu , a także miałbyś trudności z wykluczeniem wszystkich nieautorytatywnych źródeł.
l0b0
źródło
Czy mógłby Pan wyjaśnić powód (przyczyny) tego pytania?
Faheem Mitha
ISTM, że jeśli musisz przenieść oprogramowanie na te różne platformy, musisz mieć gdzieś „najstarszą” instalację. Tak więc dość szybką i autorytatywną odpowiedzią byłoby wypróbowanie go na tej platformie. Idealnie na wszystkich platformach (jeśli napisałeś przypadek testowy jako skrypt, możesz przekazać go wszystkim platformom do przenoszenia i uzyskać serię odpowiedzi tak / nie).
roaima

Odpowiedzi:

7

Ogólnie istnieje dziennik zmian. W rzeczywistości GPL wymaga tego (lub innych „widocznych powiadomień” o zmianach)! (Przynajmniej tak skutecznie w przypadku czegokolwiek z wieloma współautorami - patrz sekcja 2a GPLv2).

W przypadku pakietu GNU coreutils - i prawie wszystkiego innego bezpośrednio z projektu GNU - ten plik jest zdecydowanie pierwszym miejscem do przeglądania i powinien odpowiadać na twoje pytanie w 95% przypadków.

mattdm
źródło
Czy masz odniesienie do dziennika zmian coreutils? Najnowszy, jaki udało mi się znaleźć, pochodzi z 2007 roku.
l0b0
2
Dziennik zmian GNU Coreutils nie był aktualizowany od 2007 roku. Cvs.savannah.gnu.org/viewvc/coreutils/... Musisz teraz spojrzeć na dzienniki git.
Mikel
2
Może być generowany automatycznie z dzienników git. Jest ChangeLog.bz2w /usr/share/doc/coreutils-8.10na moim systemie Fedora, a wejście jest od góry 2011-02-04. Możliwe też, że jest to widelec z prawej strony - sprawdzę to później.
mattdm
@mattdm: Na Ubuntu jest /usr/share/doc/coreutils/changelog.gz - Dzięki! Niestety, to tylko z 2008 roku, który jest zbyt nowy dla niektórych odpowiednich narzędzi. Wydaje mi się jednak, że przejmuje to miejsce, w którym skończył się ostatni.
l0b0
3
Oto dowód: git.savannah.gnu.org/cgit/coreutils.git/tree/HACKING Przewiń do linii 131.
Shinnok
4

Dlaczego nie skorzystać z kontroli źródła prowadzącej do X, aby wyszukać funkcję Y? Repozytorium źródłowe jest najlepszym sposobem na identyfikację, kiedy wprowadzono określoną funkcję.

W przypadku coreutils możesz udać się na http://git.savannah.gnu.org/cgit/coreutils.git i wyszukać słowa kluczowe związane z Y w komunikatach dziennika lub określonych wierszach kodu określonych jako należące do Y. Możesz to zrobić na interfejs sieciowy bezpośrednio, a nawet lepiej, klonuje repozytorium źródłowe do stacji i wyszukuje za pomocą git-bisect , git-blame i git-log --grep .

Następnie użyj git-opisz, aby dowiedzieć się, że tag jest najbliższy konkretnemu poleceniu. Znaczniki są używane głównie dla numerów wersji, dlatego daje wersję, która wprowadziła zatwierdzenie.

Możesz dostosować powyższą metodę, w zależności od X i jego kontroli źródła.

Shinnok
źródło
Jak określisz, który zatwierdzenie / linia weszła w którą wersję oprogramowania? Ponadto wyszukiwanie w Savannah jest bardzo zepsute - brak wyników dla ciągów, które oczywiście znajdują się w tych samych komunikatach dziennika.
l0b0
Użyj git-opisz, aby dowiedzieć się, że tag jest najbliższy konkretnemu poleceniu. Znaczniki są używane głównie dla numerów wersji. Jeśli chodzi o złamanie Savannah, niewiele można na to poradzić. Git klonuje repozytorium do twojego pudełka i działa po swojemu, używając poleceń git, które opisałem w poście.
Shinnok,
1

Na Debianie i platformach pochodnych Debiana, takich jak Ubuntu :

sudo apt-get changelog coreutils > changelog.txt 

zapewnia dziennik zmian GNU Core Utilities aż do wersji 4.5.1-1.

Nie jestem pewien, czy istnieją równie wygodne rozwiązania na innych platformach.

mklement0
źródło