taskjuggler 3.6.0 → 3.7.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.
- checksums.yaml +5 -5
- data/CHANGELOG +69 -0
- data/Rakefile +4 -1
- data/data/css/tjreport.css +4 -0
- data/data/tjp.vim +9 -3
- data/examples/ProjectTemplate/template.tjp +10 -10
- data/examples/Tutorial/tutorial.tjp +4 -4
- data/lib/taskjuggler/Allocation.rb +1 -1
- data/lib/taskjuggler/AppConfig.rb +1 -1
- data/lib/taskjuggler/AttributeBase.rb +10 -4
- data/lib/taskjuggler/Attributes.rb +2 -2
- data/lib/taskjuggler/BatchProcessor.rb +69 -58
- data/lib/taskjuggler/FileList.rb +1 -1
- data/lib/taskjuggler/Interval.rb +10 -12
- data/lib/taskjuggler/Journal.rb +2 -2
- data/lib/taskjuggler/LogicalFunction.rb +1 -1
- data/lib/taskjuggler/LogicalOperation.rb +7 -4
- data/lib/taskjuggler/MessageHandler.rb +1 -2
- data/lib/taskjuggler/PTNProxy.rb +1 -1
- data/lib/taskjuggler/Project.rb +27 -22
- data/lib/taskjuggler/PropertyList.rb +7 -1
- data/lib/taskjuggler/PropertySet.rb +1 -1
- data/lib/taskjuggler/PropertyTreeNode.rb +5 -3
- data/lib/taskjuggler/Query.rb +3 -3
- data/lib/taskjuggler/RealFormat.rb +1 -1
- data/lib/taskjuggler/Resource.rb +2 -2
- data/lib/taskjuggler/ResourceScenario.rb +66 -6
- data/lib/taskjuggler/RichText/Snip.rb +1 -1
- data/lib/taskjuggler/RuntimeConfig.rb +2 -2
- data/lib/taskjuggler/Scoreboard.rb +5 -2
- data/lib/taskjuggler/SheetHandlerBase.rb +5 -4
- data/lib/taskjuggler/Shift.rb +2 -2
- data/lib/taskjuggler/ShiftAssignments.rb +1 -1
- data/lib/taskjuggler/StatusSheetReceiver.rb +2 -2
- data/lib/taskjuggler/StatusSheetSender.rb +1 -1
- data/lib/taskjuggler/TaskJuggler.rb +4 -4
- data/lib/taskjuggler/TaskScenario.rb +7 -2
- data/lib/taskjuggler/TextParser/Scanner.rb +4 -4
- data/lib/taskjuggler/TextParser.rb +1 -1
- data/lib/taskjuggler/TimeSheetReceiver.rb +2 -2
- data/lib/taskjuggler/TimeSheetSender.rb +1 -1
- data/lib/taskjuggler/TimeSheets.rb +5 -4
- data/lib/taskjuggler/Tj3AppBase.rb +23 -9
- data/lib/taskjuggler/Tj3Config.rb +5 -3
- data/lib/taskjuggler/TjpExample.rb +3 -1
- data/lib/taskjuggler/TjpSyntaxRules.rb +166 -133
- data/lib/taskjuggler/UTF8String.rb +3 -3
- data/lib/taskjuggler/WorkingHours.rb +3 -3
- data/lib/taskjuggler/XMLDocument.rb +1 -1
- data/lib/taskjuggler/XMLElement.rb +12 -1
- data/lib/taskjuggler/apps/Tj3.rb +3 -1
- data/lib/taskjuggler/apps/Tj3Client.rb +3 -2
- data/lib/taskjuggler/apps/Tj3Daemon.rb +5 -3
- data/lib/taskjuggler/apps/Tj3Man.rb +4 -2
- data/lib/taskjuggler/apps/Tj3SsReceiver.rb +3 -1
- data/lib/taskjuggler/apps/Tj3SsSender.rb +3 -1
- data/lib/taskjuggler/apps/Tj3TsReceiver.rb +3 -1
- data/lib/taskjuggler/apps/Tj3TsSender.rb +3 -1
- data/lib/taskjuggler/apps/Tj3TsSummary.rb +3 -1
- data/lib/taskjuggler/apps/Tj3WebD.rb +4 -2
- data/lib/taskjuggler/daemon/ProjectServer.rb +2 -2
- data/lib/taskjuggler/deep_copy.rb +1 -1
- data/lib/taskjuggler/reports/CSVFile.rb +4 -4
- data/lib/taskjuggler/reports/ChartPlotter.rb +1 -1
- data/lib/taskjuggler/reports/GanttChart.rb +8 -2
- data/lib/taskjuggler/reports/GanttHeader.rb +11 -1
- data/lib/taskjuggler/reports/GanttLine.rb +6 -0
- data/lib/taskjuggler/reports/ICalReport.rb +1 -1
- data/lib/taskjuggler/reports/MspXmlRE.rb +5 -3
- data/lib/taskjuggler/reports/Report.rb +6 -6
- data/lib/taskjuggler/reports/ReportTableCell.rb +1 -1
- data/lib/taskjuggler/reports/TableReport.rb +7 -12
- data/lib/taskjuggler/reports/TjpExportRE.rb +1 -5
- data/lib/taskjuggler/reports/TraceReport.rb +2 -2
- data/lib/taskjuggler/version.rb +1 -0
- data/man/tj3.1 +130 -0
- data/man/tj3client.1 +145 -0
- data/man/tj3d.1 +93 -0
- data/man/tj3man.1 +76 -0
- data/man/tj3ss_receiver.1 +86 -0
- data/man/tj3ss_sender.1 +100 -0
- data/man/tj3ts_receiver.1 +86 -0
- data/man/tj3ts_sender.1 +92 -0
- data/man/tj3ts_summary.1 +104 -0
- data/man/tj3webd.1 +86 -0
- data/manual/Day_To_Day_Juggling +8 -8
- data/manual/Installation +6 -6
- data/manual/List_Attributes +1 -1
- data/manual/Rich_Text_Attributes +6 -5
- data/manual/Software +6 -6
- data/manual/TaskJuggler_Internals +4 -4
- data/manual/The_TaskJuggler_Syntax +5 -5
- data/manual/Tutorial +13 -11
- data/manual/html/Day_To_Day_Juggling.html +9 -9
- data/manual/html/Getting_Started.html +2 -2
- data/manual/html/How_To_Contribute.html +2 -2
- data/manual/html/Installation.html +8 -8
- data/manual/html/Intro.html +2 -2
- data/manual/html/List_Attributes.html +3 -3
- data/manual/html/Reporting_Bugs.html +2 -2
- data/manual/html/Rich_Text_Attributes.html +5 -5
- data/manual/html/Software.html +7 -7
- data/manual/html/TaskJuggler_2x_Migration.html +2 -2
- data/manual/html/TaskJuggler_Internals.html +6 -6
- data/manual/html/The_TaskJuggler_Syntax.html +6 -6
- data/manual/html/Tutorial.html +17 -14
- data/manual/html/account.html +3 -3
- data/manual/html/account.task.html +2 -2
- data/manual/html/accountprefix.html +2 -2
- data/manual/html/accountreport.html +3 -3
- data/manual/html/accountroot.html +2 -2
- data/manual/html/active.html +3 -3
- data/manual/html/adopt.task.html +2 -2
- data/manual/html/aggregate.html +2 -2
- data/manual/html/alert.html +3 -3
- data/manual/html/alertlevels.html +2 -2
- data/manual/html/allocate.html +3 -3
- data/manual/html/alphabet.html +1 -1
- data/manual/html/alternative.html +2 -2
- data/manual/html/author.html +2 -2
- data/manual/html/auxdir.html +2 -2
- data/manual/html/auxdir.report.html +2 -2
- data/manual/html/balance.html +2 -2
- data/manual/html/booking.resource.html +4 -4
- data/manual/html/booking.task.html +4 -4
- data/manual/html/caption.html +2 -2
- data/manual/html/cellcolor.column.html +3 -3
- data/manual/html/celltext.column.html +3 -3
- data/manual/html/center.html +2 -2
- data/manual/html/charge.html +2 -2
- data/manual/html/chargeset.html +2 -2
- data/manual/html/columnid.html +21 -14
- data/manual/html/columns.html +2 -2
- data/manual/html/complete.html +2 -2
- data/manual/html/copyright.html +2 -2
- data/manual/html/credits.html +2 -2
- data/manual/html/css/tjreport.css +4 -0
- data/manual/html/currency.html +2 -2
- data/manual/html/currencyformat.html +3 -3
- data/manual/html/dailymax.html +2 -2
- data/manual/html/dailymin.html +3 -3
- data/manual/html/dailyworkinghours.html +2 -2
- data/manual/html/date.extend.html +2 -2
- data/manual/html/date.html +5 -5
- data/manual/html/definitions.html +4 -4
- data/manual/html/depends.html +4 -4
- data/manual/html/details.html +2 -2
- data/manual/html/disabled.html +2 -2
- data/manual/html/duration.html +2 -2
- data/manual/html/efficiency.html +3 -3
- data/manual/html/effort.html +2 -2
- data/manual/html/effortdone.html +2 -2
- data/manual/html/effortleft.html +2 -2
- data/manual/html/email.html +2 -2
- data/manual/html/enabled.html +2 -2
- data/manual/html/end.column.html +3 -3
- data/manual/html/end.html +4 -4
- data/manual/html/end.limit.html +2 -2
- data/manual/html/end.report.html +2 -2
- data/manual/html/end.timesheet.html +3 -3
- data/manual/html/endcredit.html +3 -3
- data/manual/html/epilog.html +2 -2
- data/manual/html/export.html +3 -3
- data/manual/html/extend.html +3 -3
- data/manual/html/fail.html +3 -3
- data/manual/html/fdl.html +2 -2
- data/manual/html/flags.account.html +2 -2
- data/manual/html/flags.html +2 -2
- data/manual/html/flags.journalentry.html +2 -2
- data/manual/html/flags.report.html +2 -2
- data/manual/html/flags.resource.html +2 -2
- data/manual/html/flags.statussheet.html +2 -2
- data/manual/html/flags.task.html +2 -2
- data/manual/html/flags.timesheet.html +2 -2
- data/manual/html/fontcolor.column.html +3 -3
- data/manual/html/footer.html +2 -2
- data/manual/html/formats.export.html +3 -3
- data/manual/html/formats.html +3 -3
- data/manual/html/functions.html +5 -5
- data/manual/html/gapduration.html +2 -2
- data/manual/html/gaplength.html +2 -2
- data/manual/html/halign.center.html +2 -2
- data/manual/html/halign.column.html +3 -3
- data/manual/html/halign.left.html +2 -2
- data/manual/html/halign.right.html +2 -2
- data/manual/html/hasalert.html +2 -2
- data/manual/html/header.html +2 -2
- data/manual/html/headline.html +2 -2
- data/manual/html/height.html +3 -3
- data/manual/html/hideaccount.html +3 -3
- data/manual/html/hidejournalentry.html +2 -2
- data/manual/html/hidereport.html +3 -3
- data/manual/html/hideresource.html +3 -3
- data/manual/html/hidetask.html +3 -3
- data/manual/html/icalreport.html +9 -3
- data/manual/html/include.macro.html +3 -3
- data/manual/html/include.project.html +3 -3
- data/manual/html/include.properties.html +3 -3
- data/manual/html/index.html +1 -1
- data/manual/html/inherit.extend.html +3 -3
- data/manual/html/interval1.html +3 -3
- data/manual/html/interval2.html +3 -3
- data/manual/html/interval3.html +2 -2
- data/manual/html/interval4.html +2 -2
- data/manual/html/isactive.html +2 -2
- data/manual/html/ischildof.html +2 -2
- data/manual/html/isdependencyof.html +2 -2
- data/manual/html/isdutyof.html +2 -2
- data/manual/html/isfeatureof.html +2 -2
- data/manual/html/isleaf.html +2 -2
- data/manual/html/ismilestone.html +2 -2
- data/manual/html/isongoing.html +3 -3
- data/manual/html/isresource.html +2 -2
- data/manual/html/isresponsibilityof.html +2 -2
- data/manual/html/istask.html +2 -2
- data/manual/html/isvalid.html +2 -2
- data/manual/html/journalattributes.html +2 -2
- data/manual/html/journalentry.html +3 -3
- data/manual/html/journalmode.html +3 -3
- data/manual/html/leaveallowance.html +3 -3
- data/manual/html/leaves.html +3 -3
- data/manual/html/left.html +2 -2
- data/manual/html/length.html +3 -3
- data/manual/html/limits.allocate.html +2 -2
- data/manual/html/limits.html +2 -2
- data/manual/html/limits.resource.html +2 -2
- data/manual/html/limits.task.html +2 -2
- data/manual/html/listitem.column.html +3 -3
- data/manual/html/listtype.column.html +2 -2
- data/manual/html/loadunit.html +2 -2
- data/manual/html/logicalexpression.html +4 -4
- data/manual/html/logicalflagexpression.html +4 -4
- data/manual/html/macro.html +4 -4
- data/manual/html/managers.html +2 -2
- data/manual/html/mandatory.html +4 -4
- data/manual/html/markdate.html +69 -0
- data/manual/html/maxend.html +4 -4
- data/manual/html/maximum.html +2 -2
- data/manual/html/maxstart.html +2 -2
- data/manual/html/milestone.html +3 -3
- data/manual/html/minend.html +2 -2
- data/manual/html/minimum.html +2 -2
- data/manual/html/minstart.html +2 -2
- data/manual/html/monthlymax.html +2 -2
- data/manual/html/monthlymin.html +3 -3
- data/manual/html/navbar.html +5 -1
- data/manual/html/navigator.html +2 -2
- data/manual/html/newtask.html +3 -3
- data/manual/html/nikureport.html +2 -2
- data/manual/html/note.task.html +4 -4
- data/manual/html/novevents.html +68 -0
- data/manual/html/now.html +4 -4
- data/manual/html/number.extend.html +2 -2
- data/manual/html/numberformat.html +2 -2
- data/manual/html/onend.html +2 -2
- data/manual/html/onstart.html +2 -2
- data/manual/html/opennodes.html +2 -2
- data/manual/html/outputdir.html +3 -3
- data/manual/html/overtime.booking.html +2 -2
- data/manual/html/period.column.html +2 -2
- data/manual/html/period.limit.html +2 -2
- data/manual/html/period.report.html +2 -2
- data/manual/html/period.task.html +2 -2
- data/manual/html/persistent.html +3 -3
- data/manual/html/precedes.html +5 -5
- data/manual/html/priority.html +4 -4
- data/manual/html/priority.timesheet.html +3 -3
- data/manual/html/project.html +4 -4
- data/manual/html/projectid.html +2 -2
- data/manual/html/projectid.task.html +3 -3
- data/manual/html/projectids.html +2 -2
- data/manual/html/projection.html +2 -2
- data/manual/html/prolog.html +2 -2
- data/manual/html/properties.html +3 -3
- data/manual/html/purge.html +2 -2
- data/manual/html/rate.html +2 -2
- data/manual/html/rate.resource.html +2 -2
- data/manual/html/rawhtmlhead.html +3 -3
- data/manual/html/reference.extend.html +2 -2
- data/manual/html/remaining.html +3 -3
- data/manual/html/replace.html +2 -2
- data/manual/html/reportprefix.html +2 -2
- data/manual/html/resource.html +3 -3
- data/manual/html/resourceattributes.html +2 -2
- data/manual/html/resourceprefix.html +2 -2
- data/manual/html/resourcereport.html +4 -4
- data/manual/html/resourceroot.html +3 -3
- data/manual/html/resources.limit.html +2 -2
- data/manual/html/responsible.html +2 -2
- data/manual/html/richtext.extend.html +2 -2
- data/manual/html/right.html +2 -2
- data/manual/html/rollupaccount.html +3 -3
- data/manual/html/rollupresource.html +3 -3
- data/manual/html/rolluptask.html +3 -3
- data/manual/html/scale.column.html +2 -2
- data/manual/html/scenario.html +3 -3
- data/manual/html/scenario.ical.html +3 -3
- data/manual/html/scenarios.export.html +2 -2
- data/manual/html/scenarios.html +2 -2
- data/manual/html/scenariospecific.extend.html +2 -2
- data/manual/html/scheduled.html +2 -2
- data/manual/html/scheduling.html +6 -6
- data/manual/html/schedulingmode.html +2 -2
- data/manual/html/select.html +4 -4
- data/manual/html/selfcontained.html +2 -2
- data/manual/html/shift.allocate.html +2 -2
- data/manual/html/shift.html +3 -3
- data/manual/html/shift.resource.html +4 -4
- data/manual/html/shift.task.html +2 -2
- data/manual/html/shift.timesheet.html +2 -2
- data/manual/html/shifts.allocate.html +2 -2
- data/manual/html/shifts.resource.html +2 -2
- data/manual/html/shifts.task.html +3 -3
- data/manual/html/shorttimeformat.html +3 -3
- data/manual/html/sloppy.booking.html +2 -2
- data/manual/html/sloppy.projection.html +2 -2
- data/manual/html/sortaccounts.html +2 -2
- data/manual/html/sortjournalentries.html +2 -2
- data/manual/html/sortresources.html +2 -2
- data/manual/html/sorttasks.html +2 -2
- data/manual/html/start.column.html +3 -3
- data/manual/html/start.html +4 -4
- data/manual/html/start.limit.html +2 -2
- data/manual/html/start.report.html +2 -2
- data/manual/html/startcredit.html +3 -3
- data/manual/html/status.statussheet.html +2 -2
- data/manual/html/status.timesheet.html +2 -2
- data/manual/html/statussheet.html +2 -2
- data/manual/html/statussheetreport.html +3 -3
- data/manual/html/strict.projection.html +2 -2
- data/manual/html/summary.html +2 -2
- data/manual/html/supplement.html +2 -2
- data/manual/html/supplement.resource.html +2 -2
- data/manual/html/supplement.task.html +2 -2
- data/manual/html/tagfile.html +3 -3
- data/manual/html/task.html +3 -3
- data/manual/html/task.statussheet.html +3 -3
- data/manual/html/task.timesheet.html +2 -2
- data/manual/html/taskattributes.html +2 -2
- data/manual/html/taskprefix.html +2 -2
- data/manual/html/taskreport.html +4 -4
- data/manual/html/taskroot.export.html +2 -2
- data/manual/html/taskroot.html +2 -2
- data/manual/html/text.extend.html +2 -2
- data/manual/html/textreport.html +4 -4
- data/manual/html/timeformat.html +3 -3
- data/manual/html/timeformat1.html +2 -2
- data/manual/html/timeformat2.html +2 -2
- data/manual/html/timeoff.nikureport.html +2 -2
- data/manual/html/timesheet.html +3 -3
- data/manual/html/timesheetreport.html +3 -3
- data/manual/html/timezone.export.html +2 -2
- data/manual/html/timezone.html +2 -2
- data/manual/html/timezone.report.html +2 -2
- data/manual/html/timezone.shift.html +2 -2
- data/manual/html/timingresolution.html +2 -2
- data/manual/html/title.column.html +2 -2
- data/manual/html/title.html +2 -2
- data/manual/html/toc.html +157 -143
- data/manual/html/tooltip.column.html +3 -3
- data/manual/html/tracereport.html +7 -7
- data/manual/html/trackingscenario.html +3 -3
- data/manual/html/treelevel.html +2 -2
- data/manual/html/vacation.html +2 -2
- data/manual/html/vacation.resource.html +2 -2
- data/manual/html/vacation.shift.html +2 -2
- data/manual/html/warn.html +4 -4
- data/manual/html/weeklymax.html +2 -2
- data/manual/html/weeklymin.html +3 -3
- data/manual/html/weekstartsmonday.html +2 -2
- data/manual/html/weekstartssunday.html +2 -2
- data/manual/html/width.column.html +2 -2
- data/manual/html/width.html +3 -3
- data/manual/html/work.html +3 -3
- data/manual/html/workinghours.project.html +3 -3
- data/manual/html/workinghours.resource.html +2 -2
- data/manual/html/workinghours.shift.html +2 -2
- data/manual/html/yearlyworkingdays.html +2 -2
- data/spec/ProjectBroker_spec.rb +6 -6
- data/spec/StatusSheets_spec.rb +1 -1
- data/spec/TimeSheets_spec.rb +1 -1
- data/spec/TraceReport_spec.rb +1 -1
- data/spec/support/DaemonControl.rb +2 -3
- data/taskjuggler.gemspec +7 -10
- data/tasks/changelog.rake +2 -0
- data/tasks/gem.rake +3 -1
- data/tasks/help2man.rake +18 -0
- data/tasks/kate.rake +2 -0
- data/tasks/manual.rake +3 -1
- data/tasks/test.rake +5 -0
- data/tasks/vim.rake +2 -0
- data/test/TestSuite/CSV-Reports/quotes.tjp +20 -0
- data/test/TestSuite/CSV-Reports/refs/quotes.csv +5 -0
- data/test/TestSuite/Export-Reports/refs/AccountReport.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/AdoptedTasks.tjp +0 -2
- data/test/TestSuite/Export-Reports/refs/AlertLevels.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Allocate-1.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/AutoID.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/AutoMacros.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Currencyformat.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/CustomAttributes.tjp +0 -2
- data/test/TestSuite/Export-Reports/refs/Depends1.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Durations.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Efficiency.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Gap.tjp +0 -3
- data/test/TestSuite/Export-Reports/refs/Include.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Journal.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Macro-1.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Macro-2.tjp +0 -2
- data/test/TestSuite/Export-Reports/refs/Macro-3.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Manager.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Milestone.tjp +0 -2
- data/test/TestSuite/Export-Reports/refs/Numberformat.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Precedes1.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Project.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/ProjectIDs.tjp +0 -3
- data/test/TestSuite/Export-Reports/refs/Reports.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Resource.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/ResourceRoot.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/RollupResource.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Scenario.tjp +0 -2
- data/test/TestSuite/Export-Reports/refs/Timezone.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/Vacation.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/navigator.tjp +0 -4
- data/test/TestSuite/Export-Reports/refs/template.tjp +0 -6
- data/test/TestSuite/Export-Reports/refs/textreport.tjp +0 -1
- data/test/TestSuite/Export-Reports/refs/tutorial.tjp +0 -8
- data/test/TestSuite/Syntax/Correct/Booking.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/Currencyformat.tjp +1 -1
- data/test/TestSuite/Syntax/Correct/template.tjp +3 -3
- data/test/TestSuite/Syntax/Correct/tutorial.tjp +8 -3
- data/test/test_BatchProcessor.rb +6 -3
- data/test/test_ProjectFileScanner.rb +8 -8
- metadata +47 -11
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: ac8d1b5b2a3a8a3de01a39de2ef9533e1c86ade627b4a27ccf83427dac988093
|
|
4
|
+
data.tar.gz: 7dea4a421b72b1a6645b0699bfb4076eaa4fc46fcd1274066503dc2c36d7a343
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a07a210795fb27f09a3a8cc09fcef2ceb21c0f08d47cedb8655b3cc1df8201b7f309278dd1464961a5c9e06164d12ae85f979435a3007701428fe852801ffccc
|
|
7
|
+
data.tar.gz: dd87f1321f59cbd9399a2b25ab7d5f3d16a01952579f3b54abfb7e2794a0f322c047e4bfb93434569eaea9cf1fd98a7ca6737ed20bea9e5c00816c6ab0f64bc4
|
data/CHANGELOG
CHANGED
|
@@ -1,3 +1,72 @@
|
|
|
1
|
+
= Release 3.7.2 (2023-02-25)
|
|
2
|
+
|
|
3
|
+
== New Features
|
|
4
|
+
|
|
5
|
+
* The 'duties' column now supports the 'listitem' attribute.
|
|
6
|
+
|
|
7
|
+
== Bug Fixes
|
|
8
|
+
|
|
9
|
+
* File.exists? is no longer supported in Ruby 3.2.x
|
|
10
|
+
* Attempt to fix MS Project XML export for newer MSP versions.
|
|
11
|
+
* Eliminate use of useless variable
|
|
12
|
+
* Fix race condition that surfaces when using Ruby 3.x.
|
|
13
|
+
* Don't crash on division by zero for timesheets shorter than 1 week
|
|
14
|
+
* Properly escape double quotes in CSV file strings.
|
|
15
|
+
* Don't crash if task is overspeficied.
|
|
16
|
+
* Queries in listitems for some columns now respect scope property
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
= Release 3.7.1 (2020-03-14)
|
|
20
|
+
|
|
21
|
+
* Bumping version to 3.7.1
|
|
22
|
+
* Storing the version in version.rb
|
|
23
|
+
* add novevents keyword to icalreport context
|
|
24
|
+
* Revert "Revert "Revert "
|
|
25
|
+
This reverts commit d3c9d87a4fd58c9af15a44eb6c2b6c131f939912.
|
|
26
|
+
* Revert "Revert "
|
|
27
|
+
This reverts commit 3ca91860374adefb5821ab70d1a3030883459231.
|
|
28
|
+
* Revert "
|
|
29
|
+
This reverts commit 163fabe4f21b92a9828f65ccd186526af6c3b401.
|
|
30
|
+
* Revert "Revert "
|
|
31
|
+
This reverts commit 3ca91860374adefb5821ab70d1a3030883459231.
|
|
32
|
+
* Revert "
|
|
33
|
+
This reverts commit 163fabe4f21b92a9828f65ccd186526af6c3b401.
|
|
34
|
+
* Corrected some words.
|
|
35
|
+
* fix: In Windows and Cygwin generate file path for the booking file is
|
|
36
|
+
wrong
|
|
37
|
+
Reported-by: Yury Rumega
|
|
38
|
+
|
|
39
|
+
When running the freeze command in Windows and Cygwin file path for the booking file is
|
|
40
|
+
generated wrongly.
|
|
41
|
+
|
|
42
|
+
= Release 3.7.0 (2020-03-14)
|
|
43
|
+
|
|
44
|
+
== New Features
|
|
45
|
+
|
|
46
|
+
* Adding a column that lists all annual leave days.
|
|
47
|
+
* Include man pages in gem
|
|
48
|
+
* man pages: Code modifications
|
|
49
|
+
* h2m files to enhance the generated man page
|
|
50
|
+
* rake task to build man pages using help2man
|
|
51
|
+
* Add reference line via 'markdate' parameter
|
|
52
|
+
|
|
53
|
+
== Bug Fixes
|
|
54
|
+
|
|
55
|
+
* Don't use 'milestone' keyword in export reports.
|
|
56
|
+
* Fix a few warnings in the Gemfile
|
|
57
|
+
* Eliminate warnings seen with Ruby 2.5
|
|
58
|
+
* Fix endless loop when using sorting criteria in some reports.
|
|
59
|
+
* Don't crash in account definition.
|
|
60
|
+
* Correcting Typos undo: plural for pixel in German (pixel) different from English (pixels)
|
|
61
|
+
* Correcting Typos in manual pages and source file comments
|
|
62
|
+
* Correct spelling mistake in lib/taskjuggler/apps/Tj3Man.rb
|
|
63
|
+
* Clean the source tree using rake
|
|
64
|
+
* Fix crash when taskjuggler.rc is not valid YAML.
|
|
65
|
+
* syntax of xml comments to not have -- in the body
|
|
66
|
+
* Spec tests failed on some Ubuntu/Debian versions.
|
|
67
|
+
* Prioritize resource leave time over free time in resource reports
|
|
68
|
+
|
|
69
|
+
|
|
1
70
|
= Release 3.6.0 (2016-03-12)
|
|
2
71
|
|
|
3
72
|
== New Features
|
data/Rakefile
CHANGED
|
@@ -4,10 +4,13 @@ $:.unshift File.join(File.dirname(__FILE__))
|
|
|
4
4
|
lib = File.expand_path('../lib', __FILE__)
|
|
5
5
|
$:.unshift lib unless $:.include?(lib)
|
|
6
6
|
|
|
7
|
+
require 'rake'
|
|
8
|
+
require 'rspec'
|
|
7
9
|
require 'rake/clean'
|
|
10
|
+
require 'bundler/gem_tasks'
|
|
8
11
|
|
|
9
12
|
Dir.glob( 'tasks/*.rake').each do |fn|
|
|
10
|
-
begin
|
|
13
|
+
begin
|
|
11
14
|
load fn;
|
|
12
15
|
rescue LoadError
|
|
13
16
|
puts "#{fn.split('/')[1]} tasks unavailable: #{$!}"
|
data/data/css/tjreport.css
CHANGED
data/data/tjp.vim
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
" Vim syntax file
|
|
2
2
|
" Language: TaskJuggler
|
|
3
3
|
" Maintainer: TaskJuggler Developers <taskjuggler-devel@googlegroups.com>
|
|
4
|
-
" Last Change:
|
|
4
|
+
" Last Change: 2023-02-25 11:11:12 +0100
|
|
5
5
|
" This file was automatically generated by VimSyntax.rb
|
|
6
6
|
|
|
7
7
|
if exists("b:current_syntax")
|
|
@@ -86,6 +86,8 @@ syn keyword tjp_columnid_annualleave annualleave
|
|
|
86
86
|
hi def link tjp_columnid_annualleave Type
|
|
87
87
|
syn keyword tjp_columnid_annualleavebalance annualleavebalance
|
|
88
88
|
hi def link tjp_columnid_annualleavebalance Type
|
|
89
|
+
syn keyword tjp_columnid_annualleavelist annualleavelist
|
|
90
|
+
hi def link tjp_columnid_annualleavelist Type
|
|
89
91
|
syn keyword tjp_columnid_alert alert
|
|
90
92
|
hi def link tjp_columnid_alert Type
|
|
91
93
|
syn keyword tjp_columnid_alertmessages alertmessages
|
|
@@ -346,6 +348,8 @@ syn keyword tjp_hidetask hidetask contained
|
|
|
346
348
|
hi def link tjp_hidetask Type
|
|
347
349
|
syn keyword tjp_icalreport icalreport contained
|
|
348
350
|
hi def link tjp_icalreport Type
|
|
351
|
+
syn keyword tjp_novevents novevents contained
|
|
352
|
+
hi def link tjp_novevents Type
|
|
349
353
|
syn keyword tjp_scenario_ical scenario contained
|
|
350
354
|
hi def link tjp_scenario_ical Type
|
|
351
355
|
syn keyword tjp_accountprefix accountprefix contained
|
|
@@ -414,6 +418,8 @@ syn keyword tjp_extend extend contained
|
|
|
414
418
|
hi def link tjp_extend Type
|
|
415
419
|
syn keyword tjp_now now contained
|
|
416
420
|
hi def link tjp_now Type
|
|
421
|
+
syn keyword tjp_markdate markdate contained
|
|
422
|
+
hi def link tjp_markdate Type
|
|
417
423
|
syn keyword tjp_outputdir outputdir contained
|
|
418
424
|
hi def link tjp_outputdir Type
|
|
419
425
|
syn keyword tjp_shorttimeformat shorttimeformat contained
|
|
@@ -665,7 +671,7 @@ syn region tjpblk_number_extend start=/^\s*number\s.*{\s*$/ end=/^\s*}\s*$/ tran
|
|
|
665
671
|
syn region tjpblk_reference_extend start=/^\s*reference\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_reference_extend,tjp_inherit_extend,tjp_scenariospecific_extend contained
|
|
666
672
|
syn region tjpblk_richtext_extend start=/^\s*richtext\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_richtext_extend,tjp_inherit_extend,tjp_scenariospecific_extend contained
|
|
667
673
|
syn region tjpblk_text_extend start=/^\s*text\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_text_extend,tjp_inherit_extend,tjp_scenariospecific_extend contained
|
|
668
|
-
syn region tjpblk_icalreport start=/^\s*icalreport\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_icalreport,tjp_hideresource,tjp_hidejournalentry,tjp_hidetask,tjp_end_report,tjp_period_report,tjp_start_report,tjp_rollupresource,tjp_rolluptask,tjp_scenario_ical
|
|
674
|
+
syn region tjpblk_icalreport start=/^\s*icalreport\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_icalreport,tjp_hideresource,tjp_hidejournalentry,tjp_hidetask,tjp_end_report,tjp_period_report,tjp_start_report,tjp_rollupresource,tjp_rolluptask,tjp_novevents,tjp_scenario_ical
|
|
669
675
|
syn region tjpblk_journalentry start=/^\s*journalentry\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_journalentry,tjp_alert,tjp_author,tjp_flags_journalentry,tjp_summary,tjp_details contained
|
|
670
676
|
syn region tjpblk_dailymax start=/^\s*dailymax\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_dailymax,tjp_end_limit,tjp_period_limit,tjp_resources_limit,tjp_start_limit contained
|
|
671
677
|
syn region tjpblk_dailymin start=/^\s*dailymin\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_dailymin,tjp_end_limit,tjp_period_limit,tjp_resources_limit,tjp_start_limit contained
|
|
@@ -678,7 +684,7 @@ syn region tjpblk_weeklymin start=/^\s*weeklymin\s.*{\s*$/ end=/^\s*}\s*$/ trans
|
|
|
678
684
|
syn region tjpblk_navigator start=/^\s*navigator\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_navigator,tjp_hidereport
|
|
679
685
|
syn region tjpblk_nikureport start=/^\s*nikureport\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_nikureport,tjp_formats,tjp_headline,tjp_hideresource,tjp_hidetask,tjp_numberformat,tjp_end_report,tjp_period_report,tjp_start_report,tjp_title,tjp_timeoff_nikureport
|
|
680
686
|
syn region tjpblk_extend start=/^\s*extend\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_extend,tjp_date_extend,tjpblk_date_extend,tjp_number_extend,tjpblk_number_extend,tjp_reference_extend,tjpblk_reference_extend,tjp_richtext_extend,tjpblk_richtext_extend,tjp_text_extend,tjpblk_text_extend contained
|
|
681
|
-
syn region tjpblk_project start=/^\s*project\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_project,tjp_alertlevels,tjp_currencyformat,tjp_currency,tjp_dailyworkinghours,tjp_extend,tjpblk_extend,tjp_include_project,tjp_journalentry,tjpblk_journalentry,tjp_now,tjp_numberformat,tjp_outputdir,tjp_scenario,tjpblk_scenario,tjp_shorttimeformat,tjp_timeformat,tjp_timezone,tjp_timingresolution,tjp_trackingscenario,tjp_weekstartsmonday,tjp_weekstartssunday,tjp_workinghours_project,tjp_yearlyworkingdays
|
|
687
|
+
syn region tjpblk_project start=/^\s*project\s.*{\s*$/ end=/^\s*}\s*$/ transparent fold contains=@tjpcommon,tjp_project,tjp_alertlevels,tjp_currencyformat,tjp_currency,tjp_dailyworkinghours,tjp_extend,tjpblk_extend,tjp_include_project,tjp_journalentry,tjpblk_journalentry,tjp_now,tjp_markdate,tjp_numberformat,tjp_outputdir,tjp_scenario,tjpblk_scenario,tjp_shorttimeformat,tjp_timeformat,tjp_timezone,tjp_timingresolution,tjp_trackingscenario,tjp_weekstartsmonday,tjp_weekstartssunday,tjp_workinghours_project,tjp_yearlyworkingdays
|
|
682
688
|
syn region tjpblk_limits start=/^\s*limits\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_limits,tjp_dailymax,tjpblk_dailymax,tjp_dailymin,tjpblk_dailymin,tjp_maximum,tjpblk_maximum,tjp_minimum,tjpblk_minimum,tjp_monthlymax,tjpblk_monthlymax,tjp_monthlymin,tjpblk_monthlymin,tjp_weeklymax,tjpblk_weeklymax,tjp_weeklymin,tjpblk_weeklymin
|
|
683
689
|
syn region tjpblk_include_properties start=/^\s*include\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_include_properties,tjp_accountprefix,tjp_reportprefix,tjp_resourceprefix,tjp_taskprefix
|
|
684
690
|
syn region tjpblk_columns start=/^\s*columns\s.*{\s*$/ end=/^\s*}\s*$/ transparent contains=@tjpcommon,tjp_columns,tjp_celltext_column,tjp_cellcolor_column,tjp_end_column,tjp_fontcolor_column,tjp_halign_column,tjp_listitem_column,tjp_listtype_column,tjp_period_column,tjp_scale_column,tjp_start_column,tjp_timeformat1,tjp_timeformat2,tjp_title_column,tjp_tooltip_column,tjp_width_column contained
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* This file contains a project skeleton. It is part of the
|
|
3
3
|
* TaskJuggler project management tool. You can use this as a basis to
|
|
4
|
-
* start
|
|
4
|
+
* start your own project file.
|
|
5
5
|
*/
|
|
6
6
|
project your_project_id "Your Project Title" 2011-11-11-0:00--0500 +4m {
|
|
7
7
|
# Set the default time zone for the project. If not specified, UTC
|
|
@@ -28,7 +28,7 @@ project your_project_id "Your Project Title" 2011-11-11-0:00--0500 +4m {
|
|
|
28
28
|
|
|
29
29
|
# You can define your own attributes for tasks and resources. This
|
|
30
30
|
# is handy to capture additional information about the project that
|
|
31
|
-
# is not directly impacting the project schedule but you like to
|
|
31
|
+
# is not directly impacting the project schedule, but which you like to
|
|
32
32
|
# keep in one place.
|
|
33
33
|
#extend task {
|
|
34
34
|
# reference spec "Link to Wiki page"
|
|
@@ -59,7 +59,7 @@ copyright "Claim your rights here"
|
|
|
59
59
|
# used to filter out subsets of them during reporting.
|
|
60
60
|
flags important, hidden
|
|
61
61
|
|
|
62
|
-
# If you want to do budget planning for
|
|
62
|
+
# If you want to do budget planning for your project, you need to
|
|
63
63
|
# define some accounts.
|
|
64
64
|
account cost "Project Cost" {
|
|
65
65
|
account dev "Development"
|
|
@@ -67,10 +67,10 @@ account cost "Project Cost" {
|
|
|
67
67
|
}
|
|
68
68
|
account rev "Customer Payments"
|
|
69
69
|
|
|
70
|
-
# The Profit&Loss analysis should be rev - cost accounts.
|
|
70
|
+
# The Profit & Loss analysis should be rev - cost accounts.
|
|
71
71
|
balance cost rev
|
|
72
72
|
|
|
73
|
-
# Define
|
|
73
|
+
# Define your public holidays here.
|
|
74
74
|
vacation "New Year's Day" 2012-01-02
|
|
75
75
|
vacation "Birthday of Martin Luther King, Jr." 2012-01-16
|
|
76
76
|
vacation "Washington's Birthday" 2012-02-20
|
|
@@ -83,7 +83,7 @@ vacation "Thanksgiving Day" 2012-11-22
|
|
|
83
83
|
vacation "Christmas Day" 2012-12-25
|
|
84
84
|
|
|
85
85
|
# The daily default rate of all resources. This can be overridden for each
|
|
86
|
-
# resource. We specify this
|
|
86
|
+
# resource. We specify this so we can do a good calculation of
|
|
87
87
|
# the costs of the project.
|
|
88
88
|
rate 400.0
|
|
89
89
|
|
|
@@ -123,7 +123,7 @@ task project "Project" {
|
|
|
123
123
|
|
|
124
124
|
# Now the project has been specified completely. Stopping here would
|
|
125
125
|
# result in a valid TaskJuggler file that could be processed and
|
|
126
|
-
# scheduled.
|
|
126
|
+
# scheduled. Here reports will be generated to visualize the
|
|
127
127
|
# results.
|
|
128
128
|
|
|
129
129
|
navigator navbar {
|
|
@@ -242,9 +242,9 @@ taskreport overview "" {
|
|
|
242
242
|
# Macro to set the background color of a cell according to the alert
|
|
243
243
|
# level of the task.
|
|
244
244
|
macro AlertColor [
|
|
245
|
-
cellcolor plan.alert = 0 "#
|
|
246
|
-
cellcolor plan.alert = 1 "#
|
|
247
|
-
cellcolor plan.alert = 2 "#
|
|
245
|
+
cellcolor plan.alert = 0 "#90FF90" # green
|
|
246
|
+
cellcolor plan.alert = 1 "#FFFF90" # yellow
|
|
247
|
+
cellcolor plan.alert = 2 "#FF9090" # red
|
|
248
248
|
]
|
|
249
249
|
|
|
250
250
|
taskreport status "" {
|
|
@@ -20,7 +20,7 @@ project acso "Accounting Software" 2002-01-16 +4m {
|
|
|
20
20
|
# used, but this will likely be outside of the project range, so it
|
|
21
21
|
# can't be seen in the reports.
|
|
22
22
|
now 2002-03-05-13:00
|
|
23
|
-
# The currency for all money values is the
|
|
23
|
+
# The currency for all money values is the US Dollar.
|
|
24
24
|
currency "USD"
|
|
25
25
|
|
|
26
26
|
# We want to compare the baseline scenario to one with a slightly
|
|
@@ -405,9 +405,9 @@ taskreport overview "" {
|
|
|
405
405
|
# Macro to set the background color of a cell according to the alert
|
|
406
406
|
# level of the task.
|
|
407
407
|
macro AlertColor [
|
|
408
|
-
cellcolor plan.alert = 0 "#
|
|
409
|
-
cellcolor plan.alert = 1 "#
|
|
410
|
-
cellcolor plan.alert = 2 "#
|
|
408
|
+
cellcolor plan.alert = 0 "#90FF90" # green
|
|
409
|
+
cellcolor plan.alert = 1 "#FFFF90" # yellow
|
|
410
|
+
cellcolor plan.alert = 2 "#FF9090" # red
|
|
411
411
|
]
|
|
412
412
|
|
|
413
413
|
taskreport status "" {
|
|
@@ -50,7 +50,7 @@ class TaskJuggler
|
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
# Set the selection mode identified by name specified in _str_. For
|
|
53
|
-
# efficiency reasons, we turn the name into
|
|
53
|
+
# efficiency reasons, we turn the name into an Integer value.
|
|
54
54
|
def setSelectionMode(str)
|
|
55
55
|
modes = %w( order minallocated minloaded maxloaded random )
|
|
56
56
|
@selectionMode = modes.index(str)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
#
|
|
4
4
|
# = AttributeBase.rb -- The TaskJuggler III Project Management Software
|
|
5
5
|
#
|
|
6
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014
|
|
6
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2019
|
|
7
7
|
# by Chris Schlaeger <cs@taskjuggler.org>
|
|
8
8
|
#
|
|
9
9
|
# This program is free software; you can redistribute it and/or modify
|
|
@@ -136,7 +136,7 @@ class TaskJuggler
|
|
|
136
136
|
|
|
137
137
|
def to_num
|
|
138
138
|
v = get
|
|
139
|
-
if v.is_a?(
|
|
139
|
+
if v.is_a?(Integer) || v.is_a?(Float)
|
|
140
140
|
v
|
|
141
141
|
else
|
|
142
142
|
nil
|
|
@@ -145,10 +145,16 @@ class TaskJuggler
|
|
|
145
145
|
|
|
146
146
|
def to_sort
|
|
147
147
|
v = get
|
|
148
|
-
if v.is_a?(
|
|
148
|
+
if v.is_a?(Integer) || v.is_a?(Float)
|
|
149
149
|
v
|
|
150
150
|
elsif v.respond_to?('to_s')
|
|
151
|
-
v.
|
|
151
|
+
if v.respond_to?('join')
|
|
152
|
+
# If the attribute is an Array we convert it to a comma separated
|
|
153
|
+
# list.
|
|
154
|
+
v.join(', ')
|
|
155
|
+
else
|
|
156
|
+
v.to_s
|
|
157
|
+
end
|
|
152
158
|
else
|
|
153
159
|
nil
|
|
154
160
|
end
|
|
@@ -264,12 +264,12 @@ class TaskJuggler
|
|
|
264
264
|
|
|
265
265
|
end
|
|
266
266
|
|
|
267
|
-
class
|
|
267
|
+
class IntegerAttribute < AttributeBase
|
|
268
268
|
def initialize(property, type, container)
|
|
269
269
|
super
|
|
270
270
|
end
|
|
271
271
|
|
|
272
|
-
def
|
|
272
|
+
def IntegerAttribute::tjpId
|
|
273
273
|
'integer'
|
|
274
274
|
end
|
|
275
275
|
end
|
|
@@ -16,7 +16,7 @@ require 'monitor'
|
|
|
16
16
|
|
|
17
17
|
class TaskJuggler
|
|
18
18
|
|
|
19
|
-
# The JobInfo class is just a storage container for some batch job
|
|
19
|
+
# The JobInfo class is just a storage container for some batch job related
|
|
20
20
|
# pieces of information. It contains things like a job id, the process id,
|
|
21
21
|
# the stdout data and the like.
|
|
22
22
|
class JobInfo
|
|
@@ -69,16 +69,16 @@ class TaskJuggler
|
|
|
69
69
|
def initialize(maxCpuCores)
|
|
70
70
|
@maxCpuCores = maxCpuCores
|
|
71
71
|
# Jobs submitted by calling queue() are put in the @toRunQueue. The
|
|
72
|
-
#
|
|
72
|
+
# launcher Thread will pick them up and fork them off into another
|
|
73
73
|
# process.
|
|
74
|
-
@toRunQueue =
|
|
74
|
+
@toRunQueue = [ ]
|
|
75
75
|
# A hash that maps the JobInfo objects of running jobs by their PID.
|
|
76
76
|
@runningJobs = { }
|
|
77
77
|
# A list of jobs that wait to complete their writing.
|
|
78
78
|
@spoolingJobs = [ ]
|
|
79
79
|
# The wait() method will then clean the @toDropQueue, executes the post
|
|
80
80
|
# processing block and removes all JobInfo related objects.
|
|
81
|
-
@toDropQueue =
|
|
81
|
+
@toDropQueue = []
|
|
82
82
|
|
|
83
83
|
# A semaphore to guard accesses to @runningJobs, @spoolingJobs and
|
|
84
84
|
# following shared data structures.
|
|
@@ -106,28 +106,34 @@ class TaskJuggler
|
|
|
106
106
|
# to identify the job upon completion. +block+ is a Ruby code block to be
|
|
107
107
|
# executed in a separate process.
|
|
108
108
|
def queue(tag = nil, &block)
|
|
109
|
-
raise 'You cannot call queue() while wait() is running!' if @jobsOut > 0
|
|
110
|
-
|
|
111
|
-
# If this is the first queued job for this run, we have to start the
|
|
112
|
-
# helper threads.
|
|
113
|
-
if @jobsIn == 0
|
|
114
|
-
# The JobInfo objects in the @toRunQueue are processed by the pusher
|
|
115
|
-
# thread. It forkes off processes to execute the code block associated
|
|
116
|
-
# with the JobInfo.
|
|
117
|
-
@pusher = Thread.new { pusher }
|
|
118
|
-
# The popper thread waits for terminated childs and picks up the
|
|
119
|
-
# results.
|
|
120
|
-
@popper = Thread.new { popper }
|
|
121
|
-
# The grabber thread collects $stdout and $stderr data from each child
|
|
122
|
-
# process and stores them in the corresponding JobInfo.
|
|
123
|
-
@grabber = Thread.new { grabber }
|
|
124
|
-
end
|
|
125
109
|
|
|
126
110
|
# Create a new JobInfo object for the job and push it to the @toRunQueue.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
111
|
+
@lock.synchronize do
|
|
112
|
+
raise 'You cannot call queue() while wait() is running!' if @jobsOut > 0
|
|
113
|
+
|
|
114
|
+
# If this is the first queued job for this run, we have to start the
|
|
115
|
+
# helper threads.
|
|
116
|
+
if @jobsIn == 0
|
|
117
|
+
# The JobInfo objects in the @toRunQueue are processed by the
|
|
118
|
+
# launcher thread. It forkes off processes to execute the code
|
|
119
|
+
# block associated with the JobInfo.
|
|
120
|
+
@launcher = Thread.new { launcher }
|
|
121
|
+
# The receiver thread waits for terminated child processes and picks
|
|
122
|
+
# up the results.
|
|
123
|
+
@receiver = Thread.new { receiver }
|
|
124
|
+
# The grabber thread collects $stdout and $stderr data from each
|
|
125
|
+
# child process and stores them in the corresponding JobInfo.
|
|
126
|
+
@grabber = Thread.new { grabber }
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# To track a job through the queues, we use a JobInfo object to hold
|
|
130
|
+
# all data associated with a job.
|
|
131
|
+
job = JobInfo.new(@jobsIn, block, tag)
|
|
132
|
+
# Increase job counter
|
|
133
|
+
@jobsIn += 1
|
|
134
|
+
# Push the job to the toRunQueue.
|
|
135
|
+
@toRunQueue.push(job)
|
|
136
|
+
end
|
|
131
137
|
end
|
|
132
138
|
|
|
133
139
|
# Wait for all jobs to complete. The code block will get the JobInfo
|
|
@@ -138,29 +144,27 @@ class TaskJuggler
|
|
|
138
144
|
|
|
139
145
|
# When we have received as many jobs in the @toDropQueue than we have
|
|
140
146
|
# started then we're done.
|
|
141
|
-
while
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
# We have completed jobs.
|
|
146
|
-
while !@toDropQueue.empty?
|
|
147
|
-
# Pop a job from the @toDropQueue and call the block with it.
|
|
148
|
-
job = @toDropQueue.pop
|
|
149
|
-
# Remove the job related entries from the housekeeping tables.
|
|
150
|
-
@lock.synchronize { @jobsOut += 1 }
|
|
151
|
-
|
|
147
|
+
while @lock.synchronize { @jobsOut < @jobsIn }
|
|
148
|
+
job = nil
|
|
149
|
+
@lock.synchronize do
|
|
150
|
+
if !@toDropQueue.empty? && (job = @toDropQueue.pop)
|
|
152
151
|
# Call the post-processing block that was passed to wait() with
|
|
153
152
|
# the JobInfo object as argument.
|
|
153
|
+
@jobsOut += 1
|
|
154
154
|
yield(job)
|
|
155
155
|
end
|
|
156
156
|
end
|
|
157
|
+
|
|
158
|
+
unless job
|
|
159
|
+
sleep(@timeout)
|
|
160
|
+
end
|
|
157
161
|
end
|
|
158
162
|
|
|
159
163
|
# Signal threads to stop
|
|
160
164
|
@terminate = true
|
|
161
165
|
# Wait for treads to finish
|
|
162
|
-
@
|
|
163
|
-
@
|
|
166
|
+
@launcher.join
|
|
167
|
+
@receiver.join
|
|
164
168
|
@grabber.join
|
|
165
169
|
|
|
166
170
|
# Reset some variables so we can reuse the object for further job runs.
|
|
@@ -175,25 +179,22 @@ class TaskJuggler
|
|
|
175
179
|
|
|
176
180
|
# This function runs in a separate thread to pop JobInfo items from the
|
|
177
181
|
# @toRunQueue and create child processes for them.
|
|
178
|
-
def
|
|
182
|
+
def launcher
|
|
179
183
|
# Run until the terminate flag is set.
|
|
180
184
|
until @terminate
|
|
181
|
-
|
|
182
|
-
|
|
185
|
+
job = nil
|
|
186
|
+
unless @lock.synchronize { @runningJobs.length < @maxCpuCores &&
|
|
187
|
+
(job = @toRunQueue.pop) }
|
|
183
188
|
# We have no jobs in the @toRunQueue or all CPU cores in use already.
|
|
184
189
|
sleep(@timeout)
|
|
185
190
|
else
|
|
186
191
|
@lock.synchronize do
|
|
187
|
-
# Get a new job from the @toRunQueue
|
|
188
|
-
job = @toRunQueue.pop
|
|
189
|
-
|
|
190
192
|
job.openPipes
|
|
191
|
-
# Add the receiver end of the pipe to the
|
|
193
|
+
# Add the receiver end of the pipe to the pipes Arrays.
|
|
192
194
|
@pipes << job.stdoutP
|
|
195
|
+
@pipes << job.stderrP
|
|
193
196
|
# Map the pipe end to this JobInfo object.
|
|
194
197
|
@pipeToJob[job.stdoutP] = job
|
|
195
|
-
# Same for $stderr.
|
|
196
|
-
@pipes << job.stderrP
|
|
197
198
|
@pipeToJob[job.stderrP] = job
|
|
198
199
|
|
|
199
200
|
pid = fork do
|
|
@@ -224,15 +225,20 @@ class TaskJuggler
|
|
|
224
225
|
|
|
225
226
|
# This function runs in a separate thread to wait for completed jobs. It
|
|
226
227
|
# waits for the process completion and stores the result in the
|
|
227
|
-
# corresponding JobInfo object.
|
|
228
|
-
|
|
228
|
+
# corresponding JobInfo object. Aborted jobs are pushed to the
|
|
229
|
+
# @toDropQueue while completed jobs are pushed to the @spoolingJobs queue.
|
|
230
|
+
def receiver
|
|
229
231
|
until @terminate
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
sleep(@timeout)
|
|
233
|
-
else
|
|
232
|
+
pid = retVal = nil
|
|
233
|
+
begin
|
|
234
234
|
# Wait for the next job to complete.
|
|
235
235
|
pid, retVal = Process.wait2
|
|
236
|
+
rescue Errno::ECHILD
|
|
237
|
+
# No running jobs. Wait a bit.
|
|
238
|
+
sleep(@timeout)
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
if pid && retVal
|
|
236
242
|
job = nil
|
|
237
243
|
@lock.synchronize do
|
|
238
244
|
# Get the JobInfo object that corresponds to the process ID. The
|
|
@@ -242,7 +248,7 @@ class TaskJuggler
|
|
|
242
248
|
# Remove the job from the @runningJobs Hash.
|
|
243
249
|
@runningJobs.delete(pid)
|
|
244
250
|
# Save the return value.
|
|
245
|
-
job.retVal = retVal.
|
|
251
|
+
job.retVal = retVal.exitstatus
|
|
246
252
|
if retVal.signaled?
|
|
247
253
|
cleanPipes(job)
|
|
248
254
|
# Aborted jobs will probably not send an EOT. So we fastrack
|
|
@@ -269,22 +275,27 @@ class TaskJuggler
|
|
|
269
275
|
res = nil
|
|
270
276
|
begin
|
|
271
277
|
@lock.synchronize do
|
|
272
|
-
if (res = select(@pipes, nil,
|
|
278
|
+
if (res = IO.select(@pipes, nil, nil, @timeout))
|
|
273
279
|
# We have output data from at least one child. Check which pipe
|
|
274
280
|
# actually triggered the select.
|
|
275
281
|
res[0].each do |pipe|
|
|
276
282
|
# Find the corresponding JobInfo object.
|
|
277
283
|
job = @pipeToJob[pipe]
|
|
278
|
-
|
|
284
|
+
|
|
285
|
+
# Store the standard output.
|
|
279
286
|
if pipe == job.stdoutP
|
|
280
287
|
# Look for the EOT character to signal the end of the text.
|
|
281
|
-
if (c = pipe.
|
|
288
|
+
if pipe.closed? || (c = pipe.read_nonblock(1)) == ?\004
|
|
282
289
|
job.stdoutEOT = true
|
|
283
290
|
else
|
|
284
291
|
job.stdout << c
|
|
285
292
|
end
|
|
286
|
-
|
|
287
|
-
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
# Store the error output.
|
|
296
|
+
if pipe == job.stderrP
|
|
297
|
+
# Look for the EOT character to signal the end of the text.
|
|
298
|
+
if pipe.closed? || (c = pipe.read_nonblock(1)) == ?\004
|
|
288
299
|
job.stderrEOT = true
|
|
289
300
|
else
|
|
290
301
|
job.stderr << c
|
data/lib/taskjuggler/FileList.rb
CHANGED
data/lib/taskjuggler/Interval.rb
CHANGED
|
@@ -166,7 +166,7 @@ class TaskJuggler
|
|
|
166
166
|
#
|
|
167
167
|
# sbStart must be a TjTime of the scoreboard start
|
|
168
168
|
# slotDuration must be the duration of the scoreboard slots in seconds
|
|
169
|
-
# a and b should be TjTime or
|
|
169
|
+
# a and b should be TjTime or Integer objects that describe the start and
|
|
170
170
|
# end time or index of the interval.
|
|
171
171
|
#
|
|
172
172
|
# TimeInterval.new(iv)
|
|
@@ -191,7 +191,7 @@ class TaskJuggler
|
|
|
191
191
|
# If the third argument is a date we convert it to a scoreboard index.
|
|
192
192
|
args[2] = dateToIndex(args[2]) if args[2].is_a?(TjTime)
|
|
193
193
|
|
|
194
|
-
if args[2].is_a?(
|
|
194
|
+
if args[2].is_a?(Integer)
|
|
195
195
|
super(args[2], args[2])
|
|
196
196
|
else
|
|
197
197
|
raise ArgumentError, "Illegal argument 3: #{args[0].class}"
|
|
@@ -204,11 +204,11 @@ class TaskJuggler
|
|
|
204
204
|
args[2] = dateToIndex(args[2]) if args[2].is_a?(TjTime)
|
|
205
205
|
args[3] = dateToIndex(args[3]) if args[3].is_a?(TjTime)
|
|
206
206
|
|
|
207
|
-
if !(args[2].is_a?(
|
|
207
|
+
if !(args[2].is_a?(Integer))
|
|
208
208
|
raise ArgumentError, "Interval start must be an index or TjTime, " +
|
|
209
209
|
"not a #{args[2].class}"
|
|
210
210
|
end
|
|
211
|
-
if !(args[3].is_a?(
|
|
211
|
+
if !(args[3].is_a?(Integer))
|
|
212
212
|
raise ArgumentError, "Interval end must be an index or TjTime, " +
|
|
213
213
|
"not a #{args[3].class}"
|
|
214
214
|
end
|
|
@@ -221,19 +221,18 @@ class TaskJuggler
|
|
|
221
221
|
raise ArgumentError, "sbStart must be a TjTime object, not a" +
|
|
222
222
|
"#{@sbStart.class}"
|
|
223
223
|
end
|
|
224
|
-
unless @slotDuration.is_a?(
|
|
225
|
-
raise ArgumentError, "slotDuration must be
|
|
224
|
+
unless @slotDuration.is_a?(Integer)
|
|
225
|
+
raise ArgumentError, "slotDuration must be an Integer, not a " +
|
|
226
226
|
"#{@slotDuration.class}"
|
|
227
227
|
end
|
|
228
228
|
|
|
229
229
|
end
|
|
230
230
|
|
|
231
|
-
# Assign the start of the interval. +arg+ can be
|
|
231
|
+
# Assign the start of the interval. +arg+ can be an Integer or
|
|
232
232
|
# TjTime object.
|
|
233
233
|
def start=(arg)
|
|
234
234
|
case arg
|
|
235
|
-
when
|
|
236
|
-
when Bignum
|
|
235
|
+
when Integer
|
|
237
236
|
@start = arg
|
|
238
237
|
when TjTime
|
|
239
238
|
@start = dateToIndex(arg)
|
|
@@ -242,12 +241,11 @@ class TaskJuggler
|
|
|
242
241
|
end
|
|
243
242
|
end
|
|
244
243
|
|
|
245
|
-
# Assign the start of the interval. +arg+ can be
|
|
244
|
+
# Assign the start of the interval. +arg+ can be an Integer or
|
|
246
245
|
# TjTime object.
|
|
247
246
|
def end=(arg)
|
|
248
247
|
case arg
|
|
249
|
-
when
|
|
250
|
-
when Bignum
|
|
248
|
+
when Integer
|
|
251
249
|
@end = arg
|
|
252
250
|
when TjTime
|
|
253
251
|
@end = dateToIndex(arg)
|
data/lib/taskjuggler/Journal.rb
CHANGED
|
@@ -613,7 +613,7 @@ class TaskJuggler
|
|
|
613
613
|
# This function returns a list of entries that have all the exact same
|
|
614
614
|
# date and are the last entries before the deadline _date_. Only messages
|
|
615
615
|
# with at least the required alert level _minLevel_ are returned. Messages
|
|
616
|
-
# with alert level _minLevel_ must be newer than _minDate_.
|
|
616
|
+
# with alert level _minLevel_ or higher must be newer than _minDate_.
|
|
617
617
|
def currentEntries(date, property, minLevel, minDate, logExp)
|
|
618
618
|
pEntries = getEntries(property) ? getEntries(property).last(date) :
|
|
619
619
|
JournalEntryList.new
|
|
@@ -621,7 +621,7 @@ class TaskJuggler
|
|
|
621
621
|
# date.
|
|
622
622
|
pEntries.delete_if do |e|
|
|
623
623
|
e.headline.empty? || e.alertLevel < minLevel ||
|
|
624
|
-
(e.alertLevel
|
|
624
|
+
(e.alertLevel >= minLevel && minDate && e.date < minDate)
|
|
625
625
|
end
|
|
626
626
|
|
|
627
627
|
unless pEntries.empty?
|