Please note:The SCons wiki is now restored from the attack in March 2013. All old passwords have been invalidated. Please reset your password if you have an account. If you note missing pages, please report them to Also, new account creation is currently disabled due to an ongoing spam flood (2013/08/27).

(07:42:08 PM) The topic for #scons is: SCons | building software, better | | next bug triage party is Tue 2 Mar 2010 17h00 US/Pacific
(07:43:00 PM) unlink [~unlink@unaffiliated/unlink] entered the room.
(07:53:29 PM) Jason_at_Intel [~chatzilla@] entered the room.
(07:53:53 PM) Jason_at_Intel: Hello
(07:54:14 PM) loonycyborg: hi
(07:55:03 PM) garyo: Hi guys
(07:55:37 PM) Jason_at_Intel: big list of bugs
(07:55:57 PM) Jason_at_Intel: I still can't edit it :-(
(07:56:00 PM) garyo: yes, reminds me of the old days.
(07:56:03 PM) garyo: :-(
(07:56:34 PM) Jason_at_Intel: well 1.3 is out
(07:56:42 PM) garyo: jason: I used to have that problem too, not sure why it stopped happening for me. Did you follow the invite link on the BugParty/ReadWrite page?
(07:56:55 PM) Jason_at_Intel: we are waiting for 2.0 and we plan to upgrade to that version at work
(07:57:00 PM) garyo: Yes, 1.3 seems to be doing fine -- a couple of bugs reported against it but nothing serious so far.
(07:57:21 PM) garyo: Greg's been an absolute machine, getting the 2.0 python-version fixers in.
(07:57:48 PM) garyo: Tons of changes; check the trunk out.
(07:57:49 PM) Jason_at_Intel: I have seen alot of python based update coming from him
(07:58:23 PM) bdbaddog [] entered the room.
(07:58:24 PM) Jason_at_Intel: Saw a few items i think i should do in Parts as well when using python
(07:58:25 PM) garyo: How's things with you, Sergey?
(07:58:31 PM) garyo: Hi Bill!
(07:58:36 PM) bdbaddog: Good evening!
(07:59:12 PM) garyo: Greg may or may not join us; I hope Steven will though.
(07:59:47 PM) bdbaddog: k.
(08:00:04 PM) sgk [~sgk@nat/google/x-iokzizbssmtgctut] entered the room.
(08:00:20 PM) garyo: And here's Steven now I think.
(08:00:21 PM) sgk: hey all
(08:00:23 PM) garyo: Hi Steven!
(08:00:32 PM) Jason_at_Intel: hi steve!
(08:00:34 PM) garyo: We have a good crew tonight
(08:00:47 PM) sgk: unfortunately, i'm still in the office and have a five minute walk to the shuttle today
(08:00:58 PM) sgk: so i'll need an intermission in about 15 minutes
(08:01:06 PM) sgk: hey Jason_at_Intel
(08:01:11 PM) sgk: sorry I've been so uncommunicative
(08:01:24 PM) sgk: not that it's a big help, but you're not the only one... :-/
(08:01:25 PM) Jason_at_Intel: no problem.. been busy
(08:01:41 PM) garyo: me too
(08:01:51 PM) garyo: but at least 1.3 is out & doing well.
(08:02:01 PM) sgk: yep, thanks to all of you guys for the work on it
(08:02:02 PM) Jason_at_Intel: Alright... i can edit it :-)
(08:02:08 PM) bdbaddog: got 1 VC related bug to be patched..
(08:02:16 PM) garyo: Shall we get going? I'll do the recording this week.
(08:02:43 PM) garyo: bdbaddog: yes, I saw that. And one other thing too I think, on tonight's list.
(08:03:17 PM) sgk: sure, let's dive in
(08:04:03 PM) garyo: ok, 2572 then
(08:04:16 PM) garyo: consensus invalid.
(08:04:23 PM) garyo: ?
(08:04:24 PM) sgk: done
(08:04:25 PM) garyo: ok
(08:04:34 PM) sgk: he can reopen if he has a use case
(08:04:48 PM) garyo: 2576
(08:04:50 PM) sgk: 2576: no progress, still on my plate
(08:05:10 PM) garyo: ok, continue to defer.
(08:05:15 PM) garyo: 2577
(08:05:24 PM) sgk: consensus 2.x p3
(08:05:30 PM) sgk: +subst
(08:05:50 PM) garyo: ok, makes sense.
(08:05:56 PM) garyo: done.
(08:06:03 PM) garyo: 2578
(08:06:18 PM) sgk: consensus 2.x p3 garyo
(08:06:21 PM) garyo: I'll take this, have Lukas bring his win32 instlaler up to date
(08:06:22 PM) sgk: (thnx)
(08:06:24 PM) garyo: done.
(08:06:38 PM) sgk: 2580
(08:06:41 PM) sgk: consensus 2.x p3
(08:06:47 PM) garyo: 2.x p3 +Easy?
(08:07:01 PM) sgk: should we start trying to assign 2.x issues now that 1.3.0 is out?
(08:07:13 PM) sgk: i.e., can we still get away with leaving them unassigned?
(08:07:23 PM) sgk: agree w/+Easy
(08:07:33 PM) garyo: You're probably right. Otherwise they won't get done.
(08:07:46 PM) garyo: Volunteers?
(08:07:49 PM) sgk: yeah, we've already got a big backlog of to-be-assigned 2.x issues
(08:08:18 PM) garyo: I think we have been assigning 2.1 items though, so at least we should get through that.
(08:08:22 PM) sgk: well, now that i've raised the issue, i'll backtrack a little on this
(08:08:37 PM) sgk: absent a volunteer, I'm okay leaving it +Easy
(08:08:51 PM) garyo: We'll need to reprioritize all the 2.x issues I think, or at least assign & review.
(08:09:05 PM) garyo: re: +Easy, I think easy ones are OK to not assign for now.
(08:09:06 PM) sgk: right, that'll probably be the first meeting after 2.0 is out
(08:09:10 PM) sgk: agree
(08:09:38 PM) garyo: done for now then. 2582?
(08:10:18 PM) sgk: agree w/p4
(08:10:29 PM) Jason_at_Intel: +1
(08:10:36 PM) sgk: 3.x? seems like 2.x is full enough
(08:10:43 PM) garyo: 3.x p4 unassigned then.
(08:11:02 PM) sgk: done
(08:11:06 PM) garyo: 2583
(08:11:35 PM) sgk: consensus 2.x p4
(08:11:50 PM) garyo: how about 3.x p4 instead?
(08:11:50 PM) sgk: hmm, let's say for tonight it's still okay to leave 2.x unassigned
(08:12:03 PM) sgk: ...or i was about to say, how about 3.x p4... :-)
(08:12:09 PM) garyo: :-)
(08:12:11 PM) sgk: 3.x p4
(08:12:21 PM) garyo: all agree? done then.
(08:12:26 PM) sgk: if it's not urgent enough to attract a volunteer, 3.x is fine
(08:12:34 PM) garyo: 2584: dup 1516
(08:12:38 PM) sgk: (amazing how 3.x doesn't feel so distant now that 1.3.0 is out)
(08:12:43 PM) sgk: 2584: done
(08:13:00 PM) sgk: 2585: garyo++
(08:13:11 PM) garyo: 2586: regression, 1.3.1
(08:13:21 PM) sgk: yep
(08:13:34 PM) garyo: I'm looking at his patch in 2595
(08:13:59 PM) garyo: Steven, I want to ask you about line 371 in Node/ at some point, I don't get that line.
(08:14:44 PM) garyo: But for now let's move on to 2589
(08:14:49 PM) sgk: okay
(08:14:54 PM) sgk: was just looking at hist 2595 patch
(08:15:10 PM) sgk: seems right, but treading lightly around cygwin's case sensitivity is wise
(08:15:24 PM) garyo: it all hinges on whether _my_normpath is really working right (hence my q re: line 371)
(08:15:42 PM) bdbaddog: there's also cygwin 1.5.x vs 1.7.x I think there are some diffs with case sensitivity
(08:15:52 PM) bdbaddog: though 1.7.x is the "new" and 1.5.x is deprecated.
(08:15:54 PM) garyo: I guess I should just trust that it's OK or more stuff would be broken.
(08:16:23 PM) garyo: bdbaddog: are you talking cygwin versions or python versions?
(08:16:30 PM) sgk: gotta cruise to the shuttle, should be back in 5-10 mins.
(08:16:32 PM) sgk left the room (quit: Quit: sgk).
(08:17:39 PM) garyo: bdbaddog: what do you make of ... if os.path.normcase("TeSt") == os.path.normcase("TeSt") ?
(08:18:03 PM) bdbaddog: cygwin versions
(08:18:06 PM) garyo: (or anyone else)
(08:18:18 PM) garyo: but doesn't that test always succeed no matter what?
(08:18:47 PM) garyo: oh wait -- I see it now, duh.
(08:19:03 PM) garyo: one's normcase, the other's normpath.
(08:19:08 PM) garyo: never mind :-/
(08:19:25 PM) bdbaddog: >>> if os.path.normcase("TeST") == os.path.normcase("TeST"):
(08:19:25 PM) bdbaddog: ... print "YES"
(08:19:25 PM) bdbaddog: ...
(08:19:25 PM) bdbaddog: YES
(08:19:25 PM) bdbaddog: >>> if os.path.normcase("TeSt") == os.path.normcase("TeSt"):
(08:19:25 PM) bdbaddog: ... print "YES"
(08:19:26 PM) bdbaddog: ...
(08:19:26 PM) bdbaddog: YES
(08:19:27 PM) bdbaddog: >>> if os.path.normcase("TeSt") == os.path.normcase("TeST"):
(08:19:27 PM) bdbaddog: ... print "YES"
(08:19:28 PM) bdbaddog: ...
(08:19:52 PM) garyo: So now I think his patch is fine. I'll integrate it for 1.3.1.
(08:20:03 PM) bdbaddog: where are we putting those patches?
(08:20:34 PM) garyo: I vote for branching 1.3.1 off of 1.3's tag and putting things there, then merging back to trunk later.
(08:20:59 PM) garyo: The release procedure will be a little different from usual since it won't be on the release branch though.
(08:22:20 PM) garyo: seem ok to you all?
(08:22:37 PM) Jason_at_Intel: I don't have any issues with it
(08:22:45 PM) bdbaddog: what's the path for the 1.3.x and should we make a checkpoint tree for 1.3.x as well?
(08:23:33 PM) sgk [~sgk@nat/google/x-xlqjvvxeqxftuvnm] entered the room.
(08:23:35 PM) garyo: My opinion is no checkpoints for patch releases. They're supposed to be small and well-contained.
(08:23:40 PM) garyo: Hi again Steven.
(08:24:04 PM) garyo: Steven, are you OK with branching 1.3.1 off of 1.3's tag and putting things there, then merging back to trunk later?
(08:24:04 PM) sgk_ [~sgk@] entered the room.
(08:24:20 PM) sgk_: okay, now i'm back
(08:24:30 PM) garyo: Steven, are you OK with branching 1.3.1 off of 1.3's tag and putting things there, then merging back to trunk later?
(08:24:51 PM) garyo: ... and doing the 1.3.1 release right on that branch (not the release branch)?
(08:24:54 PM) garyo: ... and no checkpoint?
(08:24:55 PM) sgk_: yeah, that sounds like how i'd do it
(08:25:00 PM) sgk_: yes
(08:25:05 PM) garyo: good.
(08:25:25 PM) garyo: ok, onward (as Greg would say). 2590
(08:25:29 PM) sgk_: checkpoint and release (+ trunk) in my mind are collectively the main development+release line
(08:25:31 PM) bdbaddog: I'm not sure I agree. any numbered release should havea checkpoint right?
(08:25:44 PM) sgk_: i'm agnostic about whether you choose to checkpoint it first
(08:25:54 PM) sgk_: but the checkpoint would come off the 1.3 branch
(08:26:04 PM) bdbaddog: yes. agreed 1.3 branch
(08:26:22 PM) garyo: I'm OK w/ that too, checkpoint first.
(08:26:23 PM) sgk_: in other words, current "checkpoint" and "release" would be more accurately named "trunk-checkpoint" and "trunk-release"
(08:26:29 PM) sgk_: imho
(08:26:35 PM) bdbaddog: yes
(08:26:53 PM) garyo: I was just trying to take a shortcut I guess -- checkpoint is safer.
(08:26:55 PM) sgk_: in general, a checkpoint is probably more correct
(08:26:56 PM) bdbaddog: or just delete contents of checkpoint and make checkpoint/trunk checkpoint/1.3.x
(08:27:11 PM) sgk_: yeah, safer
(08:27:33 PM) sgk_: but i'm okay with arguments that skipping the checkpoint might be okay in specific circumstances
(08:28:02 PM) garyo: ok, but no huge hurry in this case so ckpoint is ok?
(08:28:19 PM) bdbaddog: k. so I'll go ahead and delete checkpoint/* and create checkpoint/trunk and checkpoint/1.3.x
(08:28:19 PM) sgk left the room (quit: Ping timeout: 260 seconds).
(08:28:31 PM) sgk_: right
(08:28:31 PM) sgk_ is now known as sgk
(08:28:42 PM) sgk: wth?
(08:28:46 PM) sgk: am i still on?
(08:28:54 PM) garyo: hi, I can see you
(08:29:02 PM) sgk: oh, i see, i was sgk_ for a bit there
(08:29:26 PM) sgk: it just cut me back to the registered nick
(08:29:30 PM) garyo: 2590: I'm working with the OP, I'll take it until I can mark it invalid :-)
(08:29:58 PM) garyo: 2591
(08:30:16 PM) garyo: 3.x p4?
(08:30:40 PM) bdbaddog: 2.x p4
(08:30:59 PM) garyo: ok, 2.x p4s will get pushed to 3.x anyway IMHO :-) :-)
(08:31:01 PM) sgk: of doom
(08:31:18 PM) sgk: again: gah, beach ball of doom...
(08:31:24 PM) sgk: laptop froze up there for a while
(08:31:40 PM) bdbaddog: :)
(08:31:53 PM) bdbaddog: yeah probably, but if we can do it..
(08:31:55 PM) garyo: ok, 2591: 2.x p4
(08:32:11 PM) garyo: 2592
(08:32:50 PM) garyo: Steven wants 2.x p4, I'll go with that
(08:32:54 PM) bdbaddog: +1
(08:33:15 PM) Jason_at_Intel: +1
(08:33:19 PM) garyo: ok, done.
(08:33:33 PM) garyo: 2593
(08:34:02 PM) sgk left the room (quit: Read error: Connection reset by peer).
(08:34:34 PM) garyo: Steven's got laptop problems.
(08:34:36 PM) sgk_ [~sgk@] entered the room.
(08:34:39 PM) bdbaddog: k.
(08:34:49 PM) bdbaddog: or googly bus net problemos
(08:35:27 PM) garyo: 2593 really wants periodic saving of the .sconsign file, which I like.
(08:35:40 PM) bdbaddog: k. 3.0 p4 ?
(08:35:41 PM) sgk_ left the room.
(08:36:32 PM) garyo: I guess so. If people want it sooner they can vote it up (not that we check the votes that often)
(08:36:56 PM) bdbaddog: yup. or if someone gets motivated to implement
(08:38:28 PM) garyo: sgk's gone again. Let's say 2593 3.0 p4.
(08:38:33 PM) garyo: 2594
(08:39:05 PM) garyo: Looks like Steven says research sk, who am I to argue?
(08:39:12 PM) bdbaddog: +1
(08:39:35 PM) garyo: 2595 is the patch for 2586
(08:39:55 PM) garyo: 2596: doc anytime sgk
(08:40:22 PM) garyo: 2597 invalid, but Jason says doc could be better
(08:40:44 PM) Jason_at_Intel: ya.. a number of people mess this up
(08:40:46 PM) sgk [~sgk@] entered the room.
(08:40:48 PM) garyo: Jason: can you suggest some text? Email it to me if you want.
(08:41:06 PM) sgk: had to reboot; hopefully i'm really back now
(08:41:12 PM) garyo: I'm always up for better doc and error handling.
(08:41:16 PM) Jason_at_Intel: well I think people read this section in the man page
(08:41:42 PM) Jason_at_Intel: Builder calls support a chdir keyword argument that specifies that the Builder's action(s) should be executed after changing directory. If the chdir argument is a string or a directory Node, scons will change to the specified directory. If the chdir is not a string or Node and is non-zero, then scons will change to the target file's directory.
(08:41:44 PM) Jason_at_Intel: ...
(08:41:50 PM) bdbaddog: ANyway to detect chdir and -j and spit out a warning?
(08:41:55 PM) Jason_at_Intel: does not say anything about -j
(08:42:08 PM) Jason_at_Intel: I like that
(08:42:25 PM) Jason_at_Intel: detect -j > 1 and warn is chdir is used
(08:42:28 PM) sgk: a warning sounds good
(08:42:30 PM) garyo: bdbaddog: that would be even better, but at least we can update the doc easily
(08:42:53 PM) garyo: I'll update this ticket to mention all the above. Steven, can I assign it to you to add the warning?
(08:43:15 PM) sgk: sure
(08:43:28 PM) garyo: ok, 2.x p3? sgk
(08:43:42 PM) sgk: yeah, 2.x p3 is fine
(08:43:46 PM) sgk: so we're up to 2597?
(08:44:02 PM) garyo: that's it.
(08:44:08 PM) sgk: awesome
(08:44:25 PM) sgk: any things from while i was away that need more discussion?
(08:45:03 PM) garyo: we assigned you the ones you volunteered for: 2594
(08:45:11 PM) Jason_at_Intel: The only item i have i that i need to catch up with you offline to start Part review stuff
(08:45:13 PM) garyo: and 2596
(08:45:53 PM) garyo: Jason: I owe you a walkthrough of parts too.
(08:46:05 PM) sgk: Jason_at_Intel: sounds good, as always the best bet is to drive it forwarded by scheduling something
(08:46:08 PM) garyo: What about release planning? 1.3.1 checkpoint "soon", right?
(08:46:26 PM) bdbaddog: Sure. do we have a path for the 1.3.x branch?
(08:46:40 PM) sgk: yeah, bdbaddog, anyone owe you fixes or anything before 1.3.1?
(08:46:46 PM) Jason_at_Intel: Can i setup a hour or two phone conference with you guy two? to get started?
(08:46:52 PM) sgk: like what path in the repository?
(08:46:55 PM) garyo: Bill: I can create that if you want, how about branches/1.3.1?
(08:47:05 PM) bdbaddog: branches/1.3.x
(08:47:07 PM) bdbaddog: or 1.3
(08:47:14 PM) sgk: branches/1.3 ?
(08:47:35 PM) bdbaddog: so that'd be the 1.3's series "trunk" equivalent?
(08:47:43 PM) sgk: sure
(08:47:49 PM) sgk: although i'd be okay with branches/1.3.x too
(08:47:53 PM) sgk: either one is in the ballpark
(08:48:02 PM) garyo: is a branch "for" a release or "from" it? I like 1.3.x better than 1.3.
(08:48:30 PM) bdbaddog: branch is for working on, -> checkpoint or -> tags/1.3.1
(08:49:16 PM) garyo: Either's fine, I'm just nitpicking: do you name it based on where it came from (1.3) or where it's going (1.3.x)?
(08:49:43 PM) sgk: i think of it as where it came frame
(08:50:01 PM) sgk: "trunk" suggests that to me (things come off the trunk)
(08:50:01 PM) bdbaddog: I think 1.3 as in the series
(08:50:19 PM) sgk: came from
(08:50:24 PM) garyo: ok, majority rules, call it branches/1.3.
(08:51:00 PM) garyo: And 2.0 checkpoint, we're moving toward that, right?
(08:51:28 PM) bdbaddog: sure. I think i can wipe out checkpoint/* and create checkpoint/trunk and checkpoint/1.3
(08:51:47 PM) bdbaddog: and then is the content in trunk now that we want in the first 2.0 chekcpoint?
(08:51:52 PM) garyo: Ah, I see what you mean now.
(08:52:18 PM) garyo: As for 2.0 checkpoint, we need to wait for word from Greg, but that should come soon I hope.
(08:52:25 PM) sgk: hmm, i just realized i'm not sure
(08:52:45 PM) sgk: trunk has lots and lots of greg's 3.x fixer stuff in it
(08:53:01 PM) sgk: i didn't have it in mind that 2.0 would have this much actual code change
(08:53:09 PM) sgk: even if none of them are (in theory) functional differences
(08:53:22 PM) sgk: but in practice, i guess itshouldn't hurt anything
(08:53:48 PM) sgk: so it sounds like the near term roadmap is:
(08:53:54 PM) sgk: checkpoint for 1.3.1
(08:53:58 PM) sgk: 1.3.1
(08:54:02 PM) sgk: checkpoint for 2.0
(08:54:09 PM) sgk: 2.0
(08:54:09 PM) sgk: yes?
(08:54:15 PM) bdbaddog: sounds good.
(08:54:17 PM) garyo: +1
(08:54:33 PM) bdbaddog: once the rleease branch is there, I"ll check in my patch, Garyo, lemme know when you'res is ready?
(08:54:33 PM) sgk: what's needed for 1.3.1 checkpoint?
(08:54:33 PM) garyo: (repeat checkpoints as needed of course)
(08:54:42 PM) sgk: yes
(08:54:51 PM) garyo: bdbaddog: I'll make the branch and let you know.
(08:55:05 PM) garyo: sgk: just two patches so far. Both minor.
(08:55:19 PM) garyo: We could also hold it a week and wait for more...
(08:55:39 PM) bdbaddog: the VC one's not so minor. it throws an exception.
(08:55:41 PM) sgk: okay, so next action items are: 1) garyo branch; 2) bdbaddog check in; 3) cut checkpoint ?
(08:56:05 PM) garyo: bdbaddog: true, if you have Express. sgk: I agree.
(08:56:07 PM) sgk: (apologies if I'm being pedantic, i just want to make sure i understand)
(08:56:26 PM) garyo: bdbaddog: can you do the checkpoint release?
(08:56:36 PM) bdbaddog: yup, no problmeo, sounds good. yes can do release
(08:56:46 PM) garyo: excellent.
(08:57:22 PM) sgk: awesome. target date?
(08:57:26 PM) garyo: that's all on my list. I'll update the bug list and enter this log in the usual place, since Greg's not here.
(08:57:36 PM) bdbaddog: sounds good.
(08:57:51 PM) garyo: I'll make the branch & my patch in the 24 hrs.
(08:58:04 PM) bdbaddog: k.
(08:58:53 PM) sgk: very good, many thanks
(08:59:00 PM) sgk: i'm going to keep the fixer stuff for 2.0 moving forward
(08:59:04 PM) sgk: as well as doc updates
(08:59:17 PM) garyo: good - I see a few fixers still on the 2.0 list.
(08:59:37 PM) bdbaddog: k. I guess float to the release list when its time for a 2.0 checkpoint?
(08:59:39 PM) sgk: I'll try to land that issue about Command() not being documented in the builder list
(09:00:06 PM) sgk: i expanded it to include documenting the global functions and Environment methods in the homebrew .xml format
(09:00:23 PM) sgk: with the side benefit of having all those show up in a user's guide appendix
(09:00:43 PM) garyo: Very nice.
(09:00:43 PM) sgk: yeah, I'll try to keep everyone posted re: 2.0
(09:01:02 PM) Jason_at_Intel: cool
(09:01:11 PM) bdbaddog: sounds good.
(09:01:39 PM) garyo: ok, sounds great -- bye for now, if that's all
(09:02:04 PM) bdbaddog: k. l8r all
(09:02:10 PM) sgk: one last bit
(09:02:18 PM) Jason_at_Intel: Gary: steve: I will catch up with you in e-mail
(09:02:19 PM) garyo: Jason: I'll get you a writeup first, then let's do a call.
(09:02:19 PM) sgk: here's a tree of the dependencies for greg's fixer work:
(09:02:20 PM) sgk:
(09:02:40 PM) Jason_at_Intel: ok
(09:02:56 PM) sgk: the guy's did some heroic work prepping for this
(09:03:00 PM) Jason_at_Intel: any ETA on the write up?
(09:03:01 PM) sgk: done
(09:03:03 PM) garyo: cool, looks like a lot of work has gone into that.
(09:03:09 PM) garyo: Jason: this weekend for sure.
(09:03:23 PM) Jason_at_Intel: ok sounds great!
(09:03:57 PM) Jason_at_Intel: I will wait for that, and go from there
(09:03:59 PM) sgk: thanks everyone
(09:04:23 PM) Jason_at_Intel: Till next time!
(09:04:29 PM) garyo: by 4 now
(09:04:35 PM) sgk left the room.
(09:04:38 PM) bdbaddog left the room.
(09:04:40 PM) Jason_at_Intel left the room (quit: Quit: ChatZilla 0.9.86 [Firefox 3.5.3/20090824101458]).

BugParty/IrcLog2010-03-30 (last edited 2010-04-01 12:25:01 by GaryOberbrunner)