taskjuggler 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. data/{tasks/missing.rake → .gemtest} +0 -0
  2. data/CHANGELOG +27 -0
  3. data/Rakefile +8 -9
  4. data/bin/tj3 +2 -1
  5. data/bin/tj3client +2 -1
  6. data/bin/tj3d +2 -1
  7. data/bin/tj3man +2 -1
  8. data/bin/tj3ss_receiver +2 -1
  9. data/bin/tj3ss_sender +2 -1
  10. data/bin/tj3ts_receiver +2 -1
  11. data/bin/tj3ts_sender +2 -1
  12. data/bin/tj3ts_summary +2 -1
  13. data/data/tjp.vim +425 -419
  14. data/examples/Fedora-20/f-20.tjp +2442 -0
  15. data/examples/Fedora-20/icons/fedoralogo.png +0 -0
  16. data/examples/Fedora-20/reports.tji +423 -0
  17. data/lib/header.tmpl +13 -0
  18. data/lib/taskjuggler/AppConfig.rb +5 -0
  19. data/lib/taskjuggler/Attributes.rb +22 -0
  20. data/lib/taskjuggler/Journal.rb +273 -10
  21. data/lib/taskjuggler/Log.rb +9 -8
  22. data/lib/taskjuggler/Project.rb +28 -60
  23. data/lib/taskjuggler/ProjectFileScanner.rb +2 -1
  24. data/lib/taskjuggler/PropertySet.rb +3 -0
  25. data/lib/taskjuggler/PropertyTreeNode.rb +4 -0
  26. data/lib/taskjuggler/Query.rb +2 -1
  27. data/lib/taskjuggler/Resource.rb +0 -103
  28. data/lib/taskjuggler/RichText/RTFQuery.rb +42 -4
  29. data/lib/taskjuggler/SheetHandlerBase.rb +0 -20
  30. data/lib/taskjuggler/SheetReceiver.rb +23 -21
  31. data/lib/taskjuggler/Task.rb +3 -5
  32. data/lib/taskjuggler/TaskJuggler.rb +4 -0
  33. data/lib/taskjuggler/TaskScenario.rb +81 -103
  34. data/lib/taskjuggler/TextParser/Scanner.rb +19 -18
  35. data/lib/taskjuggler/Tj3Config.rb +1 -1
  36. data/lib/taskjuggler/TjpSyntaxRules.rb +180 -45
  37. data/lib/taskjuggler/UTF8String.rb +30 -0
  38. data/lib/taskjuggler/apps/Tj3.rb +1 -1
  39. data/lib/taskjuggler/apps/Tj3Man.rb +54 -2
  40. data/lib/taskjuggler/reports/ICalReport.rb +4 -4
  41. data/lib/taskjuggler/reports/NikuReport.rb +6 -0
  42. data/lib/taskjuggler/reports/Report.rb +5 -5
  43. data/lib/taskjuggler/reports/ReportContext.rb +4 -2
  44. data/lib/taskjuggler/reports/ResourceListRE.rb +10 -1
  45. data/lib/taskjuggler/reports/StatusSheetReport.rb +3 -0
  46. data/lib/taskjuggler/reports/TableReport.rb +8 -3
  47. data/lib/taskjuggler/reports/TimeSheetReport.rb +3 -0
  48. data/lib/updateheader.sh +15 -0
  49. data/manual/Installation +11 -22
  50. data/manual/Software +17 -3
  51. data/manual/html/Day_To_Day_Juggling.html +359 -0
  52. data/manual/html/Getting_Started.html +62 -0
  53. data/manual/html/How_To_Contribute.html +88 -0
  54. data/manual/html/Installation.html +172 -0
  55. data/manual/html/Intro.html +74 -0
  56. data/manual/html/Reporting_Bugs.html +47 -0
  57. data/manual/html/Rich_Text_Attributes.html +174 -0
  58. data/manual/html/Software.html +147 -0
  59. data/manual/html/TaskJuggler_2x_Migration.html +71 -0
  60. data/manual/html/TaskJuggler_Internals.html +61 -0
  61. data/manual/html/The_TaskJuggler_Syntax.html +89 -0
  62. data/manual/html/Tutorial.html +498 -0
  63. data/manual/html/account.html +152 -0
  64. data/manual/html/account.task.html +68 -0
  65. data/manual/html/accountprefix.html +67 -0
  66. data/manual/html/active.html +66 -0
  67. data/manual/html/adopt.task.html +73 -0
  68. data/manual/html/alert level.html +66 -0
  69. data/manual/html/alert.html +66 -0
  70. data/manual/html/allocate.html +92 -0
  71. data/manual/html/alphabet.html +33 -0
  72. data/manual/html/alternative.html +77 -0
  73. data/manual/html/author.html +69 -0
  74. data/manual/html/balance.html +73 -0
  75. data/manual/html/booking.resource.html +122 -0
  76. data/manual/html/booking.task.html +120 -0
  77. data/manual/html/caption.html +96 -0
  78. data/manual/html/cellcolor.column.html +71 -0
  79. data/manual/html/celltext.column.html +68 -0
  80. data/manual/html/center.html +67 -0
  81. data/manual/html/charge.html +89 -0
  82. data/manual/html/chargeset.html +73 -0
  83. data/manual/html/columnid.html +358 -0
  84. data/manual/html/columns.html +73 -0
  85. data/manual/html/complete.html +80 -0
  86. data/manual/html/copyright.html +97 -0
  87. data/manual/html/credit.html +117 -0
  88. data/{benchmarks → manual/html}/css/tjmanual.css +0 -0
  89. data/{benchmarks → manual/html}/css/tjreport.css +0 -0
  90. data/manual/html/currency.html +120 -0
  91. data/manual/html/currencyformat.html +99 -0
  92. data/manual/html/dailymax.html +144 -0
  93. data/manual/html/dailymin.html +132 -0
  94. data/manual/html/dailyworkinghours.html +90 -0
  95. data/manual/html/date.extend.html +77 -0
  96. data/manual/html/date.html +100 -0
  97. data/manual/html/definitions.html +94 -0
  98. data/manual/html/depends.html +110 -0
  99. data/manual/html/details.html +69 -0
  100. data/manual/html/disabled.html +85 -0
  101. data/manual/html/duration.html +133 -0
  102. data/manual/html/efficiency.html +93 -0
  103. data/manual/html/effort.html +134 -0
  104. data/manual/html/email.html +68 -0
  105. data/manual/html/enabled.html +69 -0
  106. data/manual/html/end.column.html +67 -0
  107. data/manual/html/end.html +87 -0
  108. data/manual/html/end.limit.html +69 -0
  109. data/manual/html/end.report.html +99 -0
  110. data/manual/html/end.timesheet.html +94 -0
  111. data/manual/html/endcredit.html +110 -0
  112. data/manual/html/epilog.html +72 -0
  113. data/manual/html/export.html +197 -0
  114. data/manual/html/extend.html +87 -0
  115. data/manual/html/fail.html +69 -0
  116. data/manual/html/fdl.html +430 -0
  117. data/manual/html/flags.account.html +66 -0
  118. data/manual/html/flags.html +66 -0
  119. data/manual/html/flags.journalentry.html +66 -0
  120. data/manual/html/flags.report.html +66 -0
  121. data/manual/html/flags.resource.html +68 -0
  122. data/manual/html/flags.statussheet.html +66 -0
  123. data/manual/html/flags.task.html +68 -0
  124. data/manual/html/flags.timesheet.html +66 -0
  125. data/manual/html/fontcolor.column.html +71 -0
  126. data/manual/html/footer.html +72 -0
  127. data/manual/html/formats.html +80 -0
  128. data/manual/html/functions.html +78 -0
  129. data/manual/html/gapduration.html +93 -0
  130. data/manual/html/gaplength.html +93 -0
  131. data/manual/html/halign.center.html +66 -0
  132. data/manual/html/halign.column.html +67 -0
  133. data/manual/html/halign.left.html +66 -0
  134. data/manual/html/halign.right.html +66 -0
  135. data/manual/html/hasalert.html +71 -0
  136. data/manual/html/header.html +72 -0
  137. data/manual/html/headline.html +69 -0
  138. data/manual/html/hidejournalentry.html +69 -0
  139. data/manual/html/hidereport.html +67 -0
  140. data/manual/html/hideresource.html +73 -0
  141. data/manual/html/hidetask.html +73 -0
  142. data/manual/html/icalreport.html +137 -0
  143. data/manual/html/include.macro.html +70 -0
  144. data/manual/html/include.project.html +71 -0
  145. data/manual/html/include.properties.html +168 -0
  146. data/manual/html/index.html +18 -0
  147. data/manual/html/inherit.extend.html +68 -0
  148. data/manual/html/interval1.html +99 -0
  149. data/manual/html/interval2.html +98 -0
  150. data/manual/html/interval3.html +99 -0
  151. data/manual/html/interval4.html +100 -0
  152. data/manual/html/isactive.html +67 -0
  153. data/manual/html/ischildof.html +67 -0
  154. data/manual/html/isdependencyof.html +75 -0
  155. data/manual/html/isdutyof.html +71 -0
  156. data/manual/html/isfeatureof.html +71 -0
  157. data/manual/html/isleaf.html +66 -0
  158. data/manual/html/ismilestone.html +67 -0
  159. data/manual/html/isongoing.html +67 -0
  160. data/manual/html/isresource.html +66 -0
  161. data/manual/html/istask.html +66 -0
  162. data/manual/html/journalattributes.html +107 -0
  163. data/manual/html/journalentry.html +83 -0
  164. data/manual/html/journalmode.html +83 -0
  165. data/manual/html/left.html +66 -0
  166. data/manual/html/length.html +104 -0
  167. data/manual/html/limits.allocate.html +72 -0
  168. data/manual/html/limits.html +72 -0
  169. data/manual/html/limits.resource.html +80 -0
  170. data/manual/html/limits.task.html +113 -0
  171. data/manual/html/listitem.column.html +66 -0
  172. data/manual/html/listtype.column.html +79 -0
  173. data/manual/html/loadunit.html +99 -0
  174. data/manual/html/logicalexpression.html +110 -0
  175. data/manual/html/logicalflagexpression.html +82 -0
  176. data/manual/html/macro.html +103 -0
  177. data/manual/html/managers.html +109 -0
  178. data/manual/html/mandatory.html +66 -0
  179. data/manual/html/maxend.html +69 -0
  180. data/manual/html/maximum.html +99 -0
  181. data/manual/html/maxstart.html +69 -0
  182. data/manual/html/milestone.html +71 -0
  183. data/manual/html/minend.html +69 -0
  184. data/manual/html/minimum.html +99 -0
  185. data/manual/html/minstart.html +69 -0
  186. data/manual/html/monthlymax.html +99 -0
  187. data/manual/html/monthlymin.html +99 -0
  188. data/manual/html/navbar.html +513 -0
  189. data/manual/html/navigator.html +70 -0
  190. data/manual/html/newtask.html +83 -0
  191. data/manual/html/nikureport.html +216 -0
  192. data/manual/html/note.task.html +68 -0
  193. data/manual/html/now.html +67 -0
  194. data/manual/html/numberformat.html +85 -0
  195. data/manual/html/onend.html +68 -0
  196. data/manual/html/onstart.html +68 -0
  197. data/manual/html/opennodes.html +66 -0
  198. data/manual/html/overtime.booking.html +76 -0
  199. data/manual/html/period.column.html +67 -0
  200. data/manual/html/period.limit.html +69 -0
  201. data/manual/html/period.report.html +69 -0
  202. data/manual/html/period.task.html +69 -0
  203. data/manual/html/persistent.html +66 -0
  204. data/manual/html/precedes.html +86 -0
  205. data/manual/html/priority.html +114 -0
  206. data/manual/html/priority.timesheet.html +68 -0
  207. data/manual/html/project.html +88 -0
  208. data/manual/html/projectid.html +66 -0
  209. data/manual/html/projectid.task.html +68 -0
  210. data/manual/html/projectids.html +66 -0
  211. data/manual/html/projection.html +75 -0
  212. data/manual/html/prolog.html +72 -0
  213. data/manual/html/properties.html +64 -0
  214. data/manual/html/purge.html +69 -0
  215. data/manual/html/rate.html +66 -0
  216. data/manual/html/rate.resource.html +68 -0
  217. data/manual/html/reference.extend.html +77 -0
  218. data/manual/html/remaining.html +117 -0
  219. data/manual/html/replace.html +66 -0
  220. data/manual/html/report.html +333 -0
  221. data/manual/html/reportprefix.html +67 -0
  222. data/manual/html/resource.html +194 -0
  223. data/manual/html/resourceattributes.html +83 -0
  224. data/manual/html/resourceprefix.html +67 -0
  225. data/manual/html/resourcereport.html +69 -0
  226. data/manual/html/resourceroot.html +90 -0
  227. data/manual/html/resources.limit.html +82 -0
  228. data/manual/html/responsible.html +69 -0
  229. data/manual/html/richtext.extend.html +78 -0
  230. data/manual/html/right.html +66 -0
  231. data/manual/html/rollupresource.html +92 -0
  232. data/manual/html/rolluptask.html +69 -0
  233. data/manual/html/scale.column.html +87 -0
  234. data/manual/html/scenario.html +123 -0
  235. data/manual/html/scenario.ical.html +67 -0
  236. data/manual/html/scenarios.export.html +66 -0
  237. data/manual/html/scenarios.html +66 -0
  238. data/manual/html/scenariospecific.extend.html +68 -0
  239. data/manual/html/scheduled.html +68 -0
  240. data/manual/html/scheduling.html +74 -0
  241. data/manual/html/select.html +86 -0
  242. data/manual/html/selfcontained.html +66 -0
  243. data/manual/html/shift.html +128 -0
  244. data/manual/html/shift.resource.html +74 -0
  245. data/manual/html/shift.task.html +74 -0
  246. data/manual/html/shift.timesheet.html +70 -0
  247. data/manual/html/shifts.allocate.html +71 -0
  248. data/manual/html/shifts.resource.html +73 -0
  249. data/manual/html/shifts.task.html +73 -0
  250. data/manual/html/shorttimeformat.html +67 -0
  251. data/manual/html/sloppy.booking.html +77 -0
  252. data/manual/html/sloppy.projection.html +66 -0
  253. data/manual/html/sortjournalentries.html +81 -0
  254. data/manual/html/sortresources.html +73 -0
  255. data/manual/html/sorttasks.html +73 -0
  256. data/manual/html/start.column.html +67 -0
  257. data/manual/html/start.html +78 -0
  258. data/manual/html/start.limit.html +69 -0
  259. data/manual/html/start.report.html +69 -0
  260. data/manual/html/startcredit.html +68 -0
  261. data/manual/html/status.statussheet.html +73 -0
  262. data/manual/html/status.timesheet.html +91 -0
  263. data/manual/html/statussheet.html +124 -0
  264. data/manual/html/statussheetreport.html +125 -0
  265. data/manual/html/strict.projection.html +66 -0
  266. data/manual/html/summary.html +69 -0
  267. data/manual/html/supplement.html +108 -0
  268. data/manual/html/supplement.resource.html +195 -0
  269. data/manual/html/supplement.task.html +329 -0
  270. data/manual/html/tagfile.html +73 -0
  271. data/manual/html/task.html +320 -0
  272. data/manual/html/task.statussheet.html +74 -0
  273. data/manual/html/task.timesheet.html +89 -0
  274. data/manual/html/taskattributes.html +115 -0
  275. data/manual/html/taskprefix.html +67 -0
  276. data/manual/html/taskreport.html +69 -0
  277. data/manual/html/taskroot.html +103 -0
  278. data/manual/html/text.extend.html +77 -0
  279. data/manual/html/textreport.html +66 -0
  280. data/manual/html/timeformat.html +160 -0
  281. data/manual/html/timeoff.nikureport.html +71 -0
  282. data/manual/html/timesheet.html +129 -0
  283. data/manual/html/timesheetreport.html +107 -0
  284. data/manual/html/timezone.export.html +66 -0
  285. data/manual/html/timezone.html +72 -0
  286. data/manual/html/timezone.report.html +66 -0
  287. data/manual/html/timezone.shift.html +70 -0
  288. data/manual/html/timingresolution.html +71 -0
  289. data/manual/html/title.column.html +67 -0
  290. data/manual/html/title.html +68 -0
  291. data/manual/html/toc.html +1330 -0
  292. data/manual/html/tooltip.column.html +72 -0
  293. data/manual/html/trackingscenario.html +80 -0
  294. data/manual/html/treelevel.html +66 -0
  295. data/manual/html/vacation.html +71 -0
  296. data/manual/html/vacation.resource.html +73 -0
  297. data/manual/html/vacation.shift.html +71 -0
  298. data/manual/html/warn.html +69 -0
  299. data/manual/html/weeklymax.html +99 -0
  300. data/manual/html/weeklymin.html +99 -0
  301. data/manual/html/weekstartsmonday.html +66 -0
  302. data/manual/html/weekstartssunday.html +66 -0
  303. data/manual/html/width.column.html +66 -0
  304. data/manual/html/work.html +105 -0
  305. data/manual/html/workinghours.project.html +102 -0
  306. data/manual/html/workinghours.resource.html +79 -0
  307. data/manual/html/workinghours.shift.html +81 -0
  308. data/manual/html/yearlyworkingdays.html +70 -0
  309. data/spec/StatusSheets_spec.rb +0 -6
  310. data/spec/TimeSheets_spec.rb +0 -6
  311. data/spec/Tj3Daemon_spec.rb +2 -0
  312. data/spec/support/DaemonControl.rb +10 -0
  313. data/taskjuggler.gemspec +71 -0
  314. data/tasks/changelog.rake +2 -2
  315. data/tasks/gem.rake +50 -21
  316. data/tasks/manual.rake +1 -1
  317. data/tasks/rdoc.rake +5 -12
  318. data/tasks/spec.rake +1 -1
  319. data/tasks/test.rake +5 -8
  320. data/test/ReferenceGenerator.rb +91 -0
  321. data/test/TestSuite/CSV-Reports/refs/resourcereport.csv +4 -4
  322. data/test/TestSuite/ReportGenerator/Correct/Journal.tjp +21 -0
  323. data/test/TestSuite/ReportGenerator/Correct/JournalMode.tjp +124 -0
  324. data/test/TestSuite/ReportGenerator/Correct/refs/Alerts-1.csv +124 -124
  325. data/test/TestSuite/ReportGenerator/Correct/refs/Journal-1.csv +1 -7
  326. data/test/TestSuite/ReportGenerator/Correct/refs/Journal-2.csv +7 -3
  327. data/test/TestSuite/ReportGenerator/Correct/refs/JournalMode-1.csv +79 -0
  328. data/test/TestSuite/ReportGenerator/Correct/refs/JournalMode-2.csv +208 -0
  329. data/test/TjpGen.rb +152 -0
  330. metadata +1290 -741
  331. data/benchmarks/666tasks.tjp +0 -3183
  332. data/benchmarks/allocate.tjp +0 -30
  333. data/benchmarks/allocatedSlots.tjp +0 -1602
  334. data/benchmarks/booking.tjp +0 -76
  335. data/benchmarks/depends.tjp +0 -113
  336. data/benchmarks/gantt.tjp +0 -57
  337. data/benchmarks/htmltaskreport.tjp +0 -71
  338. data/benchmarks/icons/details.png +0 -0
  339. data/benchmarks/icons/flag-green.png +0 -0
  340. data/benchmarks/icons/flag-red.png +0 -0
  341. data/benchmarks/icons/flag-yellow.png +0 -0
  342. data/benchmarks/icons/resource.png +0 -0
  343. data/benchmarks/icons/resourcegroup.png +0 -0
  344. data/benchmarks/icons/task.png +0 -0
  345. data/benchmarks/icons/taskgroup.png +0 -0
  346. data/benchmarks/icons/trend-down.png +0 -0
  347. data/benchmarks/icons/trend-flat.png +0 -0
  348. data/benchmarks/icons/trend-up.png +0 -0
  349. data/benchmarks/runbench.rb +0 -30
  350. data/benchmarks/scripts/wz_tooltip.js +0 -1301
  351. data/gem_spec.rb +0 -37
  352. data/lib/exchangebug.rb +0 -42
  353. data/lib/ruby-signal-bug.rb +0 -55
  354. data/prj_cfg.rb +0 -50
  355. data/tasks/csts.rake +0 -72
  356. data/tasks/rcov.rake +0 -14
  357. data/tasks/rexml_fix.rb +0 -16
  358. data/tasks/rexml_fix_19.rb +0 -49
  359. data/tasks/show.rake +0 -21
  360. data/tasks/stats.rake +0 -25
  361. data/test/TestSuite/Export-Reports/refs/DST.tjp +0 -60
  362. data/test/TestSuite/Export-Reports/refs/ReleasePlan.tjp +0 -80
  363. data/test/TestSuite/Export-Reports/tp.tjp +0 -49
  364. data/test/TestSuite/HTML-Reports/Alerts.html +0 -424
  365. data/test/TestSuite/HTML-Reports/TimeSheet.html +0 -79
  366. data/test/TestSuite/HTML-Reports/css/tjmanual.css +0 -86
  367. data/test/TestSuite/HTML-Reports/css/tjreport.css +0 -413
  368. data/test/TestSuite/HTML-Reports/icons/details.png +0 -0
  369. data/test/TestSuite/HTML-Reports/icons/flag-green.png +0 -0
  370. data/test/TestSuite/HTML-Reports/icons/flag-red.png +0 -0
  371. data/test/TestSuite/HTML-Reports/icons/flag-yellow.png +0 -0
  372. data/test/TestSuite/HTML-Reports/icons/resource.png +0 -0
  373. data/test/TestSuite/HTML-Reports/icons/resourcegroup.png +0 -0
  374. data/test/TestSuite/HTML-Reports/icons/task.png +0 -0
  375. data/test/TestSuite/HTML-Reports/icons/taskgroup.png +0 -0
  376. data/test/TestSuite/HTML-Reports/icons/trend-down.png +0 -0
  377. data/test/TestSuite/HTML-Reports/icons/trend-flat.png +0 -0
  378. data/test/TestSuite/HTML-Reports/icons/trend-up.png +0 -0
  379. data/test/TestSuite/HTML-Reports/reference.html +0 -51
  380. data/test/TestSuite/HTML-Reports/scripts/wz_tooltip.js +0 -1301
  381. data/test/TestSuite/ReportGenerator/Correct/css/tjmanual.css +0 -86
  382. data/test/TestSuite/ReportGenerator/Correct/css/tjreport.css +0 -413
  383. data/test/TestSuite/ReportGenerator/Correct/icons/details.png +0 -0
  384. data/test/TestSuite/ReportGenerator/Correct/icons/flag-green.png +0 -0
  385. data/test/TestSuite/ReportGenerator/Correct/icons/flag-red.png +0 -0
  386. data/test/TestSuite/ReportGenerator/Correct/icons/flag-yellow.png +0 -0
  387. data/test/TestSuite/ReportGenerator/Correct/icons/resource.png +0 -0
  388. data/test/TestSuite/ReportGenerator/Correct/icons/resourcegroup.png +0 -0
  389. data/test/TestSuite/ReportGenerator/Correct/icons/task.png +0 -0
  390. data/test/TestSuite/ReportGenerator/Correct/icons/taskgroup.png +0 -0
  391. data/test/TestSuite/ReportGenerator/Correct/icons/trend-down.png +0 -0
  392. data/test/TestSuite/ReportGenerator/Correct/icons/trend-flat.png +0 -0
  393. data/test/TestSuite/ReportGenerator/Correct/icons/trend-up.png +0 -0
  394. data/test/TestSuite/ReportGenerator/Correct/opennodes.tjp +0 -26
  395. data/test/TestSuite/ReportGenerator/Correct/refs/opennodes-1.csv +0 -2
  396. data/test/TestSuite/ReportGenerator/Correct/scripts/wz_tooltip.js +0 -1301
  397. data/test/TestSuite/Scheduler/Correct/Allocate.html +0 -1075
  398. data/test/TestSuite/Scheduler/Correct/Duration.html +0 -610
  399. data/test/TestSuite/Scheduler/Correct/css/tjmanual.css +0 -85
  400. data/test/TestSuite/Scheduler/Correct/css/tjreport.css +0 -413
  401. data/test/TestSuite/Scheduler/Correct/icons/details.png +0 -0
  402. data/test/TestSuite/Scheduler/Correct/icons/flag-green.png +0 -0
  403. data/test/TestSuite/Scheduler/Correct/icons/flag-red.png +0 -0
  404. data/test/TestSuite/Scheduler/Correct/icons/flag-yellow.png +0 -0
  405. data/test/TestSuite/Scheduler/Correct/icons/resource.png +0 -0
  406. data/test/TestSuite/Scheduler/Correct/icons/resourcegroup.png +0 -0
  407. data/test/TestSuite/Scheduler/Correct/icons/task.png +0 -0
  408. data/test/TestSuite/Scheduler/Correct/icons/taskgroup.png +0 -0
  409. data/test/TestSuite/Scheduler/Correct/icons/trend-down.png +0 -0
  410. data/test/TestSuite/Scheduler/Correct/icons/trend-flat.png +0 -0
  411. data/test/TestSuite/Scheduler/Correct/icons/trend-up.png +0 -0
  412. data/test/TestSuite/Scheduler/Correct/scripts/wz_tooltip.js +0 -1301
  413. data/test/TestSuite/StatusSheetTemplates/project.tji +0 -35
  414. data/test/TestSuite/StatusSheetTemplates/project.tjp +0 -56
  415. data/test/TestSuite/StatusSheets/TimeSheets/2002-03-01/missing-reports +0 -2
  416. data/test/TestSuite/StatusSheets/TimeSheets/2002-03-01/resource1_2002-03-01.tji +0 -0
  417. data/test/TestSuite/StatusSheets/boss.tji +0 -45
  418. data/test/TestSuite/StatusSheets/boss_mail +0 -51
  419. data/test/TestSuite/StatusSheets/dev2_mail +0 -37
  420. data/test/TestSuite/StatusSheets/project.tjp +0 -275
  421. data/test/TestSuite/StatusSheets/run +0 -54
  422. data/test/TestSuite/Syntax/Correct/DST.tjp +0 -11
  423. data/test/TestSuite/Syntax/Correct/ReleasePlan.tjp +0 -32
  424. data/test/TestSuite/Syntax/Correct/css/tjmanual.css +0 -86
  425. data/test/TestSuite/Syntax/Correct/css/tjreport.css +0 -413
  426. data/test/TestSuite/Syntax/Correct/icons/details.png +0 -0
  427. data/test/TestSuite/Syntax/Correct/icons/flag-green.png +0 -0
  428. data/test/TestSuite/Syntax/Correct/icons/flag-red.png +0 -0
  429. data/test/TestSuite/Syntax/Correct/icons/flag-yellow.png +0 -0
  430. data/test/TestSuite/Syntax/Correct/icons/resource.png +0 -0
  431. data/test/TestSuite/Syntax/Correct/icons/resourcegroup.png +0 -0
  432. data/test/TestSuite/Syntax/Correct/icons/task.png +0 -0
  433. data/test/TestSuite/Syntax/Correct/icons/taskgroup.png +0 -0
  434. data/test/TestSuite/Syntax/Correct/icons/trend-down.png +0 -0
  435. data/test/TestSuite/Syntax/Correct/icons/trend-flat.png +0 -0
  436. data/test/TestSuite/Syntax/Correct/icons/trend-up.png +0 -0
  437. data/test/TestSuite/Syntax/Correct/scripts/wz_tooltip.js +0 -1301
  438. data/test/TestSuite/TimeSheets/dev2_mail1 +0 -84
  439. data/test/TestSuite/TimeSheets/dev2_mail2 +0 -87
  440. data/test/TestSuite/TimeSheets/project.tjp +0 -271
  441. data/test/TestSuite/TimeSheets/receiver.log.mod +0 -1056
  442. data/test/TestSuite/TimeSheets/run +0 -76
  443. data/test/TestSuite/TimeSheets/uu.txt +0 -29
