Please review first draft of Fossick - a MacPorts GUI

Ian Wadham at
Sat Apr 20 17:05:55 PDT 2013

Hello Kevin,

On 21/04/2013, at 4:28 AM, Kevin Walzer wrote:
> I'm the competition here (, but since no one else has provided any comments yet, I'll offer a few.

Thank you for being so chivalrous as to review my code.

> The app felt very sluggish the first time I ran it in Xcode--I wasn't sure if this was because of the overhead of running it under Xcode or what. It was a bit snappier when I closed Xcode and ran it separately.

I find that every morning after booting up.  I think it is an Xcode startup overhead.  The
first compile and run goes slowly, subsequent runs are faster.  The Console app output
indicates that Fossick itself takes about 3-4 secs to get going.

> From a design standpoint, the UI is a bit counterintuitive. I understand the idea behind the side-by-side text views, but it strikes me as fiddly and very much out of step with the customary two- and three-pane interfaces that are prevalent today: table view, tree view, text view. My solution is to have all data in a single text view; there may be other ways to do it, such as a floating window, etc. But I didn't grok the purpose of the twin text views until I read the "readme." You can't assume users will do that.

I thought about a sidebar, but could not see a use for one.  The list of ports is essentially
unstructured and subject to filtering, sorting, etc.  The twin subviews idea arose because
there was wasted space down there once I had all the columns in the table view and there
was room for another view.  Actually I find side-by-side views quite useful, putting on my
MacPorts end-user hat … :-)

> I also noticed that changes in MacPorts were not reflected in the app after running an operation. For instance, I selected a random port (gawk) and installed it. It did not change state in the table view after the port was installed (i.e. was not listed as being installed). It did not show up as installed until I re-launched the app. That's a fairly significant issue; users will wonder if anything happened if they do not see changes in the UI that reflect operations they have run.

Please have a look at the FossickSpec.txt file.  The "install" was the last bit I got working.

My intention is to complete it by automatically opening a subview to Results Of Run and
afterwards to update the status.  For beginning users, Results Of Run will be filtered to show
overal success or failure only, plus progress through the dependencies.  It would be nice if
I coud find a way to do time estimates as well.

> In a similar vein, the app provides no visual feedback of an operation running. No scrolling text in the text view, not even a progress bar. I ran an install command and the app just sat there. A user should not have to select "view output of operation" from a tiny little popup menu to get an indication of what is happening.

See above.  I will probably have some kind of indicator(s) that something is going on in
the background even if Results of Run is deselected.

> It appears you're handing a lot of the operations off to AppleScript to actually execute port commands, via the "do shell script" paradigm? That's an interesting choice. It solves the problem of running privileged operations without having to delve into the authorization libraries, but doesn't it run the risk of locking up the app? AppleScript blocks until a command is returned. (Wranging with this very dilemma years ago, I finally ran across a different solution, whereby a user password is echoed is piped to "sudo port  install" or what not.) I'm curious how you keep the app responsive while you have this massive blocking operation going on under the hood. Did NSTask not provide useful tools for running port commands, or was there some other reason for choosing AppleScript?

See the method runPrivilegedScript in SoftwareActions.m.  It is non-blocking.
I also like using the "port" command method because it is fast enough and is
fairly stable as MacPorts changes.  Pallet, by contrast, uses libraries, but these
are out of date now ...

I use AppleScript to get the usual Apple authorisation behaviour.  The command
it runs has an "&" on the end, so it is non-blocking.  I use an NSTask and "tail -f" to
collect and display the output as it happens, rather than letting AppleScript show
the whole lot at the end of the run.

> Anyway, I realize this is an alpha of an alpha build, and there's still a lot to be done, but some of what I'm responding to seems basic to the design rather than something that will be smoothed out later, so I felt it would be useful to raise these points.

> Hope they're helpful,
> Kevin

Thank you, Kevin.  Yes, it's very alpha, but I have very much appreciated your input.

Cheers, Ian W.

More information about the macports-dev mailing list