Difference between revisions of "Debugging OOo"

From CDOT Wiki
Jump to: navigation, search
(Created page with '== Lecture logs by Eric == <pre> 1 : [11:54] <@ericb2> fardad: ok, let's go 2 : �01[11:54] <@fardad> ericb2: Thank you in advance for taking time and lecturing us! 3 : [11:54] ...')
 
(OOo Category)
 
(9 intermediate revisions by one other user not shown)
Line 1: Line 1:
== Lecture logs by Eric ==
+
= logs of IRC Lectures On Debugging openoffice.org =
 +
 
 +
== Lecturer Eric Bachard, [http://education.openoffice.org/ Openoffice.org Ecucation Project leader] ==
 +
 
 +
Also see other classroom logs at Openoffic.org's [http://wiki.services.openoffice.org/wiki/Education_ClassRoom/Previous_Logs Education Classrooms]
 +
 
 +
== First Session ==
 
<pre>
 
<pre>
 
1 : [11:54] <@ericb2> fardad: ok, let's go
 
1 : [11:54] <@ericb2> fardad: ok, let's go
Line 415: Line 421:
 
413 : [13:31] <@ericb2> thanks to all :-)
 
413 : [13:31] <@ericb2> thanks to all :-)
 
</pre>
 
</pre>
 +
 +
== Second Session ==
 +
<pre>
 +
1 : [12:04] <@ericb2> ok, let's start ?
 +
2 : �01[12:04] <@fardad> we are ready (missing 3 students, but its their loss)
 +
3 : [12:04] <@ericb2> ok
 +
4 : [12:04] <@ericb2> Outline of the ClassRoom
 +
5 : [12:04] <@ericb2> Prerequisites for the test
 +
6 : [12:04] <@ericb2> Reminder about what happens when building in a module
 +
7 : [12:04] <@ericb2> Add symbols in a library
 +
8 : [12:04] <@ericb2> Introduction of gdb use
 +
9 : [12:04] <@ericb2> Launch OOo using gdb
 +
10 : [12:05] <@ericb2> Play with it (discovery)
 +
11 : [12:05] <@ericb2> So today, we'll start playing with gdb + Ooo
 +
12 : [12:06] <@ericb2> who does have a full OOo build at hand ?
 +
13 : [12:06] <@ericb2> ok :)
 +
14 : [12:06] <@ericb2> As pre-requisites , I'll suppose :
 +
15 : [12:06] <@ericb2> - there is a complete build working already
 +
16 : [12:06] <@ericb2> - there is a working installset , and we will launch it using the terminal
 +
17 : [12:06] <@ericb2> Thus, if you want to redo at home, or later, you just have to read and try
 +
18 : [12:06] <@ericb2> Reminder : what happens when something is built
 +
19 : [12:07] <@ericb2> we'll use <module> for whatever subdir of the OOo tree, aka "module" most of the time
 +
20 : [12:08] <@ericb2> <module>/prj/build.lst does contain the list of the subdirs containing a makefile
 +
21 : [12:08] <@ericb2> Means:  Every product is built in the output dir. e.g. : unxmacxi.pro on Mac Intel
 +
22 : [12:08] <@ericb2> we have the same tree inside all the modules:
 +
23 : [12:08] <@ericb2> unxmacxi.pro/bin
 +
24 : [12:08] <@ericb2> unxmacxi.pro/lib
 +
25 : [12:08] <@ericb2> unxmacxi.pro/inc
 +
26 : [12:09] <@ericb2> ... and so on (look yourself )
 +
27 : [12:09] <@ericb2> to rebuild a module, just remove this directory
 +
28 : [12:09] <@ericb2> Once all the .o are build, the libs, and/or the binaries / resources / whatever are  "delivered" from the unxmacxi.pro dir to the solver
 +
29 : [12:11] <@ericb2> The information providing the list of what has to be delivered is always in : <module>/prj/d.lst
 +
30 : [12:11] <@ericb2> these files are text files, using a "Windows"  separator, but this is not a problem at all
 +
31 : [12:13] <@ericb2> If we summarize : a normal build provides binaries like libraries, who are stripped when the are delivered. Between the unxmacxi.pro and their place in the "solver "
 +
32 : [12:14] <@ericb2> Important:  to be able to trace using gdb, we'll need to add symbols, lines of code and a lot of information inside the binaries
 +
33 : [12:14] <@ericb2> Howto add symbols in a library ?
 +
34 : [12:14] <@ericb2> 1) first approach
 +
35 : [12:14] <@ericb2> -> look at configure extra option : --disable-strip-solver
 +
36 : [12:15] <@ericb2> To verify by yourself, just place you at the root of the sources (since DEV300_m40, there is no longer config_office subdir)
 +
37 : [12:15] <@ericb2> and do : ./configure --help | grep -4 solver
 +
38 : [12:16] <@ericb2> you'll have several lines explaining the right option
 +
39 : [12:16] <@ericb2> Tip : if you're familiar with configure, better read configure itself, more informative ;-)
 +
40 : [12:17] <@ericb2> and if you know a bit of autoconf, you can even hack configure.in, and run autoconf to regenerate a new configure :)
 +
41 : [12:18] <@ericb2> The first approach has a drawback : just a bit of information is inside the binary, and that's not enough most of the time, when you have a complex problem to solve
 +
42 : [12:19] <@ericb2> 2) second approach
 +
43 : [12:19] <@ericb2> consider only a part of the code, for tracing
 +
44 : [12:20] <@ericb2> The method is equivalent to use  --enable-debug at configure time, but nobody uses this option. the reason is simple : all libraries become huges, and OOo won't probably launch correctly.
 +
45 : [12:21] <@ericb2> e.g. : the libsw (writer) becomes 660MB heavy
 +
46 : �01[12:22] <@fardad> ericb2: when you say correctly, does it mean it will be too slow, or it will not function properly?
 +
47 : [12:22] <Kamots> wow, that's a lot of extra weight
 +
48 : [12:22] <@ericb2> fardad: yes, imagine 10 libs of 500MB every + some other 100MB and so on
 +
49 : [12:23] <@ericb2> Kamots: I'll explain you how to proceed
 +
50 : �01[12:23] <@fardad> wow, :o
 +
51 : [12:24] <@ericb2> Other important information
 +
52 : [12:24] <@ericb2> about assertions
 +
53 : [12:24] <@ericb2> There is another option in configure
 +
54 : [12:24] <@ericb2>  --enable-dbgutil
 +
55 : [12:25] <@ericb2> Include additional debugging utilities, such assertions, object counting, etc. Larger build.
 +
56 : [12:25] <@ericb2>  Independent from --enable-debug
 +
57 : [12:25] <@ericb2>  the *second one* does concern assertions in the code :
 +
58 : [12:25] <@ericb2> DBG_ASSERT( !(rALR.flags & kATSGlyphInfoTerminatorGlyph),
 +
59 : [12:25] <@ericb2>                        "ATSLayout::InitGIA(): terminator glyph not marked as deleted!" );
 +
60 : [12:25] <@ericb2> -> if the condition is not verified -> boom .. and a window will appear, containing the message
 +
61 : [12:26] <@ericb2> if --enable-dbgutil is not in the configure command line, assertions are not included
 +
62 : [12:26] <@ericb2> As you understood, assertions are for development, not for end users ;-)
 +
63 : [12:27] <@ericb2> So, we use to add symbols for debugging for some libs, in a given module only
 +
64 : [12:27] <@ericb2> Counterpart : needs to rebuild the module
 +
65 : [12:27] <@ericb2> The process is very simple :
 +
66 : [12:28] <@ericb2> cd <module>
 +
67 : [12:28] <@ericb2> mv unxmacxi.pro unxmacxi.pro_backup
 +
68 : [12:28] <@ericb2> build debug=t
 +
69 : [12:28] <@ericb2> Do *always* a backup of your build, because the binaries in the output tree, do match with stamps in the solver
 +
70 : [12:29] <@ericb2> if you modify something, you'll have to redo a build, and a "deliver". Elser, the build can break at postprocess, or at then end, because the stamp between the solver and the module do not match
 +
71 : [12:29] <@ericb2> that's just harmless, but if you are not aware, you can lose a while before someone explains you what happens
 +
72 : [12:30] <@ericb2> As example, I'll rebuild a little lib , to show you the difference
 +
73 : [12:31] <@ericb2> cd apple_remote/
 +
74 : [12:31] <@ericb2> source ../MacOSXX86Env.Set.sh
 +
75 : [12:31] <@ericb2> sorry, I forgot :-)
 +
76 : [12:32] <@ericb2> mv unxmacxi.pro unxmacxi.pro_back
 +
77 : [12:32] <@ericb2> build debug=t
 +
78 : [12:32] <@ericb2> Important:  whatever you put, will work
 +
79 : [12:32] <@ericb2> t is one letter, but once the string is not empty, debug is true
 +
80 : [12:33] <@ericb2> means all the code included between #ifdef DEBUG ... #endif  or some other macros, will be included
 +
81 : [12:34] <@ericb2> e.g. :
 +
82 : [12:34] <@ericb2> #ifdef DEBUG
 +
83 : [12:34] <@ericb2>        // debug purpose
 +
84 : [12:34] <@ericb2>    NSLog(@"reset... (after listening to remote)");
 +
85 : [12:34] <@ericb2> #endif
 +
86 : [12:34] <@ericb2> -> in the terminal, I'll see the information
 +
87 : [12:34] <@ericb2> NSLog is sort of cout
 +
88 : �01[12:35] <@fardad> ic,
 +
89 : [12:35] <@ericb2> After the rebuild :
 +