@@ -306,6 +306,18 @@ class TaskJuggler
306
306
  end
307
307
 
308
308
  end
309
+ class JournalSortListAttribute < ListAttributeBase
310
+
311
+ def initialize(property, type, container)
312
+ super
313
+ end
314
+
315
+ def JournalSortListAttribute ::tjpId
316
+ 'journalsorting'
317
+ end
318
+
319
+ end
320
+
309
321
 
310
322
  class TimeIntervalListAttribute < ListAttributeBase
311
323
  def initialize(property, type, container)
@@ -577,6 +589,16 @@ class TaskJuggler
577
589
  end
578
590
  end
579
591
 
592
+ class SymbolListAttribute < ListAttributeBase
593
+ def initialize(property, type, container)
594
+ super
595
+ end
596
+
597
+ def SymbolListAttribute::tjpId
598
+ 'symbollist'
599
+ end
600
+ end
601
+
580
602
  class TaskDepListAttribute < ListAttributeBase
581
603
  def initialize(property, type, container)
582
604
  super
@@ -56,6 +56,125 @@ class TaskJuggler
56
56
  @journal.addEntry(self)
57
57
  end
58
58
 
59
+ # Convert the entry into a RichText string. The formatting is controlled
60
+ # by the Query parameters.
61
+ def to_rText(query)
62
+ # We use the alert level a sortable and numerical result.
63
+ if query.journalAttributes.include?('alert')
64
+ levelRecord = query.project['alertLevels'][alertLevel]
65
+ if query.selfContained
66
+ alertName = "<nowiki>[#{levelRecord[1]}]</nowiki> "
67
+ else
68
+ alertName = "[[File:icons/flag-#{levelRecord[0]}.png|" +
69
+ "alt=[#{levelRecord[1]}]|text-bottom]] "
70
+ end
71
+ else
72
+ alertName = ''
73
+ end
74
+
75
+ # The String that will hold the result as RichText markup.
76
+ rText = ''
77
+
78
+ # Markup to use for headlines.
79
+ hlMark = '==='
80
+
81
+ if query.journalAttributes.include?('property') && @property
82
+ if @property.is_a?(Task)
83
+ # Include the alert level, task name and ID.
84
+ rText += "#{hlMark} #{alertName} <nowiki>#{@property.name}</nowiki>"
85
+ if query.journalAttributes.include?('propertyid')
86
+ rText += " (ID: #{@property.fullId})"
87
+ end
88
+ rText += " #{hlMark}\n\n"
89
+
90
+ if query.journalAttributes.include?('timesheet') && @timeSheetRecord
91
+ # Include the reported time sheet data for this task.
92
+ rText += "'''Work:''' #{@timeSheetRecord.actualWorkPercent.to_i}% "
93
+ if @timeSheetRecord.actualWorkPercent !=
94
+ @timeSheetRecord.planWorkPercent
95
+ rText += "(#{@timeSheetRecord.planWorkPercent.to_i}%) "
96
+ end
97
+ if @timeSheetRecord.remaining
98
+ rText += "'''Remaining:''' #{@timeSheetRecord.actualRemaining}d "
99
+ if @timeSheetRecord.actualRemaining !=
100
+ @timeSheetRecord.planRemaining
101
+ rText += "(#{@timeSheetRecord.planRemaining}d) "
102
+ end
103
+ else
104
+ rText += "'''End:''' " +
105
+ "#{@timeSheetRecord.actualEnd.to_s(query.timeFormat)} "
106
+ if @timeSheetRecord.actualEnd != @timeSheetRecord.planEnd
107
+ rText += "(#{@timeSheetRecord.planEnd.to_s(query.timeFormat)}) "
108
+ end
109
+ end
110
+ rText += "\n\n"
111
+ end
112
+ elsif !(@timeSheetRecord = @timeSheetRecord).nil? &&
113
+ @timeSheetRecord.task.is_a?(String)
114
+ # There is only an entry in the timesheet, but we don't have a
115
+ # corresponding Task in the Project. This must be a new task created
116
+ # by the timesheet submitter.
117
+ rText += "#{hlMark} #{alertName} <nowiki>[New Task] " +
118
+ "#{@timeSheetRecord.name}</nowiki>"
119
+ if query.journalAttributes.include?('propertyid')
120
+ rText += " (ID: #{@timeSheetRecord.task})"
121
+ end
122
+ rText += " #{hlMark}\n\n"
123
+
124
+ if query.journalAttributes.include?('timesheet') && @timeSheetRecord
125
+ # We don't have any plan data since it's a new task. Just include
126
+ # the reported time sheet actuals.
127
+ rText += "'''Work:''' #{@timeSheetRecord.actualWorkPercent}% "
128
+ if @timeSheetRecord.remaining
129
+ rText += "'''Remaining:''' #{@timeSheetRecord.actualRemaining}d "
130
+ else
131
+ rText += "'''End:''' " +
132
+ "#{@timeSheetRecord.actualEnd.to_s(query.timeFormat)} "
133
+ end
134
+ rText += "\n\n"
135
+ end
136
+ else
137
+ # Property must be a Resource
138
+ rText += "#{hlMark} #{alertName} Personal Notes #{hlMark}\n\n"
139
+ end
140
+
141
+ # We've shown the alert now. Don't show it again with the headline.
142
+ alertName = ''
143
+ # Increase level for subsequent headlines.
144
+ hlMark += '='
145
+ end
146
+
147
+ if query.journalAttributes.include?('headline')
148
+ rText += "#{hlMark} #{alertName}<nowiki>" + @headline +
149
+ "</nowiki> #{hlMark}\n\n"
150
+ end
151
+
152
+ showDate = query.journalAttributes.include?('date')
153
+ showAuthor = query.journalAttributes.include?('author') && @author
154
+ if showDate || showAuthor
155
+ rText += "''Reported "
156
+ end
157
+ if showDate
158
+ rText += "on #{@date.to_s(query.timeFormat)} "
159
+ end
160
+ if showAuthor
161
+ rText += "by <nowiki>#{@author.name}</nowiki>"
162
+ end
163
+ rText += "''\n\n" if showDate || showAuthor
164
+
165
+ if query.journalAttributes.include?('flags') && !@flags.empty?
166
+ rText += "''Flags:'' #{@flags.join(', ')}\n\n"
167
+ end
168
+
169
+ if query.journalAttributes.include?('summary') && @summary
170
+ rText += @summary.richText.inputText + "\n\n"
171
+ end
172
+ if query.journalAttributes.include?('details') && @details
173
+ rText += @details.richText.inputText + "\n\n"
174
+ end
175
+ rText
176
+ end
177
+
59
178
  # Just for debugging
