NetBeans, SVN, SSH and multiple repositories

I know git is right choice for VCS, but… not all have converted yet and NetBeans does not support git (yet, since work is in progress?).

If You are still stuck in SVN world – in NetBeans FAQ You can find guide how to setup svn+ssh protocol to work with NetBeans.

On Windows (as always) are some gotchas when You setup svn+ssh.

First, connect to host with PuTTy to populate PuTTys key cache – otherwise You won’t be able use command line SVN tools.

Second – don’t dare to set default IP address in PuTTy (that is default host name for Default Settings). If You do, no matter what URL You give as SVN repo address, plink.exe will try connect to default IP/hostname instead to SVN repo. Probably this is not what You want plink to do.

All is working and You need to setup another repository?

As a freelancer I do work with different customers and if more than one uses svn+ssh URL schema, how to setup NetBeans?

Well it can be achieved with little trick. You need to create new schema named for example svn+ssh2 and adjust SVN config.

Example! Example!

Let’s assume we have:

  • first repository
    • URL: svn+ssh://example.com/repo/trunk
    • user: user1
    • password: pwd1
  • second repository
    • URL: svn+ssh://other.example.com/repo/trunk
    • user: user2
    • password: pwd2

    Now [tunnels] section of SVN config file could be:

    [tunnels]
    ssh = plink -l user1 -pw pwd1
    ssh2 = plink -l user2 -pw pwd2
    

    First URL does not change, so we can checkout code with svn+ssh://example.com/repo/trunk, and code from second repository with modified URL: svn+ssh2://other.example.com/repo/trunk (spot this little 2 in protocol name).

    It just works. Or I missed some other option and it can be done simpler way?

NetBeans code template for RESTful controller

I’m using NetBeans as my IDE for my Ruby related (and not only) work. Since I’m writing RESTful application I do create a lot of Restful controllers. And I was tired creating Golden Seven actions again and again. So I finally sat and learned a little about NetBeans code templates.

So here it comes code for create RESTful controller:


  def index
    @${1 default="PLURAL"} = ${2 default="MODEL"}.find(:all)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @${1 editable="false"} }
      format.json  { render :json => @${1 editable="false"} }
    end
  end


  def show
    @${3 default="SINGULAR"} = ${2 editable="false"}.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @${3 editable="false"} }
      format.json  { render :json => @${3 editable="false"} }
    end
  end

  def new
    @${3 editable="false"} = ${2 editable="false"}.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @${3 editable="false"} }
      format.json  { render :json => @${3 editable="false"} }
    end
  end

  def edit
    @${3 editable="false"} = ${2 editable="false"}.find(params[:id])
  end

  def create
    @${3 editable="false"} = ${2 editable="false"}.new(params[:${2 editable="false"}])

    respond_to do |format|
      if @${3 editable="false"}.save
        flash[:notice] = '${2 editable="false"} was successfully created.'
        format.html { redirect_to(@${3 editable="false"}) }
        format.xml  { render :xml => @${3 editable="false"}, :status => :created, :location => @${3 editable="false"} }
        format.json { render :json => @${3 editable="false"}, :status => :created, :location => @${3 editable="false"} }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @${3 editable="false"}.errors, :status => :unprocessable_entity }
        format.json { render :json => @${3 editable="false"}.errors, :status => :unprocessable_entity }
      end
    end
  end

  def update
    @${3 editable="false"} = ${2 editable="false"}.find(params[:id])

    respond_to do |format|
      if @${3 editable="false"}.update_attributes(params[:${3 editable="false"}])
        flash[:notice] = '${2 editable="false"} was successfully updated.'
        format.html { redirect_to(@${3 editable="false"}) }
        format.xml  { head :ok }
        format.json { head :ok }
      else
        format.html { render :action => "edit" }
        format.json { render :xml => @${3 editable="false"}.errors, :status => :unprocessable_entity }
      end
    end
  end

  def destroy
    @${3 editable="false"} = ${2 editable="false"}.find(params[:id])
    @${3 editable="false"}.destroy

    respond_to do |format|
      format.html { redirect_to(${3 editable="false"}s_url) }
      format.xml  { head :ok }
      format.json  { head :ok }
    end
  end

How to use it?

Copy following code, go to Tools / Options / Editor / Code Templates, select Ruby language, click New and create new code template. I have used abbreviation rc.

Now I can generate empty controller, go to it’s body, type rc and press TAB – now just type three names (TAB after each one). First is plural for variable names, second is model name and third is singular variable name. If we would generate PostsController we would go to empty body of PostsController class and type rc, TAB, posts, TAB, Post, TAB, post. Done.

I was inspired by this TextMate snippet To create this code template

I’m using developer build of NetBeans, but this code template should work in older NB too.