90 : [12:35] <@ericb2> ls -l  unxmacxi.pro/lib/libAppleRemotemxi.dylib
 +
91 : [12:35] <@ericb2> -rwxr-xr-x  1 ericb  ericb  159932 Feb 19 18:31 unxmacxi.pro/lib/libAppleRemotemxi.dylib
 +
92 : [12:35] <@ericb2> ls -l unxmacxi.pro_back/lib/libAppleRemotemxi.dylib
 +
93 : [12:35] <@ericb2> -rwxr-xr-x  1 ericb  ericb  52436 Feb 12 14:31 unxmacxi.pro_back/lib/libAppleRemotemxi.dylib
 +
94 : [12:36] <@ericb2> the first one does contain strings and a lot of other stuff
 +
95 : [12:37] <@ericb2> Now .. Launch OOo in a terminal :)
 +
96 : [12:37] <@ericb2> before, we'll copy the lib in the bundle
 +
97 : [12:37] <IZBot> News from cws: native227: created
 +
98 : [12:38] <@ericb2> For the rest, my bundle is in the Desktop/test_eraser folder (I'm on Mac OS X )
 +
99 : [12:38] <@ericb2> Means, the Bundle is the dir : ~/Desktop/test_eraser/OpenOffice.org.app
 +
100 : [12:38] <@ericb2> So, I'll open a terminal, and I'll do :
 +
101 : [12:38] <@ericb2> cd ~/Desktop/test_eraser/OpenOffice.org.app/Contents/program
 +
102 : [12:39] <@ericb2> the idea, is to start gdb form the directory containing soffice (the binary )
 +
103 : [12:39] <@ericb2> and the command line is :
 +
104 : [12:40] <@ericb2> gdb --args ~/Desktop/est.odp
 +
105 : [12:40] <@ericb2> you'll see gdb tell you a lot of things. If you don't want to see that the next time, you can add -q (for quiet) option
 +
106 : [12:41] <@ericb2> as you can see nothing happens :)
 +
107 : [12:41] <@ericb2> the reason is: the binary is not "running"
 +
108 : [12:42] <@ericb2> oops, sorry
 +
109 : [12:42] <@ericb2> gdb --args soffice  ~/Desktop/est.odp
 +
110 : [12:42] <@ericb2> is the right command line
 +
111 : [12:42] <@ericb2> to redo; just enter "q"
 +
112 : [12:42] <@ericb2> and type the correct command
 +
113 : [12:42] <@ericb2> now, type r ( shortcut for "run" )
 +
114 : [12:43] <@ericb2> -> OOo will start
 +
115 : [12:43] <@ericb2> and open the file
 +
116 : [12:43] <@ericb2> in the terminal, you no longer have the control. To stop the execution, do "CTRL-C"
 +
117 : [12:44] <@ericb2> Program received signal SIGINT, Interrupt.
 +
118 : [12:44] <@ericb2> 0x90009cd7 in mach_msg_trap ()
 +
119 : [12:44] <@ericb2> (gdb)
 +
120 : [12:44] <@ericb2> OOo is stopped
 +
121 : [12:44] <@ericb2> you can enter whatever command, like " info frame "
 +
122 : [12:44] <@ericb2> to continue, type : c
 +
123 : [12:45] <@ericb2> The result is : (gdb) c
 +
124 : [12:45] <@ericb2> Continuing.
 +
125 : [12:45] <@ericb2> and OOo is no longer stopped
 +
126 : [12:45] <@ericb2> Add a breakpoint
 +
127 : �01[12:45] <@fardad> amazing...
 +
128 : [12:46] <@ericb2> fardad: I know this is difficult like that, but people will redo later, and ask whenever they want
 +
129 : [12:46] <@ericb2> on the channel
 +
130 : [12:46] <@ericb2> we'll explain them
 +
131 : �01[12:46] <@fardad> I understand
 +
132 : [12:46] <@ericb2> Let's add a breakpoint now
 +
133 : [12:47] <@ericb2> to know whether breakpoints are set or not, the command is :
 +
134 : [12:47] <@ericb2> info b
 +
135 : [12:47] <@ericb2> (means info breakpoints)
 +
136 : [12:47] <@ericb2> exactly :
 +
137 : [12:47] <@ericb2> CTRL-C
 +
138 : [12:47] <@ericb2> info b
 +
139 : [12:48] <@ericb2> The result is :
 +
140 : [12:48] <@ericb2> (gdb) info b
 +
141 : [12:48] <@ericb2> No breakpoints or watchpoints.
 +
142 : [12:48] <@ericb2> of course
 +
143 : [12:48] <@ericb2> so let's set one
 +
144 : [12:49] <@ericb2> Since only libAppleRemotemxi.dylib has symbols, I'll have to set one in whatever file included
 +
145 : �01[12:52] <@fardad> oops
 +
146 : �01[12:54] <@fardad> we lost eric!
 +
147 : [12:54] <@ericb2> For instance :
 +
148 : [12:54] <@ericb2> (gdb) l
 +
149 : [12:54] <@ericb2> 113    #ifdef DEBUG
 +
150 : [12:54] <@ericb2> 114        NSString* buttonName = nil;
 +
151 : [12:54] <@ericb2> 115    #endif
 +
152 : [12:54] <@ericb2> 116        if (pressedDown)
 +
153 : [12:55] <@ericb2> 117        {
 +
154 : [12:55] <@ericb2> 118            pressed = @"(pressed)";
 +
155 : [12:55] <@ericb2> 119
 +
156 : [12:55] <@ericb2> 120    #ifdef DEBUG
 +
157 : [12:55] <@ericb2> 121            switch(buttonIdentifier)
 +
158 : [12:55] <@ericb2> 122            {
 +
159 : [12:55] <@ericb2> Current language:  auto; currently objective-c
 +
160 : [12:55] <@ericb2> (gdb)
 +
161 : [12:55] <@ericb2> I can go up or continue
 +
162 : [12:55] <@ericb2> and if I need info, I can check for the stack of frames
 +
163 : [12:55] <@ericb2> (gdb) bt
 +
164 : [12:56] <@ericb2> -> will return the frames, in *reverse* order. Means, the #0 is the last one, and #1 the one before .. and so on
 +
165 : [12:56] <IZBot> no issue with number 1
 +
166 : [12:56] <@ericb2> ooops :-)
 +
167 : [12:56] <@ericb2> Lets choose "n" for next
 +
168 : [12:57] <@ericb2> The result is :
 +
169 : [12:57] <@ericb2> (gdb) n
 +
170 : [12:57] <@ericb2> 121            switch(buttonIdentifier)
 +
171 : [12:57] <@ericb2> IMPORTANT: the current line is NOT executed yet
 +
172 : [12:57] <@ericb2> e.g. if you have  a= 10;
 +
173 : [12:57] <@ericb2> p a
 +
174 : [12:57] <@ericb2> can return whatevert
 +
175 : [12:58] <@ericb2> *only* n will validate the line. This is the context
 +
176 : [12:58] <@ericb2> execution context
 +
177 : [12:58] <@ericb2> n will continue ..
 +
178 : [12:58] <@ericb2> (gdb) n
 +
179 : [12:58] <@ericb2> 126                case kRemoteButtonPlay:        buttonName = @"Play";                  break;  // MEDIA_COMMAND_PLAY
 +
180 : [12:58] <@ericb2> and of course, we can check for the variable :
 +
181 : [12:58] <@ericb2> (gdb) p buttonIdentifier
 +
182 : [12:58] <@ericb2> $1 = kRemoteButtonPlay
 +
183 : [12:59] <@ericb2> so, it means the  slideshow will start ...
 +
184 : [13:00] <@ericb2> Next instruction :
 +
185 : [13:00] <@ericb2> (gdb) n
 +
186 : [13:00] <@ericb2> 140            [ self postTheEvent:buttonIdentifier modifierFlags: 0 ];
 +
187 : [13:00] <@ericb2> -> means the remote sent a "Play" and I'll inform the vcl there is an event, containing the "Play" information. vcl will forward to Impress, and the slideshow will start
 +
188 : [13:01] <@ericb2> This is only the introduction (if people are intersted, we can do another workshop about gdb another day )
 +
189 : [13:02] <@ericb2> To quit *cleanly*
 +
190 : [13:02] <@ericb2> delete the brekapoints :
 +
191 : [13:02] <@ericb2> d
 +
192 : [13:02] <@ericb2> confirm with yest
 +
193 : [13:02] <@ericb2> yes
 +
194 : [13:02] <@ericb2> c
 +
195 : [13:02] <@ericb2> to continue
 +
196 : [13:02] <@ericb2> and then Quit OOo using CMD Q
 +
197 : [13:03] <@ericb2> The result is :
 +
198 : [13:03] <@ericb2> Program exited normally.
 +
199 : [13:03] <@ericb2> (gdb)
 +
200 : [13:03] <@ericb2> Then quit gdb :
 +
201 : [13:03] <@ericb2> q
 +
202 : [13:03] <@ericb2> -> will give you the normal prompt
 +
203 : [13:03] <@ericb2> back
 +
204 : [13:03] <@ericb2> Questions ?
 +
205 : [13:04] <BartB> not at the moment, might have some later
 +
206 : [13:04] <@ericb2> I forgot, to affect a value,  the command is "set"
 +
207 : [13:04] <@ericb2> e.g. :
 +
208 : [13:04] <MrBraini> ericb2: last lecture you stated the notes from the lectures will be placed on the wiki?  where can we find the notes in the wiki?
 +
209 : [13:04] <@ericb2> (gdb) : set a=10
 +
210 : [13:05] <daeseon_> not now may be later.
 +
211 : [13:05] <@ericb2> MrBraini: I'll put them on the wiki, yes
 +
212 : [13:05] <l_zahir> is there a y way so we can see multiple line before their execution?
 +
213 : [13:05] <@ericb2> l_zahir: list ?
 +
214 : [13:05] <@ericb2> l_zahir: l is the shortcut
 +
215 : [13:06] <@ericb2> l_zahir: I forgot, there is another way to break, using conditional breakpoint
 +
216 : [13:06] <l_zahir> oksu during debugging or before?
 +
217 : [13:06] <@ericb2> l_zahir :  you can go up and down in the frames
 +
218 : [13:06] <@ericb2>  l_zahir to retrieve a context
 +
219 : [13:06] <l_zahir> ok , thanks
 +
220 : [13:07] <@ericb2> l_zahir: I think, the best is to redo a workshop, with everything ready
 +
221 : [13:07] <@ericb2> l_zahir: but nothing will replace the experiences
 +
222 : [13:07] <l_zahir> sure
 +
223 : [13:07] <l_zahir> I will
 +
224 : [13:07] <@ericb2> l_zahir: no problem.
 +
225 : [13:08] <@ericb2> BTW, I provided a patch for rhino and scripting
 +
226 : [13:08] <l_zahir> Oh, good :)
 +