60
179
  def to_s # :nodoc:
61
180
  "Headline: #{@headline}\nProperty: #{@property.class}: #{@property.fullId}"
@@ -70,11 +189,27 @@ class TaskJuggler
70
189
 
71
190
  attr_reader :entries
72
191
 
192
+ JournalEntryList::SortingAttributes = [ :alert, :date, :seqno ]
193
+
73
194
  def initialize
74
195
  @entries = []
75
196
  @sorted = false
197
+ @sortBy = [ [ :date, 1 ], [ :alert, 1 ], [ :seqno, 1 ] ]
198
+ end
199
+
200
+ def setSorting(by)
201
+ by.each do |attr, direction|
202
+ unless SortingAttributes.include?(attr)
203
+ raise ArgumentError, "Unknown attribute #{attr}"
204
+ end
205
+ if (direction != 1) && (direction != -1)
206
+ raise ArgumentError, "Unknown direction #{direction}"
207
+ end
208
+ end
209
+ @sortBy = by
76
210
  end
77
211
 
212
+
78
213
  # Return the number of entries.
79
214
  def count
80
215
  @entries.length
@@ -167,12 +302,21 @@ class TaskJuggler
167
302
  else
168
303
  return self if @sorted
169
304
 
170
- @entries.sort! { |a, b| a.date != b.date ?
171
- a.date <=> b.date :
172
- (a.alertLevel != b.alertLevel ?
173
- a.alertLevel <=> b.alertLevel :
174
- a.property.sequenceNo <=>
175
- b.property.sequenceNo) }
305
+ @entries.sort! do |a, b|
306
+ res = 0
307
+ @sortBy.each do |attr, direction|
308
+ res = case attr
309
+ when :date
310
+ a.date <=> b.date
311
+ when :alert
312
+ a.alertLevel <=> b.alertLevel
313
+ when :seqno
314
+ a.property.sequenceNo <=> b.property.sequenceNo
315
+ end * direction
316
+ break if res != 0
317
+ end
318
+ res
319
+ end
176
320
  end
