4
\$\begingroup\$

I'm relatively new to bash scripting, and I'm wondering how I've done on this. Basically it's a script where if I'm in a github or bitbucket repository in my terminal, I can type browse-repository to open it up in the browser. I can also type something like browse-repository issues to visit the issues page, or browse-repository issues 19 to see issue # 19 for the repository.

I alias the command as br to save on typing, and can type things like br i 19 to get to the page for issue # 19.

I'm mainly looking for tips on organization and scope, and of course if there's any other improvements as well. I couldn't figure out any sort of namespacing, so i prefixed commands with _browse_repository

The file as it currently stands is simple sourced from my .bash_profile, if that matters.

#!/bin/bash -e
function browse-repository() {
 local URL="https://$(git config remote.origin.url | sed 's/\.git//' | sed 's/https:\/\///' | sed 's/ssh:\/\///' | sed 's/git:\/\///' | sed 's/git@//' | tr ':' '/')"
 if _browse_repository_is_bitbucket_repo "$URL" || _browse_repository_is_github_repo "$URL"
 then
 case "1ドル" in
 "")
 URL="$URL"
 _browse_repository_go
 ;;
 i|issues|-i|--issues)
 if [[ -n 2ドル ]]
 then
 if _browse_repository_is_bitbucket_repo "$URL"
 then
 URL="$URL/issue/2ドル"
 else
 URL="$URL/issues/2ドル"
 fi
 else
 URL="$URL/issues"
 fi
 _browse_repository_go
 ;;
 p|pulls|-p|--pulls)
 if _is_bitbucket_repo "$URL"
 then
 URL="$URL/pull-requests"
 else
 URL="$URL/pulls"
 fi
 _browse_repository_go
 ;;
 w|wiki|-w|--wiki)
 URL="$URL/wiki"
 _browse_repository_go
 ;;
 h|help|-h|--help)
 _browse_repository_usage
 ;;
 *)
 _browse_repository_usage
 ;;
 esac
 else
 case "1ドル" in
 h|help|-h|--help)
 _browse_repository_usage
 ;;
 *)
 echo "Not a valid bitbucket or github repository"
 ;;
 esac
 fi
}
_browse_repository_is_bitbucket_repo() {
 [ "$URL" != "${URL#https:\/\/bitbucket.org\/}" ]
}
_browse_repository_is_github_repo() {
 [ "$URL" != "${URL#https:\/\/github.com\/}" ]
}
_browse_repository_usage() {
 cat <<EOF
usage: browse-repository [<command>] [<number>]
The following commands are performed on the current project.
Available commands:
 -i --issues [<number>] Open issues, optionally pass a number to open a specific issue
 -p --pulls Open pull requests, optionally pass a number to open a specific pull request
 -w --wiki Open wiki
When no argument is supplied the main project page will be opened.
EOF
}
_browse_repository_go() {
 open "$URL"
}
asked May 22, 2013 at 15:35
\$\endgroup\$
1
  • \$\begingroup\$ I saved your script and made it executable, and from a github Repository, i executed it but nothing happens.. \$\endgroup\$ Commented Feb 11, 2014 at 17:21

1 Answer 1

3
\$\begingroup\$

Some things:

  • You don't need the function keyword to define a function.
  • You can combine sed commands by separating them by ;: sed 's/\.git//;s/https:\/\///;s/ssh:\/\///;s/git:\/\///;s/git@//'
  • This can be shortened down to a single statement: sed 's/\(\.git\|https:\/\/\|ssh:\/\/\|git:\/\/\|git@\)//'
  • Fortunately you can get rid of picket fences in sed by using a different separator: sed 's#\(\.git\|https://\|ssh://\|git://\|git@\)##'
  • I'd use getopt or getopts for option handling. Which one to use is a bit of a religious issue, but getopt supports long options (--help and the like), while getopts is more portable.
  • It is recommended to use upper case only for variables exported in the shell, and lower case for other variables.
  • This is maybe more of a personal preference, but rather than creating a function called I'd create a script with the same name and move the contents of the browse-repository function to the end of the script. That way there's no pollution of the function name space, and no need to source the script. Just put it for example at /usr/local/bin/browse-repository and run. An added advantage of this is that you don't need the function name prefixes anymore.
  • I'm not sure how portable open is. On my system:

    $ open http://www.example.org
    Couldn't get a file descriptor referring to the console
    

    Alternatively you could use x-www-browser, but I fear that's even less portable (Debian & derivatives only IIRC). I don't know if there's something more portable available.

All in all a very nice script.

answered May 28, 2013 at 13:35
\$\endgroup\$

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.