227 : [13:08] <@ericb2> was my fault: two modules where concerned, and this is what caused some issues
 +
228 : [13:08] <@ericb2> l_zahir: one minute, I'll retrive the URL
 +
229 : [13:08] <l_zahir> thanks
 +
230 : [13:08] <l_zahir> :)
 +
231 : [13:09] <@ericb2> http://eric.bachard.free.fr/mac/aquavcl/patches/aqua_February2009/17th_february/complete_rhino_and_scripting_patch.diff
 +
232 : [13:09] <@ericb2> l_zahir: this patch should apply cleanly on m40
 +
233 : [13:09] <@ericb2> l_zahir: not sure it will work, I'm not a Java specialist ;)
 +
234 : [13:09] <@ericb2> ok, I'll have to stop.
 +
235 : [13:09] <l_zahir> I'll try
 +
236 : [13:10] <@ericb2> If you have further questions, ask directly, and if I see them, I'll answer
 +
237 : [13:11] <l_zahir> sure
 +
238 : [13:11] <@ericb2> Other questions ?
 +
239 : [13:12] <@ericb2> If you have no other questions, I'll stop for a while, but in ~2 hours max, I'll be back.
 +
240 : [13:12] <@ericb2> The content of the classroom will be on the wiki
 +
241 : [13:12] <achan66> okay
 +
242 : [13:12] <daeseon_> ok.
 +
243 : [13:12] <@ericb2> later
 +
244 : [13:12] <l_zahir> no Qs
 +
245 : [13:12] <MrBraini> okay thank you
 +
246 : [13:12] <rmwang> Okay Thank you Eric!
 +
247 : [13:13] <@ericb2> thansk to all for coming :)
 +
248 : [13:13] <BartB> thank you Eric
 +
249 : [13:13] <achan66> eric, would it be here?
 +
250 : [13:13] <achan66> http://wiki.services.openoffice.org/wiki/Education_ClassRoom/Practice#SVN_use
 +
251 : [13:13] <@ericb2> achan66: yes, not far
 +
252 : [13:13] <achan66> thank you
 +
253 : [13:13] <WFred___> Thanks Eric!
 +
254 : [13:13] <achan66> = )
 +
255 : [13:13] <@ericb2> achan66: just a tip : look at recent changes on the wiki, say in 2 or 3 hours ;-)
 +
256 : [13:14] <achan66> affirm
 +
257 : [13:14] <MrBraini> okay
 +
258 : [13:14] <Kamots> thank you Eric
 +
259 : [13:15] <daeseon_> thanks Eric
 +
260 : �01[13:19] <@fardad> thanks eric
 +
</pre>
 +
 +
[[Category:OpenOffice.org]]

Latest revision as of 15:41, 11 May 2009

logs of IRC Lectures On Debugging openoffice.org

Lecturer Eric Bachard, Openoffice.org Ecucation Project leader

Also see other classroom logs at Openoffic.org's Education Classrooms

First Session