177
321
  @sorted = true
178
322
  self
@@ -211,6 +355,124 @@ class TaskJuggler
211
355
  @propertyToEntries[entry.property] << entry
212
356
  end
213
357
 
358
+ def to_rti(query)
359
+ entries = JournalEntryList.new
360
+
361
+ case query.journalMode
362
+ when :journal
363
+ # This is the regular journal. It contains all journal entries that
364
+ # are dated in the query interval. If a property is given, only
365
+ # entries of this property are included.
366
+ if query.property
367
+ if query.property.is_a?(Task)
368
+ entries = entriesByTask(query.property, query.start, query.end,
369
+ query.hideJournalEntry)
370
+ elsif query.property.is_a?(Resource)
371
+ entries = entriesByResource(query.property, query.start, query.end,
372
+ query.hideJournalEntry)
373
+ end
374
+ else
375
+ entries = self.entries(query.start, query.end, query.hideJournalEntry)
376
+ end
377
+ when :journal_sub
378
+ # This mode also contains all journal entries that are dated in the
379
+ # query interval. A property must be given and only entries of this
380
+ # property and all its children are included.
381
+ if query.property.is_a?(Task)
382
+ entries = entriesByTaskR(query.property, query.start, query.end,
383
+ query.hideJournalEntry)
384
+ end
385
+ when :status_up
386
+ # In this mode only the last entries before the query end date for
387
+ # each task are included. An entry is not included if any of the
388
+ # parent tasks has a more recent entry that is still before the query
389
+ # end date.
390
+ if query.property
391
+ if query.property.is_a?(Task)
392
+ entries += currentEntries(query.end, query.property, 0, query.start,
393
+ query.hideJournalEntry)
394
+ end
395
+ else
396
+ query.project.tasks.each do |task|
397
+ # We only care about top-level tasks.
398
+ next if task.parent
399
+
400
+ entries += currentEntries(query.end, task, 0, query.start,
401
+ query.hideJournalEntry)
402
+ # Eliminate duplicates due to entries from adopted tasks
403
+ entries.uniq!
404
+ end
405
+ end
406
+ when :status_down
407
+ # In this mode only the last entries before the query end date for
408
+ # each task (incl. sub tasks) are included.
409
+ if query.property
410
+ if query.property.is_a?(Task)
411
+ entries += currentEntriesR(query.end, query.property, 0, query.start,
412
+ query.hideJournalEntry)
413
+ end
414
+ else
415
+ query.project.tasks.each do |task|
416
+ # We only care about top-level tasks.
417
+ next if task.parent
418
+
419
+ entries += currentEntriesR(query.end, task, 0, query.start,
420
+ query.hideJournalEntry)
421
+ # Eliminate duplicates due to entries from adopted tasks
422
+ entries.uniq!
423
+ end
424
+ end
425
+ when :alerts_down
426
+ # In this mode only the last entries before the query end date for
427
+ # each task (incl. sub tasks) and only the ones with the highest alert
428
+ # level are included.
429
+ if query.property
430
+ if query.property.is_a?(Task)
431
+ entries += alertEntries(query.end, query.property, 1, query.start,
432
+ query.hideJournalEntry)
433
+ end
434
+ else
435
+ query.project.tasks.each do |task|
436
+ # We only care about top-level tasks.
437
+ next if task.parent
438
+
439
+ entries += alertEntries(query.end, task, 1, query.start,
440
+ query.hideJournalEntry)
441
+ # Eliminate duplicates due to entries from adopted tasks
442
+ entries.uniq!
443
+ end
444
+ end
445
+ else
446
+ raise "Unknown jourmal mode: #{query.journalMode}"
447
+ end
448
+ # Sort entries according to the user specified sorting criteria.
449
+ entries.setSorting(query.sortJournalEntries)
450
+ entries.sort!
451
+
452
+ # The components of the message are either UTF-8 text or RichText. For
453
+ # the RichText components, we use the originally provided markup since
454
+ # we compose the result as RichText markup first.
455
+ rText = ''
456
+ entries.each do |entry|
457
+ rText += entry.to_rText(query)
458
+ end
459
+
460
+ # Now convert the RichText markup String into RichTextIntermediate
461
+ # format.
462
+ unless (rti = RichText.new(rText, RTFHandlers.create(query.project),
463
+ query.project.messageHandler).
464
+ generateIntermediateFormat)
465
+ query.project.warning('ptn_journal',
466
+ "Syntax error in journal: #{rText}")
467
+ return nil
468
+ end
469
+ # No section numbers, please!
470
+ rti.sectionNumbers = false
471
+ # We use a special class to allow CSS formating.
472
+ rti.cssClass = 'tj_journal'
473
+ query.rti = rti
474
+ end
475
+
214
476
  # Return a list of all JournalEntry objects for the given _resource_ that
