improve client_test output

This commit is contained in:
Arvid Norberg 2015-02-08 03:24:56 +00:00
parent 2a0789594d
commit 266760b70b
2 changed files with 108 additions and 38 deletions

View File

@ -410,9 +410,12 @@ int peer_index(libtorrent::tcp::endpoint addr, std::vector<libtorrent::peer_info
return i - peers.begin(); return i - peers.begin();
} }
void print_peer_info(std::string& out, std::vector<libtorrent::peer_info> const& peers) // returns the number of lines printed
int print_peer_info(std::string& out
, std::vector<libtorrent::peer_info> const& peers, int max_lines)
{ {
using namespace libtorrent; using namespace libtorrent;
int pos = 0;
if (print_ip) out += "IP "; if (print_ip) out += "IP ";
out += "progress down (total | peak ) up (total | peak ) sent-req tmo bsy rcv flags dn up source "; out += "progress down (total | peak ) up (total | peak ) sent-req tmo bsy rcv flags dn up source ";
if (print_fails) out += "fail hshf "; if (print_fails) out += "fail hshf ";
@ -424,7 +427,8 @@ void print_peer_info(std::string& out, std::vector<libtorrent::peer_info> const&
out += "country "; out += "country ";
#endif #endif
if (print_peer_rate) out += "peer-rate est.rec.rate "; if (print_peer_rate) out += "peer-rate est.rec.rate ";
out += "client \n"; out += "client \x1b[K\n";
++pos;
char str[500]; char str[500];
for (std::vector<peer_info>::const_iterator i = peers.begin(); for (std::vector<peer_info>::const_iterator i = peers.begin();
@ -569,22 +573,23 @@ void print_peer_info(std::string& out, std::vector<libtorrent::peer_info> const&
out += esc("31"); out += esc("31");
out += " waiting for handshake"; out += " waiting for handshake";
out += esc("0"); out += esc("0");
out += "\n";
} }
else if (i->flags & peer_info::connecting) else if (i->flags & peer_info::connecting)
{ {
out += esc("31"); out += esc("31");
out += " connecting to peer"; out += " connecting to peer";
out += esc("0"); out += esc("0");
out += "\n";
} }
else else
{ {
out += " "; out += " ";
out += i->client; out += i->client;
out += "\n";
} }
out += "\x1b[K\n";
++pos;
if (pos >= max_lines) break;
} }
return pos;
} }
int listen_port = 6881; int listen_port = 6881;
@ -1637,8 +1642,8 @@ int main(int argc, char* argv[])
int terminal_width = 80; int terminal_width = 80;
int terminal_height = 50; int terminal_height = 50;
terminal_size(&terminal_width, &terminal_height); terminal_size(&terminal_width, &terminal_height);
view.set_size(terminal_width, terminal_height / 2); view.set_size(terminal_width, terminal_height / 3);
ses_view.set_pos(terminal_height / 2); ses_view.set_pos(terminal_height / 3);
int c = 0; int c = 0;
if (sleep_and_input(&c, refresh_delay)) if (sleep_and_input(&c, refresh_delay))
@ -1957,7 +1962,6 @@ int main(int argc, char* argv[])
char str[500]; char str[500];
int pos = view.height() + ses_view.height(); int pos = view.height() + ses_view.height();
clear_rows(pos, terminal_height);
set_cursor_pos(0, pos); set_cursor_pos(0, pos);
int cache_flags = print_downloads ? 0 : lt::session::disk_cache_no_pieces; int cache_flags = print_downloads ? 0 : lt::session::disk_cache_no_pieces;
@ -1977,6 +1981,7 @@ int main(int argc, char* argv[])
, sess_stat.dht_total_allocations); , sess_stat.dht_total_allocations);
out += str; out += str;
*/ */
int bucket = 0; int bucket = 0;
for (std::vector<dht_routing_bucket>::iterator i = dht_routing_table.begin() for (std::vector<dht_routing_bucket>::iterator i = dht_routing_table.begin()
, end(dht_routing_table.end()); i != end; ++i, ++bucket) , end(dht_routing_table.end()); i != end; ++i, ++bucket)
@ -1988,11 +1993,12 @@ int main(int argc, char* argv[])
"################################"; "################################";
char const* short_progress_bar = "--------"; char const* short_progress_bar = "--------";
snprintf(str, sizeof(str) snprintf(str, sizeof(str)
, "%3d [%3d, %d] %s%s\n" , "%3d [%3d, %d] %s%s\x1b[K\n"
, bucket, i->num_nodes, i->num_replacements , bucket, i->num_nodes, i->num_replacements
, progress_bar + (128 - i->num_nodes) , progress_bar + (128 - i->num_nodes)
, short_progress_bar + (8 - (std::min)(8, i->num_replacements))); , short_progress_bar + (8 - (std::min)(8, i->num_replacements)));
out += str; out += str;
pos += 1;
} }
for (std::vector<dht_lookup>::iterator i = dht_active_requests.begin() for (std::vector<dht_lookup>::iterator i = dht_active_requests.begin()
@ -2005,7 +2011,7 @@ int main(int argc, char* argv[])
"1st-timeout: %-2d " "1st-timeout: %-2d "
"timeouts: %-2d " "timeouts: %-2d "
"responses: %-2d " "responses: %-2d "
"last_sent: %-2d\n" "last_sent: %-2d\x1b[K\n"
, i->type , i->type
, i->branch_factor , i->branch_factor
, i->outstanding_requests , i->outstanding_requests
@ -2015,6 +2021,7 @@ int main(int argc, char* argv[])
, i->responses , i->responses
, i->last_sent); , i->last_sent);
out += str; out += str;
pos += 1;
} }
} }
#endif #endif
@ -2022,14 +2029,15 @@ int main(int argc, char* argv[])
{ {
torrent_status const& s = view.get_active_torrent(); torrent_status const& s = view.get_active_torrent();
print(piece_bar(s.pieces, 126).c_str()); print((piece_bar(s.pieces, 126) + "\x1b[K\n").c_str());
pos += 1;
if ((print_downloads && s.state != torrent_status::seeding) if ((print_downloads && s.state != torrent_status::seeding)
|| print_peers) || print_peers)
h.get_peer_info(peers); h.get_peer_info(peers);
if (print_peers && !peers.empty()) if (print_peers && !peers.empty())
print_peer_info(out, peers); pos += print_peer_info(out, peers, terminal_height - pos - 2);
if (print_trackers) if (print_trackers)
{ {
@ -2038,7 +2046,8 @@ int main(int argc, char* argv[])
for (std::vector<announce_entry>::iterator i = tr.begin() for (std::vector<announce_entry>::iterator i = tr.begin()
, end(tr.end()); i != end; ++i) , end(tr.end()); i != end; ++i)
{ {
snprintf(str, sizeof(str), "%2d %-55s fails: %-3d (%-3d) %s %s %5d \"%s\" %s\n" if (pos + 1 >= terminal_height) break;
snprintf(str, sizeof(str), "%2d %-55s fails: %-3d (%-3d) %s %s %5d \"%s\" %s\x1b[K\n"
, i->tier, i->url.c_str(), i->fails, i->fail_limit, i->verified?"OK ":"- " , i->tier, i->url.c_str(), i->fails, i->fail_limit, i->verified?"OK ":"- "
, i->updating?"updating" , i->updating?"updating"
:to_string(int(total_seconds(i->next_announce - now)), 8).c_str() :to_string(int(total_seconds(i->next_announce - now)), 8).c_str()
@ -2046,6 +2055,7 @@ int main(int argc, char* argv[])
, i->last_error ? i->last_error.message().c_str() : "" , i->last_error ? i->last_error.message().c_str() : ""
, i->message.c_str()); , i->message.c_str());
out += str; out += str;
pos += 1;
} }
} }
@ -2059,10 +2069,12 @@ int main(int argc, char* argv[])
std::sort(cs.pieces.begin(), cs.pieces.end(), boost::bind(&cached_piece_info::piece, _1) std::sort(cs.pieces.begin(), cs.pieces.end(), boost::bind(&cached_piece_info::piece, _1)
> boost::bind(&cached_piece_info::piece, _2)); > boost::bind(&cached_piece_info::piece, _2));
int pos = 0; int p = 0;
for (std::vector<cached_piece_info>::iterator i = cs.pieces.begin(); for (std::vector<cached_piece_info>::iterator i = cs.pieces.begin();
i != cs.pieces.end(); ++i) i != cs.pieces.end(); ++i)
{ {
if (pos + 3 >= terminal_height) break;
partial_piece_info* pp = 0; partial_piece_info* pp = 0;
partial_piece_info tmp; partial_piece_info tmp;
tmp.piece_index = i->piece; tmp.piece_index = i->piece;
@ -2075,11 +2087,21 @@ int main(int argc, char* argv[])
print_piece(pp, &*i, peers, &s, out); print_piece(pp, &*i, peers, &s, out);
int num_blocks = pp ? pp->blocks_in_piece : i->blocks.size(); int num_blocks = pp ? pp->blocks_in_piece : i->blocks.size();
pos += num_blocks + 8; p += num_blocks + 8;
if (pos + num_blocks + 8 > terminal_width) bool continuous_mode = 8 + num_blocks > terminal_width;
if (continuous_mode)
{ {
out += "\n"; while (p > terminal_width)
pos = 0; {
p -= terminal_width;
++pos;
}
}
else if (p + num_blocks + 8 > terminal_width)
{
out += "\x1b[K\n";
pos += 1;
p = 0;
} }
if (pp) queue.erase(ppi); if (pp) queue.erase(ppi);
@ -2088,19 +2110,35 @@ int main(int argc, char* argv[])
for (std::vector<partial_piece_info>::iterator i = queue.begin() for (std::vector<partial_piece_info>::iterator i = queue.begin()
, end(queue.end()); i != end; ++i) , end(queue.end()); i != end; ++i)
{ {
if (pos + 3 >= terminal_height) break;
print_piece(&*i, 0, peers, &s, out); print_piece(&*i, 0, peers, &s, out);
int num_blocks = i->blocks_in_piece; int num_blocks = i->blocks_in_piece;
pos += num_blocks + 8; p += num_blocks + 8;
if (pos + num_blocks + 8 > terminal_width) bool continuous_mode = 8 + num_blocks > terminal_width;
if (continuous_mode)
{ {
out += "\n"; while (p > terminal_width)
pos = 0; {
p -= terminal_width;
++pos;
} }
} }
if (out[out.size()] != '\n') out += "\n"; else if (p + num_blocks + 8 > terminal_width)
{
out += "\x1b[K\n";
pos += 1;
p = 0;
}
}
if (p != 0)
{
out += "\x1b[K\n";
pos += 1;
}
snprintf(str, sizeof(str), "%s %s read cache | %s %s downloading | %s %s cached | %s %s flushed | %s %s snubbed\n" snprintf(str, sizeof(str), "%s %s read cache | %s %s downloading | %s %s cached | %s %s flushed | %s %s snubbed\x1b[K\n"
, esc("34;7"), esc("0") // read cache , esc("34;7"), esc("0") // read cache
, esc("33;7"), esc("0") // downloading , esc("33;7"), esc("0") // downloading
, esc("36;7"), esc("0") // cached , esc("36;7"), esc("0") // cached
@ -2108,7 +2146,7 @@ int main(int argc, char* argv[])
, esc("35;7"), esc("0") // snubbed , esc("35;7"), esc("0") // snubbed
); );
out += str; out += str;
out += "___________________________________\n"; pos += 1;
} }
if (print_file_progress && s.has_metadata) if (print_file_progress && s.has_metadata)
@ -2122,15 +2160,18 @@ int main(int argc, char* argv[])
boost::shared_ptr<const torrent_info> ti = h.torrent_file(); boost::shared_ptr<const torrent_info> ti = h.torrent_file();
for (int i = 0; i < ti->num_files(); ++i) for (int i = 0; i < ti->num_files(); ++i)
{ {
if (pos + 1 >= terminal_height) break;
bool pad_file = ti->files().pad_file_at(i); bool pad_file = ti->files().pad_file_at(i);
if (pad_file) if (pad_file)
{ {
if (show_pad_files) if (show_pad_files)
{ {
snprintf(str, sizeof(str), "\x1b[34m%-70s %s\x1b[0m\n" snprintf(str, sizeof(str), "\x1b[34m%-70s %s\x1b[0m\x1b[K\n"
, ti->files().file_name(i).c_str() , ti->files().file_name(i).c_str()
, add_suffix(ti->files().file_size(i)).c_str()); , add_suffix(ti->files().file_size(i)).c_str());
out += str; out += str;
pos += 1;
} }
continue; continue;
} }
@ -2160,20 +2201,15 @@ int main(int argc, char* argv[])
++f; ++f;
} }
snprintf(str, sizeof(str), "%s %s prio: %d\n", snprintf(str, sizeof(str), "%s %s prio: %d\x1b[K\n",
progress_bar(progress, 70, complete?col_green:col_yellow, '-', '#' progress_bar(progress, 70, complete?col_green:col_yellow, '-', '#'
, title.c_str()).c_str() , title.c_str()).c_str()
, add_suffix(file_progress[i]).c_str() , add_suffix(file_progress[i]).c_str()
, file_prio[i]); , file_prio[i]);
out += str; out += str;
} pos += 1;
out += "___________________________________\n";
} }
} }
else
{
print("\x1b[K");
} }
if (print_log) if (print_log)
@ -2181,15 +2217,17 @@ int main(int argc, char* argv[])
for (std::deque<std::string>::iterator i = events.begin(); for (std::deque<std::string>::iterator i = events.begin();
i != events.end(); ++i) i != events.end(); ++i)
{ {
out += "\n"; if (pos + 1 >= terminal_height) break;
out += *i; out += *i;
out += "\x1b[K\n";
pos += 1;
} }
} }
++pos; // clear rest of screen
set_cursor_pos(0, pos); out += "\x1b[J";
print(out.c_str()); print(out.c_str());
fflush(stdout); fflush(stdout);
if (!monitor_dir.empty() if (!monitor_dir.empty()

View File

@ -279,6 +279,38 @@ void print(char const* str)
WriteFile(out, start, buf - start, &written, NULL); WriteFile(out, start, buf - start, &written, NULL);
buf += 2; // skip escape and '[' buf += 2; // skip escape and '['
start = buf; start = buf;
if (*start == 'K')
{
// this means clear the rest of the line.
CONSOLE_SCREEN_BUFFER_INFO sbi;
if (GetConsoleScreenBufferInfo(out, &sbi))
{
COORD pos = sbi.dwCursorPosition;
int width = sbi.dwSize.X;
int run = width - pos.X;
DWORD n;
FillConsoleOutputAttribute(out, 0x7, run, pos, &n);
FillConsoleOutputCharacter(out, ' ', run, pos, &n);
}
++buf;
continue;
}
else if (*start == 'J')
{
// clear rest of screen
CONSOLE_SCREEN_BUFFER_INFO sbi;
if (GetConsoleScreenBufferInfo(out, &sbi))
{
COORD pos = sbi.dwCursorPosition;
int width = sbi.dwSize.X;
int run = (width - pos.X) + width * (sbi.swSize.Y - pos.Y - 1);
DWORD n;
FillConsoleOutputAttribute(out, 0x7, run, pos, &n);
FillConsoleOutputCharacter(out, ' ', run, pos, &n);
}
++buf;
continue;
}
one_more: one_more:
while (*buf != 'm' && *buf != ';' && *buf != 0) ++buf; while (*buf != 'm' && *buf != ';' && *buf != 0) ++buf;
if (*buf == 0) break; if (*buf == 0) break;
@ -302,7 +334,7 @@ void print(char const* str)
WriteFile(out, start, buf - start, &written, NULL); WriteFile(out, start, buf - start, &written, NULL);
#else #else
puts(str); fputs(str, stdout);
#endif #endif
} }