1 : [11:54] <@ericb2> fardad: ok, let's go
2 : �01[11:54] <@fardad> ericb2: Thank you in advance for taking time and lecturing us!
3 : [11:54] <@ericb2> To make things more easy, everything will be avaulable on the wiki afterwards
4 : [11:54] <@ericb2> fardad: you're welcome
5 : [11:55] <@ericb2> @all : if ever you detect something wrong, please let me know, or better fix it on the wiki afterwards
6 : [11:55] <@ericb2> thanks in advance
7 : [11:55] <@ericb2> Outline of the ClassRoom :
8 : [11:55] <@ericb2> 1) Create patches using svn
9 : [11:55] <@ericb2> 2) apply a patch
10 : [11:55] <@ericb2> 3) rebuild a module
11 : [11:55] <@ericb2> 4) rebuild a module including symbols
12 : [11:55] <@ericb2> 5) run OOo with gdb  (introduction of gdb use)
13 : [11:55] <@ericb2> that's what we'll try to do
14 : [11:56] <@ericb2> if you have questions, please do
15 : [11:56] <@ericb2> fardad: we have ~1 hour
16 : [11:56] <@ericb2> fardad: is it ok ?
17 : [11:56] <IZBot> News from cws: native222: nominated || hr59: nominated
18 : �01[11:56] <@fardad> ericb2: sure, but just letting you know that students have 1hour 30 minutes
19 : [11:57] <@ericb2> fardad: well, they will experiment and ask then :-)
20 : [11:57] <@ericb2> Introduction :  in this part, we will create, apply patches using svn tool. To simplify, we'll suppose the patches are in unified mode.
21 : [11:57] <@ericb2>  Means:
22 : [11:57] <@ericb2> - 3 lines of context before the change
23 : [11:57] <@ericb2> - a line who starts with " - " means the line before the old version (if the old version was existing)
24 : [11:57] <@ericb2> - a line starting with " + " means after the change(s), if a new version does exist
25 : [11:57] <@ericb2> - 3 lines of context after the change
26 : [11:58] <@ericb2> The most important with unified mode : patches are human readable
27 : [11:58] <@ericb2> For example :
28 : [11:58] <@ericb2> ordinateur-de-eric-b-2:~/Desktop/ecntablet01 ericb$ svn diff sd/source/ui/slideshow/slideshow.hrc
29 : [11:58] <@ericb2> Index: sd/source/ui/slideshow/slideshow.hrc
30 : [11:58] <@ericb2> ===================================================================
31 : [11:58] <@ericb2> --- sd/source/ui/slideshow/slideshow.hrc        (revision 267130)
32 : [11:58] <@ericb2> +++ sd/source/ui/slideshow/slideshow.hrc        (working copy)
33 : [11:58] <@ericb2> @@ -38,8 +38,10 @@
34 : [11:58] <@ericb2>  #define CM_SCREEN_BLACK        5
35 : [11:58] <@ericb2>  #define CM_SCREEN_WHITE        6
36 : [11:58] <@ericb2>  #define CM_ENDSHOW             7
37 : [11:58] <@ericb2> -#define CM_FIRST_SLIDE 8
38 : [11:58] <@ericb2> -#define CM_LAST_SLIDE  9
39 : [11:58] <@ericb2> -#define CM_SLIDES              10
40 : [11:58] <@ericb2> +#define CM_ERASE_ALLINK        8
41 : [11:58] <@ericb2> +#define CM_ERASE_INK   9
42 : [11:58] <@ericb2> +#define CM_FIRST_SLIDE 10
43 : [11:58] <@ericb2> +#define CM_LAST_SLIDE  11
44 : [11:58] <@ericb2> +#define CM_SLIDES              12
45 : [11:58] <@ericb2>  
46 : [11:58] <@ericb2>  #endif
47 : [11:58] <@ericb2> As you can see, the - mean : the line is the previous version
48 : [11:59] <@ericb2> the + the new one
49 : [11:59] <@ericb2> in this patch, the deve loper added new constants
50 : [11:59] <@ericb2> 1) Create patches using svn
51 : [11:59] <@ericb2> Lot of possibilities. Below some of them. Probably better solutions do exist. This is just a little inventory of the possibilities.
52 : [11:59] <@ericb2> 1.1) you got a tree, did some modifications, and you want to send the patch to a friend
53 : [12:00] <@ericb2> To visualize the changes :
54 : [12:00] <@ericb2> ordinateur-de-eric-b-2:~/Desktop/moz2seamonkey01 ericb$ svn diff slideshow/source/inc/userpainteventhandler.hxx
55 : [12:00] <@ericb2> The command (without the prompt) is :
56 : [12:00] <@ericb2> svn diff slideshow/source/inc/userpainteventhandler.hxx
57 : [12:00] <@ericb2> Comment:  we only check the changes in 1 filme there
58 : [12:00] <@ericb2> The result is :
59 : [12:00] <@ericb2> Index: slideshow/source/inc/userpainteventhandler.hxx
60 : [12:00] <@ericb2> ===================================================================
61 : [12:00] <@ericb2> --- slideshow/source/inc/userpainteventhandler.hxx      (revision 267652)
62 : [12:00] <@ericb2> +++ slideshow/source/inc/userpainteventhandler.hxx      (working copy)
63 : [12:00] <@ericb2> @@ -53,6 +53,9 @@
64 : [12:00] <@ericb2>              virtual ~UserPaintEventHandler() {}
65 : [12:01] <@ericb2>  
66 : [12:01] <@ericb2>              virtual bool colorChanged( RGBColor const& rUserColor ) = 0;
67 : [12:01] <@ericb2> +
68 : [12:01] <@ericb2> +                       virtual bool eraseAllInkChanged(bool const& rEraseAllInk) =0;
69 : [12:01] <@ericb2> +                       virtual bool eraseInkChanged(bool const& rEraseInk) =0;
70 : [12:01] <@ericb2>              virtual bool disable() = 0;
71 : [12:01] <@ericb2>          };
72 : [12:01] <@ericb2> Now, to create the patch for true, the command is
73 : [12:01] <@ericb2> svn diff slideshow/source/inc/userpainteventhandler.hxx > my pretty patch.diff
74 : [12:01] <@ericb2> And " my_pretty_patch.diff " will contain the same.
75 : [12:01] <achan66> sorry what do you mean patch for true>
76 : [12:01] <achan66> ?
77 : [12:02] <@ericb2> Remark: if you are domain developer, you'll be asked for your passphrase
78 : [12:02] <@ericb2> achan66: the first command line returns everything on the standard output -> the screen
79 : [12:02] <achan66> okay thanks
80 : [12:02] <@ericb2> achan66: you're welcome :)
81 : [12:02] <@ericb2> 1.2) you want to create a patch between a cws and a milestone (the one the cws is based on )
82 : [12:02] <@ericb2> For example, to extract the changes in helpcontent2, ab65 introduced
83 : [12:03] <@ericb2> ab65 is the cws name, and was based on DEV300_m35
84 : [12:03] <@ericb2> in one line :
85 : [12:03] <@ericb2> svn diff http://svn.services.openoffice.org/ooo/tags/DEV300_m35/helpcontent2 http://svn.services.openoffice.org/ooo/cws/ab65/helpcontent2 > mydiff.diff
86 : [12:04] <@ericb2> Comment : as you can see, we use URLs, means you need a working internet connexion, and subversion installed :-)
87 : [12:04] <@ericb2> Important: for the eventual commiters, svn 1.5.4 or more is *mandatory* to avoid creating garbage in the dev tree :)
88 : [12:04] <@ericb2> 1.3) you want to create a patch between two svn revisions for a given cws
89 : [12:05] <@ericb2> Tip : you can follow the recent commits there : http://cia.vc/stats/project/OOo
90 : [12:05] <Kamots> ab65 is the cws name, and was based on DEV300_m35
91 : [12:05] <@ericb2> Example of change (in one line) :
92 : [12:05] <@ericb2> Kamots: exactly
93 : [12:05] <@ericb2> svn diff http://svn.services.openoffice.org/ooo/cws/ooo31gsl2/vcl@268180 http://svn.services.openoffice.org/ooo/cws/ooo31gsl2/vcl@268182
94 : [12:05] <Kamots> oh sorry! my mouse slipped
95 : [12:06] <@ericb2> Remark : the revision syntax  is @number
96 : [12:06] <@ericb2> Other possible syntax : dates are allowed
97 : [12:06] <@ericb2> 1.4) using svn log, you want to create the diff between two revisions of the same file
98 : [12:07] <@ericb2> For example :
99 : [12:07] <@ericb2> ordinateur-de-eric-b-2:~/Desktop/moz2seamonkey01 ericb$ svn log configure.in
100 : [12:07] <@ericb2> Means:  I'm working in moz2seamonkey01 tree ( svn info will confirm )
101 : [12:08] <@ericb2> Just some of the returned lines :
102 : [12:08] <@ericb2> (because the log is very long for some often modified files )
103 : [12:08] <@ericb2> r267684 | ericb | 2009-02-12 18:13:52 +0100 (Thu, 12 Feb 2009) | 1 line
104 : [12:08] <@ericb2> #i94628# fix a path issue for finding seamonkey01
105 : [12:08] <@ericb2> ------------------------------------------------------------------------
106 : [12:08] <@ericb2> r267656 | ericb | 2009-02-12 14:13:21 +0100 (Thu, 12 Feb 2009) | 1 line
107 : [12:08] <@ericb2> #i94628# other missing changes for Windows
108 : [12:08] <IZBot> porting DEFECT RESOLVED FIXED P3 make seamonkey 1.1.x buildable on Mac OS X http://qa.openoffice.org/issues/show_bug.cgi?id=94628
109 : [12:08] <IZBot> porting DEFECT RESOLVED FIXED P3 make seamonkey 1.1.x buildable on Mac OS X http://qa.openoffice.org/issues/show_bug.cgi?id=94628
110 : [12:10] <@ericb2> lol :)
111 : [12:10] <@ericb2> Practice : try to find the command line yourself ;)
112 : �01[12:10] <@fardad> :)
113 : [12:10] <@ericb2> That's enough for the first part, about create a diff
114 : [12:11] <@ericb2> and other possibilities do exist. What I wanted to show, is you'll have to experiment by yourself, and choose the most adapted to your case
115 : [12:11] <@ericb2> questions ?
116 : [12:12] <jPau> nope
117 : [12:12] <Kamots> so there is no patch command that will generate a .patch file for all modified files?
118 : [12:12] <daeseon_> no
119 : [12:12] <BartB> no questions here
120 : [12:13] <@ericb2> Kamots: diff or svn diff will create a patch. Patch is the next part, and this command will *apply* it
121 : [12:13] <achan66> ic, so far none
122 : [12:13] <@ericb2> I'd like to add an important information
123 : [12:14] <@ericb2> .diff or .patch are the most used suffixes
124 : [12:14] <l_zahir> what happens when a patch fails to be applied?
125 : [12:14] <Kamots> oh ok, thank you
126 : [12:14] <@ericb2> the reason is simple
127 : [12:14] <@ericb2> some editors, when they read .diff or .patch extension, have colored syntax, what is basically interesting
128 : [12:15] <@ericb2> means: you are free to rename your patch whatever you want, but use .diff or .patch as suffix, is generally a good idea
129 : [12:15] <@ericb2> l_zahir: I'll treat the case
130 : [12:15] <@ericb2> l_zahir: in the second part.
131 : [12:15] <l_zahir> ok thanks
132 : [12:16] <WFred__> does this apply to non-C++ code such as PERL??
133 : [12:16] <@ericb2> WFred__: so far, diff can diff everything
134 : [12:16] <WFred__> :D
135 : [12:16] <@ericb2> WFred__: just use -a when you are diffing binary files
136 : [12:16] <@ericb2> WFred__: just try
137 : [12:17] <WFred__> what does the -a option do?
138 : [12:17] <@ericb2> WFred__: in OOo source tree we have makefiles, C++ , Java, Python , whatever
139 : [12:17] <@ericb2> WFred__: even .jpg or binaries blobs
140 : [12:18] <@ericb2> WFred__: man diff told me " treat all files as text"
141 : [12:18] <@ericb2> WFred__: usefull when binaries are diff'ed
142 : [12:18] <WFred__> oh ok thanks
143 : [12:18] <@ericb2> WFred__: to be sure, you can use  diff -Naur old_tree new_tree
144 : [12:19] <@ericb2> WFred__: more precisely : diff -Naur old_tree new_tree W > my_patch.diff
145 : [12:19] <@ericb2> Part 2 :
146 : [12:19] <@ericb2>  Apply a patch
147 : [12:19] <@ericb2> Essential options :
148 : [12:19] <@ericb2> --dry-run : fakes the patch application *extremely usefull* if you want to check whether a patch will apply, without create garbage in your tree
149 : [12:20] <@ericb2> -R : reverse it -> we suppose you already applied the patch, did no change and want to reverse the patch, to retrieve the same code as before
150 : [12:20] <@ericb2> -p0 :  apply a patch using the exact path the files have.  Important: your tree does match with the path of the file the patch will be applied, *AND*
151 : [12:20] <@ericb2> you apply it from the right location
152 : [12:20] <@ericb2> -p1 : you remove the first subdir of the path for every to be patched file listed in th patch
153 : [12:21] <@ericb2> -p2  you remove two  .. and so on
154 : [12:21] <@ericb2> Correct way of application :
155 : [12:21] <@ericb2> Fake the application :
156 : [12:21] <@ericb2> patch --dry-run -p0 < my_patch.diff
157 : [12:21] <@ericb2> If nothing wrong occurs, remove the --dry-run option, and apply it for true :
158 : [12:21] <@ericb2> patch -p0 < my_patch.diff
159 : [12:22] <@ericb2> Other possibility, not recommended because of the UUOC (useless use of cat) :
160 : [12:22] <@ericb2> cat my_patch.diff | patch -p0
161 : [12:22] <@ericb2> Now, something important, people do not understand easely
162 : [12:22] <@ericb2> Depth of the application:
163 : [12:22] <@ericb2> e.g. let's suppose a patch has to modify
164 : [12:23] <@ericb2> vcl/source/aqua/source/window/salframeview.mm
165 : [12:23] <@ericb2> vcl/source/aqua/source/gdi/salprn.cxx
166 : [12:23] <@ericb2> vcl/source/aqua/inc/salframeview.h
167 : [12:23] <@ericb2> You can apply the patch from :
168 : [12:23] <@ericb2> 1) the root of the sources :
169 : [12:23] <@ericb2> patch -p0  < my_patch.diff
170 : [12:23] <@ericb2> 2) inside vcl :
171 : [12:23] <@ericb2> but you have to remove the first element of the path for every patched file
172 : [12:24] <@ericb2> patch -p1 < my_patch.diff
173 : [12:24] <@ericb2> (was -p0)
174 : [12:24] <@ericb2> 3) inside vcl/aqua
175 : [12:24] <@ericb2> patch -p2 < my_patch.diff
176 : [12:24] <@ericb2> BUT ...
177 : [12:24] <@ericb2> You cannot apply  patch from elsewhere, because the paths will no longer match with the one every of the file contained in it.
178 : [12:25] <@ericb2> Other case
179 : [12:25] <@ericb2> 3) mix of applying patches + svn use
180 : [12:25] <@ericb2> e.g. you did a wrong change in a module, and you want to reverse it directly :
181 : [12:25] <@ericb2> cd  module
182 : [12:25] <@ericb2> svn diff  apath/afile.cxx  | patch -R -p0
183 : [12:25] <@ericb2> will reverse the bad changes
184 : [12:25] <@ericb2> Other similar case :
185 : [12:26] <@ericb2> for the entire local tree this time
186 : [12:26] <@ericb2> svn diff .  | patch -R -p0
187 : [12:27] <@ericb2> I'm sorry, but I'll have to stop for 15 to 20 minutes.
188 : [12:27] <@ericb2> So I ask you to prepare questions, experiment and so on for when I'll be back
189 : [12:27] <@ericb2> ok ?
190 : �01[12:27] <@fardad> thanks...
191 : �01[12:27] <@fardad> will do
192 : [12:28] <@ericb2> fardad: ok. See in later. and sorry again
193 : �01[12:28] <@fardad> thats very ok, this give us time to digest the info.... cu in 20
194 : [12:44] <@ericb2> Questions :-)
195 : [12:44] <@ericb2> ?
196 : [12:44] <arBraini> ericb2: wb
197 : �01[12:45] <@fardad> we are back too...
198 : [12:45] <l_zahir> I had problems applying a patch manually, could you please explain this
199 : [12:46] <l_zahir> the patch was :
200 : [12:46] <l_zahir> http://www.puppylinux.ca/puppyfiles/sources/kernel-2.6.25.11/patches-required.txt
201 : [12:47] <l_zahir> for this problem:
202 : [12:47] <l_zahir> http://www.puppylinux.ca/puppyfiles/sources/kernel-2.6.25.11/patches-required.txt
203 : [12:47] <l_zahir> sorry this:
204 : [12:47] <l_zahir> http://daeseonmoon.wordpress.com/2009/02/02/build-openoffice-phase-2-rhino-build-fail-with-openjdk/
205 : [12:48] <@ericb2> l_zahir: this patch does have *extra* names in the path
206 : [12:49] <l_zahir> ok , I looked for the file and found them
207 : [12:49] <daeseon_> ericb2: so we need to use -p option
208 : [12:49] <@ericb2> l_zahir: so, what you have to do is 1) use -p option, with the right value AND apply the patch from the right place
209 : [12:49] <@ericb2> daeseon_: mandatory there
210 : [12:50] <l_zahir> is right place always one directory above the file?
211 : [12:50] <l_zahir> cause I noticed every body doing that
212 : [12:50] <l_zahir>  <../
213 : [12:51] <@ericb2> l_zahir: I think you can put the patch in rhino, and try to apply it directly, using -p0
214 : [12:51] <l_zahir> ok
215 : [12:51] <@ericb2> l_zahir: to be sure, I test with m40
216 : [12:51] <l_zahir> does the patch fail if the line numbers do not match the file?
217 : [12:52] <l_zahir> thanks
218 : [12:52] <l_zahir> cause the patch fails (half of it )
219 : [12:52] <@ericb2> l_zahir: Please excuse me
220 : [12:53] <@ericb2> l_zahir: the patch must be applied using -p1 fomr inside rhino, and using -p0 from the root dir
221 : [12:53] <l_zahir> and I tried to apply it manually but the out come wouldn't make sense and laft me with open xml tags
222 : [12:53] <l_zahir> ok
223 : [12:53] <l_zahir> I did not use any -p
224 : [12:53] <@ericb2> l_zahir: in fact only -p0 from the root dir works
225 : [12:53] <@ericb2> l_zahir: and the patch gives garbage
226 : [12:53] <@ericb2> l_zahir: now to answer to your previosu question, a patch can cause disorder
227 : [12:53] <l_zahir> but the location of the code lines were wrong too
228 : [12:54] <l_zahir> ok
229 : [12:54] <@ericb2> l_zahir: yes, the patch does not apply, but I'll create a new one for you (if I can now)
230 : [12:54] <l_zahir> :)
231 : [12:54] <l_zahir> than you
232 : [12:54] <@ericb2> l_zahir: to summarize :
233 : [12:54] <@ericb2> patch --dry-run -p0 < buildfix-openjdk-6-no-rhino.diff
234 : [12:54] <@ericb2> is the right way to apply it
235 : [12:54] <@ericb2> but
236 : �01[12:55] <@fardad> ericb2: everyone is LOLing :)
237 : [12:55] <@ericb2> fardad: why ?
238 : [12:55] <mmu_man> our minister of culture looks nice on this pic: http://www.laquadrature.net/fr/hadopi-albanel-passe-son-oral-0-sur-20
239 : �01[12:55] <@fardad> ericb2: they are amazed that you can just fix the patch "right now"
240 : [12:55] <mmu_man> she likes DRM so probably doesn't like OOo :-(
241 : [12:56] <@ericb2> fardad: I'll try. This happens form time to time
242 : [12:56] <l_zahir> and I spent 3 days non stop and could not get it writ :(
243 : [12:56] <l_zahir> right
244 : [12:56] <@ericb2> two problems with this patch :
245 : [12:56] <@ericb2> patching file rhino/rhino1_5R5.patch
246 : [12:56] <@ericb2> Hunk #1 succeeded at 1206 (offset 32 lines).
247 : [12:56] <IZBot> no issue with number 1
248 : [12:56] <@ericb2> means on hunck will apply with "fuzz" , means will be applied, but cause the creation of file.orig
249 : [12:56] <IZBot> News from cws: hb17: nominated || fwk102: nominated || native226: nominated
250 : [12:57] <@ericb2> saying something not clean happened
251 : [12:57] <@ericb2> + the bad message :
252 : [12:57] <@ericb2> patching file scripting/java/build.xml
253 : [12:57] <@ericb2> Hunk #1 FAILED at 85.
254 : [12:57] <IZBot> no issue with number 1
255 : [12:57] <@ericb2> saying the result will be put in
256 : [12:57] <@ericb2> 1 out of 1 hunk FAILED -- saving rejects to file scripting/java/build.xml.rej
257 : [12:58] <@ericb2> to fix that, we need to apply it for true, and see what happened
258 : [12:58] <@ericb2> to the one who don't know how to proceed
259 : [12:59] <@ericb2> patches are created with the building environment
260 : [12:59] <l_zahir> the fixes to scripting/java/build.xml in the patch aws not clear for me
261 : [12:59] <@ericb2> e.g. on Mac OS X  source MacOSXX86Env.Set.sh
262 : [12:59] <@ericb2> then, you have to go into rhino
263 : [12:59] <@ericb2> and type :
264 : [13:00] <@ericb2> dmake patch
265 : [13:01] <@ericb2> then, apply the changes you are supposed to apply in the new patch in the output tree -> unxmacxi.pro there
266 : [13:01] <@ericb2> (I'll continue after)
267 : [13:01] <@ericb2> then do :
268 : [13:01] <@ericb2> (once the changes are ok): :
269 : [13:01] <@ericb2> dmake create patch
270 : [13:01] <@ericb2> sorry
271 : [13:01] <@ericb2> dmake create_patch
272 : [13:01] <@ericb2> this command will create a new patch, replacing the previous one and including all the changes you did manually
273 : [13:01] <@ericb2> that's all
274 : [13:03] <@ericb2> l_zahir: now, maybe the change is obsolete, means cannot be applied. I'm not an .xml specialist, but I can have a look
275 : [13:03] <l_zahir> I would appreciate that
276 : [13:05] <l_zahir> So each successful Hunk means that 1 file has been modified? Or a part of a file?
277 : [13:05] <@ericb2> l_zahir: can be a part of a file, when several changes occur in the same file
278 : [13:05] <@ericb2> l_zahir: means it depends
279 : [13:05] <l_zahir> ok
280 : [13:06] <l_zahir> and after applying each patch should we dmake clean   and  build again?
281 : [13:06] <l_zahir> or we shoul apply all the patches from the beginning to the source code ?
282 : [13:06] <@ericb2> l_zahir: dmake create_patch will create a backup of the previous one ( .bak ) and build should be ok
283 : [13:07] <l_zahir> Ok , thanks
284 : [13:07] <@ericb2> l_zahir: no, so far, when you are inside a module, you just have to build it : build does it (supposing you sourced the environment file)
285 : [13:07] <@ericb2> l_zahir: deliver at the end, to put everything in the solver
286 : [13:07] <@ericb2>  l_zahir and then you can continue the build
287 : [13:08] <@ericb2> l_zahir: back to this patch, the change look completely uncompatible
288 : [13:08] <l_zahir> yes but it worked for others
289 : [13:09] <@ericb2> l_zahir: interesting. Do you remember the milestone used for the build ?
290 : [13:09] <l_zahir> 40 and 41
291 : [13:10] <@ericb2> l_zahir: did the patch apply without garbage ?
292 : [13:10] <l_zahir> Daeseon did it manually
293 : �01[13:10] <@fardad> ericb2: intersting to know that for both build daeseon_ applied the patched manually :)
294 : [13:10] <l_zahir> but I couldn't
295 : [13:10] <l_zahir> He is the smartest here
296 : [13:11] <@ericb2> daeseon_: can yo please tell me more  : did it break, then you applied the patch ? Or did you proceed differently ?
297 : [13:12] <daeseon_> ericb2:I saw the patch files and open the file which need to be changed using vi
298 : [13:12] <daeseon_> and then manuall I made change
299 : [13:12] <@ericb2> daeseon_: ok, then you fixed it manually
300 : [13:12] <@ericb2> daeseon_: that's the only solution I see
301 : [13:12] <daeseon_> ericb2:yes. I didn't know how to create patch file and
302 : [13:13] <@ericb2> daeseon_: ok, no problem
303 : [13:13] <daeseon_> how to apply patch using patch command
304 : [13:13] <daeseon_> Now I know...
305 : [13:13] <@ericb2> what I propose : I'll continue after with the patch and I'll finish the presentation. Still a little part to say
306 : [13:13] <@ericb2> ok ?
307 : [13:14] <l_zahir> Daeseon:good you did not know, otherwise you would be confused :)
308 : �01[13:14] <@fardad> ericb2: now that daeseon_ patched it  and it worked, can't he diff the files and recreate the proper patch?
309 : �01[13:14] <@fardad> ericb2: sorry, please continue...
310 : [13:14] <@ericb2> fardad: yes, he can , but he'll have to backup the modified file, cleanup the tree, and restart dmake patch .. replace the modified files .. dmake create_patch
311 : [13:15] <@ericb2> fardad: thanks :)  We suppose now we did a change, applied whatever patch
312 : [13:15] <@ericb2> Next part is :
313 : [13:15] <@ericb2> 4) Rebuild a module where a patch has been applied
314 : [13:15] <@ericb2> 4.1. Introduction
315 : [13:15] <@ericb2> We suppose we modified some files, and we need to rebuild a lib. The scheme is always the same, in every module concerned by the build
316 : [13:15] <@ericb2> - the first prj/build.lst does contain the modules dependencies, means all the listed modules are prerequisites
317 : [13:16] <@ericb2> - everything built inside a module is put in type_os_proc.pro
318 : [13:16] <@ericb2> e.g. on Mac OS X, type == unx ,  os == macx  ,  I for Intel -> output dir is unxmacxi.pro in every module
319 : [13:17] <@ericb2> Note:  have a look in solenv/inc  -> all the possible arch/os have their own makefile, containing the essential for the build. unxlngi4.mk  unxmacxi.mk unxmacxp.mk .. and so on :  everything is there
320 : [13:17] <@ericb2> The last modification date is used to check the dependencies.
321 : [13:17] <@ericb2> Rule : If a .o is older than it's dependencies, it is rebuild
322 : [13:17] <@ericb2> -> once you modified a file ( touch file is enough) , build in a module will create a new lib
323 : [13:17] <@ericb2> or more generally, new binaries
324 : [13:18] <@ericb2> 4.2 ) Example : rebuild libvclmxi.dylib on Mac ( .so on Linux, .dll on Windows )
325 : [13:18] <@ericb2> Hypothesis : we suppose the build is completed, and successfull.
326 : [13:18] <@ericb2> cd vcl
327 : [13:18] <@ericb2> touch aqua/source/gdi/sallayout.cxx
328 : [13:18] <@ericb2> -> even without a change, the matching .o will be rebuilt
329 : [13:19] <@ericb2> build
330 : [13:19] <@ericb2> ! not dmake inside a module
331 : [13:19] <@ericb2> but dmake can be used in a subdir containing a makefile.mk file
332 : [13:20] <@ericb2> e.g. dmake test will build whatever respecting the target "test" if there is one existing in the makefile.mk file located in the current dir
333 : [13:20] <@ericb2> Other tip :
334 : [13:20] <@ericb2> If you are in aqua/source/gdi , and you want to rebuild *only* the files listed in the makefile in the current dir, do :
335 : [13:20] <@ericb2> dmake killobj
336 : [13:20] <@ericb2> build
337 : [13:20] <@ericb2> Once done, and if you want to see the changes packaged, do  : deliver
338 : [13:21] <@ericb2> cd ../instsetoo_native
339 : [13:21] <@ericb2> mv unxmacxi.pro
340 : [13:21] <@ericb2> unxmacxi.pro_back
341 : [13:21] <@ericb2> (in one line)
342 : [13:21] <@ericb2> build
343 : [13:21] <@ericb2> will recreate a new installset
344 : [13:21] <@ericb2> Else, if you just want to test your lib, put it in the right subdir
345 : [13:21] <@ericb2> (probably in <Install_dir>/OpenOffice.org.app/Contents/basis-link/program on Mac OS X )
346 : [13:22] <@ericb2> same for any binary, or resource file ( .res ) when you modify the layout
347 : [13:22] <@ericb2> Now, we'll start the gdb part
348 : [13:22] <@ericb2> 5 ) Build including symbols.
349 : [13:22] <@ericb2> Example
350 : [13:22] <@ericb2> cd vcl
351 : [13:23] <@ericb2> mv unxmacxi.pro unxmacxi.pro_back  # keep the normal build
352 : [13:23] <@ericb2> build debug="a_non_empty_sting"   #  means " build debug=t  "  is ok
353 : [13:23] <@ericb2> The final lib, including symbols for debugging, will be in unxmacxi.pro/lib (on Mac OS X )
354 : [13:23] <@ericb2> Replace the one  already  in <Install_dir>/OpenOffice.org.app/Contents/basis-link/program on Mac OS X
355 : [13:23] <@ericb2> and the last thing for today (will prepare the next presentation) :
356 : [13:23] <@ericb2> To debug using gdb,do :
357 : [13:23] <@ericb2> cd  <Install_dir>/OpenOffice.org.app/Contents/program
358 : [13:23] <@ericb2> gdb --args soffice apath/afile
359 : [13:23] <@ericb2> "r"  (to start) .. and so on;
360 : [13:23] <@ericb2> Happy debugging !
361 : [13:24] <@ericb2> Sorry for being long, but that's all for today :)
362 : [13:24] <tct13> hello everybody
363 : [13:24] <tct13> hello ericb2
364 : [13:24] <tct13> :-)
365 : [13:24] <@ericb2> tct13: hello
366 : [13:25] <l_zahir> Thanks
367 : [13:25] <tct13> i'm the romanian from fosdem that stated the implication of its organization in openoffice education
368 : [13:25] <Kamots> hello
369 : [13:25] <@ericb2> l_zahir: you're welcome
370 : [13:25] <Kamots> thank you very much eric
371 : [13:25] <@ericb2> tct13: hello :)
372 : [13:25] <tct13> :-)
373 : [13:25] <@ericb2> Kamots: you're welcome
374 : [13:25] <BartB> ericb2: where on the wiki will all of this be posted?
375 : [13:26] <@ericb2> @all :  http://wiki.services.openoffice.org/wiki/Education_ClassRoom/Practice#SVN_use
376 : [13:26] <achan66> yey thanks
377 : [13:26] <achan66> i was gonna ask that
378 : [13:26] <@ericb2> I'll complete once possible
379 : [13:26] <@ericb2> this is not perfect, and everybody is welcome to improve, and add information !
380 : [13:26] <@ericb2> thanks in advance
381 : [13:26] <@ericb2> :-)
382 : [13:27] <BartB> thank you
383 : [13:27] <daeseon_> thank you eric. It is really useful.
384 : [13:27] <@ericb2> l_zahir: I'll have a look at your patch
385 : [13:27] <@ericb2> daeseon_: you're welcome :)
386 : [13:27] <tct13> me and my associate continued the discussion with Sun officials. we plan a Sun event at the very beginning of the Campus Ambassador programme, at the end of February
387 : [13:27] <@ericb2> tct13: great.
388 : [13:27] <l_zahir> thank you , I'm looking forward to the result
389 : [13:27] <tct13> meanwhile, we document on ooo developing from education.ooo
390 : [13:27] <tct13> :-D
391 : [13:28] <@ericb2> l_zahir: just be a bit patient: it will be dinner time. But I'll be there afterwars
392 : [13:28] <@ericb2> afterwards
393 : [13:28] <l_zahir> :)
394 : [13:28] <l_zahir> thanks
395 : [13:28] <@ericb2> tct13: just to avoid misunderstanding:  Sun does not provide me any information. Means does not really share ;)
396 : [13:28] <tct13> ericb2: just wanted to let you know, we'll probably ask some questions this days
397 : �01[13:29] <@fardad> ok, this ends the session for today, thanks again and see you on thursday same time :)
398 : [13:29] <tct13> well, this is why I told you :-)
399 : [13:29] <@ericb2> l_zahir: the probem you could have, is a working patch can be created, but can break the build
400 : [13:29] <@ericb2> tct13: thanks :)
401 : [13:29] <@ericb2> tct13: can we continue in  say, 1h30 ?
402 : [13:29] <l_zahir> yes
403 : [13:29] <tct13> sure :-)
404 : [13:29] <@ericb2> tct13: I'm sorry, this is dinner time
405 : [13:29] <tct13> i already had
406 : [13:29] <@ericb2> tct13: ok, then later :)
407 : [13:29] <tct13> gmt + 2 :-P
408 : [13:29] <tct13> ok
409 : [13:30] <@ericb2> tct13: I'm sorry, but I really will have to stop
410 : [13:30] <tct13> bone a petit
411 : [13:30] <l_zahir> ericb2: have a good day
412 : [13:31] <Kamots> thanks again, take care everyone
413 : [13:31] <@ericb2> thanks to all :-)