215
477
  # are dated between _startDate_ and _endDate_, are not hidden by their
216
478
  # flags matching _logExp_, are for Task _task_ and have at least the alert
@@ -218,7 +480,7 @@ class TaskJuggler
218
480
  # the entry.
219
481
  def entriesByResource(resource, startDate = nil, endDate = nil,
220
482
  logExp = nil, task = nil, alertLevel = nil)
221
- list = []
483
+ list = JournalEntryList.new
222
484
  @entries.each do |entry|
223
485
  if entry.author == resource &&
224
486
  (startDate.nil? || entry.date > startDate) &&
@@ -239,7 +501,7 @@ class TaskJuggler
239
501
  # nil, it always matches the entry.
240
502
  def entriesByTask(task, startDate = nil, endDate = nil, logExp = nil,
241
503
  resource = nil, alertLevel = nil)
242
- list = []
504
+ list = JournalEntryList.new
243
505
  @entries.each do |entry|
244
506
  if entry.property == task &&
245
507
  (startDate.nil? || entry.date >= startDate) &&
@@ -273,7 +535,7 @@ class TaskJuggler
273
535
 
274
536
  def entries(startDate = nil, endDate = nil, logExp = nil, property = nil,
275
537
  alertLevel = nil)
276
- list = []
538
+ list = JournalEntryList.new
277
539
  @entries.each do |entry|
