@ -52,10 +52,10 @@ Source::DiffView::~DiffView() {
monitor_changed_connection . disconnect ( ) ;
delayed_buffer_changed_connection . disconnect ( ) ;
delayed_monitor_changed_connection . disconnect ( ) ;
delayed_reparse_connection . disconnect ( ) ;
parse_stop = true ;
if ( parse_thread . joinable ( ) )
parse_thread . join ( ) ;
+ + parse_count ;
worker . stop ( ) ;
}
}
@ -82,6 +82,7 @@ void Source::DiffView::configure() {
green . set_green ( normal_color . get_green ( ) + factor * ( green . get_green ( ) - normal_color . get_green ( ) ) ) ;
green . set_blue ( normal_color . get_blue ( ) + factor * ( green . get_blue ( ) - normal_color . get_blue ( ) ) ) ;
LockGuard lock ( parse_mutex ) ;
if ( Config : : get ( ) . source . show_git_diff ) {
if ( repository )
return ;
@ -94,13 +95,10 @@ void Source::DiffView::configure() {
delayed_buffer_changed_connection . disconnect ( ) ;
delayed_monitor_changed_connection . disconnect ( ) ;
parse_stop = true ;
if ( parse_thread . joinable ( ) )
parse_thread . join ( ) ;
repository = nullptr ;
LockGuard lock ( parse_mutex ) ;
+ + parse_count ;
worker . restart ( ) ;
diff = nullptr ;
repository = nullptr ;
return ;
}
else
@ -114,8 +112,6 @@ void Source::DiffView::configure() {
}
get_gutter ( Gtk : : TextWindowType : : TEXT_WINDOW_LEFT ) - > insert ( renderer . get ( ) , - 40 ) ;
parse_state = ParseState : : starting ;
parse_stop = false ;
monitor_changed = false ;
buffer_insert_connection = get_buffer ( ) - > signal_insert ( ) . connect (
@ -140,11 +136,12 @@ void Source::DiffView::configure() {
get_buffer ( ) - > remove_tag ( renderer - > tag_removed_above , start_iter , end_iter ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed_below , start_iter , end_iter ) ;
}
parse_state = ParseState : : idle ;
delayed_buffer_changed_connection . disconnect ( ) ;
size_t count = + + parse_count ;
delayed_buffer_changed_connection = Glib : : signal_timeout ( ) . connect (
[ this ] ( ) {
parse_state = ParseState : : starting ;
[ this , count ] ( ) {
if ( count = = parse_count )
parse ( count ) ;
return false ;
} ,
250 ) ;
@ -157,11 +154,12 @@ void Source::DiffView::configure() {
if ( start_iter . get_line ( ) = = end_iter . get_line ( ) & & start_iter . has_tag ( renderer - > tag_added ) )
return ;
parse_state = ParseState : : idle ;
delayed_buffer_changed_connection . disconnect ( ) ;
size_t count = + + parse_count ;
delayed_buffer_changed_connection = Glib : : signal_timeout ( ) . connect (
[ this ] ( ) {
parse_state = ParseState : : starting ;
[ this , count ] ( ) {
if ( count = = parse_count )
parse ( count ) ;
return false ;
} ,
250 ) ;
@ -173,25 +171,27 @@ void Source::DiffView::configure() {
Gio : : FileMonitorEvent monitor_event ) {
if ( monitor_event ! = Gio : : FileMonitorEvent : : FILE_MONITOR_EVENT_CHANGES_DONE_HINT ) {
delayed_monitor_changed_connection . disconnect ( ) ;
size_t count = + + parse_count ;
delayed_monitor_changed_connection = Glib : : signal_timeout ( ) . connect (
[ this ] ( ) {
[ this , count ] ( ) {
monitor_changed = true ;
parse_state = ParseState : : starting ;
LockGuard lock ( parse_mutex ) ;
diff = nullptr ;
{
LockGuard lock ( parse_mutex ) ;
diff = nullptr ;
}
if ( count = = parse_count )
parse ( count ) ;
return false ;
} ,
500 ) ;
}
} ) ;
parse_thread = std : : thread ( [ this ] ( ) {
worker . post ( [ this ] {
std : : string status_branch ;
try {
{
LockGuard lock ( parse_mutex ) ;
diff = get_diff ( ) ;
}
LockGuard lock ( parse_mutex ) ;
diff = get_diff ( ) ;
status_branch = repository - > get_branch ( ) ;
}
catch ( const std : : exception & ) {
@ -202,81 +202,86 @@ void Source::DiffView::configure() {
if ( update_status_branch )
update_status_branch ( this ) ;
} ) ;
} ) ;
try {
while ( true ) {
while ( ! parse_stop & & parse_state ! = ParseState : : starting & & parse_state ! = ParseState : : processing )
std : : this_thread : : sleep_for ( std : : chrono : : milliseconds ( 10 ) ) ;
if ( parse_stop )
break ;
auto expected = ParseState : : starting ;
if ( parse_state . compare_exchange_strong ( expected , ParseState : : preprocessing ) ) {
dispatcher . post ( [ this ] {
auto expected = ParseState : : preprocessing ;
if ( parse_mutex . try_lock ( ) ) {
if ( parse_state . compare_exchange_strong ( expected , ParseState : : processing ) )
parse_buffer = get_buffer ( ) - > get_text ( ) ;
parse_mutex . unlock ( ) ;
}
else
parse_state . compare_exchange_strong ( expected , ParseState : : starting ) ;
} ) ;
}
else if ( parse_state = = ParseState : : processing & & parse_mutex . try_lock ( ) ) {
bool expected_monitor_changed = true ;
if ( monitor_changed . compare_exchange_strong ( expected_monitor_changed , false ) ) {
try {
diff = get_diff ( ) ;
dispatcher . post ( [ this , status_branch = repository - > get_branch ( ) ] {
this - > status_branch = status_branch ;
if ( update_status_branch )
update_status_branch ( this ) ;
} ) ;
}
catch ( const std : : exception & ) {
dispatcher . post ( [ this ] {
get_buffer ( ) - > remove_tag ( renderer - > tag_added , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_modified , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed_below , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed_above , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
renderer - > queue_draw ( ) ;
this - > status_branch = " " ;
if ( update_status_branch )
update_status_branch ( this ) ;
} ) ;
}
parse ( + + parse_count ) ;
}
void Source : : DiffView : : parse ( size_t count ) {
if ( parse_mutex . try_lock ( ) ) {
parse_buffer = get_buffer ( ) - > get_text ( ) ;
parse_mutex . unlock ( ) ;
worker . post ( [ this , count ] {
if ( count ! = parse_count )
return ;
if ( parse_mutex . try_lock ( ) ) {
bool expected_monitor_changed = true ;
if ( monitor_changed . compare_exchange_strong ( expected_monitor_changed , false ) ) {
try {
diff = get_diff ( ) ;
dispatcher . post ( [ this , status_branch = repository - > get_branch ( ) ] {
this - > status_branch = status_branch ;
if ( update_status_branch )
update_status_branch ( this ) ;
} ) ;
}
catch ( const std : : exception & ) {
dispatcher . post ( [ this ] {
get_buffer ( ) - > remove_tag ( renderer - > tag_added , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_modified , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed_below , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed_above , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
renderer - > queue_draw ( ) ;
this - > status_branch = " " ;
if ( update_status_branch )
update_status_branch ( this ) ;
} ) ;
}
}
Git : : Repository : : Diff : : Lines diff_lines ;
if ( diff )
Git : : Repository : : Diff : : Lines diff_lines ;
if ( diff ) {
try {
diff_lines = diff - > get_lines ( parse_buffer . raw ( ) ) ;
auto expected = ParseState : : processing ;
if ( parse_state . compare_exchange_strong ( expected , ParseState : : postprocessing ) ) {
parse_mutex . unlock ( ) ;
dispatcher . post ( [ this , diff_lines = std : : move ( diff_lines ) ] {
auto expected = ParseState : : postprocessing ;
if ( parse_state . compare_exchange_strong ( expected , ParseState : : idle ) )
update_tags ( diff_lines ) ;
} ) ;
}
else
catch ( const std : : exception & ) {
dispatcher . post ( [ this ] {
get_buffer ( ) - > remove_tag ( renderer - > tag_added , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_modified , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed_below , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed_above , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
renderer - > queue_draw ( ) ;
this - > status_branch = " " ;
if ( update_status_branch )
update_status_branch ( this ) ;
} ) ;
parse_mutex . unlock ( ) ;
return ;
}
}
parse_mutex . unlock ( ) ;
dispatcher . post ( [ this , diff_lines = std : : move ( diff_lines ) , count ] {
if ( count ! = parse_count )
return ;
update_tags ( diff_lines ) ;
} ) ;
}
}
catch ( const std : : exception & e ) {
dispatcher . post ( [ this , e_what = e . what ( ) ] {
get_buffer ( ) - > remove_tag ( renderer - > tag_added , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_modified , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed_below , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
get_buffer ( ) - > remove_tag ( renderer - > tag_removed_above , get_buffer ( ) - > begin ( ) , get_buffer ( ) - > end ( ) ) ;
renderer - > queue_draw ( ) ;
Terminal : : get ( ) . print ( std : : string ( " \ e[31mError (git) \ e[m: " ) + e_what + ' \n ' , true ) ;
} ) ;
}
} ) ;
} ) ;
}
els e {
delayed_reparse_connection . disconnect ( ) ;
size_t count = + + parse_count ;
delayed_reparse_connection = Glib : : signal_timeout ( ) . connect (
[ this , count ] {
if ( count = = parse_count )
parse ( count ) ;
return false ;
} ,
100 ) ;
}
}
void Source : : DiffView : : rename ( const boost : : filesystem : : path & path ) {