Second Session

1 : [12:04] <@ericb2> ok, let's start ?
2 : �01[12:04] <@fardad> we are ready (missing 3 students, but its their loss)
3 : [12:04] <@ericb2> ok
4 : [12:04] <@ericb2> Outline of the ClassRoom
5 : [12:04] <@ericb2> Prerequisites for the test
6 : [12:04] <@ericb2> Reminder about what happens when building in a module
7 : [12:04] <@ericb2> Add symbols in a library
8 : [12:04] <@ericb2> Introduction of gdb use
9 : [12:04] <@ericb2> Launch OOo using gdb
10 : [12:05] <@ericb2> Play with it (discovery)
11 : [12:05] <@ericb2> So today, we'll start playing with gdb + Ooo
12 : [12:06] <@ericb2> who does have a full OOo build at hand ?
13 : [12:06] <@ericb2> ok :)
14 : [12:06] <@ericb2> As pre-requisites , I'll suppose :
15 : [12:06] <@ericb2> - there is a complete build working already
16 : [12:06] <@ericb2> - there is a working installset , and we will launch it using the terminal
17 : [12:06] <@ericb2> Thus, if you want to redo at home, or later, you just have to read and try
18 : [12:06] <@ericb2> Reminder : what happens when something is built
19 : [12:07] <@ericb2> we'll use <module> for whatever subdir of the OOo tree, aka "module" most of the time
20 : [12:08] <@ericb2> <module>/prj/build.lst does contain the list of the subdirs containing a makefile
21 : [12:08] <@ericb2> Means:  Every product is built in the output dir. e.g. : unxmacxi.pro on Mac Intel
22 : [12:08] <@ericb2> we have the same tree inside all the modules:
23 : [12:08] <@ericb2> unxmacxi.pro/bin
24 : [12:08] <@ericb2> unxmacxi.pro/lib
25 : [12:08] <@ericb2> unxmacxi.pro/inc
26 : [12:09] <@ericb2> ... and so on (look yourself )
27 : [12:09] <@ericb2> to rebuild a module, just remove this directory
28 : [12:09] <@ericb2> Once all the .o are build, the libs, and/or the binaries / resources / whatever are  "delivered" from the unxmacxi.pro dir to the solver
29 : [12:11] <@ericb2> The information providing the list of what has to be delivered is always in : <module>/prj/d.lst
30 : [12:11] <@ericb2> these files are text files, using a "Windows"  separator, but this is not a problem at all
31 : [12:13] <@ericb2> If we summarize : a normal build provides binaries like libraries, who are stripped when the are delivered. Between the unxmacxi.pro and their place in the "solver "
32 : [12:14] <@ericb2> Important:  to be able to trace using gdb, we'll need to add symbols, lines of code and a lot of information inside the binaries
33 : [12:14] <@ericb2> Howto add symbols in a library ?
34 : [12:14] <@ericb2> 1) first approach
35 : [12:14] <@ericb2> -> look at configure extra option : --disable-strip-solver
36 : [12:15] <@ericb2> To verify by yourself, just place you at the root of the sources (since DEV300_m40, there is no longer config_office subdir)
37 : [12:15] <@ericb2> and do : ./configure --help | grep -4 solver
38 : [12:16] <@ericb2> you'll have several lines explaining the right option
39 : [12:16] <@ericb2> Tip : if you're familiar with configure, better read configure itself, more informative ;-)
40 : [12:17] <@ericb2> and if you know a bit of autoconf, you can even hack configure.in, and run autoconf to regenerate a new configure :)
41 : [12:18] <@ericb2> The first approach has a drawback : just a bit of information is inside the binary, and that's not enough most of the time, when you have a complex problem to solve
42 : [12:19] <@ericb2> 2) second approach
43 : [12:19] <@ericb2> consider only a part of the code, for tracing
44 : [12:20] <@ericb2> The method is equivalent to use  --enable-debug at configure time, but nobody uses this option. the reason is simple : all libraries become huges, and OOo won't probably launch correctly.
45 : [12:21] <@ericb2> e.g. : the libsw (writer) becomes 660MB heavy
46 : �01[12:22] <@fardad> ericb2: when you say correctly, does it mean it will be too slow, or it will not function properly?
47 : [12:22] <Kamots> wow, that's a lot of extra weight
48 : [12:22] <@ericb2> fardad: yes, imagine 10 libs of 500MB every + some other 100MB and so on
49 : [12:23] <@ericb2> Kamots: I'll explain you how to proceed
50 : �01[12:23] <@fardad> wow, :o
51 : [12:24] <@ericb2> Other important information
52 : [12:24] <@ericb2> about assertions
53 : [12:24] <@ericb2> There is another option in configure
54 : [12:24] <@ericb2>  --enable-dbgutil
55 : [12:25] <@ericb2> Include additional debugging utilities, such assertions, object counting, etc. Larger build.
56 : [12:25] <@ericb2>   Independent from --enable-debug
57 : [12:25] <@ericb2>  the *second one* does concern assertions in the code :
58 : [12:25] <@ericb2> DBG_ASSERT( !(rALR.flags & kATSGlyphInfoTerminatorGlyph),
59 : [12:25] <@ericb2>                         "ATSLayout::InitGIA(): terminator glyph not marked as deleted!" );
60 : [12:25] <@ericb2> -> if the condition is not verified -> boom .. and a window will appear, containing the message
61 : [12:26] <@ericb2> if --enable-dbgutil is not in the configure command line, assertions are not included
62 : [12:26] <@ericb2> As you understood, assertions are for development, not for end users ;-)
63 : [12:27] <@ericb2> So, we use to add symbols for debugging for some libs, in a given module only
64 : [12:27] <@ericb2> Counterpart : needs to rebuild the module
65 : [12:27] <@ericb2> The process is very simple :
66 : [12:28] <@ericb2> cd <module>
67 : [12:28] <@ericb2> mv unxmacxi.pro unxmacxi.pro_backup
68 : [12:28] <@ericb2> build debug=t
69 : [12:28] <@ericb2> Do *always* a backup of your build, because the binaries in the output tree, do match with stamps in the solver
70 : [12:29] <@ericb2> if you modify something, you'll have to redo a build, and a "deliver". Elser, the build can break at postprocess, or at then end, because the stamp between the solver and the module do not match
71 : [12:29] <@ericb2> that's just harmless, but if you are not aware, you can lose a while before someone explains you what happens
72 : [12:30] <@ericb2> As example, I'll rebuild a little lib , to show you the difference
73 : [12:31] <@ericb2> cd apple_remote/
74 : [12:31] <@ericb2> source ../MacOSXX86Env.Set.sh
75 : [12:31] <@ericb2> sorry, I forgot :-)
76 : [12:32] <@ericb2> mv unxmacxi.pro unxmacxi.pro_back
77 : [12:32] <@ericb2> build debug=t
78 : [12:32] <@ericb2> Important:  whatever you put, will work
79 : [12:32] <@ericb2> t is one letter, but once the string is not empty, debug is true
80 : [12:33] <@ericb2> means all the code included between #ifdef DEBUG ... #endif  or some other macros, will be included
81 : [12:34] <@ericb2> e.g. :
82 : [12:34] <@ericb2> #ifdef DEBUG
83 : [12:34] <@ericb2>         // debug purpose
84 : [12:34] <@ericb2>     NSLog(@"reset... (after listening to remote)");
85 : [12:34] <@ericb2> #endif
86 : [12:34] <@ericb2> -> in the terminal, I'll see the information
87 : [12:34] <@ericb2> NSLog is sort of cout
88 : �01[12:35] <@fardad> ic, 
89 : [12:35] <@ericb2> After the rebuild :
90 : [12:35] <@ericb2> ls -l  unxmacxi.pro/lib/libAppleRemotemxi.dylib
91 : [12:35] <@ericb2> -rwxr-xr-x   1 ericb  ericb  159932 Feb 19 18:31 unxmacxi.pro/lib/libAppleRemotemxi.dylib
92 : [12:35] <@ericb2> ls -l unxmacxi.pro_back/lib/libAppleRemotemxi.dylib
93 : [12:35] <@ericb2> -rwxr-xr-x   1 ericb  ericb  52436 Feb 12 14:31 unxmacxi.pro_back/lib/libAppleRemotemxi.dylib
94 : [12:36] <@ericb2> the first one does contain strings and a lot of other stuff
95 : [12:37] <@ericb2> Now .. Launch OOo in a terminal :)
96 : [12:37] <@ericb2> before, we'll copy the lib in the bundle
97 : [12:37] <IZBot> News from cws: native227: created
98 : [12:38] <@ericb2> For the rest, my bundle is in the Desktop/test_eraser folder (I'm on Mac OS X )
99 : [12:38] <@ericb2> Means, the Bundle is the dir : ~/Desktop/test_eraser/OpenOffice.org.app
100 : [12:38] <@ericb2> So, I'll open a terminal, and I'll do :
101 : [12:38] <@ericb2> cd ~/Desktop/test_eraser/OpenOffice.org.app/Contents/program
102 : [12:39] <@ericb2> the idea, is to start gdb form the directory containing soffice (the binary )
103 : [12:39] <@ericb2> and the command line is :
104 : [12:40] <@ericb2> gdb --args ~/Desktop/est.odp
105 : [12:40] <@ericb2> you'll see gdb tell you a lot of things. If you don't want to see that the next time, you can add -q (for quiet) option
106 : [12:41] <@ericb2> as you can see nothing happens :)
107 : [12:41] <@ericb2> the reason is: the binary is not "running"
108 : [12:42] <@ericb2> oops, sorry
109 : [12:42] <@ericb2> gdb --args soffice  ~/Desktop/est.odp
110 : [12:42] <@ericb2> is the right command line
111 : [12:42] <@ericb2> to redo; just enter "q"
112 : [12:42] <@ericb2> and type the correct command
113 : [12:42] <@ericb2> now, type r ( shortcut for "run" )
114 : [12:43] <@ericb2> -> OOo will start
115 : [12:43] <@ericb2> and open the file
116 : [12:43] <@ericb2> in the terminal, you no longer have the control. To stop the execution, do "CTRL-C"
117 : [12:44] <@ericb2> Program received signal SIGINT, Interrupt.
118 : [12:44] <@ericb2> 0x90009cd7 in mach_msg_trap ()
119 : [12:44] <@ericb2> (gdb)
120 : [12:44] <@ericb2> OOo is stopped
121 : [12:44] <@ericb2> you can enter whatever command, like " info frame "
122 : [12:44] <@ericb2> to continue, type : c
123 : [12:45] <@ericb2> The result is : (gdb) c
124 : [12:45] <@ericb2> Continuing.
125 : [12:45] <@ericb2> and OOo is no longer stopped
126 : [12:45] <@ericb2> Add a breakpoint
127 : �01[12:45] <@fardad> amazing...
128 : [12:46] <@ericb2> fardad: I know this is difficult like that, but people will redo later, and ask whenever they want
129 : [12:46] <@ericb2> on the channel
130 : [12:46] <@ericb2> we'll explain them
131 : �01[12:46] <@fardad> I understand
132 : [12:46] <@ericb2> Let's add a breakpoint now
133 : [12:47] <@ericb2> to know whether breakpoints are set or not, the command is :
134 : [12:47] <@ericb2> info b
135 : [12:47] <@ericb2> (means info breakpoints)
136 : [12:47] <@ericb2> exactly :
137 : [12:47] <@ericb2> CTRL-C
138 : [12:47] <@ericb2> info b
139 : [12:48] <@ericb2> The result is :
140 : [12:48] <@ericb2> (gdb) info b
141 : [12:48] <@ericb2> No breakpoints or watchpoints.
142 : [12:48] <@ericb2> of course
143 : [12:48] <@ericb2> so let's set one
144 : [12:49] <@ericb2> Since only libAppleRemotemxi.dylib has symbols, I'll have to set one in whatever file included
145 : �01[12:52] <@fardad> oops
146 : �01[12:54] <@fardad> we lost eric!
147 : [12:54] <@ericb2> For instance :
148 : [12:54] <@ericb2> (gdb) l
149 : [12:54] <@ericb2> 113     #ifdef DEBUG
150 : [12:54] <@ericb2> 114         NSString* buttonName = nil;
151 : [12:54] <@ericb2> 115     #endif
152 : [12:54] <@ericb2> 116         if (pressedDown)
153 : [12:55] <@ericb2> 117         {
154 : [12:55] <@ericb2> 118             pressed = @"(pressed)";
155 : [12:55] <@ericb2> 119
156 : [12:55] <@ericb2> 120     #ifdef DEBUG
157 : [12:55] <@ericb2> 121             switch(buttonIdentifier)
158 : [12:55] <@ericb2> 122             {
159 : [12:55] <@ericb2> Current language:  auto; currently objective-c
160 : [12:55] <@ericb2> (gdb)
161 : [12:55] <@ericb2> I can go up or continue
162 : [12:55] <@ericb2> and if I need info, I can check for the stack of frames
163 : [12:55] <@ericb2> (gdb) bt
164 : [12:56] <@ericb2> -> will return the frames, in *reverse* order. Means, the #0 is the last one, and #1 the one before .. and so on
165 : [12:56] <IZBot> no issue with number 1
166 : [12:56] <@ericb2> ooops :-)
167 : [12:56] <@ericb2> Lets choose "n" for next
168 : [12:57] <@ericb2> The result is :
169 : [12:57] <@ericb2> (gdb) n
170 : [12:57] <@ericb2> 121             switch(buttonIdentifier)
171 : [12:57] <@ericb2> IMPORTANT: the current line is NOT executed yet
172 : [12:57] <@ericb2> e.g. if you have  a= 10;
173 : [12:57] <@ericb2> p a
174 : [12:57] <@ericb2> can return whatevert
175 : [12:58] <@ericb2> *only* n will validate the line. This is the context
176 : [12:58] <@ericb2> execution context
177 : [12:58] <@ericb2> n will continue ..
178 : [12:58] <@ericb2> (gdb) n
179 : [12:58] <@ericb2> 126                 case kRemoteButtonPlay:         buttonName = @"Play";                   break;  // MEDIA_COMMAND_PLAY
180 : [12:58] <@ericb2> and of course, we can check for the variable :
181 : [12:58] <@ericb2> (gdb) p buttonIdentifier
182 : [12:58] <@ericb2> $1 = kRemoteButtonPlay
183 : [12:59] <@ericb2> so, it means the  slideshow will start ...
184 : [13:00] <@ericb2> Next instruction :
185 : [13:00] <@ericb2> (gdb) n
186 : [13:00] <@ericb2> 140             [ self postTheEvent:buttonIdentifier modifierFlags: 0 ];
187 : [13:00] <@ericb2> -> means the remote sent a "Play" and I'll inform the vcl there is an event, containing the "Play" information. vcl will forward to Impress, and the slideshow will start
188 : [13:01] <@ericb2> This is only the introduction (if people are intersted, we can do another workshop about gdb another day )
189 : [13:02] <@ericb2> To quit *cleanly*
190 : [13:02] <@ericb2> delete the brekapoints :
191 : [13:02] <@ericb2> d
192 : [13:02] <@ericb2> confirm with yest
193 : [13:02] <@ericb2> yes
194 : [13:02] <@ericb2> c
195 : [13:02] <@ericb2> to continue
196 : [13:02] <@ericb2> and then Quit OOo using CMD Q
197 : [13:03] <@ericb2> The result is :
198 : [13:03] <@ericb2> Program exited normally.
199 : [13:03] <@ericb2> (gdb)
200 : [13:03] <@ericb2> Then quit gdb :
201 : [13:03] <@ericb2> q
202 : [13:03] <@ericb2> -> will give you the normal prompt
203 : [13:03] <@ericb2> back
204 : [13:03] <@ericb2> Questions ?
205 : [13:04] <BartB> not at the moment, might have some later
206 : [13:04] <@ericb2> I forgot, to affect a value,  the command is "set"
207 : [13:04] <@ericb2> e.g. :
208 : [13:04] <MrBraini> ericb2: last lecture you stated the notes from the lectures will be placed on the wiki?  where can we find the notes in the wiki?
209 : [13:04] <@ericb2> (gdb) : set a=10
210 : [13:05] <daeseon_> not now may be later.
211 : [13:05] <@ericb2> MrBraini: I'll put them on the wiki, yes
212 : [13:05] <l_zahir> is there a y way so we can see multiple line before their execution?
213 : [13:05] <@ericb2> l_zahir: list ?
214 : [13:05] <@ericb2> l_zahir: l is the shortcut
215 : [13:06] <@ericb2> l_zahir: I forgot, there is another way to break, using conditional breakpoint
216 : [13:06] <l_zahir> oksu during debugging or before?
217 : [13:06] <@ericb2> l_zahir :  you can go up and down in the frames
218 : [13:06] <@ericb2>  l_zahir to retrieve a context
219 : [13:06] <l_zahir> ok , thanks
220 : [13:07] <@ericb2> l_zahir: I think, the best is to redo a workshop, with everything ready
221 : [13:07] <@ericb2> l_zahir: but nothing will replace the experiences
222 : [13:07] <l_zahir> sure
223 : [13:07] <l_zahir> I will
224 : [13:07] <@ericb2> l_zahir: no problem.
225 : [13:08] <@ericb2> BTW, I provided a patch for rhino and scripting
226 : [13:08] <l_zahir> Oh, good :)
227 : [13:08] <@ericb2> was my fault: two modules where concerned, and this is what caused some issues
228 : [13:08] <@ericb2> l_zahir: one minute, I'll retrive the URL
229 : [13:08] <l_zahir> thanks
230 : [13:08] <l_zahir> :)
231 : [13:09] <@ericb2> http://eric.bachard.free.fr/mac/aquavcl/patches/aqua_February2009/17th_february/complete_rhino_and_scripting_patch.diff
232 : [13:09] <@ericb2> l_zahir: this patch should apply cleanly on m40
233 : [13:09] <@ericb2> l_zahir: not sure it will work, I'm not a Java specialist ;)
234 : [13:09] <@ericb2> ok, I'll have to stop.
235 : [13:09] <l_zahir> I'll try
236 : [13:10] <@ericb2> If you have further questions, ask directly, and if I see them, I'll answer
237 : [13:11] <l_zahir> sure
238 : [13:11] <@ericb2> Other questions ?
239 : [13:12] <@ericb2> If you have no other questions, I'll stop for a while, but in ~2 hours max, I'll be back.
240 : [13:12] <@ericb2> The content of the classroom will be on the wiki
241 : [13:12] <achan66> okay
242 : [13:12] <daeseon_> ok.
243 : [13:12] <@ericb2> later
244 : [13:12] <l_zahir> no Qs
245 : [13:12] <MrBraini> okay thank you
246 : [13:12] <rmwang> Okay Thank you Eric!
247 : [13:13] <@ericb2> thansk to all for coming :)
248 : [13:13] <BartB> thank you Eric
249 : [13:13] <achan66> eric, would it be here?
250 : [13:13] <achan66> http://wiki.services.openoffice.org/wiki/Education_ClassRoom/Practice#SVN_use
251 : [13:13] <@ericb2> achan66: yes, not far
252 : [13:13] <achan66> thank you
253 : [13:13] <WFred___> Thanks Eric!
254 : [13:13] <achan66> = )
255 : [13:13] <@ericb2> achan66: just a tip : look at recent changes on the wiki, say in 2 or 3 hours ;-)
256 : [13:14] <achan66> affirm
257 : [13:14] <MrBraini> okay
258 : [13:14] <Kamots> thank you Eric
259 : [13:15] <daeseon_> thanks Eric
260 : �01[13:19] <@fardad> thanks eric