278
540
  if (startDate.nil? || startDate <= entry.date) &&
279
541
  (endDate.nil? || endDate >= entry.date) &&
@@ -304,7 +566,8 @@ class TaskJuggler
304
566
 
305
567
  # Return the list of JournalEntry objects that are dated at or before
306
568
  # _date_, are for _property_ or any of its childs, have at least _level_
307
- # alert and are after _minDate_.
569
+ # alert and are after _minDate_. We only return those entries with the
570
+ # highest overall alert level.
308
571
  def alertEntries(date, property, minLevel, minDate, logExp)
309
572
  maxLevel = 0
310
573
  entries = []
@@ -42,7 +42,7 @@ class TaskJuggler
42
42
  # into the shown segments will be shown for the next @@level nested
43
43
  # segments.
44
44
  def Log.segments=(s)
45
- @@segments = []
45
+ @@segments = s
46
46
  end
47
47
 
48
48
  # if +s+ is true, progress information will not be shown.
@@ -61,7 +61,7 @@ class TaskJuggler
61
61
  return if @@level == 0
62
62
 
63
63
  @@stack << segment
64
- Log.<< ">> [#{segment}] #{message}"
64
+ Log.msg { ">> [#{segment}] #{message}" }
65
65
  end
66
66
 
67
67
  # This function is used to close an open segment. To make this mechanism a
