Changeset 4271 for trunk/includes/admin/converters/vBulletin.php
- Timestamp:
- 10/29/2012 12:12:57 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/includes/admin/converters/vBulletin.php
r4102 r4271 2 2 3 3 /** 4 * Implementation of vBulletin converter. 4 * vBulletin Converter 5 * 6 * @since bbPress (r) 5 7 */ 6 class vBulletin extends BBP_Converter_Base 7 { 8 function __construct() 9 { 8 class vBulletin extends BBP_Converter_Base { 9 10 /** 11 * Main constructor 12 * 13 * @uses vBulletin::setup_globals() 14 */ 15 function __construct() { 10 16 parent::__construct(); 11 17 $this->setup_globals(); 12 18 } 13 19 14 public function setup_globals() 15 { 16 /** Forum Section ******************************************************/ 20 /** 21 * Sets up the field mappings 22 */ 23 private function setup_globals() { 24 25 /** Forum Section *****************************************************/ 17 26 18 27 // Forum id. Stored in postmeta. 19 28 $this->field_map[] = array( 20 'from_tablename' => 'forum', 'from_fieldname' => 'forumid', 21 'to_type' => 'forum', 'to_fieldname' => '_bbp_forum_id' 22 ); 23 29 'from_tablename' => 'forum', 30 'from_fieldname' => 'forumid', 31 'to_type' => 'forum', 32 'to_fieldname' => '_bbp_forum_id' 33 ); 34 24 35 // Forum parent id. If no parent, than 0. Stored in postmeta. 25 36 $this->field_map[] = array( 26 'from_tablename' => 'forum', 'from_fieldname' => 'parentid', 27 'to_type' => 'forum', 'to_fieldname' => '_bbp_parent_id' 28 ); 29 37 'from_tablename' => 'forum', 38 'from_fieldname' => 'parentid', 39 'to_type' => 'forum', 40 'to_fieldname' => '_bbp_forum_parent_id' 41 ); 42 30 43 // Forum title. 31 44 $this->field_map[] = array( 32 'from_tablename' => 'forum', 'from_fieldname' => 'title', 33 'to_type' => 'forum', 'to_fieldname' => 'post_title' 34 ); 35 45 'from_tablename' => 'forum', 46 'from_fieldname' => 'title', 47 'to_type' => 'forum', 48 'to_fieldname' => 'post_title' 49 ); 50 36 51 // Forum slug. Clean name. 37 52 $this->field_map[] = array( 38 'from_tablename' => 'forum', 'from_fieldname' => 'title_clean', 39 'to_type' => 'forum', 'to_fieldname' => 'post_name', 53 'from_tablename' => 'forum', 54 'from_fieldname' => 'title_clean', 55 'to_type' => 'forum', 56 'to_fieldname' => 'post_name', 40 57 'callback_method' => 'callback_slug' 41 58 ); 42 59 43 60 // Forum description. 44 61 $this->field_map[] = array( 45 'from_tablename' => 'forum', 'from_fieldname' => 'description', 46 'to_type' => 'forum', 'to_fieldname' => 'post_content', 62 'from_tablename' => 'forum', 63 'from_fieldname' => 'description', 64 'to_type' => 'forum', 65 'to_fieldname' => 'post_content', 47 66 'callback_method' => 'callback_null' 48 67 ); 49 68 50 69 // Forum display order. Starts from 1. 51 70 $this->field_map[] = array( 52 'from_tablename' => 'forum', 'from_fieldname' => 'displayorder', 53 'to_type' => 'forum', 'to_fieldname' => 'menu_order' 54 ); 55 71 'from_tablename' => 'forum', 72 'from_fieldname' => 'displayorder', 73 'to_type' => 'forum', 74 'to_fieldname' => 'menu_order' 75 ); 76 56 77 // Forum date update. 57 78 $this->field_map[] = array( 58 'to_type' => 'forum', 'to_fieldname' => 'post_date', 59 'default' => date('Y-m-d H:i:s') 60 ); 61 $this->field_map[] = array( 62 'to_type' => 'forum', 'to_fieldname' => 'post_date_gmt', 63 'default' => date('Y-m-d H:i:s') 64 ); 65 $this->field_map[] = array( 66 'to_type' => 'forum', 'to_fieldname' => 'post_modified', 67 'default' => date('Y-m-d H:i:s') 68 ); 69 $this->field_map[] = array( 70 'to_type' => 'forum', 'to_fieldname' => 'post_modified_gmt', 71 'default' => date('Y-m-d H:i:s') 72 ); 73 74 /** Topic Section ******************************************************/ 79 'to_type' => 'forum', 80 'to_fieldname' => 'post_date', 81 'default' => date( 'Y-m-d H:i:s' ) 82 ); 83 $this->field_map[] = array( 84 'to_type' => 'forum', 85 'to_fieldname' => 'post_date_gmt', 86 'default' => date( 'Y-m-d H:i:s' ) 87 ); 88 $this->field_map[] = array( 89 'to_type' => 'forum', 90 'to_fieldname' => 'post_modified', 91 'default' => date( 'Y-m-d H:i:s' ) 92 ); 93 $this->field_map[] = array( 94 'to_type' => 'forum', 95 'to_fieldname' => 'post_modified_gmt', 96 'default' => date( 'Y-m-d H:i:s' ) 97 ); 98 99 /** Topic Section *****************************************************/ 75 100 76 101 // Topic id. Stored in postmeta. 77 102 $this->field_map[] = array( 78 'from_tablename' => 'thread', 'from_fieldname' => 'threadid', 79 'to_type' => 'topic', 'to_fieldname' => '_bbp_topic_id' 80 ); 81 103 'from_tablename' => 'thread', 104 'from_fieldname' => 'threadid', 105 'to_type' => 'topic', 106 'to_fieldname' => '_bbp_topic_id' 107 ); 108 82 109 // Forum id. Stored in postmeta. 83 110 $this->field_map[] = array( 84 'from_tablename' => 'thread', 'from_fieldname' => 'forumid', 85 'to_type' => 'topic', 'to_fieldname' => '_bbp_forum_id', 111 'from_tablename' => 'thread', 112 'from_fieldname' => 'forumid', 113 'to_type' => 'topic', 114 'to_fieldname' => '_bbp_forum_id', 86 115 'callback_method' => 'callback_forumid' 87 116 ); 88 117 89 118 // Topic author. 90 119 $this->field_map[] = array( 91 'from_tablename' => 'thread', 'from_fieldname' => 'postuserid', 92 'to_type' => 'topic', 'to_fieldname' => 'post_author', 120 'from_tablename' => 'thread', 121 'from_fieldname' => 'postuserid', 122 'to_type' => 'topic', 123 'to_fieldname' => 'post_author', 93 124 'callback_method' => 'callback_userid' 94 125 ); 95 126 127 // Topic title. 128 $this->field_map[] = array( 129 'from_tablename' => 'thread', 130 'from_fieldname' => 'title', 131 'to_type' => 'topic', 132 'to_fieldname' => 'post_title' 133 ); 134 135 // Topic slug. Clean name. 136 $this->field_map[] = array( 137 'from_tablename' => 'thread', 138 'from_fieldname' => 'title', 139 'to_type' => 'topic', 140 'to_fieldname' => 'post_name', 141 'callback_method' => 'callback_slug' 142 ); 143 144 // Forum id. If no parent, than 0. 145 $this->field_map[] = array( 146 'from_tablename' => 'thread', 147 'from_fieldname' => 'forumid', 148 'to_type' => 'topic', 149 'to_fieldname' => 'post_parent', 150 'callback_method' => 'callback_forumid' 151 ); 152 96 153 // Topic content. 97 154 $this->field_map[] = array( 98 'from_tablename' => 'post', 'from_fieldname' => 'pagetext', 99 'join_tablename' => 'thread', 'join_type' => 'INNER', 'join_expression' => 'USING (threadid) WHERE post.parentid = 0', 100 'to_type' => 'topic', 'to_fieldname' => 'post_content', 155 'from_tablename' => 'post', 156 'from_fieldname' => 'pagetext', 157 'join_tablename' => 'thread', 158 'join_type' => 'INNER', 159 'join_expression' => 'USING (threadid) WHERE post.parentid = 0', 160 'to_type' => 'topic', 161 'to_fieldname' => 'post_content', 101 162 'callback_method' => 'callback_html' 102 ); 163 ); 164 165 // Topic date update. 166 $this->field_map[] = array( 167 'from_tablename' => 'thread', 168 'from_fieldname' => 'dateline', 169 'to_type' => 'topic', 170 'to_fieldname' => 'post_date', 171 'callback_method' => 'callback_datetime' 172 ); 173 $this->field_map[] = array( 174 'from_tablename' => 'thread', 175 'from_fieldname' => 'dateline', 176 'to_type' => 'topic', 177 'to_fieldname' => 'post_date_gmt', 178 'callback_method' => 'callback_datetime' 179 ); 180 $this->field_map[] = array( 181 'from_tablename' => 'thread', 182 'from_fieldname' => 'dateline', 183 'to_type' => 'topic', 184 'to_fieldname' => 'post_modified', 185 'callback_method' => 'callback_datetime' 186 ); 187 $this->field_map[] = array( 188 'from_tablename' => 'thread', 189 'from_fieldname' => 'dateline', 190 'to_type' => 'topic', 191 'to_fieldname' => 'post_modified_gmt', 192 'callback_method' => 'callback_datetime' 193 ); 194 195 /** Tags Section ******************************************************/ 196 197 // Topic id. 198 $this->field_map[] = array( 199 'from_tablename' => 'tagcontent', 200 'from_fieldname' => 'contentid', 201 'to_type' => 'tags', 202 'to_fieldname' => 'objectid', 203 'callback_method' => 'callback_topicid' 204 ); 205 206 // Tags text. 207 $this->field_map[] = array( 208 'from_tablename' => 'tag', 209 'from_fieldname' => 'tagtext', 210 'join_tablename' => 'tagcontent', 211 'join_type' => 'INNER', 212 'join_expression' => 'USING (tagid)', 213 'to_type' => 'tags', 214 'to_fieldname' => 'name' 215 ); 216 217 /** Post Section ******************************************************/ 218 219 // Post id. Stores in postmeta. 220 $this->field_map[] = array( 221 'from_tablename' => 'post', 222 'from_fieldname' => 'postid', 223 'from_expression' => 'WHERE post.parentid != 0', 224 'to_type' => 'reply', 225 'to_fieldname' => '_bbp_post_id' 226 ); 227 228 // Forum id. Stores in postmeta. 229 $this->field_map[] = array( 230 'from_tablename' => 'post', 231 'from_fieldname' => 'threadid', 232 'to_type' => 'reply', 233 'to_fieldname' => '_bbp_forum_id', 234 'callback_method' => 'callback_topicid_to_forumid' 235 ); 236 237 // Topic id. Stores in postmeta. 238 $this->field_map[] = array( 239 'from_tablename' => 'post', 240 'from_fieldname' => 'threadid', 241 'to_type' => 'reply', 242 'to_fieldname' => '_bbp_topic_id', 243 'callback_method' => 'callback_topicid' 244 ); 245 246 // Author ip. 247 $this->field_map[] = array( 248 'from_tablename' => 'post', 249 'from_fieldname' => 'ipaddress', 250 'to_type' => 'reply', 251 'to_fieldname' => '_bbp_author_ip' 252 ); 253 254 // Post author. 255 $this->field_map[] = array( 256 'from_tablename' => 'post', 257 'from_fieldname' => 'userid', 258 'to_type' => 'reply', 259 'to_fieldname' => 'post_author', 260 'callback_method' => 'callback_userid' 261 ); 103 262 104 263 // Topic title. 105 264 $this->field_map[] = array( 106 'from_tablename' => 'thread', 'from_fieldname' => 'title', 107 'to_type' => 'topic', 'to_fieldname' => 'post_title' 108 ); 109 265 'from_tablename' => 'post', 266 'from_fieldname' => 'title', 267 'to_type' => 'reply', 268 'to_fieldname' => 'post_title' 269 ); 270 110 271 // Topic slug. Clean name. 111 272 $this->field_map[] = array( 112 'from_tablename' => 'thread', 'from_fieldname' => 'title', 113 'to_type' => 'topic', 'to_fieldname' => 'post_name', 273 'from_tablename' => 'post', 274 'from_fieldname' => 'title', 275 'to_type' => 'reply', 276 'to_fieldname' => 'post_name', 114 277 'callback_method' => 'callback_slug' 115 278 ); 116 117 // Forum id. If no parent, than 0. 118 $this->field_map[] = array( 119 'from_tablename' => 'thread', 'from_fieldname' => 'forumid', 120 'to_type' => 'topic', 'to_fieldname' => 'post_parent', 121 'callback_method' => 'callback_forumid' 279 280 // Post content. 281 $this->field_map[] = array( 282 'from_tablename' => 'post', 283 'from_fieldname' => 'pagetext', 284 'to_type' => 'reply', 285 'to_fieldname' => 'post_content', 286 'callback_method' => 'callback_html' 287 ); 288 289 // Topic id. If no parent, than 0. 290 $this->field_map[] = array( 291 'from_tablename' => 'post', 292 'from_fieldname' => 'threadid', 293 'to_type' => 'reply', 294 'to_fieldname' => 'post_parent', 295 'callback_method' => 'callback_topicid' 122 296 ); 123 297 124 298 // Topic date update. 125 299 $this->field_map[] = array( 126 'from_tablename' => 'thread', 'from_fieldname' => 'dateline', 127 'to_type' => 'topic', 'to_fieldname' => 'post_date', 128 'callback_method' => 'callback_datetime' 129 ); 130 $this->field_map[] = array( 131 'from_tablename' => 'thread', 'from_fieldname' => 'dateline', 132 'to_type' => 'topic', 'to_fieldname' => 'post_date_gmt', 133 'callback_method' => 'callback_datetime' 134 ); 135 $this->field_map[] = array( 136 'from_tablename' => 'thread', 'from_fieldname' => 'dateline', 137 'to_type' => 'topic', 'to_fieldname' => 'post_modified', 138 'callback_method' => 'callback_datetime' 139 ); 140 $this->field_map[] = array( 141 'from_tablename' => 'thread', 'from_fieldname' => 'dateline', 142 'to_type' => 'topic', 'to_fieldname' => 'post_modified_gmt', 143 'callback_method' => 'callback_datetime' 144 ); 145 146 /** Tags Section ******************************************************/ 147 148 // Topic id. 149 $this->field_map[] = array( 150 'from_tablename' => 'tagcontent', 'from_fieldname' => 'contentid', 151 'to_type' => 'tags', 'to_fieldname' => 'objectid', 152 'callback_method' => 'callback_topicid' 153 ); 154 155 // Tags text. 156 $this->field_map[] = array( 157 'from_tablename' => 'tag', 'from_fieldname' => 'tagtext', 158 'join_tablename' => 'tagcontent', 'join_type' => 'INNER', 'join_expression' => 'USING (tagid)', 159 'to_type' => 'tags', 'to_fieldname' => 'name' 160 ); 161 162 /** Post Section ******************************************************/ 163 164 // Post id. Stores in postmeta. 165 $this->field_map[] = array( 166 'from_tablename' => 'post', 'from_fieldname' => 'postid', 'from_expression' => 'WHERE post.parentid != 0', 167 'to_type' => 'reply', 'to_fieldname' => '_bbp_post_id' 168 ); 169 170 // Forum id. Stores in postmeta. 171 $this->field_map[] = array( 172 'from_tablename' => 'post', 'from_fieldname' => 'threadid', 173 'to_type' => 'reply', 'to_fieldname' => '_bbp_forum_id', 174 'callback_method' => 'callback_topicid_to_forumid' 175 ); 176 177 // Topic id. Stores in postmeta. 178 $this->field_map[] = array( 179 'from_tablename' => 'post', 'from_fieldname' => 'threadid', 180 'to_type' => 'reply', 'to_fieldname' => '_bbp_topic_id', 181 'callback_method' => 'callback_topicid' 182 ); 183 184 // Author ip. 185 $this->field_map[] = array( 186 'from_tablename' => 'post', 'from_fieldname' => 'ipaddress', 187 'to_type' => 'reply', 'to_fieldname' => '__bbp_author_ip' 188 ); 189 190 // Post author. 191 $this->field_map[] = array( 192 'from_tablename' => 'post', 'from_fieldname' => 'userid', 193 'to_type' => 'reply', 'to_fieldname' => 'post_author', 194 'callback_method' => 'callback_userid' 195 ); 196 197 // Topic title. 198 $this->field_map[] = array( 199 'from_tablename' => 'post', 'from_fieldname' => 'title', 200 'to_type' => 'reply', 'to_fieldname' => 'post_title' 201 ); 202 203 // Topic slug. Clean name. 204 $this->field_map[] = array( 205 'from_tablename' => 'post', 'from_fieldname' => 'title', 206 'to_type' => 'reply', 'to_fieldname' => 'post_name', 207 'callback_method' => 'callback_slug' 208 ); 209 210 // Post content. 211 $this->field_map[] = array( 212 'from_tablename' => 'post', 'from_fieldname' => 'pagetext', 213 'to_type' => 'reply', 'to_fieldname' => 'post_content', 214 'callback_method' => 'callback_html' 215 ); 216 217 // Topic id. If no parent, than 0. 218 $this->field_map[] = array( 219 'from_tablename' => 'post', 'from_fieldname' => 'threadid', 220 'to_type' => 'reply', 'to_fieldname' => 'post_parent', 221 'callback_method' => 'callback_topicid' 222 ); 223 224 // Topic date update. 225 $this->field_map[] = array( 226 'from_tablename' => 'post', 'from_fieldname' => 'dateline', 227 'to_type' => 'reply', 'to_fieldname' => 'post_date', 228 'callback_method' => 'callback_datetime' 229 ); 230 $this->field_map[] = array( 231 'from_tablename' => 'post', 'from_fieldname' => 'dateline', 232 'to_type' => 'reply', 'to_fieldname' => 'post_date_gmt', 233 'callback_method' => 'callback_datetime' 234 ); 235 $this->field_map[] = array( 236 'from_tablename' => 'post', 'from_fieldname' => 'dateline', 237 'to_type' => 'reply', 'to_fieldname' => 'post_modified', 238 'callback_method' => 'callback_datetime' 239 ); 240 $this->field_map[] = array( 241 'from_tablename' => 'post', 'from_fieldname' => 'dateline', 242 'to_type' => 'reply', 'to_fieldname' => 'post_modified_gmt', 300 'from_tablename' => 'post', 301 'from_fieldname' => 'dateline', 302 'to_type' => 'reply', 303 'to_fieldname' => 'post_date', 304 'callback_method' => 'callback_datetime' 305 ); 306 $this->field_map[] = array( 307 'from_tablename' => 'post', 308 'from_fieldname' => 'dateline', 309 'to_type' => 'reply', 310 'to_fieldname' => 'post_date_gmt', 311 'callback_method' => 'callback_datetime' 312 ); 313 $this->field_map[] = array( 314 'from_tablename' => 'post', 315 'from_fieldname' => 'dateline', 316 'to_type' => 'reply', 317 'to_fieldname' => 'post_modified', 318 'callback_method' => 'callback_datetime' 319 ); 320 $this->field_map[] = array( 321 'from_tablename' => 'post', 322 'from_fieldname' => 'dateline', 323 'to_type' => 'reply', 324 'to_fieldname' => 'post_modified_gmt', 243 325 'callback_method' => 'callback_datetime' 244 326 ); … … 248 330 // Store old User id. Stores in usermeta. 249 331 $this->field_map[] = array( 250 'from_tablename' => 'user', 'from_fieldname' => 'userid', 251 'to_type' => 'user', 'to_fieldname' => '_bbp_user_id' 252 ); 253 332 'from_tablename' => 'user', 333 'from_fieldname' => 'userid', 334 'to_type' => 'user', 335 'to_fieldname' => '_bbp_user_id' 336 ); 337 254 338 // Store old User password. Stores in usermeta serialized with salt. 255 339 $this->field_map[] = array( 256 'from_tablename' => 'user', 'from_fieldname' => 'password', 257 'to_type' => 'user', 'to_fieldname' => '_bbp_password', 340 'from_tablename' => 'user', 341 'from_fieldname' => 'password', 342 'to_type' => 'user', 343 'to_fieldname' => '_bbp_password', 258 344 'callback_method' => 'callback_savepass' 259 345 ); 260 346 261 // Store old User Salt. This is only used for the SELECT row info for the above password save 262 $this->field_map[] = array( 263 'from_tablename' => 'user', 'from_fieldname' => 'salt', 264 'to_type' => 'user', 'to_fieldname' => '' 265 ); 266 347 // Store old User Salt. This is only used for the SELECT row info for 348 // the above password save. 349 $this->field_map[] = array( 350 'from_tablename' => 'user', 351 'from_fieldname' => 'salt', 352 'to_type' => 'user', 353 'to_fieldname' => '' 354 ); 355 267 356 // User password verify class. Stores in usermeta for verifying password. 268 357 $this->field_map[] = array( 269 'to_type' => 'user', 'to_fieldname' => '_bbp_class', 270 'default' => 'vBulletin' 271 ); 272 358 'to_type' => 'user', 359 'to_fieldname' => '_bbp_class', 360 'default' => 'vBulletin' 361 ); 362 273 363 // User name. 274 364 $this->field_map[] = array( 275 'from_tablename' => 'user', 'from_fieldname' => 'username', 276 'to_type' => 'user', 'to_fieldname' => 'user_login' 277 ); 278 365 'from_tablename' => 'user', 366 'from_fieldname' => 'username', 367 'to_type' => 'user', 368 'to_fieldname' => 'user_login' 369 ); 370 279 371 // User email. 280 372 $this->field_map[] = array( 281 'from_tablename' => 'user', 'from_fieldname' => 'email', 282 'to_type' => 'user', 'to_fieldname' => 'user_email' 283 ); 284 373 'from_tablename' => 'user', 374 'from_fieldname' => 'email', 375 'to_type' => 'user', 376 'to_fieldname' => 'user_email' 377 ); 378 285 379 // User homepage. 286 380 $this->field_map[] = array( 287 'from_tablename' => 'user', 'from_fieldname' => 'homepage', 288 'to_type' => 'user', 'to_fieldname' => 'user_url' 289 ); 290 381 'from_tablename' => 'user', 382 'from_fieldname' => 'homepage', 383 'to_type' => 'user', 384 'to_fieldname' => 'user_url' 385 ); 386 291 387 // User registered. 292 388 $this->field_map[] = array( 293 'from_tablename' => 'user', 'from_fieldname' => 'joindate', 294 'to_type' => 'user', 'to_fieldname' => 'user_registered', 295 'callback_method' => 'callback_datetime' 296 ); 297 389 'from_tablename' => 'user', 390 'from_fieldname' => 'joindate', 391 'to_type' => 'user', 392 'to_fieldname' => 'user_registered', 393 'callback_method' => 'callback_datetime' 394 ); 395 298 396 // User aim. 299 397 $this->field_map[] = array( 300 'from_tablename' => 'user', 'from_fieldname' => 'aim', 301 'to_type' => 'user', 'to_fieldname' => 'aim' 302 ); 303 398 'from_tablename' => 'user', 399 'from_fieldname' => 'aim', 400 'to_type' => 'user', 401 'to_fieldname' => 'aim' 402 ); 403 304 404 // User yahoo. 305 405 $this->field_map[] = array( 306 'from_tablename' => 'user', 'from_fieldname' => 'yahoo', 307 'to_type' => 'user', 'to_fieldname' => 'yim' 308 ); 406 'from_tablename' => 'user', 407 'from_fieldname' => 'yahoo', 408 'to_type' => 'user', 409 'to_fieldname' => 'yim' 410 ); 309 411 } 310 412 311 413 /** 312 414 * This method allows us to indicates what is or is not converted for each 313 415 * converter. 314 416 */ 315 public function info() 316 { 417 public function info() { 317 418 return ''; 318 419 } … … 323 424 * as one value. Array values are auto sanitized by wordpress. 324 425 */ 325 public function callback_savepass( $field, $row ) 326 { 327 $pass_array = array( 'hash' => $field, 'salt' => $row['salt'] ); 426 public function callback_savepass( $field, $row ) { 427 $pass_array = array( 'hash' => $field, 'salt' => $row['salt'] ); 328 428 return $pass_array; 329 429 } … … 333 433 * to a pass the user has typed in. 334 434 */ 335 public function authenticate_pass( $password, $serialized_pass ) 336 { 435 public function authenticate_pass( $password, $serialized_pass ) { 337 436 $pass_array = unserialize( $serialized_pass ); 338 return ( $pass_array['hash'] == md5( md5( $password ) . $pass_array['salt'] ) );437 return ( $pass_array['hash'] == md5( md5( $password ) . $pass_array['salt'] ) ); 339 438 } 340 439 }
Note: See TracChangeset
for help on using the changeset viewer.