diff --git a/site-lisp/phabricator.el b/site-lisp/phabricator.el new file mode 100644 index 0000000..95daac7 --- /dev/null +++ b/site-lisp/phabricator.el @@ -0,0 +1,61 @@ +;;; phabricator.el --- utils for jumping/navigating to phabricator + +(require 'tbgX) ;; fb-find-repo-root +(require 'dired) + +;;;###autoload + +;; You need to ssh to your devbox with tunneling so that your ssh +;; session can run commands on your local machine i.e.: +;; `ssh -R12345:localhost:22 {your sandbox}` +(defvar phabricator-ssh-port "12345" + "default ssh port for calling into 'open' with the uri") + +(defvar phabricator-diffusion-repo-alist + '(("admin" . "E/browse/admin/") + ("dataswarm-hg" . "E/browse/projects/data/dataswarm/") + ("dataswarm-git" . "E/browse/projects/data/dataswarm/") + ("www" . "E/browse/tfb/trunk/www/") + ("www-git" . "E/browse/tfb/trunk/www/") + ("www-hg" . "E/browse/tfb/trunk/www/") + ("configerator" . "CF/browse/master/") + ("configerator-hg" . "CF/browse/master/") + ("configerator-dsi" . "CFDSI/browse/master/") + ("fbcode" . "FBCODE/browse/master/") + ("fbobjc" . "FBOBJC/browse/master/") + ("fbsource" . "FBS/browse/master/") + ("opsfiles" . "O/browse/opsfiles/branches/PROD/") + ("opsfiles-git" . "O/browse/opsfiles/branches/PROD/") + ("fbandroid" . "FA/browse/master/") + ("si_sigma" . "SIGMA/browse/master/")) + "repo-alist for determining the appropriate path to phabricator") + +(defun phabricator-diffusion-url (beg end) + "Retrieves the corresponding diffusion (browse) URL for the current file, + prints it in the minibuffer (via message), and puts the URL on the + clipboard." + (interactive (if (use-region-p) + (list (region-beginning) (region-end)) + (list nil nil))) + (flet ((line-num (pt) + (save-excursion + (goto-char pt) + (beginning-of-line) + (number-to-string (1+ (count-lines 1 (point))))))) + (let* ((file-name (file-truename + (or (buffer-file-name) (dired-file-name-at-point)))) + (repo-path (directory-file-name (fb-find-repo-root file-name))) + (repo-name (file-name-nondirectory repo-path)) + (rel-path (substring file-name (1+ (length repo-path)))) + (diffusion-prefix "https://phabricator.fb.com/diffusion/") + (lines (if beg (concat "$" (line-num beg) "-" (line-num end)) "")) + (url (concat (concat diffusion-prefix + (cdr (assoc repo-name phabricator-diffusion-repo-alist)) + rel-path lines)))) + (with-temp-buffer + (message url) + (insert url) + (clipboard-kill-ring-save (point-min) (point-max)))))) + +(provide 'phabricator) +;;; phabricator.el ends here