@@ -70,7 +70,7 @@ class TaskJuggler
70
70
  def Log.exit(segment, message = nil)
71
71
  return if @@level == 0
72
72
 
73
- Log.<< "<< [#{segment}] #{message}" if message
73
+ Log.msg { "<< [#{segment}] #{message}" } if message
74
74
  if @@stack.include?(segment)
75
75
  loop do
76
76
  m = @@stack.pop
@@ -80,8 +80,9 @@ class TaskJuggler
80
80
  end
81
81
 
82
82
  # Use this function to show a log message within the currently active
83
- # segment.
84
- def Log.<<(message)
83
+ # segment. The message is the result of the passed block. The block will
84
+ # only be evaluated if the message will actually be shown.
85
+ def Log.msg(&block)
85
86
  return if @@level == 0
86
87
 
87
88
  offset = 0
@@ -91,8 +92,8 @@ class TaskJuggler
91
92
  # If a segment list is used to filter the output, we look for the
92
93
  # first listed segments on the stack. This and all nested segments
93
94
  # will be shown.
94
- if @@segments.include?(segment) &&
95
- (offset = @@stack.length - @@stack.index(segment)) >= @@level
95
+ if @@segments.include?(segment)
96
+ offset = @@stack.index(segment)
96
97
  showMessage = true
97
98
  break
98
99
  end
@@ -100,7 +101,7 @@ class TaskJuggler
100
101
  return unless showMessage
101
102
  end
102
103
  if @@stack.length - offset < @@level
103
- $stderr.puts ' ' * (@@stack.length - offset) + message
104
+ $stderr.puts ' ' * (@@stack.length - offset) + yield(block)
104
105
  end
105
106
  end
106
107
 
@@ -368,6 +368,10 @@ class TaskJuggler
368
368
  false, false, false, -1 ],
369
369
  [ 'interactive', 'Interactive', BooleanAttribute,
370
370
  false, false, false, false ],
371
+ [ 'journalAttributes', 'Journal Attributes', SymbolListAttribute,
372
+ true, false, false, KeywordArray.new([ '*' ]) ],
373
+ [ 'journalMode', 'Journal Mode', SymbolAttribute,
374
+ true, false, false, :journal ],
371
375
  [ 'left', 'Left', RichTextAttribute,
372
376
  true, false, false, nil ],
