2012-01-09 8 views
7

i Szczęśliwego Nowego Roku. Oto trudny problem do odzyskania po świątecznym obiedzie!SVN: Dodaj kolory do linii komend svn z awk (w bash)


Oto część kodu bash (I umieścić go w .bashrc pliku) wich pracuje:

function svn { 
    command svn "[email protected]" | awk ' 
    BEGIN { 
    cpt_c=0; 
    } 
    { 
    if  ($1=="C") { 
     cpt_c=cpt_c+1; 
     print "\033[31m" $0 "\033[00m"; # Conflicts are displayed in red 
    } 
    else if ($1=="A") { 
     print "\033[32m" $0 "\033[00m"; # Add in green 
    } 
    else if ($1=="?") { 
     print "\033[36m" $0 "\033[00m"; # New in cyan 
    } 
    else if ($1=="D") { 
     print "\033[35m" $0 "\033[00m"; # Delete in magenta 
    } 
    else    { 
     print $0;      # No color, just print the line 
    } 
    } 
    END { 
    print cpt_c, " conflicts are found."; 
    }'; 
} 

Ta część kodu zrobić dokładnie to, co chcę. Funkcje svn (status, aktualizacja itp.) są drukowane kolorami. W przypadku potrzeb wewnętrznych nie chcę instalować takich rzeczy, jak colorsvn lub svn-color.

Oto przykład kodu powyżej: (nie mają wystarczających reputację do zamieszczania zdjęć)

svn command displayed in colors

i znowu, że doskonale to, co chcę. Problem pojawia się, gdy zostanie wykryty konflikt (na przykład, gdy wykonuję aktualizację): w rzeczywistości, gdy plik jest sprzeczny, svn jest przekazywane użytkownikowi, aby mógł wpisać kilka liter (patrz poniżej):

# svn update 
Conflict discovered in 'test.txt'. 
Select: (p) postpone, (df) diff-full, (e) edit, 
     (mc) mine-conflict, (tc) theirs-conflict, 
     (s) show all options: 

Czy istnieje sposób, aby awk niech typu użytkownika coś (na przykład e, wich otwarte w vim plik skonfliktowany), zrobić coś (na przykład usunąć niektóre wiersze po tYP e, a następnie zapisać & rzucić) i wpisz inną literę, aby potwierdzić rozwiązanie konfliktu, a następnie wyświetlić następny etap aktualizacji svn (inne pliki itp.)?

Innymi słowy, chcę "wstrzymać" skrypt, który wyświetla kolory, aby umożliwić interakcję użytkownika z svn, a następnie aktualizacja svn. Myślę, że będzie bardzo przydatna na przyszłość, aby wiedzieć, jak można pozwolić awk zatrzymać skrypt wywołujący, a następnie wznowić!


Czy dałam sobie jasno do zrozumienia? Mój angielski nie jest tak dobry, jak chcę:/

Jeśli potrzebujesz szczegółowych informacji, zapytaj!

+3

Twój 'command svn' nadal otrzymuje dane wejściowe. Istnieją narzędzia, takie jak "spodziewać się" przełączania między wykonywaniem autonomicznym i interaktywnym, ale może to być nieco poza punktem. Prawidłowym rozwiązaniem jest opakowanie na niższym poziomie, tak jak te, o których mówiłeś, że nie chcesz ich używać. Twój skrypt awk otrzymuje swój input frim a pipe, ale możesz zhackować coś, aby dodać tryb, w którym odczytuje dodatkowe wejście z '/ dev/tty' lub niektóre takie. – tripleee

+0

Czy chcesz rozszerzyć swoją funkcję bash 'svn', aby obsłużyć to wszystko, czy też wyobrażasz sobie, że wymagane" wstrzymanie "jako oddzielny kod po uruchomieniu funkcji' svn'? Nawiasem mówiąc twój angielski jest w porządku! Powodzenia. – shellter

+0

@shellter: Cóż, chciałbym rozszerzyć moją funkcję bash, to będzie najlepsze. Ale jestem otwarty na wszystkie możliwe rozwiązania;) Ty za mój angielski! –

Odpowiedz

3

Próbowałeś uruchomić svn update --accept postpone tak że svn nie poprosi do konfliktów?

+0

Człowieku, to jest IDEALNE. Koniec z podpowiadaniem konfliktu ...Więc mogę zachować cały scenariusz! Wielkie dzięki, to było oczywiste, ale nie dowiedziałem się! –

+1

UWAGA: aby uniknąć ** WSZYSTKICH zapytań SVN **, lepiej użyć opcji '--non-interactive' (dla dowolnej podkomendy SVN). –

0

Oto proste i bezpieczne obejście problemu (przetestowane przy użyciu skryptu). Ponieważ svn po prostu wywołuje

system(getenv("SVN_EDITOR")) // or something similar 

po prostu można wykonać następujące czynności (w bash, dostosować do innych powłok):

export SVN_EDITOR="</dev/tty >&/dev/tty vi" 

Będziesz wtedy mógł zrobić swoje zmiany i utrzymać swój schemat kolorowania z awk.

Nie wiem, czy działa z innymi edytorami, ale mam taką nadzieję. Powinno to być standardowe przekierowania.

+0

Zrobię test w ten weekend i powiem ci, co się dzieje, dzięki! –

2

Chociaż nie odpowiadam w szczególności na twoje pytanie - stworzyłem nieznacznie zmodyfikowaną wersję skryptu, w której pomijam awk podczas uruchamiania svn commit. Co więcej, dodałem więcej kolorów do niektórych typów wydruków. Skrypt jest dostępny online - prosimy o zatwierdzenie zmian.

+0

Wow, czuję się trochę pochlebnie! W porządku, dodaj trochę koloru. Ale jak powiedziałem, w przypadku konfliktu plików podczas aktualizacji svn, myślę, że będziesz miał ten sam problem co ja: 'Konflikt wykryty w 'offres.php'. Wybierz: (p) odłóż, (df) diff-full, (e) edytuj, (h) help, aby uzyskać więcej opcji: ' –

+0

Moja konfiguracja jest inna. Używam równolegle repozytorium 'svn' i repozytorium' git'. Konflikty są rozwiązywane tylko przez 'git'. Za każdym razem, gdy zatwierdzam program 'svn', nie będę miał żadnych konfliktów. - Musiałbym ustawić jakiś projekt testowy, aby odtworzyć twój konflikt. Bez obrazy! Używam twojego skryptu z samolubnych "kolorowych" powodów. Mogę jednak spojrzeć na twój problem najwcześniej w marcu, ponieważ w międzyczasie będę na wakacjach. – JJD

+1

W końcu, 4+ lata później, postanowiłem udostępnić moją wersję tego fragmentu przez GitHub, tak jak w przeszłości;) Wprowadziłem wiele ulepszeń, więc jeśli ktoś jest zainteresowany, proszę spojrzeć na [ ta aktualna wersja beautifulSVN] (https://github.com/4wk-/beautifulSVN) –

Powiązane problemy