##// END OF EJS Templates
#551 show breadcrumbs in summary view for repositories inside a group
marcink -
r2811:b1467856 beta
parent child Browse files
Show More
@@ -1,744 +1,745 b''
1 1 .. _changelog:
2 2
3 3 =========
4 4 Changelog
5 5 =========
6 6
7 7
8 8 1.4.1 (**2012-09-05**)
9 9 ----------------------
10 10
11 11 :status: in-progress
12 12 :branch: beta
13 13
14 14 news
15 15 ++++
16 16
17 17 - always put a comment about code-review status change even if user send
18 18 empty data
19 19 - modified_on column saves repository update and it's going to be used
20 20 later for light version of main page ref #500
21 21 - pull request notifications send much nicer emails with details about pull
22 22 request
23 - #551 show breadcrumbs in summary view for repositories inside a group
23 24
24 25 fixes
25 26 +++++
26 27
27 28 - fixed migrations of permissions that can lead to inconsistency.
28 29 Some users sent feedback that after upgrading from older versions issues
29 30 with updating default permissions occurred. RhodeCode detects that now and
30 31 resets default user permission to initial state if there is a need for that.
31 32 Also forces users to set the default value for new forking permission.
32 33 - #535 improved apache wsgi example configuration in docs
33 34 - fixes #550 mercurial repositories comparision failed when origin repo had
34 35 additional not-common changesets
35 36 - fixed status of code-review in preview windows of pull request
36 37 - git forks were not initialized at bare repos
37 38 - fixes #555 fixes issues with comparing non-related repositories
38 39
39 40 1.4.0 (**2012-09-03**)
40 41 ----------------------
41 42
42 43 news
43 44 ++++
44 45
45 46 - new codereview system
46 47 - email map, allowing users to have multiple email addresses mapped into
47 48 their accounts
48 49 - improved git-hook system. Now all actions for git are logged into journal
49 50 including pushed revisions, user and IP address
50 51 - changed setup-app into setup-rhodecode and added default options to it.
51 52 - new git repos are created as bare now by default
52 53 - #464 added links to groups in permission box
53 54 - #465 mentions autocomplete inside comments boxes
54 55 - #469 added --update-only option to whoosh to re-index only given list
55 56 of repos in index
56 57 - rhodecode-api CLI client
57 58 - new git http protocol replaced buggy dulwich implementation.
58 59 Now based on pygrack & gitweb
59 60 - Improved RSS/ATOM feeds. Discoverable by browsers using proper headers, and
60 61 reformated based on user suggestions. Additional rss/atom feeds for user
61 62 journal
62 63 - various i18n improvements
63 64 - #478 permissions overview for admin in user edit view
64 65 - File view now displays small gravatars off all authors of given file
65 66 - Implemented landing revisions. Each repository will get landing_rev attribute
66 67 that defines 'default' revision/branch for generating readme files
67 68 - Implemented #509, RhodeCode enforces SSL for push/pulling if requested at
68 69 earliest possible call.
69 70 - Import remote svn repositories to mercurial using hgsubversion.
70 71 - Fixed #508 RhodeCode now has a option to explicitly set forking permissions
71 72 - RhodeCode can use alternative server for generating avatar icons
72 73 - implemented repositories locking. Pull locks, push unlocks. Also can be done
73 74 via API calls
74 75 - #538 form for permissions can handle multiple users at once
75 76
76 77 fixes
77 78 +++++
78 79
79 80 - improved translations
80 81 - fixes issue #455 Creating an archive generates an exception on Windows
81 82 - fixes #448 Download ZIP archive keeps file in /tmp open and results
82 83 in out of disk space
83 84 - fixes issue #454 Search results under Windows include proceeding
84 85 backslash
85 86 - fixed issue #450. Rhodecode no longer will crash when bad revision is
86 87 present in journal data.
87 88 - fix for issue #417, git execution was broken on windows for certain
88 89 commands.
89 90 - fixed #413. Don't disable .git directory for bare repos on deleting
90 91 - fixed issue #459. Changed the way of obtaining logger in reindex task.
91 92 - fixed #453 added ID field in whoosh SCHEMA that solves the issue of
92 93 reindexing modified files
93 94 - fixed #481 rhodecode emails are sent without Date header
94 95 - fixed #458 wrong count when no repos are present
95 96 - fixed issue #492 missing `\ No newline at end of file` test at the end of
96 97 new chunk in html diff
97 98 - full text search now works also for commit messages
98 99
99 100 1.3.6 (**2012-05-17**)
100 101 ----------------------
101 102
102 103 news
103 104 ++++
104 105
105 106 - chinese traditional translation
106 107 - changed setup-app into setup-rhodecode and added arguments for auto-setup
107 108 mode that doesn't need user interaction
108 109
109 110 fixes
110 111 +++++
111 112
112 113 - fixed no scm found warning
113 114 - fixed __future__ import error on rcextensions
114 115 - made simplejson required lib for speedup on JSON encoding
115 116 - fixes #449 bad regex could get more than revisions from parsing history
116 117 - don't clear DB session when CELERY_EAGER is turned ON
117 118
118 119 1.3.5 (**2012-05-10**)
119 120 ----------------------
120 121
121 122 news
122 123 ++++
123 124
124 125 - use ext_json for json module
125 126 - unified annotation view with file source view
126 127 - notification improvements, better inbox + css
127 128 - #419 don't strip passwords for login forms, make rhodecode
128 129 more compatible with LDAP servers
129 130 - Added HTTP_X_FORWARDED_FOR as another method of extracting
130 131 IP for pull/push logs. - moved all to base controller
131 132 - #415: Adding comment to changeset causes reload.
132 133 Comments are now added via ajax and doesn't reload the page
133 134 - #374 LDAP config is discarded when LDAP can't be activated
134 135 - limited push/pull operations are now logged for git in the journal
135 136 - bumped mercurial to 2.2.X series
136 137 - added support for displaying submodules in file-browser
137 138 - #421 added bookmarks in changelog view
138 139
139 140 fixes
140 141 +++++
141 142
142 143 - fixed dev-version marker for stable when served from source codes
143 144 - fixed missing permission checks on show forks page
144 145 - #418 cast to unicode fixes in notification objects
145 146 - #426 fixed mention extracting regex
146 147 - fixed remote-pulling for git remotes remopositories
147 148 - fixed #434: Error when accessing files or changesets of a git repository
148 149 with submodules
149 150 - fixed issue with empty APIKEYS for users after registration ref. #438
150 151 - fixed issue with getting README files from git repositories
151 152
152 153 1.3.4 (**2012-03-28**)
153 154 ----------------------
154 155
155 156 news
156 157 ++++
157 158
158 159 - Whoosh logging is now controlled by the .ini files logging setup
159 160 - added clone-url into edit form on /settings page
160 161 - added help text into repo add/edit forms
161 162 - created rcextensions module with additional mappings (ref #322) and
162 163 post push/pull/create repo hooks callbacks
163 164 - implemented #377 Users view for his own permissions on account page
164 165 - #399 added inheritance of permissions for users group on repos groups
165 166 - #401 repository group is automatically pre-selected when adding repos
166 167 inside a repository group
167 168 - added alternative HTTP 403 response when client failed to authenticate. Helps
168 169 solving issues with Mercurial and LDAP
169 170 - #402 removed group prefix from repository name when listing repositories
170 171 inside a group
171 172 - added gravatars into permission view and permissions autocomplete
172 173 - #347 when running multiple RhodeCode instances, properly invalidates cache
173 174 for all registered servers
174 175
175 176 fixes
176 177 +++++
177 178
178 179 - fixed #390 cache invalidation problems on repos inside group
179 180 - fixed #385 clone by ID url was loosing proxy prefix in URL
180 181 - fixed some unicode problems with waitress
181 182 - fixed issue with escaping < and > in changeset commits
182 183 - fixed error occurring during recursive group creation in API
183 184 create_repo function
184 185 - fixed #393 py2.5 fixes for routes url generator
185 186 - fixed #397 Private repository groups shows up before login
186 187 - fixed #396 fixed problems with revoking users in nested groups
187 188 - fixed mysql unicode issues + specified InnoDB as default engine with
188 189 utf8 charset
189 190 - #406 trim long branch/tag names in changelog to not break UI
190 191
191 192 1.3.3 (**2012-03-02**)
192 193 ----------------------
193 194
194 195 news
195 196 ++++
196 197
197 198
198 199 fixes
199 200 +++++
200 201
201 202 - fixed some python2.5 compatibility issues
202 203 - fixed issues with removed repos was accidentally added as groups, after
203 204 full rescan of paths
204 205 - fixes #376 Cannot edit user (using container auth)
205 206 - fixes #378 Invalid image urls on changeset screen with proxy-prefix
206 207 configuration
207 208 - fixed initial sorting of repos inside repo group
208 209 - fixes issue when user tried to resubmit same permission into user/user_groups
209 210 - bumped beaker version that fixes #375 leap error bug
210 211 - fixed raw_changeset for git. It was generated with hg patch headers
211 212 - fixed vcs issue with last_changeset for filenodes
212 213 - fixed missing commit after hook delete
213 214 - fixed #372 issues with git operation detection that caused a security issue
214 215 for git repos
215 216
216 217 1.3.2 (**2012-02-28**)
217 218 ----------------------
218 219
219 220 news
220 221 ++++
221 222
222 223
223 224 fixes
224 225 +++++
225 226
226 227 - fixed git protocol issues with repos-groups
227 228 - fixed git remote repos validator that prevented from cloning remote git repos
228 229 - fixes #370 ending slashes fixes for repo and groups
229 230 - fixes #368 improved git-protocol detection to handle other clients
230 231 - fixes #366 When Setting Repository Group To Blank Repo Group Wont Be
231 232 Moved To Root
232 233 - fixes #371 fixed issues with beaker/sqlalchemy and non-ascii cache keys
233 234 - fixed #373 missing cascade drop on user_group_to_perm table
234 235
235 236 1.3.1 (**2012-02-27**)
236 237 ----------------------
237 238
238 239 news
239 240 ++++
240 241
241 242
242 243 fixes
243 244 +++++
244 245
245 246 - redirection loop occurs when remember-me wasn't checked during login
246 247 - fixes issues with git blob history generation
247 248 - don't fetch branch for git in file history dropdown. Causes unneeded slowness
248 249
249 250 1.3.0 (**2012-02-26**)
250 251 ----------------------
251 252
252 253 news
253 254 ++++
254 255
255 256 - code review, inspired by github code-comments
256 257 - #215 rst and markdown README files support
257 258 - #252 Container-based and proxy pass-through authentication support
258 259 - #44 branch browser. Filtering of changelog by branches
259 260 - mercurial bookmarks support
260 261 - new hover top menu, optimized to add maximum size for important views
261 262 - configurable clone url template with possibility to specify protocol like
262 263 ssh:// or http:// and also manually alter other parts of clone_url.
263 264 - enabled largefiles extension by default
264 265 - optimized summary file pages and saved a lot of unused space in them
265 266 - #239 option to manually mark repository as fork
266 267 - #320 mapping of commit authors to RhodeCode users
267 268 - #304 hashes are displayed using monospace font
268 269 - diff configuration, toggle white lines and context lines
269 270 - #307 configurable diffs, whitespace toggle, increasing context lines
270 271 - sorting on branches, tags and bookmarks using YUI datatable
271 272 - improved file filter on files page
272 273 - implements #330 api method for listing nodes ar particular revision
273 274 - #73 added linking issues in commit messages to chosen issue tracker url
274 275 based on user defined regular expression
275 276 - added linking of changesets in commit messages
276 277 - new compact changelog with expandable commit messages
277 278 - firstname and lastname are optional in user creation
278 279 - #348 added post-create repository hook
279 280 - #212 global encoding settings is now configurable from .ini files
280 281 - #227 added repository groups permissions
281 282 - markdown gets codehilite extensions
282 283 - new API methods, delete_repositories, grante/revoke permissions for groups
283 284 and repos
284 285
285 286
286 287 fixes
287 288 +++++
288 289
289 290 - rewrote dbsession management for atomic operations, and better error handling
290 291 - fixed sorting of repo tables
291 292 - #326 escape of special html entities in diffs
292 293 - normalized user_name => username in api attributes
293 294 - fixes #298 ldap created users with mixed case emails created conflicts
294 295 on saving a form
295 296 - fixes issue when owner of a repo couldn't revoke permissions for users
296 297 and groups
297 298 - fixes #271 rare JSON serialization problem with statistics
298 299 - fixes #337 missing validation check for conflicting names of a group with a
299 300 repositories group
300 301 - #340 fixed session problem for mysql and celery tasks
301 302 - fixed #331 RhodeCode mangles repository names if the a repository group
302 303 contains the "full path" to the repositories
303 304 - #355 RhodeCode doesn't store encrypted LDAP passwords
304 305
305 306 1.2.5 (**2012-01-28**)
306 307 ----------------------
307 308
308 309 news
309 310 ++++
310 311
311 312 fixes
312 313 +++++
313 314
314 315 - #340 Celery complains about MySQL server gone away, added session cleanup
315 316 for celery tasks
316 317 - #341 "scanning for repositories in None" log message during Rescan was missing
317 318 a parameter
318 319 - fixed creating archives with subrepos. Some hooks were triggered during that
319 320 operation leading to crash.
320 321 - fixed missing email in account page.
321 322 - Reverted Mercurial to 2.0.1 for windows due to bug in Mercurial that makes
322 323 forking on windows impossible
323 324
324 325 1.2.4 (**2012-01-19**)
325 326 ----------------------
326 327
327 328 news
328 329 ++++
329 330
330 331 - RhodeCode is bundled with mercurial series 2.0.X by default, with
331 332 full support to largefiles extension. Enabled by default in new installations
332 333 - #329 Ability to Add/Remove Groups to/from a Repository via AP
333 334 - added requires.txt file with requirements
334 335
335 336 fixes
336 337 +++++
337 338
338 339 - fixes db session issues with celery when emailing admins
339 340 - #331 RhodeCode mangles repository names if the a repository group
340 341 contains the "full path" to the repositories
341 342 - #298 Conflicting e-mail addresses for LDAP and RhodeCode users
342 343 - DB session cleanup after hg protocol operations, fixes issues with
343 344 `mysql has gone away` errors
344 345 - #333 doc fixes for get_repo api function
345 346 - #271 rare JSON serialization problem with statistics enabled
346 347 - #337 Fixes issues with validation of repository name conflicting with
347 348 a group name. A proper message is now displayed.
348 349 - #292 made ldap_dn in user edit readonly, to get rid of confusion that field
349 350 doesn't work
350 351 - #316 fixes issues with web description in hgrc files
351 352
352 353 1.2.3 (**2011-11-02**)
353 354 ----------------------
354 355
355 356 news
356 357 ++++
357 358
358 359 - added option to manage repos group for non admin users
359 360 - added following API methods for get_users, create_user, get_users_groups,
360 361 get_users_group, create_users_group, add_user_to_users_groups, get_repos,
361 362 get_repo, create_repo, add_user_to_repo
362 363 - implements #237 added password confirmation for my account
363 364 and admin edit user.
364 365 - implements #291 email notification for global events are now sent to all
365 366 administrator users, and global config email.
366 367
367 368 fixes
368 369 +++++
369 370
370 371 - added option for passing auth method for smtp mailer
371 372 - #276 issue with adding a single user with id>10 to usergroups
372 373 - #277 fixes windows LDAP settings in which missing values breaks the ldap auth
373 374 - #288 fixes managing of repos in a group for non admin user
374 375
375 376 1.2.2 (**2011-10-17**)
376 377 ----------------------
377 378
378 379 news
379 380 ++++
380 381
381 382 - #226 repo groups are available by path instead of numerical id
382 383
383 384 fixes
384 385 +++++
385 386
386 387 - #259 Groups with the same name but with different parent group
387 388 - #260 Put repo in group, then move group to another group -> repo becomes unavailable
388 389 - #258 RhodeCode 1.2 assumes egg folder is writable (lockfiles problems)
389 390 - #265 ldap save fails sometimes on converting attributes to booleans,
390 391 added getter and setter into model that will prevent from this on db model level
391 392 - fixed problems with timestamps issues #251 and #213
392 393 - fixes #266 RhodeCode allows to create repo with the same name and in
393 394 the same parent as group
394 395 - fixes #245 Rescan of the repositories on Windows
395 396 - fixes #248 cannot edit repos inside a group on windows
396 397 - fixes #219 forking problems on windows
397 398
398 399 1.2.1 (**2011-10-08**)
399 400 ----------------------
400 401
401 402 news
402 403 ++++
403 404
404 405
405 406 fixes
406 407 +++++
407 408
408 409 - fixed problems with basic auth and push problems
409 410 - gui fixes
410 411 - fixed logger
411 412
412 413 1.2.0 (**2011-10-07**)
413 414 ----------------------
414 415
415 416 news
416 417 ++++
417 418
418 419 - implemented #47 repository groups
419 420 - implemented #89 Can setup google analytics code from settings menu
420 421 - implemented #91 added nicer looking archive urls with more download options
421 422 like tags, branches
422 423 - implemented #44 into file browsing, and added follow branch option
423 424 - implemented #84 downloads can be enabled/disabled for each repository
424 425 - anonymous repository can be cloned without having to pass default:default
425 426 into clone url
426 427 - fixed #90 whoosh indexer can index chooses repositories passed in command
427 428 line
428 429 - extended journal with day aggregates and paging
429 430 - implemented #107 source code lines highlight ranges
430 431 - implemented #93 customizable changelog on combined revision ranges -
431 432 equivalent of githubs compare view
432 433 - implemented #108 extended and more powerful LDAP configuration
433 434 - implemented #56 users groups
434 435 - major code rewrites optimized codes for speed and memory usage
435 436 - raw and diff downloads are now in git format
436 437 - setup command checks for write access to given path
437 438 - fixed many issues with international characters and unicode. It uses utf8
438 439 decode with replace to provide less errors even with non utf8 encoded strings
439 440 - #125 added API KEY access to feeds
440 441 - #109 Repository can be created from external Mercurial link (aka. remote
441 442 repository, and manually updated (via pull) from admin panel
442 443 - beta git support - push/pull server + basic view for git repos
443 444 - added followers page and forks page
444 445 - server side file creation (with binary file upload interface)
445 446 and edition with commits powered by codemirror
446 447 - #111 file browser file finder, quick lookup files on whole file tree
447 448 - added quick login sliding menu into main page
448 449 - changelog uses lazy loading of affected files details, in some scenarios
449 450 this can improve speed of changelog page dramatically especially for
450 451 larger repositories.
451 452 - implements #214 added support for downloading subrepos in download menu.
452 453 - Added basic API for direct operations on rhodecode via JSON
453 454 - Implemented advanced hook management
454 455
455 456 fixes
456 457 +++++
457 458
458 459 - fixed file browser bug, when switching into given form revision the url was
459 460 not changing
460 461 - fixed propagation to error controller on simplehg and simplegit middlewares
461 462 - fixed error when trying to make a download on empty repository
462 463 - fixed problem with '[' chars in commit messages in journal
463 464 - fixed #99 Unicode errors, on file node paths with non utf-8 characters
464 465 - journal fork fixes
465 466 - removed issue with space inside renamed repository after deletion
466 467 - fixed strange issue on formencode imports
467 468 - fixed #126 Deleting repository on Windows, rename used incompatible chars.
468 469 - #150 fixes for errors on repositories mapped in db but corrupted in
469 470 filesystem
470 471 - fixed problem with ascendant characters in realm #181
471 472 - fixed problem with sqlite file based database connection pool
472 473 - whoosh indexer and code stats share the same dynamic extensions map
473 474 - fixes #188 - relationship delete of repo_to_perm entry on user removal
474 475 - fixes issue #189 Trending source files shows "show more" when no more exist
475 476 - fixes issue #197 Relative paths for pidlocks
476 477 - fixes issue #198 password will require only 3 chars now for login form
477 478 - fixes issue #199 wrong redirection for non admin users after creating a repository
478 479 - fixes issues #202, bad db constraint made impossible to attach same group
479 480 more than one time. Affects only mysql/postgres
480 481 - fixes #218 os.kill patch for windows was missing sig param
481 482 - improved rendering of dag (they are not trimmed anymore when number of
482 483 heads exceeds 5)
483 484
484 485 1.1.8 (**2011-04-12**)
485 486 ----------------------
486 487
487 488 news
488 489 ++++
489 490
490 491 - improved windows support
491 492
492 493 fixes
493 494 +++++
494 495
495 496 - fixed #140 freeze of python dateutil library, since new version is python2.x
496 497 incompatible
497 498 - setup-app will check for write permission in given path
498 499 - cleaned up license info issue #149
499 500 - fixes for issues #137,#116 and problems with unicode and accented characters.
500 501 - fixes crashes on gravatar, when passed in email as unicode
501 502 - fixed tooltip flickering problems
502 503 - fixed came_from redirection on windows
503 504 - fixed logging modules, and sql formatters
504 505 - windows fixes for os.kill issue #133
505 506 - fixes path splitting for windows issues #148
506 507 - fixed issue #143 wrong import on migration to 1.1.X
507 508 - fixed problems with displaying binary files, thanks to Thomas Waldmann
508 509 - removed name from archive files since it's breaking ui for long repo names
509 510 - fixed issue with archive headers sent to browser, thanks to Thomas Waldmann
510 511 - fixed compatibility for 1024px displays, and larger dpi settings, thanks to
511 512 Thomas Waldmann
512 513 - fixed issue #166 summary pager was skipping 10 revisions on second page
513 514
514 515
515 516 1.1.7 (**2011-03-23**)
516 517 ----------------------
517 518
518 519 news
519 520 ++++
520 521
521 522 fixes
522 523 +++++
523 524
524 525 - fixed (again) #136 installation support for FreeBSD
525 526
526 527
527 528 1.1.6 (**2011-03-21**)
528 529 ----------------------
529 530
530 531 news
531 532 ++++
532 533
533 534 fixes
534 535 +++++
535 536
536 537 - fixed #136 installation support for FreeBSD
537 538 - RhodeCode will check for python version during installation
538 539
539 540 1.1.5 (**2011-03-17**)
540 541 ----------------------
541 542
542 543 news
543 544 ++++
544 545
545 546 - basic windows support, by exchanging pybcrypt into sha256 for windows only
546 547 highly inspired by idea of mantis406
547 548
548 549 fixes
549 550 +++++
550 551
551 552 - fixed sorting by author in main page
552 553 - fixed crashes with diffs on binary files
553 554 - fixed #131 problem with boolean values for LDAP
554 555 - fixed #122 mysql problems thanks to striker69
555 556 - fixed problem with errors on calling raw/raw_files/annotate functions
556 557 with unknown revisions
557 558 - fixed returned rawfiles attachment names with international character
558 559 - cleaned out docs, big thanks to Jason Harris
559 560
560 561 1.1.4 (**2011-02-19**)
561 562 ----------------------
562 563
563 564 news
564 565 ++++
565 566
566 567 fixes
567 568 +++++
568 569
569 570 - fixed formencode import problem on settings page, that caused server crash
570 571 when that page was accessed as first after server start
571 572 - journal fixes
572 573 - fixed option to access repository just by entering http://server/<repo_name>
573 574
574 575 1.1.3 (**2011-02-16**)
575 576 ----------------------
576 577
577 578 news
578 579 ++++
579 580
580 581 - implemented #102 allowing the '.' character in username
581 582 - added option to access repository just by entering http://server/<repo_name>
582 583 - celery task ignores result for better performance
583 584
584 585 fixes
585 586 +++++
586 587
587 588 - fixed ehlo command and non auth mail servers on smtp_lib. Thanks to
588 589 apollo13 and Johan Walles
589 590 - small fixes in journal
590 591 - fixed problems with getting setting for celery from .ini files
591 592 - registration, password reset and login boxes share the same title as main
592 593 application now
593 594 - fixed #113: to high permissions to fork repository
594 595 - fixed problem with '[' chars in commit messages in journal
595 596 - removed issue with space inside renamed repository after deletion
596 597 - db transaction fixes when filesystem repository creation failed
597 598 - fixed #106 relation issues on databases different than sqlite
598 599 - fixed static files paths links to use of url() method
599 600
600 601 1.1.2 (**2011-01-12**)
601 602 ----------------------
602 603
603 604 news
604 605 ++++
605 606
606 607
607 608 fixes
608 609 +++++
609 610
610 611 - fixes #98 protection against float division of percentage stats
611 612 - fixed graph bug
612 613 - forced webhelpers version since it was making troubles during installation
613 614
614 615 1.1.1 (**2011-01-06**)
615 616 ----------------------
616 617
617 618 news
618 619 ++++
619 620
620 621 - added force https option into ini files for easier https usage (no need to
621 622 set server headers with this options)
622 623 - small css updates
623 624
624 625 fixes
625 626 +++++
626 627
627 628 - fixed #96 redirect loop on files view on repositories without changesets
628 629 - fixed #97 unicode string passed into server header in special cases (mod_wsgi)
629 630 and server crashed with errors
630 631 - fixed large tooltips problems on main page
631 632 - fixed #92 whoosh indexer is more error proof
632 633
633 634 1.1.0 (**2010-12-18**)
634 635 ----------------------
635 636
636 637 news
637 638 ++++
638 639
639 640 - rewrite of internals for vcs >=0.1.10
640 641 - uses mercurial 1.7 with dotencode disabled for maintaining compatibility
641 642 with older clients
642 643 - anonymous access, authentication via ldap
643 644 - performance upgrade for cached repos list - each repository has its own
644 645 cache that's invalidated when needed.
645 646 - performance upgrades on repositories with large amount of commits (20K+)
646 647 - main page quick filter for filtering repositories
647 648 - user dashboards with ability to follow chosen repositories actions
648 649 - sends email to admin on new user registration
649 650 - added cache/statistics reset options into repository settings
650 651 - more detailed action logger (based on hooks) with pushed changesets lists
651 652 and options to disable those hooks from admin panel
652 653 - introduced new enhanced changelog for merges that shows more accurate results
653 654 - new improved and faster code stats (based on pygments lexers mapping tables,
654 655 showing up to 10 trending sources for each repository. Additionally stats
655 656 can be disabled in repository settings.
656 657 - gui optimizations, fixed application width to 1024px
657 658 - added cut off (for large files/changesets) limit into config files
658 659 - whoosh, celeryd, upgrade moved to paster command
659 660 - other than sqlite database backends can be used
660 661
661 662 fixes
662 663 +++++
663 664
664 665 - fixes #61 forked repo was showing only after cache expired
665 666 - fixes #76 no confirmation on user deletes
666 667 - fixes #66 Name field misspelled
667 668 - fixes #72 block user removal when he owns repositories
668 669 - fixes #69 added password confirmation fields
669 670 - fixes #87 RhodeCode crashes occasionally on updating repository owner
670 671 - fixes #82 broken annotations on files with more than 1 blank line at the end
671 672 - a lot of fixes and tweaks for file browser
672 673 - fixed detached session issues
673 674 - fixed when user had no repos he would see all repos listed in my account
674 675 - fixed ui() instance bug when global hgrc settings was loaded for server
675 676 instance and all hgrc options were merged with our db ui() object
676 677 - numerous small bugfixes
677 678
678 679 (special thanks for TkSoh for detailed feedback)
679 680
680 681
681 682 1.0.2 (**2010-11-12**)
682 683 ----------------------
683 684
684 685 news
685 686 ++++
686 687
687 688 - tested under python2.7
688 689 - bumped sqlalchemy and celery versions
689 690
690 691 fixes
691 692 +++++
692 693
693 694 - fixed #59 missing graph.js
694 695 - fixed repo_size crash when repository had broken symlinks
695 696 - fixed python2.5 crashes.
696 697
697 698
698 699 1.0.1 (**2010-11-10**)
699 700 ----------------------
700 701
701 702 news
702 703 ++++
703 704
704 705 - small css updated
705 706
706 707 fixes
707 708 +++++
708 709
709 710 - fixed #53 python2.5 incompatible enumerate calls
710 711 - fixed #52 disable mercurial extension for web
711 712 - fixed #51 deleting repositories don't delete it's dependent objects
712 713
713 714
714 715 1.0.0 (**2010-11-02**)
715 716 ----------------------
716 717
717 718 - security bugfix simplehg wasn't checking for permissions on commands
718 719 other than pull or push.
719 720 - fixed doubled messages after push or pull in admin journal
720 721 - templating and css corrections, fixed repo switcher on chrome, updated titles
721 722 - admin menu accessible from options menu on repository view
722 723 - permissions cached queries
723 724
724 725 1.0.0rc4 (**2010-10-12**)
725 726 --------------------------
726 727
727 728 - fixed python2.5 missing simplejson imports (thanks to Jens BΓ€ckman)
728 729 - removed cache_manager settings from sqlalchemy meta
729 730 - added sqlalchemy cache settings to ini files
730 731 - validated password length and added second try of failure on paster setup-app
731 732 - fixed setup database destroy prompt even when there was no db
732 733
733 734
734 735 1.0.0rc3 (**2010-10-11**)
735 736 -------------------------
736 737
737 738 - fixed i18n during installation.
738 739
739 740 1.0.0rc2 (**2010-10-11**)
740 741 -------------------------
741 742
742 743 - Disabled dirsize in file browser, it's causing nasty bug when dir renames
743 744 occure. After vcs is fixed it'll be put back again.
744 745 - templating/css rewrites, optimized css. No newline at end of file
@@ -1,21 +1,22 b''
1 1 ## -*- coding: utf-8 -*-
2 2 <%inherit file="/base/base.html"/>
3 3 <%def name="title()">
4 4 ${_('Repository group')} - ${c.rhodecode_name}
5 5 </%def>
6 6
7 7 <%def name="breadcrumbs()">
8 <span class="groups_breadcrumbs"> ${_('Groups')}
8 <span class="groups_breadcrumbs">
9 ${h.link_to(_(u'Home'),h.url('/'))}
9 10 %if c.group.parent_group:
10 11 &raquo; ${h.link_to(c.group.parent_group.name,h.url('repos_group_home',group_name=c.group.parent_group.group_name))}
11 12 %endif
12 13 &raquo; "${c.group.name}" ${_('with')}
13 14 </span>
14 15 </%def>
15 16
16 17 <%def name="page_nav()">
17 18 ${self.menu('admin')}
18 19 </%def>
19 20 <%def name="main()">
20 21 <%include file="/index_base.html" args="parent=self,short_repo_names=True"/>
21 22 </%def>
@@ -1,710 +1,710 b''
1 1 <%inherit file="/base/base.html"/>
2 2
3 3 <%def name="title()">
4 4 ${_('%s Summary') % c.repo_name} - ${c.rhodecode_name}
5 5 </%def>
6 6
7 7 <%def name="breadcrumbs_links()">
8 8 ${h.link_to(_(u'Home'),h.url('/'))}
9 9 &raquo;
10 ${h.link_to(c.dbrepo.just_name,h.url('summary_home',repo_name=c.repo_name))}
10 ${h.repo_link(c.dbrepo.groups_and_repo)}
11 11 &raquo;
12 12 ${_('summary')}
13 13 </%def>
14 14
15 15 <%def name="page_nav()">
16 16 ${self.menu('summary')}
17 17 </%def>
18 18
19 19 <%def name="head_extra()">
20 20 <link href="${h.url('atom_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('repo %s ATOM feed') % c.repo_name}" type="application/atom+xml" />
21 21 <link href="${h.url('rss_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('repo %s RSS feed') % c.repo_name}" type="application/rss+xml" />
22 22 </%def>
23 23
24 24 <%def name="main()">
25 25 <%
26 26 summary = lambda n:{False:'summary-short'}.get(n)
27 27 %>
28 28 %if c.show_stats:
29 29 <div class="box box-left">
30 30 %else:
31 31 <div class="box">
32 32 %endif
33 33 <!-- box / title -->
34 34 <div class="title">
35 35 ${self.breadcrumbs()}
36 36 </div>
37 37 <!-- end box / title -->
38 38 <div class="form">
39 39 <div id="summary" class="fields">
40 40
41 41 <div class="field">
42 42 <div class="label-summary">
43 43 <label>${_('Name')}:</label>
44 44 </div>
45 45 <div class="input ${summary(c.show_stats)}">
46 46 <div style="float:right;padding:5px 0px 0px 5px">
47 47 %if c.rhodecode_user.username != 'default':
48 48 ${h.link_to(_('RSS'),h.url('rss_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key),class_='rss_icon')}
49 49 ${h.link_to(_('ATOM'),h.url('atom_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key),class_='atom_icon')}
50 50 %else:
51 51 ${h.link_to(_('RSS'),h.url('rss_feed_home',repo_name=c.dbrepo.repo_name),class_='rss_icon')}
52 52 ${h.link_to(_('ATOM'),h.url('atom_feed_home',repo_name=c.dbrepo.repo_name),class_='atom_icon')}
53 53 %endif
54 54 </div>
55 55 %if c.rhodecode_user.username != 'default':
56 56 %if c.following:
57 57 <span id="follow_toggle" class="following" title="${_('Stop following this repository')}"
58 58 onclick="javascript:toggleFollowingRepo(this,${c.dbrepo.repo_id},'${str(h.get_token())}')">
59 59 </span>
60 60 %else:
61 61 <span id="follow_toggle" class="follow" title="${_('Start following this repository')}"
62 62 onclick="javascript:toggleFollowingRepo(this,${c.dbrepo.repo_id},'${str(h.get_token())}')">
63 63 </span>
64 64 %endif
65 65 %endif:
66 66 ##REPO TYPE
67 67 %if h.is_hg(c.dbrepo):
68 68 <img style="margin-bottom:2px" class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="${h.url('/images/icons/hgicon.png')}"/>
69 69 %endif
70 70 %if h.is_git(c.dbrepo):
71 71 <img style="margin-bottom:2px" class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="${h.url('/images/icons/giticon.png')}"/>
72 72 %endif
73 73
74 74 ##PUBLIC/PRIVATE
75 75 %if c.dbrepo.private:
76 76 <img style="margin-bottom:2px" class="icon" title="${_('private repository')}" alt="${_('private repository')}" src="${h.url('/images/icons/lock.png')}"/>
77 77 %else:
78 78 <img style="margin-bottom:2px" class="icon" title="${_('public repository')}" alt="${_('public repository')}" src="${h.url('/images/icons/lock_open.png')}"/>
79 79 %endif
80 80
81 81 ##REPO NAME
82 82 <span class="repo_name" title="${_('Non changable ID %s') % c.dbrepo.repo_id}">${h.repo_link(c.dbrepo.groups_and_repo)}</span>
83 83
84 84 ##FORK
85 85 %if c.dbrepo.fork:
86 86 <div style="margin-top:5px;clear:both"">
87 87 <a href="${h.url('summary_home',repo_name=c.dbrepo.fork.repo_name)}"><img class="icon" alt="${_('public')}" title="${_('Fork of')} ${c.dbrepo.fork.repo_name}" src="${h.url('/images/icons/arrow_divide.png')}"/>
88 88 ${_('Fork of')} ${c.dbrepo.fork.repo_name}
89 89 </a>
90 90 </div>
91 91 %endif
92 92 ##REMOTE
93 93 %if c.dbrepo.clone_uri:
94 94 <div style="margin-top:5px;clear:both">
95 95 <a href="${h.url(str(h.hide_credentials(c.dbrepo.clone_uri)))}"><img class="icon" alt="${_('remote clone')}" title="${_('Clone from')} ${h.hide_credentials(c.dbrepo.clone_uri)}" src="${h.url('/images/icons/connect.png')}"/>
96 96 ${_('Clone from')} ${h.hide_credentials(c.dbrepo.clone_uri)}
97 97 </a>
98 98 </div>
99 99 %endif
100 100 </div>
101 101 </div>
102 102
103 103 <div class="field">
104 104 <div class="label-summary">
105 105 <label>${_('Description')}:</label>
106 106 </div>
107 107 %if c.visual.stylify_metatags:
108 108 <div class="input ${summary(c.show_stats)} desc">${h.urlify_text(h.desc_stylize(c.dbrepo.description))}</div>
109 109 %else:
110 110 <div class="input ${summary(c.show_stats)} desc">${h.urlify_text(c.dbrepo.description)}</div>
111 111 %endif
112 112 </div>
113 113
114 114 <div class="field">
115 115 <div class="label-summary">
116 116 <label>${_('Contact')}:</label>
117 117 </div>
118 118 <div class="input ${summary(c.show_stats)}">
119 119 <div class="gravatar">
120 120 <img alt="gravatar" src="${h.gravatar_url(c.dbrepo.user.email)}"/>
121 121 </div>
122 122 ${_('Username')}: ${c.dbrepo.user.username}<br/>
123 123 ${_('Name')}: ${c.dbrepo.user.name} ${c.dbrepo.user.lastname}<br/>
124 124 ${_('Email')}: <a href="mailto:${c.dbrepo.user.email}">${c.dbrepo.user.email}</a>
125 125 </div>
126 126 </div>
127 127
128 128 <div class="field">
129 129 <div class="label-summary">
130 130 <label>${_('Clone url')}:</label>
131 131 </div>
132 132 <div class="input ${summary(c.show_stats)}">
133 133 <div style="display:none" id="clone_by_name" class="ui-btn clone">${_('Show by Name')}</div>
134 134 <div id="clone_by_id" class="ui-btn clone">${_('Show by ID')}</div>
135 135 <input style="width:80%;margin-left:105px" type="text" id="clone_url" readonly="readonly" value="${c.clone_repo_url}"/>
136 136 <input style="display:none;width:80%;margin-left:105px" type="text" id="clone_url_id" readonly="readonly" value="${c.clone_repo_url_id}"/>
137 137 </div>
138 138 </div>
139 139
140 140 <div class="field">
141 141 <div class="label-summary">
142 142 <label>${_('Trending files')}:</label>
143 143 </div>
144 144 <div class="input ${summary(c.show_stats)}">
145 145 %if c.show_stats:
146 146 <div id="lang_stats"></div>
147 147 %else:
148 148 ${_('Statistics are disabled for this repository')}
149 149 %if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
150 150 ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
151 151 %endif
152 152 %endif
153 153 </div>
154 154 </div>
155 155
156 156 <div class="field">
157 157 <div class="label-summary">
158 158 <label>${_('Download')}:</label>
159 159 </div>
160 160 <div class="input ${summary(c.show_stats)}">
161 161 %if len(c.rhodecode_repo.revisions) == 0:
162 162 ${_('There are no downloads yet')}
163 163 %elif c.enable_downloads is False:
164 164 ${_('Downloads are disabled for this repository')}
165 165 %if h.HasPermissionAll('hg.admin')('enable downloads on from summary'):
166 166 ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
167 167 %endif
168 168 %else:
169 169 ${h.select('download_options',c.rhodecode_repo.get_changeset().raw_id,c.download_options)}
170 170 <span id="${'zip_link'}">${h.link_to(_('Download as zip'), h.url('files_archive_home',repo_name=c.dbrepo.repo_name,fname='tip.zip'),class_="archive_icon ui-btn")}</span>
171 171 <span style="vertical-align: bottom">
172 172 <input id="archive_subrepos" type="checkbox" name="subrepos" />
173 173 <label for="archive_subrepos" class="tooltip" title="${h.tooltip(_('Check this to download archive with subrepos'))}" >${_('with subrepos')}</label>
174 174 </span>
175 175 %endif
176 176 </div>
177 177 </div>
178 178 </div>
179 179 </div>
180 180 </div>
181 181
182 182 %if c.show_stats:
183 183 <div class="box box-right" style="min-height:455px">
184 184 <!-- box / title -->
185 185 <div class="title">
186 186 <h5>${_('Commit activity by day / author')}</h5>
187 187 </div>
188 188
189 189 <div class="graph">
190 190 <div style="padding:0 10px 10px 17px;">
191 191 %if c.no_data:
192 192 ${c.no_data_msg}
193 193 %if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
194 194 ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
195 195 %endif
196 196 %else:
197 197 ${_('Stats gathered: ')} ${c.stats_percentage}%
198 198 %endif
199 199 </div>
200 200 <div id="commit_history" style="width:450px;height:300px;float:left"></div>
201 201 <div style="clear: both;height: 10px"></div>
202 202 <div id="overview" style="width:450px;height:100px;float:left"></div>
203 203
204 204 <div id="legend_data" style="clear:both;margin-top:10px;">
205 205 <div id="legend_container"></div>
206 206 <div id="legend_choices">
207 207 <table id="legend_choices_tables" class="noborder" style="font-size:smaller;color:#545454"></table>
208 208 </div>
209 209 </div>
210 210 </div>
211 211 </div>
212 212 %endif
213 213
214 214 <div class="box">
215 215 <div class="title">
216 216 <div class="breadcrumbs">
217 217 %if c.repo_changesets:
218 218 ${h.link_to(_('Shortlog'),h.url('shortlog_home',repo_name=c.repo_name))}
219 219 %else:
220 220 ${_('Quick start')}
221 221 %endif
222 222 </div>
223 223 </div>
224 224 <div class="table">
225 225 <div id="shortlog_data">
226 226 <%include file='../shortlog/shortlog_data.html'/>
227 227 </div>
228 228 </div>
229 229 </div>
230 230
231 231 %if c.readme_data:
232 232 <div id="readme" class="box header-pos-fix" style="background-color: #FAFAFA">
233 233 <div id="readme" class="title" title="${_("Readme file at revision '%s'" % c.rhodecode_db_repo.landing_rev)}">
234 234 <div class="breadcrumbs">
235 235 <a href="${h.url('files_home',repo_name=c.repo_name,revision='tip',f_path=c.readme_file)}">${c.readme_file}</a>
236 236 <a class="permalink" href="#readme" title="${_('Permalink to this readme')}">&para;</a>
237 237 </div>
238 238 </div>
239 239 <div id="readme" class="readme">
240 240 <div class="readme_box">
241 241 ${c.readme_data|n}
242 242 </div>
243 243 </div>
244 244 </div>
245 245 %endif
246 246
247 247 <script type="text/javascript">
248 248 var clone_url = 'clone_url';
249 249 YUE.on(clone_url,'click',function(e){
250 250 if(YUD.hasClass(clone_url,'selected')){
251 251 return
252 252 }
253 253 else{
254 254 YUD.addClass(clone_url,'selected');
255 255 YUD.get(clone_url).select();
256 256 }
257 257 })
258 258
259 259 YUE.on('clone_by_name','click',function(e){
260 260 // show url by name and hide name button
261 261 YUD.setStyle('clone_url','display','');
262 262 YUD.setStyle('clone_by_name','display','none');
263 263
264 264 // hide url by id and show name button
265 265 YUD.setStyle('clone_by_id','display','');
266 266 YUD.setStyle('clone_url_id','display','none');
267 267
268 268 })
269 269 YUE.on('clone_by_id','click',function(e){
270 270
271 271 // show url by id and hide id button
272 272 YUD.setStyle('clone_by_id','display','none');
273 273 YUD.setStyle('clone_url_id','display','');
274 274
275 275 // hide url by name and show id button
276 276 YUD.setStyle('clone_by_name','display','');
277 277 YUD.setStyle('clone_url','display','none');
278 278 })
279 279
280 280
281 281 var tmpl_links = {};
282 282 %for cnt,archive in enumerate(c.rhodecode_repo._get_archives()):
283 283 tmpl_links["${archive['type']}"] = '${h.link_to('__NAME__', h.url('files_archive_home',repo_name=c.dbrepo.repo_name, fname='__CS__'+archive['extension'],subrepos='__SUB__'),class_='archive_icon ui-btn')}';
284 284 %endfor
285 285
286 286 YUE.on(['download_options','archive_subrepos'],'change',function(e){
287 287 var sm = YUD.get('download_options');
288 288 var new_cs = sm.options[sm.selectedIndex];
289 289
290 290 for(k in tmpl_links){
291 291 var s = YUD.get(k+'_link');
292 292 if(s){
293 293 var title_tmpl = "${_('Download %s as %s') % ('__CS_NAME__','__CS_EXT__')}";
294 294 title_tmpl= title_tmpl.replace('__CS_NAME__',new_cs.text);
295 295 title_tmpl = title_tmpl.replace('__CS_EXT__',k);
296 296
297 297 var url = tmpl_links[k].replace('__CS__',new_cs.value);
298 298 var subrepos = YUD.get('archive_subrepos').checked;
299 299 url = url.replace('__SUB__',subrepos);
300 300 url = url.replace('__NAME__',title_tmpl);
301 301 s.innerHTML = url
302 302 }
303 303 }
304 304 });
305 305 </script>
306 306 %if c.show_stats:
307 307 <script type="text/javascript">
308 308 var data = ${c.trending_languages|n};
309 309 var total = 0;
310 310 var no_data = true;
311 311 var tbl = document.createElement('table');
312 312 tbl.setAttribute('class','trending_language_tbl');
313 313 var cnt = 0;
314 314 for (var i=0;i<data.length;i++){
315 315 total+= data[i][1].count;
316 316 }
317 317 for (var i=0;i<data.length;i++){
318 318 cnt += 1;
319 319 no_data = false;
320 320
321 321 var hide = cnt>2;
322 322 var tr = document.createElement('tr');
323 323 if (hide){
324 324 tr.setAttribute('style','display:none');
325 325 tr.setAttribute('class','stats_hidden');
326 326 }
327 327 var k = data[i][0];
328 328 var obj = data[i][1];
329 329 var percentage = Math.round((obj.count/total*100),2);
330 330
331 331 var td1 = document.createElement('td');
332 332 td1.width = 150;
333 333 var trending_language_label = document.createElement('div');
334 334 trending_language_label.innerHTML = obj.desc+" ("+k+")";
335 335 td1.appendChild(trending_language_label);
336 336
337 337 var td2 = document.createElement('td');
338 338 td2.setAttribute('style','padding-right:14px !important');
339 339 var trending_language = document.createElement('div');
340 340 var nr_files = obj.count+" ${_('files')}";
341 341
342 342 trending_language.title = k+" "+nr_files;
343 343
344 344 if (percentage>22){
345 345 trending_language.innerHTML = "<b style='font-size:0.8em'>"+percentage+"% "+nr_files+ "</b>";
346 346 }
347 347 else{
348 348 trending_language.innerHTML = "<b style='font-size:0.8em'>"+percentage+"%</b>";
349 349 }
350 350
351 351 trending_language.setAttribute("class", 'trending_language top-right-rounded-corner bottom-right-rounded-corner');
352 352 trending_language.style.width=percentage+"%";
353 353 td2.appendChild(trending_language);
354 354
355 355 tr.appendChild(td1);
356 356 tr.appendChild(td2);
357 357 tbl.appendChild(tr);
358 358 if(cnt == 3){
359 359 var show_more = document.createElement('tr');
360 360 var td = document.createElement('td');
361 361 lnk = document.createElement('a');
362 362
363 363 lnk.href='#';
364 364 lnk.innerHTML = "${_('show more')}";
365 365 lnk.id='code_stats_show_more';
366 366 td.appendChild(lnk);
367 367
368 368 show_more.appendChild(td);
369 369 show_more.appendChild(document.createElement('td'));
370 370 tbl.appendChild(show_more);
371 371 }
372 372
373 373 }
374 374
375 375 YUD.get('lang_stats').appendChild(tbl);
376 376 YUE.on('code_stats_show_more','click',function(){
377 377 l = YUD.getElementsByClassName('stats_hidden')
378 378 for (e in l){
379 379 YUD.setStyle(l[e],'display','');
380 380 };
381 381 YUD.setStyle(YUD.get('code_stats_show_more'),
382 382 'display','none');
383 383 });
384 384 </script>
385 385 <script type="text/javascript">
386 386 /**
387 387 * Plots summary graph
388 388 *
389 389 * @class SummaryPlot
390 390 * @param {from} initial from for detailed graph
391 391 * @param {to} initial to for detailed graph
392 392 * @param {dataset}
393 393 * @param {overview_dataset}
394 394 */
395 395 function SummaryPlot(from,to,dataset,overview_dataset) {
396 396 var initial_ranges = {
397 397 "xaxis":{
398 398 "from":from,
399 399 "to":to,
400 400 },
401 401 };
402 402 var dataset = dataset;
403 403 var overview_dataset = [overview_dataset];
404 404 var choiceContainer = YUD.get("legend_choices");
405 405 var choiceContainerTable = YUD.get("legend_choices_tables");
406 406 var plotContainer = YUD.get('commit_history');
407 407 var overviewContainer = YUD.get('overview');
408 408
409 409 var plot_options = {
410 410 bars: {show:true,align:'center',lineWidth:4},
411 411 legend: {show:true, container:"legend_container"},
412 412 points: {show:true,radius:0,fill:false},
413 413 yaxis: {tickDecimals:0,},
414 414 xaxis: {
415 415 mode: "time",
416 416 timeformat: "%d/%m",
417 417 min:from,
418 418 max:to,
419 419 },
420 420 grid: {
421 421 hoverable: true,
422 422 clickable: true,
423 423 autoHighlight:true,
424 424 color: "#999"
425 425 },
426 426 //selection: {mode: "x"}
427 427 };
428 428 var overview_options = {
429 429 legend:{show:false},
430 430 bars: {show:true,barWidth: 2,},
431 431 shadowSize: 0,
432 432 xaxis: {mode: "time", timeformat: "%d/%m/%y",},
433 433 yaxis: {ticks: 3, min: 0,tickDecimals:0,},
434 434 grid: {color: "#999",},
435 435 selection: {mode: "x"}
436 436 };
437 437
438 438 /**
439 439 *get dummy data needed in few places
440 440 */
441 441 function getDummyData(label){
442 442 return {"label":label,
443 443 "data":[{"time":0,
444 444 "commits":0,
445 445 "added":0,
446 446 "changed":0,
447 447 "removed":0,
448 448 }],
449 449 "schema":["commits"],
450 450 "color":'#ffffff',
451 451 }
452 452 }
453 453
454 454 /**
455 455 * generate checkboxes accordindly to data
456 456 * @param keys
457 457 * @returns
458 458 */
459 459 function generateCheckboxes(data) {
460 460 //append checkboxes
461 461 var i = 0;
462 462 choiceContainerTable.innerHTML = '';
463 463 for(var pos in data) {
464 464
465 465 data[pos].color = i;
466 466 i++;
467 467 if(data[pos].label != ''){
468 468 choiceContainerTable.innerHTML +=
469 469 '<tr><td><input type="checkbox" id="id_user_{0}" name="{0}" checked="checked" /> \
470 470 <label for="id_user_{0}">{0}</label></td></tr>'.format(data[pos].label);
471 471 }
472 472 }
473 473 }
474 474
475 475 /**
476 476 * ToolTip show
477 477 */
478 478 function showTooltip(x, y, contents) {
479 479 var div=document.getElementById('tooltip');
480 480 if(!div) {
481 481 div = document.createElement('div');
482 482 div.id="tooltip";
483 483 div.style.position="absolute";
484 484 div.style.border='1px solid #fdd';
485 485 div.style.padding='2px';
486 486 div.style.backgroundColor='#fee';
487 487 document.body.appendChild(div);
488 488 }
489 489 YUD.setStyle(div, 'opacity', 0);
490 490 div.innerHTML = contents;
491 491 div.style.top=(y + 5) + "px";
492 492 div.style.left=(x + 5) + "px";
493 493
494 494 var anim = new YAHOO.util.Anim(div, {opacity: {to: 0.8}}, 0.2);
495 495 anim.animate();
496 496 }
497 497
498 498 /**
499 499 * This function will detect if selected period has some changesets
500 500 for this user if it does this data is then pushed for displaying
501 501 Additionally it will only display users that are selected by the checkbox
502 502 */
503 503 function getDataAccordingToRanges(ranges) {
504 504
505 505 var data = [];
506 506 var new_dataset = {};
507 507 var keys = [];
508 508 var max_commits = 0;
509 509 for(var key in dataset){
510 510
511 511 for(var ds in dataset[key].data){
512 512 commit_data = dataset[key].data[ds];
513 513 if (commit_data.time >= ranges.xaxis.from && commit_data.time <= ranges.xaxis.to){
514 514
515 515 if(new_dataset[key] === undefined){
516 516 new_dataset[key] = {data:[],schema:["commits"],label:key};
517 517 }
518 518 new_dataset[key].data.push(commit_data);
519 519 }
520 520 }
521 521 if (new_dataset[key] !== undefined){
522 522 data.push(new_dataset[key]);
523 523 }
524 524 }
525 525
526 526 if (data.length > 0){
527 527 return data;
528 528 }
529 529 else{
530 530 //just return dummy data for graph to plot itself
531 531 return [getDummyData('')];
532 532 }
533 533 }
534 534
535 535 /**
536 536 * redraw using new checkbox data
537 537 */
538 538 function plotchoiced(e,args){
539 539 var cur_data = args[0];
540 540 var cur_ranges = args[1];
541 541
542 542 var new_data = [];
543 543 var inputs = choiceContainer.getElementsByTagName("input");
544 544
545 545 //show only checked labels
546 546 for(var i=0; i<inputs.length; i++) {
547 547 var checkbox_key = inputs[i].name;
548 548
549 549 if(inputs[i].checked){
550 550 for(var d in cur_data){
551 551 if(cur_data[d].label == checkbox_key){
552 552 new_data.push(cur_data[d]);
553 553 }
554 554 }
555 555 }
556 556 else{
557 557 //push dummy data to not hide the label
558 558 new_data.push(getDummyData(checkbox_key));
559 559 }
560 560 }
561 561
562 562 var new_options = YAHOO.lang.merge(plot_options, {
563 563 xaxis: {
564 564 min: cur_ranges.xaxis.from,
565 565 max: cur_ranges.xaxis.to,
566 566 mode:"time",
567 567 timeformat: "%d/%m",
568 568 },
569 569 });
570 570 if (!new_data){
571 571 new_data = [[0,1]];
572 572 }
573 573 // do the zooming
574 574 plot = YAHOO.widget.Flot(plotContainer, new_data, new_options);
575 575
576 576 plot.subscribe("plotselected", plotselected);
577 577
578 578 //resubscribe plothover
579 579 plot.subscribe("plothover", plothover);
580 580
581 581 // don't fire event on the overview to prevent eternal loop
582 582 overview.setSelection(cur_ranges, true);
583 583
584 584 }
585 585
586 586 /**
587 587 * plot only selected items from overview
588 588 * @param ranges
589 589 * @returns
590 590 */
591 591 function plotselected(ranges,cur_data) {
592 592 //updates the data for new plot
593 593 var data = getDataAccordingToRanges(ranges);
594 594 generateCheckboxes(data);
595 595
596 596 var new_options = YAHOO.lang.merge(plot_options, {
597 597 xaxis: {
598 598 min: ranges.xaxis.from,
599 599 max: ranges.xaxis.to,
600 600 mode:"time",
601 601 timeformat: "%d/%m",
602 602 },
603 603 });
604 604 // do the zooming
605 605 plot = YAHOO.widget.Flot(plotContainer, data, new_options);
606 606
607 607 plot.subscribe("plotselected", plotselected);
608 608
609 609 //resubscribe plothover
610 610 plot.subscribe("plothover", plothover);
611 611
612 612 // don't fire event on the overview to prevent eternal loop
613 613 overview.setSelection(ranges, true);
614 614
615 615 //resubscribe choiced
616 616 YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, ranges]);
617 617 }
618 618
619 619 var previousPoint = null;
620 620
621 621 function plothover(o) {
622 622 var pos = o.pos;
623 623 var item = o.item;
624 624
625 625 //YUD.get("x").innerHTML = pos.x.toFixed(2);
626 626 //YUD.get("y").innerHTML = pos.y.toFixed(2);
627 627 if (item) {
628 628 if (previousPoint != item.datapoint) {
629 629 previousPoint = item.datapoint;
630 630
631 631 var tooltip = YUD.get("tooltip");
632 632 if(tooltip) {
633 633 tooltip.parentNode.removeChild(tooltip);
634 634 }
635 635 var x = item.datapoint.x.toFixed(2);
636 636 var y = item.datapoint.y.toFixed(2);
637 637
638 638 if (!item.series.label){
639 639 item.series.label = 'commits';
640 640 }
641 641 var d = new Date(x*1000);
642 642 var fd = d.toDateString()
643 643 var nr_commits = parseInt(y);
644 644
645 645 var cur_data = dataset[item.series.label].data[item.dataIndex];
646 646 var added = cur_data.added;
647 647 var changed = cur_data.changed;
648 648 var removed = cur_data.removed;
649 649
650 650 var nr_commits_suffix = " ${_('commits')} ";
651 651 var added_suffix = " ${_('files added')} ";
652 652 var changed_suffix = " ${_('files changed')} ";
653 653 var removed_suffix = " ${_('files removed')} ";
654 654
655 655
656 656 if(nr_commits == 1){nr_commits_suffix = " ${_('commit')} ";}
657 657 if(added==1){added_suffix=" ${_('file added')} ";}
658 658 if(changed==1){changed_suffix=" ${_('file changed')} ";}
659 659 if(removed==1){removed_suffix=" ${_('file removed')} ";}
660 660
661 661 showTooltip(item.pageX, item.pageY, item.series.label + " on " + fd
662 662 +'<br/>'+
663 663 nr_commits + nr_commits_suffix+'<br/>'+
664 664 added + added_suffix +'<br/>'+
665 665 changed + changed_suffix + '<br/>'+
666 666 removed + removed_suffix + '<br/>');
667 667 }
668 668 }
669 669 else {
670 670 var tooltip = YUD.get("tooltip");
671 671
672 672 if(tooltip) {
673 673 tooltip.parentNode.removeChild(tooltip);
674 674 }
675 675 previousPoint = null;
676 676 }
677 677 }
678 678
679 679 /**
680 680 * MAIN EXECUTION
681 681 */
682 682
683 683 var data = getDataAccordingToRanges(initial_ranges);
684 684 generateCheckboxes(data);
685 685
686 686 //main plot
687 687 var plot = YAHOO.widget.Flot(plotContainer,data,plot_options);
688 688
689 689 //overview
690 690 var overview = YAHOO.widget.Flot(overviewContainer,
691 691 overview_dataset, overview_options);
692 692
693 693 //show initial selection on overview
694 694 overview.setSelection(initial_ranges);
695 695
696 696 plot.subscribe("plotselected", plotselected);
697 697 plot.subscribe("plothover", plothover)
698 698
699 699 overview.subscribe("plotselected", function (ranges) {
700 700 plot.setSelection(ranges);
701 701 });
702 702
703 703 // user choices on overview
704 704 YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, initial_ranges]);
705 705 }
706 706 SummaryPlot(${c.ts_min},${c.ts_max},${c.commit_data|n},${c.overview_data|n});
707 707 </script>
708 708 %endif
709 709
710 710 </%def>
General Comments 0
You need to be logged in to leave comments. Login now