373
377
  [ 'loadUnit', 'Load Unit', StringAttribute,
@@ -402,6 +406,8 @@ class TaskJuggler
402
406
  false, false, false, nil ],
403
407
  [ 'shortTimeFormat', 'Short Time Format', StringAttribute,
404
408
  true, true, false, nil ],
409
+ [ 'sortJournalEntries', 'Sort Journal Entries', JournalSortListAttribute,
410
+ true, false, false, [[ :alert, 1 ], [ :date, 1 ], [ :seqno, 1 ]] ],
405
411
  [ 'sortResources', 'Sort Resources', SortListAttribute,
406
412
  true, false, false, [[ 'seqno', true, -1 ]] ],
407
413
  [ 'sortTasks', 'Sort Tasks', SortListAttribute,
@@ -989,61 +995,9 @@ class TaskJuggler
989
995
  end
990
996
 
991
997
  def journal(query)
992
- entries = JournalEntryList.new
993
- @tasks.each do |task|
994
- # We only care about top-level tasks.
995
- next if task.parent
996
-
997
- entries += (e = @attributes['journal'].
998
- currentEntriesR(query.end, task, 0, query.start,
999
- query.hideJournalEntry))
1000
- end
1001
-
1002
- # Eliminate duplicates due to entries from adopted tasks
1003
- entries.uniq!
1004
-
1005
- journalMessages(entries, query, true)
1006
- end
1007
-
1008
- # Create a blog-style list of all alert messages that match the Query.
1009
- def journalMessages(entries, query, longVersion)
1010
- # The components of the message are either UTF-8 text or RichText. For
1011
- # the RichText components, we use the originally provided markup since
1012
- # we compose the result as RichText markup first.
1013
- rText = ''
1014
- entries.each do |entry|
1015
- rText += "==== <nowiki>" + entry.headline + "</nowiki> ====\n"
1016
- #rText += "''Reported on #{entry.date.to_s(query.timeFormat)}'' "
1017
- #if entry.author
1018
- # rText += "''by <nowiki>#{entry.author.name}</nowiki>''"
1019
- #end
1020
- #rText += "\n\n"
1021
- #unless entry.flags.empty?
1022
- # rText += "''Flags:'' #{entry.flags.join(', ')}\n\n"
1023
- #end
1024
- if entry.summary
1025
- rText += entry.summary.richText.inputText + "\n\n"
1026
- end
1027
- if longVersion && entry.details
1028
- rText += entry.details.richText.inputText + "\n\n"
1029
- end
1030
- end
1031
- # Now convert the RichText markup String into RichTextIntermediate
1032
- # format.
1033
- unless (rti = RichText.new(rText, RTFHandlers.create(self),
1034
- @messageHandler).
1035
- generateIntermediateFormat)
1036
- warning('ptn_journal', "Syntax error in journal message: #{rText}")
1037
- return nil
1038
- end
1039
- # No section numbers, please!
1040
- rti.sectionNumbers = false
1041
- # We use a special class to allow CSS formating.
1042
- rti.cssClass = 'tj_journal'
1043
- query.rti = rti
998
+ @attributes['journal'].to_rti(query)
1044
999
  end
1045
1000
 
1046
-
1047
1001
  # Print the attribute values. It's used for debugging only.
1048
1002
  def to_s
1049
1003
  #raise "STOP!"
@@ -1071,6 +1025,8 @@ class TaskJuggler
1071
1025
  protected
1072
1026
 
1073
1027
  def prepareScenario(scIdx)
1028
+ Log.enter('prepareScenario',
1029
+ "Finishing scenario #{scenario(scIdx).get('name')}")
1074
1030
  Log.startProgressMeter("Preparing scenario " +
1075
1031
  "#{scenario(scIdx).get('name')}")
1076
1032
  resources = PropertyList.new(@resources)
@@ -1141,9 +1097,13 @@ class TaskJuggler
1141
1097
  puts "#{task}"
1142
1098
  end
1143
1099
  end
1100
+ Log.exit('prepareScenario',
1101
+ "Preparing scenario #{scenario(scIdx).get('name')} completed")
1144
1102
  end
1145
1103
 
1146
1104
  def finishScenario(scIdx)
1105
+ Log.enter('finishScenario',
1106
+ "Finishing scenario #{scenario(scIdx).get('name')}")
1147
1107
  Log.startProgressMeter("Checking scenario #{scenario(scIdx).get('name')}")
1148
1108
  @tasks.each do |task|
1149
1109
  # Recursively traverse the top-level tasks to finish all tasks.
@@ -1164,6 +1124,8 @@ class TaskJuggler
1164
1124
  end
1165
1125
 
1166
1126
  Log.stopProgressMeter
1127
+ Log.exit('finishScenario',
1128
+ "Finishing scenario #{scenario(scIdx).get('name')} completed")
1167
1129
  end
1168
1130
 
1169
1131
  # Schedule all tasks for the given Scenario with index +scIdx+.
@@ -1208,13 +1170,10 @@ class TaskJuggler
1208
1170
  # Task not ready? Ignore it.
1209
1171
  next unless task.readyForScheduling?(scIdx)
1210
1172
 
1211
- if task.schedule(scIdx)
1212
- Log << "Task #{task.fullId}: #{task['start', scIdx]} -> " +
1213
- "#{task['end', scIdx]}"
1214
- else
1173
+ unless task.schedule(scIdx)
1215
1174
  failedTasks << task
1216
1175
  end
1217
- # The tasks has been completed or failed. But we can remove it from
1176
+ # The task has been completed or failed. But we can remove it from
1218
1177
  # the todo list.
1219
1178
  taskToRemove = task
1220
1179
  # The scheduling of this task may cause other higher priority tasks
@@ -1227,9 +1186,18 @@ class TaskJuggler
1227
1186
  # has found a set of tasks that deadlock each other.
1228
1187
  if taskToRemove
1229
1188
  tasks.delete(taskToRemove)
1189
+ elsif failedTasks.empty?
1190
+ warning('deadlock',
1191
+ 'Some tasks reference each other but don\'t provide ' +
1192
+ 'enough information to start the scheduling. The ' +
1193
+ 'scheduler does not know where to start scheduling ' +
1194
+ 'these tasks. You need to provide more fixed dates ' +
1195
+ 'or dependencies on already scheduled tasks.')
1196
+ failedTasks = tasks
1197
+ break
1230
1198
  else
1231
- tasks.each { |t| puts t.fullId }
1232
- raise 'Scheduler deadlock: Cannot schedule any further tasks'
1199
+ # We have some tasks that cannot be scheduled.
1200
+ break
1233
1201
  end
1234
1202
  end
1235
1203