2 <html xmlns=
"http://www.w3.org/1999/xhtml">
4 <meta charset=
"utf-8" />
5 <meta http-equiv=
"content-type" content=
"text/html; charset=utf-8" />
6 <title>git browser
</title>
8 Copyright (C) 2005, Artem Khodush <greenkaa@gmail.com>
10 This file is licensed under the GNU General Public License version 2.
12 <script type=
"text/javascript" src=
"js.lib/DomTemplate.js"></script>
13 <script type=
"text/javascript" src=
"js.lib/InvisibleRequest.js"></script>
14 <script type=
"text/javascript" src=
"js.lib/Motion.js"></script>
15 <script type=
"text/javascript" src=
"js.lib/wz_jsgraphics.js"></script>
16 <script type=
"text/javascript" src=
"GitConfig.js"></script>
17 <script type=
"text/javascript" src=
"GitBrowser.js"></script>
18 <script type=
"text/javascript" src=
"GitDiagram.js"></script>
19 <script type=
"text/javascript">
23 g_diff_url
=cfg_browsercgi_url
.replace("git-browser","git-diff");
25 format_popup_date=function( node
)
28 if( node
.time
!=null ) {
29 var dt
=new Date( node
.time
);
30 var date
=dt
.getDate();
31 var month
=GitDiagram
._g_month_names
[dt
.getMonth()];
32 var year
=dt
.getFullYear();
33 var hour
=dt
.getHours();
34 var minute
=dt
.getMinutes();
35 minute
= minute
<10 ? "0"+minute
: minute
;
36 date_str
=month
+" "+date
+" "+year
+" "+hour
+":"+minute
42 on_drag_mouse_down=function( e
, diagram
)
44 // browsers ignore setting move cursor here
46 on_drag_mouse_up=function( e
, diagram
, offset
)
48 document
.body
.style
.cursor
="default";
49 diagram
.end_move( offset
);
51 on_drag_mouse_move=function( e
, diagram
, offset
, first
)
55 document
.body
.style
.cursor
="move";
58 diagram
.track_move( offset
);
61 process_date_column_stat=function( date_column
, stat
)
63 for( var i
=0; i
<date_column
.lines
.length
; ++i
) {
64 var node
=date_column
.lines
[i
];
65 if( stat
.min_y
==null || stat
.min_y
>node
.absolute_y
) {
66 stat
.min_y
=node
.absolute_y
;
68 if( stat
.max_y
==null || stat
.max_y
<node
.absolute_y
) {
69 stat
.max_y
=node
.absolute_y
;
72 if( stat
.max_count
==null || stat
.max_count
<date_column
.lines
.length
) {
73 stat
.max_count
=date_column
.lines
.length
;
78 on_draw=function( diagram
, phase
)
80 if( phase
=="begin" ) {
81 // tstart=(new Date()).getTime();
82 GitBrowser
.status_show( "drawing..." );
83 document
.body
.style
.cursor
="wait";
85 Motion
.cancel_drag( diagram
.m_container_element
);
86 }else if( phase
=="end" ) {
87 GitBrowser
.status_show();
88 if( g_selected_nodes
["diff"].highlight_node
!=null ) {
89 diagram
.select_node( g_selected_nodes
["diff"].highlight_node
.id
, g_selected_nodes
["diff"].color
);
91 if( g_selected_nodes
["pin"].highlight_node
!=null ) {
92 diagram
.select_node( g_selected_nodes
["pin"].highlight_node
.id
, g_selected_nodes
["pin"].color
);
94 document
.body
.style
.cursor
="";
97 node
: diagram
.m_container_element
,
98 down_handler
: on_drag_mouse_down
,
99 up_handler
: on_drag_mouse_up
,
100 move_handler
: on_drag_mouse_move
,
105 var tstop=(new Date()).getTime();
106 var d=g_diagram.m_container_element;
109 var s="drawing time: "+((tstop-tstart)/1000)+" body children: "+document.body.childNodes.length+" diagram children: "+d.childNodes.length+" canvas children: "+c.childNodes.length+" subcanvas children: "+cc.childNodes.length;
110 s+=" track_leave bind count: "+Motion._g_enter_leave_binder.m_objects.length;
115 on_place=function( diagram
, phase
)
117 if( phase
=="begin" ) {
118 GitBrowser
.status_show( "placing..." );
119 document
.body
.style
.cursor
="wait";
120 // tstart=(new Date()).getTime();
121 }else if( phase
=="end" ) {
122 document
.body
.style
.cursor
="";
123 GitBrowser
.status_show();
127 for( var i
=0; i
<diagram
.m_date_columns
.length
; ++i
) {
128 process_date_column_stat( diagram
.m_date_columns
[i
], stat
);
130 // xdp( "span "+(stat.max_y-stat.min_y)+" max count "+stat.max_count );
133 var tstop=(new Date()).getTime();
134 var s="placing time: "+((tstop-tstart)/1000)+" nodes: "+diagram.m_node_count+" unloaded nodes: "+diagram.m_start_more_ids.length;
139 on_node_init=function( diagram
, node
, node_div
)
141 if( node
.popup_id
==null ) {
142 var popup_nodes
= node
.coalesced_nodes
==null ? [node
] : node
.coalesced_nodes
;
143 node
.popup_id
=Motion
.attach_popup( { trigger_node
: node_div
, anchor_offset
: 4, side
: "right", side_align
: "top",
144 popup_filler
: popup_filler
, filler_arg
: { diagram
: diagram
, nodes
: popup_nodes
}, on_show
: popup_on_show
,
145 delay_show_seconds
: 0.3//, transparent: true
147 g_track_popups
.push( node_div
);
149 Motion
.attach_same_popup( node
.popup_id
, node_div
);
152 // diagram node highlight
154 "popup_track": { node
: null, color
: "#ffe000", highlight_node
: null },
155 "diff" : { node
: null, color
: "#44f088", highlight_node
: null },
156 "pin" : { node
: null, color
: "#44a0ff", highlight_node
: null }
158 select_node=function( select_kind
, node
, highlight_node
)
160 var prev_highlight
=g_selected_nodes
[select_kind
].highlight_node
;
161 g_selected_nodes
[select_kind
].node
=node
;
162 g_selected_nodes
[select_kind
].highlight_node
=highlight_node
;
163 if( highlight_node
!=null ) {
164 g_diagram
.select_node( highlight_node
.id
, g_selected_nodes
[select_kind
].color
);
166 if( prev_highlight
!=null ) {
168 var order
=["diff", "pin", "popup_track"];
169 for( var i
=0; i
<order
.length
; ++i
) {
170 if( order
[i
]!=select_kind
&& g_selected_nodes
[order
[i
]].highlight_node
==prev_highlight
) {
171 prev_color
=g_selected_nodes
[order
[i
]].color
;
174 g_diagram
.select_node( prev_highlight
.id
, prev_color
);
179 g_diff_pane_pos
={ x
: 0, y
: 0 };
180 g_diff_pane_size
={ x
: 0, y
: 0 };
181 update_diffview_height=function()
183 var diffheaddiff
=document
.getElementById( "diffheaddiff" );
185 if( diffheaddiff
.style
.display
!="none" ) {
186 var diff_comment
=document
.getElementById( diffheaddiff
._gitbrowser_comment_id
);
187 if( diff_comment
!=null ) {
188 diff_comment
.style
.color
="#000";
189 if( diff_comment
.scrollHeight
>g_max_diff_comment_height
) {
190 diff_comment
.style
.height
=g_max_diff_comment_height
+"px";
193 diff_height
=diffheaddiff
.clientHeight
;
195 var diffheadpin
=document
.getElementById( "diffheadpin" );
197 if( diffheadpin
.style
.dislpay
!="none" ) {
198 var pin_comment
=document
.getElementById( diffheadpin
._gitbrowser_comment_id
);
199 if( pin_comment
!=null ) {
200 pin_comment
.style
.color
="#787878";
201 if( pin_comment
.scrollHeight
>g_max_diff_comment_height
) {
202 pin_comment
.style
.height
=g_max_diff_comment_height
+"px";
205 pin_height
=diffheadpin
.clientHeight
;
207 var diffhead_height
=Math
.max( diff_height
, pin_height
);
209 var diffview
=document
.getElementById( "diffview" );
210 Motion
.set_page_coords( diffview
, g_diff_pane_pos
.x
, g_diff_pane_pos
.y
+diffhead_height
);
211 diffview
.style
.width
=(g_diff_pane_size
.x
-4)+"px";
212 diffview
.style
.height
=(g_diff_pane_size
.y
-diffhead_height
)+"px";
214 on_splitter_resize=function( arg
, title_div
)
216 var diagram_div
=document
.getElementById( "diagram" );
217 var title_height
=title_div
.clientHeight
;
218 Motion
.set_page_coords( diagram_div
, arg
.half1_pos
.x
, arg
.half1_pos
.y
+title_height
);
219 diagram_div
.style
.width
=(arg
.half1_wh
.x
-4)+"px";
220 diagram_div
.style
.height
=(arg
.half1_wh
.y
-title_height
)+"px";
222 g_diff_pane_pos
=arg
.half2_pos
;
223 g_diff_pane_size
=arg
.half2_wh
;
224 update_diffview_height();
229 clear_pin_and_diff=function()
231 select_node( "pin", null, null );
232 select_node( "diff", null, null );
233 document
.getElementById( "diffheaddiff" ).innerHTML
="";
234 document
.getElementById( "diffheadpin" ).innerHTML
="";
235 document
.getElementById( "differror" ).style
.display
="none";
236 document
.getElementById( "diffview" ).style
.display
="none";
237 document
.getElementById( "diffview" ).src
="";
239 g_max_diff_comment_height
=50;
240 update_diff_title=function( which
, node
)
242 var highlight_node
=node
.coalesced_to
==null ? node
: node
.coalesced_to
;
243 select_node( which
, node
, highlight_node
);
244 var title_dest
=document
.getElementById( "diffhead"+which
);
245 title_dest
.innerHTML
="";
247 date
: format_popup_date( node
),
251 _process: function( n
, arg
) {
252 arg
.dest
._gitbrowser_comment_id
=n
.id
;
254 _process_arg
: { dest
: title_dest
}
256 clear
: which
=="diff" ? null : { _process: function( n
, arg
) { n
.onclick
=clear_pin_and_diff
; } },
257 bullet
: which
=="diff" ? null : { _process: function( n
, arg
) { n
.style
.border
=arg
==null ? "" : "2px solid "+arg
; }, _process_arg
: g_selected_nodes
[which
].color
}
259 DomTemplate
.apply( document
.getElementById( "difftitle" ), data
, title_dest
);
260 var other
=which
=="diff" ? "pin" : "diff";
261 var other_node
=g_selected_nodes
[other
].node
;
262 var other_title
=document
.getElementById( "diffhead"+other
);
263 if( other_node
==null ) {
264 other_title
.style
.display
="none";
265 title_dest
.style
.width
="100%";
266 title_dest
.style
.styleFloat
="";
267 title_dest
.style
.cssFloat
="";
268 title_dest
.style
.display
="";
269 var comment
=document
.getElementById( title_dest
._gitbrowser_comment_id
);
270 if( comment
!=null ) {
271 comment
.style
.color
="#000";
272 if( comment
.clientHeight
>g_max_diff_comment_height
) {
273 comment
.style
.height
=g_max_diff_comment_height
+"px";
277 var left_title
=title_dest
;
278 var right_title
=other_title
;
279 if( other_node
.time
<node
.time
) {
280 left_title
=other_title
;
281 right_title
=title_dest
;
283 left_title
.style
.width
="49%";
284 left_title
.style
.styleFloat
="left";
285 left_title
.style
.cssFloat
="left";
286 right_title
.style
.width
="49%";
287 right_title
.style
.styleFloat
="right";
288 right_title
.style
.cssFloat
="right";
289 left_title
.style
.display
="";
290 right_title
.style
.display
="";
296 var right_diff_node
=g_selected_nodes
["diff"].node
;
297 var left_diff_node
=g_selected_nodes
["pin"].node
;
298 if( right_diff_node
!=null ) {
299 if( left_diff_node
==null ) {
300 left_diff_node
=right_diff_node
.parents
[0];
302 if( left_diff_node
.time
>right_diff_node
.time
) {
303 var t
=left_diff_node
;
304 left_diff_node
=right_diff_node
;
308 if( left_diff_node
!=null ) {
310 if( left_diff_node
==right_diff_node
) {
311 msg
="can't diff the node with itself";
313 // find repo both nodes belong to
314 var common_repo
=null;
316 for( var left_i
=0; left_i
<left_diff_node
.repos
.length
; ++left_i
) {
317 for( var right_i
=0; right_i
<right_diff_node
.repos
.length
; ++right_i
) {
318 if( left_diff_node
.repos
[left_i
]==right_diff_node
.repos
[right_i
] ) {
319 common_repo
=left_diff_node
.repos
[left_i
];
323 if( common_repo
==null ) {
324 msg
="can't diff nodes from different repositories: left from "+left_diff_node
.repos
.join( "," )+"; right from "+right_diff_node
.repos
.join( "," );
328 var differror
=document
.getElementById( "differror" );
329 differror
.style
.display
="";
330 differror
.innerHTML
="";
331 differror
.appendChild( document
.createTextNode( msg
) );
332 document
.getElementById( "diffview" ).style
.display
="none";
334 document
.getElementById( "differror" ).style
.display
="none";
335 document
.getElementById( "diffview" ).style
.display
="";
336 document
.getElementById( "diffloader" ).src
=g_diff_url
+"?repo="+encodeURIComponent(common_repo
)+"&id1="+encodeURIComponent(left_diff_node
.id
)+"&id2="+encodeURIComponent(right_diff_node
.id
);
339 update_diffview_height();
342 diff_iframe_onload=function()
344 document
.getElementById( "diffview" ).innerHTML
=window
.frames
.diffloader
.document
.body
.innerHTML
;
348 if( this._gitbrowser_diagram_id
!=null && this._gitbrowser_node_id
!=null ) {
349 var node
=g_diagram
.m_nodes
[this._gitbrowser_node_id
];
351 clear_pin_and_diff();
352 update_diff_title( "pin", node
);
353 var pn
=find_popup_node_div( this );
355 var popup
=pn
.parentNode
;
356 update_popup( popup
);
363 if( this._gitbrowser_diagram_id
!=null && this._gitbrowser_node_id
!=null ) {
364 var node
=g_diagram
.m_nodes
[this._gitbrowser_node_id
];
366 update_diff_title( "diff", node
);
374 g_track_enter_leave
=[];
375 release_popups=function()
378 for( i
=0; i
<g_track_popups
.length
; ++i
) {
379 Motion
.detach_popup( g_track_popups
[i
] );
382 for( i
=0; i
<g_track_enter_leave
.length
; ++i
) {
383 Motion
.cancel_enter_leave( g_track_enter_leave
[i
] );
385 g_track_enter_leave
=[];
386 for( i
in g_diagram
.m_nodes
) {
387 g_diagram
.m_nodes
[i
].popup_id
=null;
390 popup_enter=function( popup
, arg
)
392 var node
=arg
.diagram
.m_nodes
[arg
.node_id
];
393 var highlight_node
=node
.coalesced_to
!=null ? node
.coalesced_to
: node
;
394 select_node( "popup_track", node
, highlight_node
);
396 popup_leave=function( popup
, arg
)
398 select_node( "popup_track", null, null );
400 find_popup_node_div=function( btn
)
402 var pn
=btn
.parentNode
;
404 if( pn
.id
!=null && pn
.id
.match( "^node" ) ) {
411 remember_button_id=function( btn
, tag
)
413 var pn
=find_popup_node_div( btn
);
418 g_popup_max_width
=220;
419 popup_filler=function( popup
, arg
)
421 var diagram
=arg
.diagram
;
423 popup
.style
.padding
="2px";
424 var data
={ node
: [] };
425 for( var node_i
=0; node_i
<nodes
.length
; ++node_i
) {
426 var node
=nodes
[node_i
];
428 if( node
.author
==null ) {
429 node_data
={ not_loaded
: {} };
434 _process: function( n
, arg
) {
435 Motion
.attach_popup( { trigger_node
: n
, x_anchor_node
: popup
, y_anchor_node
: n
, anchor_offset
: 1, side
: "left", side_align
: "top",
436 popup_filler
: popup_filler
, filler_arg
: { diagram
: diagram
, nodes
: arg
}, on_show
: popup_on_show
,
437 delay_show_seconds
: 0.3//, transparent: true
439 g_track_popups
.push( n
);
440 remember_button_id( n
, "_gitbrowser_popup_parents_button" );
442 _process_arg
: node
.parents
445 _process: function( n
, arg
) {
446 Motion
.attach_popup( { trigger_node
: n
, x_anchor_node
: popup
,y_anchor_node
: n
, anchor_offset
: 1, side
: "right", side_align
: "top",
447 popup_filler
: popup_filler
, filler_arg
: { diagram
: diagram
, nodes
: arg
}, on_show
: popup_on_show
,
448 delay_show_seconds
: 0.3//, transparent: true
450 g_track_popups
.push( n
);
451 remember_button_id( n
, "_gitbrowser_popup_children_button" );
453 _process_arg
: node
.children
455 diff_btn
: node
.date
==null ? null : {
456 _process: function( n
, arg
) {
457 n
._gitbrowser_diagram_id
=arg
.diagram
.m_diagram_id
;
458 n
._gitbrowser_node_id
=arg
.node
.id
;
460 remember_button_id( n
, "_gitbrowser_popup_diff_button" );
462 _process_arg
: { diagram
: diagram
, node
: node
}
464 pin_btn
: node
.date
==null ? null : {
465 _process: function( n
, arg
) {
466 n
._gitbrowser_diagram_id
=arg
.diagram
.m_diagram_id
;
467 n
._gitbrowser_node_id
=arg
.node
.id
;
469 remember_button_id( n
, "_gitbrowser_popup_pin_button" );
471 _process_arg
: { diagram
: diagram
, node
: node
}
474 date
: format_popup_date( node
),
475 author
: node
.author
==null ? "" : node
.author
,
476 comment
: node
.comment
==null ? "" : node
.comment
,
477 _process: function( n
, arg
) {
478 Motion
.track_enter_leave( { node
: n
,
479 enter_handler
: popup_enter
, leave_handler
: popup_leave
, handler_arg
: { diagram
: arg
.diagram
, node_id
: arg
.node
.id
}
481 g_track_enter_leave
.push( n
);
482 n
._gitbrowser_node_is_root
=arg
.node
.parents
.length
==0;
483 n
._gitbrowser_node_is_leaf
=arg
.node
.children
.length
==0;
485 _process_arg
: { diagram
: diagram
, node
: node
}
488 data
.node
.push( node_data
);
490 DomTemplate
.apply( document
.getElementById( "popuptemplate" ), data
, popup
);
492 if( popup
.clientWidth
>=g_popup_max_width
) {
493 popup
.style
.width
=g_popup_max_width
+"px";
495 // stretch table with buttons to fill all popup width
496 for( var node_div
=popup
.firstChild
; node_div
!=null; node_div
=node_div
.nextSibling
) {
497 var table
=node_div
.firstChild
;
499 table
.width
=(popup
.clientWidth
-8)+"px";
503 update_popup_node_div=function( cn
, old_state
, new_state
)
505 if( old_state
==null ) { // do initialization for the first time only
506 var children_button
=document
.getElementById( cn
._gitbrowser_popup_children_button
);
507 children_button
.style
.visibility
= cn
._gitbrowser_node_is_leaf
? "hidden" : "";
508 var parents_button
=document
.getElementById( cn
._gitbrowser_popup_parents_button
);
509 parents_button
.style
.visibility
= cn
._gitbrowser_node_is_root
? "hidden" : "";
511 var diff_button
=document
.getElementById( cn
._gitbrowser_popup_diff_button
);
512 var pin_button
=document
.getElementById( cn
._gitbrowser_popup_pin_button
);
513 if( new_state
=="normal" ) {
514 diff_button
.innerHTML
=" diff";
515 diff_button
.style
.visibility
=cn
._gitbrowser_node_is_root
? "hidden" : "";
516 pin_button
.innerHTML
="pin ";
517 pin_button
.style
.visibility
="";
519 diff_button
.innerHTML
=" diff to pin";
520 diff_button
.style
.visibility
= diff_button
._gitbrowser_node_id
==g_selected_nodes
["pin"].node
.id
? "hidden" : ""; // avoid diff with itself
521 pin_button
.innerHTML
="";
522 pin_button
.style
.visibility
="hidden";
525 update_popup=function( popup
)
527 var pinned_node
=g_selected_nodes
["pin"].node
;
528 var pinned_id
=pinned_node
==null ? null : pinned_node
.id
;
529 var new_state
= pinned_node
==null ? "normal" : "pinned";
530 var old_state
=popup
._gitbrowser_popup_state
;
531 if( old_state
!=new_state
|| popup
._gitbrowser_pinned_id
!=pinned_id
) {
532 popup
._gitbrowser_popup_state
=new_state
;
533 popup
._gitbrowser_pinned_id
!=pinned_id
;
534 for( var cn
=popup
.firstChild
; cn
!=null; cn
=cn
.nextSibling
) {
535 if( cn
._gitbrowser_popup_diff_button
!=null && cn
._gitbrowser_popup_pin_button
!=null && cn
._gitbrowser_popup_children_button
!=null && cn
._gitbrowser_popup_parents_button
!=null ) {
536 update_popup_node_div( cn
, old_state
, new_state
);
541 popup_on_show=function( popup
)
543 update_popup( popup
);
546 // global initialization, diagram loading
547 place_and_draw=function( context
, keep_window_offset
)
549 context
.diagram
.place_nodes( keep_window_offset
);
550 context
.diagram
.draw();
551 GitBrowser
.title_update( { diagram
: context
.diagram
} );
553 on_title_loaded=function( context
)
555 var show_selectother
= null;
557 show_selectother
= window
.sessionStorage
.getItem("arpa.urn.uuid.c5118906-b736-4785-a3ec-28a0e1f88d66");
559 if( !show_selectother
) context
.select_other_btn
.style
.visibility
="hidden";
560 Motion
.make_splitter( { direction
: "h", container
: document
.body
, initial_split
: 0.5,
561 contents1
: [ context
.title_div
, context
.diagram_div
],
562 contents2
: [ document
.getElementById( "diff" ) ],
563 resize_handler
: on_splitter_resize
,
564 resize_handler_arg
: context
.title_div
,
565 move_handler: function( arg
, first
) { if( first
) { context
.diagram
.m_container_element
.innerHTML
=""; } } // speed up splitter drag start
572 "node_init": on_node_init
576 var diagram_div
=document
.getElementById( "diagram" );
577 g_diagram
=new GitDiagram( {
578 container_element
: diagram_div
,
580 ui_handler
: GitBrowser
.diagram_ui_handler
,
581 ui_handler_arg
: g_ui_map
584 repos
: GitBrowser
.repos_decode_location( location
),
585 diagram_div
: diagram_div
, // diagram_div is a payload
587 title_loaded_handler
: on_title_loaded
,
588 commits_first_loaded_handler: function( context
) { place_and_draw( context
, false ); },
589 commits_more_loaded_handler: function( context
) { place_and_draw( context
, true ); },
590 title
: cfg_bydate_title
597 var o
=document
.getElementById( "output" );
599 o
.appendChild( document
.createElement( "DIV" ) ).appendChild( document
.createTextNode( msg
) );
604 <link rel=
"stylesheet" type=
"text/css" href=
"GitBrowser.css"></link>
605 <style type=
"text/css">
607 html
{ height: 99.8%; }
608 body
{ height: 99.8%; font: normal normal
12px sans-serif
; overflow: hidden
; }
610 #diagram { border: 1px solid
#090; position: absolute
; }
612 .difftitle td { font-size: 12px; padding: 2px; }
613 .difftitledate, .difftitleauthor { font-weight: bold
; color: #7878b8; }
614 .diffnodebullet { width: 6px; height: 6px; background-color: #330; font-size: 1px; }
615 .diffcomment { overflow: auto
; font-size: 12px; }
616 .differror { font-size: 12px; color: #a82222; }
618 #diffseparator { clear: both
; width: 100%; margin: 3px 0 4px 0; border-bottom: 1px solid
#a8a8a8; line-height:0; }
620 .popupnode { color: #000; background-color: #f8fff8; border: 1px solid
#7b7; font-family: sans-serif
; font-size: 11px; padding-left: 2px; padding-right: 1px; margin-bottom: 2px; }
621 .popupdate { margin-top: 3px; }
622 .popupbutton { color: #000; background-color: #f4f4fc; border: 1px solid
#a0a0ff; padding: 0; margin: 1px; width: 50px; cursor: pointer
; }
623 .popupbutton:hover { border: 1px solid
#4040ff; }
624 .popuptrigger { color: #000; background-color: #e4f6e4; border: 1px solid
#9e9; padding: 0; margin: 1px; width: 50px; cursor: default
; }
625 .popupcomment { margin-top: 2px; padding-top: 4px; border-top: 1px solid
#9e9; }
627 #diffview { overflow: auto
; }
628 #diffview div
.title_text
{ padding:6px 0px; border: solid
#d9d8d1; border-width:0px 0px 1px; }
629 #diffview div
.log_body
{ padding:8px 8px 8px 150px; }
630 #diffview span
.age
{ position:relative
; float:left
; width:142px; font-style:italic
; }
631 #diffview span
.cntrl
{
632 border: dashed
#aaaaaa; border-width: 1px;
633 padding: 0px 2px 0px 2px; margin: 0px 2px 0px 2px;
635 #diffview div
.log_link
{
637 font-size:10px; font-family:sans-serif
; font-style:normal
;
638 position:relative
; float:left
; width:136px;
640 #diffview div
.list_head
{ padding:6px 8px 4px; border:solid
#d9d8d1; border-width:1px 0px 0px; font-style:italic
; }
641 #diffview a
.list
{ border-style: none
; text-decoration:none
; color:#000000; }
642 #diffview a
.list:hover
{ text-decoration:underline
; color:#880000; }
643 #diffview a
.text
{ text-decoration:none
; color:#0000cc; }
644 #diffview a
.text:visited
{ text-decoration:none
; color:#880000; }
645 #diffview a
.text:hover
{ text-decoration:underline
; color:#880000; }
646 #diffview table
{ padding:8px 4px; border-spacing: 0; }
647 #diffview table
.diff_tree
{ font-family: monospace
; }
648 #diffview table
.combined
.diff_tree th
{ text-align: center
; }
649 #diffview table
.combined
.diff_tree td
{ padding-right: 24px; }
650 #diffview table
.combined
.diff_tree th
.link
,
651 #diffview table
.combined
.diff_tree td
.link
{ padding: 0px 2px; }
652 #diffview table
.combined
.diff_tree td
.nochange a
{ color: #6666ff; }
653 #diffview table
.combined
.diff_tree td
.nochange
a:hover
,
654 #diffview table
.combined
.diff_tree td
.nochange
a:visited
{ color: #d06666; }
655 #diffview table
.diff_tree span
.file_status
.new
{ color: #008000; }
656 #diffview table
.diff_tree span
.file_status
.deleted
{ color: #c00000; }
657 #diffview table
.diff_tree span
.file_status
.moved
,
658 #diffview table
.diff_tree span
.file_status
.mode_chnge
{ color: #777777; }
659 #diffview table
.diff_tree span
.file_status
.copied
{ color: #70a070; }
660 #diffview th
{ padding: 2px 5px; font-size: 100%; text-align: left
; }
661 #diffview tr
.light
{ background-color: #ffffff; }
662 #diffview tr
.dark
{ background-color: #f6f6f0; }
663 #diffview tr
.light:hover
,
664 #diffview tr
.dark:hover
{ background-color: #edece6; }
665 #diffview td
{ padding: 2px 5px; font-size: 100%; vertical-align: top
; }
666 #diffview td
.link
{ padding: 2px 5px; font-family: sans-serif
; font-size: 70%; }
667 #diffview div
.header
, #diffview div
.patchset
{ clear: both
; }
668 #diffview div
.diff
{ font-family: monospace
; font-size: 12px; }
669 #diffview div
.diff
{ white-space: pre
; }
670 /*#diffview div.diff { white-space: pre-wrap; word-wrap: break-word; }
671 #diffview div.diff_body {
672 position: relative; overflow: hidden;
673 padding-left: 2.6ex !important; text-indent: -2.6ex;
675 #diffview div.diff_body:before {
676 position: absolute; left: -1ex; white-space: pre; font-size: 90%; vertical-align: 25%;
677 content: " \21aa\a \21aa\a \21aa\a \21aa\a \21aa\a \21aa\a \21aa\a \21aa\a \21aa\a \21aa";
678 clip: rect(auto, auto, auto, 1ex);
680 #diffview div
.diff
.header
,
681 #diffview div
.diff
.extended_header
{ white-space: normal
; }
682 #diffview div
.diff
.header
{
683 font-weight: bold
; background-color: #edece6; margin-top: 4px; padding: 4px 0px 2px 0px;
684 border: solid
#d9d8d1; border-width: 1px 0px 1px 0px;
686 #diffview div
.diff
.header a
.path
{ text-decoration: underline
; }
687 #diffview div
.diff
.extended_header
,
688 #diffview div
.diff
.extended_header a
.path
,
689 #diffview div
.diff
.extended_header a
.hash
{ color: #777777; }
690 #diffview div
.diff
.extended_header
.info
{ color: #b0b0b0; }
691 #diffview div
.diff
.extended_header
{ background-color: #f6f5ee; padding: 2px 0px 2px 0px; }
692 #diffview div
.diff a
.list
,
693 #diffview div
.diff a
.path
,
694 #diffview div
.diff a
.hash
{ text-decoration: none
; }
695 #diffview div
.diff a
.list:hover
,
696 #diffview div
.diff a
.path:hover
,
697 #diffview div
.diff a
.hash:hover
{ text-decoration: underline
; }
698 #diffview div
.diff
.to_file a
.path
,
699 #diffview div
.diff
.to_file
{ color: #007000; }
700 #diffview div
.diff
.add
{ color: #008800; }
701 #diffview div
.diff
.add span
.marked
{ background-color: #aaffaa; }
702 #diffview div
.diff
.from_file a
.path
,
703 #diffview div
.diff
.from_file
{ color: #aa0000; }
704 #diffview div
.diff
.rem
{ color: #cc0000; }
705 #diffview div
.diff
.rem span
.marked
{ background-color: #ffaaaa; }
706 #diffview div
.diff
.chunk_header a
,
707 #diffview div
.diff
.chunk_header
{ color: #990099; }
708 #diffview div
.diff
.chunk_header
{ border: dotted
#ffe0ff; border-width: 1px 0px 0px 0px; margin-top: 2px; }
709 #diffview div
.diff
.chunk_header span
.chunk_info
{ background-color: #ffeeff; }
710 #diffview div
.diff
.chunk_header span
.section
{ color: #aa22aa; }
711 #diffview div
.diff
.incomplete
{ color: #cccccc; }
712 #diffview div
.diff
.nodifferences
{ font-weight: bold
; color: #600000; }
713 #diffview div
.chunk_block
{ overflow: hidden
; }
714 #diffview div
.chunk_block div
.old
{ float: left
; width: 50%; overflow: hidden
; }
715 #diffview div
.chunk_block div
.new
{ margin-left: 50%; width: 50%; }
716 #diffview div
.chunk_block
.rem div
.old div
.diff
.rem
{ background-color: #fff5f5; }
717 #diffview div
.chunk_block
.add div
.new div
.diff
.add
{ background-color: #f8fff8; }
718 #diffview div
.chunk_block
.chg div div
.diff
{ background-color: #fffff0; }
719 #diffview div
.chunk_block
.ctx div div
.diff
.ctx
{ color: #404040; }
726 <script type=
"text/javascript"></script>
727 <noscript>Enable JavaScript to view the graph.
</noscript>
729 <div id=
"diagram"></div>
733 <div id=
"diffheaddiff"></div>
734 <div id=
"diffheadpin"></div>
735 <div id=
"diffseparator"></div>
736 <div id=
"differror" class=
"differror" style=
"display: none;"></div>
737 <div id=
"diffview"></div>
741 <div id=
"output" style=
"display: none; position: absolute; top: 360px; left: 1ex; right: 1ex; z-index: 100; background-color: #fff; max-height: 300px; overflow: auto"></div> <!-- debug output -->
743 <!-- iframe is invisible, since when visible, its document body is stealing mousemove events from Motion.js (and obscuring popups in Opera)-->
744 <iframe id=
"diffloader" name=
"diffloader" style=
"display: none; width: 1px; height: 1px" onload=
"diff_iframe_onload();"></iframe>
746 <div style=
"display: none;"> <!-- templates -->
749 <table class=
"difftitle">
751 <td><div class=
"diffnodebullet" id=
"bullet"> </div></td>
752 <td><span class=
"difftitledate" id=
"date"></span></td>
753 <td><span class=
"difftitleauthor" id=
"author"></span></td>
754 <td><a class=
"button" id=
"clear" href=
"#">clear
</a></td>
757 <div class=
"diffcomment" id=
"comment"></div>
760 <div id=
"popuptemplate">
761 <div id=
"node" class=
"popupnode">
762 <table id=
"buttons" cellpadding=
"0" cellspacing=
"0">
764 <td align=
"left"><div id=
"parents_btn" class=
"popuptrigger"> parents
</div></td>
765 <td align=
"center"><div id=
"diff_btn" class=
"popupbutton"> diff
</div></td>
766 <td align=
"center"><div id=
"pin_btn" class=
"popupbutton">pin
</div></td>
767 <td align=
"right"><div id=
"children_btn" class=
"popuptrigger">children
</div></td>
770 <div id=
"date" class=
"popupdate"></div>
771 <div id=
"author"></div>
772 <div id=
"comment" class=
"popupcomment"></div>
773 <div id=
"not_loaded">not loaded yet
</div>