Das Live-Log und das Backup-Fenster zeigen rsync-Output nicht in Echtzeit an. Die Ausgabe erscheint erst wenn der Backup-Job komplett abgeschlossen ist.
Ursache
rsync nutzt \r (Carriage Return) fuer Fortschritts-Updates, nicht \n (Newline). fgets() in popen() blockiert bis zum naechsten \n und liest erst dann den ganzen Puffer.
Außerdem puffert rsync die Ausgabe wenn stdout ein Pipe ist (kein Terminal).
\r und \n werden beide als Zeilentrenner behandelt
stdbuf -oL erzwingt line-buffered Output
poll() mit 200ms Timeout fuer responsive Cancel-Unterstuetzung
// Vorher (blockiert):
while(fgets(buf,sizeof(buf),pipe)){...}// Nachher (non-blocking):
while(true){structpollfdpfd={fd,POLLIN,0};intpret=poll(&pfd,1,200);ssize_tn=read(fd,raw,sizeof(raw)-1);// Split on \r and \n
}
Betroffene Dateien
src/rsync_manager.cpp
Gefixt in Commit 7b50af6.
## Problem
Das Live-Log und das Backup-Fenster zeigen rsync-Output nicht in Echtzeit an. Die Ausgabe erscheint erst wenn der Backup-Job komplett abgeschlossen ist.
## Ursache
rsync nutzt `\r` (Carriage Return) fuer Fortschritts-Updates, nicht `\n` (Newline). `fgets()` in `popen()` blockiert bis zum naechsten `\n` und liest erst dann den ganzen Puffer.
Außerdem puffert rsync die Ausgabe wenn stdout ein Pipe ist (kein Terminal).
## Loesung
1. `read()` + `poll()` statt `fgets()` fuer non-blocking Input
2. `\r` und `\n` werden beide als Zeilentrenner behandelt
3. `stdbuf -oL` erzwingt line-buffered Output
4. `poll()` mit 200ms Timeout fuer responsive Cancel-Unterstuetzung
```cpp
// Vorher (blockiert):
while (fgets(buf, sizeof(buf), pipe)) { ... }
// Nachher (non-blocking):
while (true) {
struct pollfd pfd = {fd, POLLIN, 0};
int pret = poll(&pfd, 1, 200);
ssize_t n = read(fd, raw, sizeof(raw) - 1);
// Split on \r and \n
}
```
## Betroffene Dateien
- `src/rsync_manager.cpp`
Gefixt in Commit `7b50af6`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem
Das Live-Log und das Backup-Fenster zeigen rsync-Output nicht in Echtzeit an. Die Ausgabe erscheint erst wenn der Backup-Job komplett abgeschlossen ist.
Ursache
rsync nutzt
\r(Carriage Return) fuer Fortschritts-Updates, nicht\n(Newline).fgets()inpopen()blockiert bis zum naechsten\nund liest erst dann den ganzen Puffer.Außerdem puffert rsync die Ausgabe wenn stdout ein Pipe ist (kein Terminal).
Loesung
read()+poll()stattfgets()fuer non-blocking Input\rund\nwerden beide als Zeilentrenner behandeltstdbuf -oLerzwingt line-buffered Outputpoll()mit 200ms Timeout fuer responsive Cancel-UnterstuetzungBetroffene Dateien
src/rsync_manager.cppGefixt in Commit
7b50af6.