taskjuggler 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
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