home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #26 / NN_1992_26.iso / spool / gnu / emacs / sources / 782 < prev    next >
Encoding:
Text File  |  1992-11-09  |  17.5 KB  |  499 lines

  1. Newsgroups: gnu.emacs.sources
  2. Path: sparky!uunet!zaphod.mps.ohio-state.edu!magnus.acs.ohio-state.edu!bgsuvax!att!att!dptg!ucs!skdutta
  3. From: skdutta@ucs.att.com (Saumen Dutta)
  4. Subject: emacs front end for sable.
  5. Message-ID: <1992Nov9.101309.19414@ucs.att.com>
  6. Keywords: sable emacs elisp
  7. Organization: AT&T Universal Card Services, Jacksonville FL
  8. Date: Mon, 9 Nov 1992 10:13:09 GMT
  9. Lines: 488
  10.  
  11. Sable is a product for managing configuration control and releases of 
  12. software. The command set of sable is extensive and complicated. The
  13. command line interface requires the presence of Korn Shell. It has
  14. a curses interface too but that requires user to type many fields
  15. before a command can be executed. The following utility helps users
  16. to use the power of emacs and execute sable commands from within
  17. emacs. You need to have sable and korn shell to use this.
  18. ;;
  19. ;;
  20. ;; sable.el -- front end code for using Sable from GNU Emacs
  21. ;;             by Saumen K. Dutta (skdutta@ucs.att.com)
  22. ;;             v1.0 October 31 1992
  23. ;;
  24. ;;
  25.  
  26. ;;
  27. ;; Description:
  28. ;;       sable.el is a GNU Emacs utility to help Assigned Developers
  29. ;; to interact with sable in a friendly manner. Most of the commands
  30. ;; are reduced to simple keystrokes. Parameters of the frequently used
  31. ;; commands are stored and can be reused. Issuing of edget and edput
  32. ;; to get and put files are not required as the program can find out
  33. ;; the next logical operation. Buffers are loaded direcly from the 
  34. ;; command so that all the required sable commands and file editing can
  35. ;; be tackled from the same emacs environment. Limited report and query
  36. ;; support is also available.
  37. ;;
  38. ;;
  39.  
  40. ;;
  41. ;; Use:
  42. ;;    To start the environment you need to issue `M-x sable'. From then on
  43. ;; all global keymapping will take into effect. Press C-ch for help
  44. ;;
  45.  
  46. ;;
  47. ;; User Modifiable Variables (don't modify these unless you are required to!)
  48. ;;
  49.  
  50. (defvar sable-ksh-program "ksh" "The korn shell executable")
  51. (defvar sable-buffer "*sable*" "Name of the sable buffer")
  52.  
  53. ;;;
  54. ;;; VARIABLES
  55. ;;;
  56.  
  57. (defvar sable-ksh-process nil "Process running the sable")
  58. (defvar sable-generic nil "Name of the sable generic")
  59. (defvar sable-mr nil "Name of the sable modification request")
  60. (defvar sable-dir nil "directory from where edgotten in sable")
  61. (defvar sable-command nil "sable command string to be executed")
  62. (defvar sable-process-status nil "Status of the sable process, The following
  63.   conventions are followed, 0 = sable process has started, 1 = sable process
  64.   has returned successfully and 2 = sable process has failed")
  65. (defvar sable-file nil "file to be operated upon by sable")
  66. (defvar sable-autodependency nil "level of autodependency")
  67. (defvar sable-query-relation nil "relation name of the sable query")
  68.  
  69.  
  70. (defun sable-start-ksh ()
  71.     "Start the ksh and initialize sable environment"
  72.     ;; first time or if process dies
  73.     (if (and (processp sable-ksh-process)
  74.          (or (eq 'stop (process-status sable-ksh-process))
  75.          (eq 'run (process-status sable-ksh-process)))) nil
  76.     (setq sable-ksh-process   ;; [re]start the ksh process
  77.           (start-process "sable" 
  78.                  (get-buffer-create sable-buffer) 
  79.                  sable-ksh-program))
  80.     (save-excursion
  81.       (set-buffer sable-buffer)
  82.       (set-marker (process-mark sable-ksh-process) 1)))
  83.     (set-process-filter sable-ksh-process 'sable-filter)
  84.         (process-kill-without-query sable-ksh-process)
  85.     (setq sable-command (concat ". sablime " sable-generic))
  86.     (sable-process-command)
  87.     (message "Done!"))
  88.  
  89.  
  90. (defun sable-filter(process input)
  91.   "Filter for the Sable process to catch sable errors"
  92.   (let ((old-buffer (current-buffer)))
  93.     (unwind-protect
  94.     (set-buffer (process-buffer process))
  95.     (save-excursion
  96.       (goto-char (process-mark process))
  97.       (insert input)
  98.       (set-marker (process-mark process) (point)))
  99.       (goto-char (process-mark process))
  100.       (set-buffer old-buffer)))
  101.       
  102.   ;; search for the bell character in the input
  103.   (if (eq nil (string-match "\007" input)) (setq sable-process-status 1)
  104.     (progn (display-buffer (process-buffer process))
  105.        (setq sable-process-status 2)
  106.        (error "Sable Error..." ))))
  107.  
  108.  
  109. (defun sable-process-command()
  110.   "Process the sable command"
  111.   (setq sable-process-status 0)
  112.   (message "Sending command to sable...")
  113.   (save-excursion
  114.     (set-buffer (process-buffer sable-ksh-process))
  115.     (erase-buffer))
  116.   (process-send-string sable-ksh-process 
  117.                (concat sable-command "\n")) 
  118.   (accept-process-output)
  119.   ;; guarantees that the sable buffer is loaded fully
  120.   (while (eq sable-process-status 0) (sleep-for 1)))
  121.  
  122.  
  123.  
  124. (defun sable-edget-(&optional long)
  125.   "short edget without a parameter, long edget with one"
  126.   (if (buffer-file-name) 
  127.       (progn (setq sable-file (file-name-nondirectory buffer-file-name))
  128.          (if (or (eq sable-mr nil) long)
  129.          (setq sable-mr (read-string "MR Number: " sable-mr)))
  130.          (if (or (eq sable-dir nil) long)
  131.          (setq sable-dir (read-string "Directory: " sable-dir)))
  132.          ;; Change the directory to the buffer's one before composing the command
  133.          (setq sable-command (concat "cd " (file-name-directory buffer-file-name) "; "))
  134.          ;; Now form the sable command from the global variables
  135.          (setq sable-command (format 
  136.                   "%s edget g=%s mr=%s rm=y dir=%s srf=%s prompt=n"
  137.                   sable-command sable-generic sable-mr sable-dir
  138.                   sable-file))
  139.          (sable-process-command)
  140.          (if (eq sable-process-status 1) 
  141.          (progn
  142.            ;; making sure that the file is gotten properly
  143.            (while (eq (file-writable-p buffer-file-name) nil) (sleep-for 1))           
  144.            (revert-buffer nil t)
  145.            (message "Done!"))))
  146.     (error "There is no file associated with buffer %s" (buffer-name))))
  147.  
  148.  
  149. (defun sable-unedget-(&optional long)
  150.   "short unedget without a parameter, long unedget with one"
  151.   (if (buffer-file-name) 
  152.       (progn (setq sable-file (file-name-nondirectory buffer-file-name))
  153.          (if (or (eq sable-mr nil) long)
  154.          (setq sable-mr (read-string "MR Number: " sable-mr)))
  155.          (if (or (eq sable-dir nil) long)
  156.          (setq sable-dir (read-string "Directory: " sable-dir)))
  157.          ;; Change the directory to the buffer's one before composing the command
  158.          (setq sable-command (concat "cd " (file-name-directory buffer-file-name) "; "))
  159.          ;; Now form the sable command from the global variables
  160.          (setq sable-command (format 
  161.                   "%s unedget g=%s mr=%s dir=%s srf=%s prompt=n"
  162.                   sable-command sable-generic sable-mr sable-dir
  163.                   sable-file))
  164.          (sable-process-command)
  165.          (if (eq sable-process-status 1) 
  166.          (progn
  167.            ;; making sure that the file is gotten properly
  168.            (while (eq (file-writable-p buffer-file-name) nil) (sleep-for 1))
  169.            ;; make the file read-only. Sable does not do it but I think it 
  170.            ;; should have!
  171.            (set-file-modes buffer-file-name 292)
  172.            (revert-buffer nil t)
  173.            (message "Done!"))))
  174.     (error "There is no file associated with buffer %s" (buffer-name))))
  175.  
  176.  
  177.  
  178. (defun sable-edput-(&optional long)
  179.   "short edput without a parameter, long edput with one"
  180.   (if (buffer-file-name) 
  181.       (progn 
  182.     ;;give the user a chance to save the file if he has unsaved edits
  183.     (if (and (buffer-modified-p)
  184.          (y-or-n-p (format "%s has been modified. Write it out?" (buffer-name))))
  185.         (save-buffer))
  186.     (setq sable-file (file-name-nondirectory buffer-file-name))
  187.     (if (or (eq sable-mr nil) long)
  188.         (setq sable-mr (read-string "MR Number: " sable-mr)))
  189.     (if (or (eq sable-dir nil) long)
  190.         (setq sable-dir (read-string "Directory: " sable-dir)))
  191.     (if (or (eq sable-autodependency nil) long)
  192.         (setq sable-autodependency (read-string "Autodependency: " "line-level"))) 
  193.     ;; Change the directory to the buffer's one before composing the command
  194.     (setq sable-command (concat "cd " (file-name-directory buffer-file-name) "; "))
  195.     ;; Now form the sable command from the global variables
  196.     (setq sable-command (format 
  197.                  "%s edput g=%s mr=%s rm=n dir=%s adep=%s srf=%s prompt=n"
  198.                  sable-command sable-generic sable-mr sable-dir
  199.                  sable-autodependency sable-file))
  200.     (sable-process-command)
  201.     (if (eq sable-process-status 1) 
  202.         (progn
  203.           ;; making sure that the file is put properly
  204.           (while (eq (file-writable-p buffer-file-name) t) (sleep-for 1))           
  205.           (message "Loading file in buffer")
  206.           (revert-buffer nil t)
  207.           (message "Done!"))))
  208.     (error "There is no file associated with buffer %s" (buffer-name))))
  209.  
  210.  
  211. (defun sable-query-(&optional long)
  212.   "forced parameter prompt with long queries"
  213.   (if (or (eq sable-mr nil) long)
  214.       (setq sable-mr (read-string "MR Number: " sable-mr)))
  215.   (if (or (eq sable-query-relation nil) long)
  216.       (setq sable-query-relation (read-string "Relation: " "MD"))) 
  217.   (setq sable-command (format
  218.                "query mr=%s relation=%s prompt=n"
  219.                sable-mr sable-query-relation))
  220.   (sable-process-command)
  221.   (if (eq sable-process-status 1)
  222.       (save-excursion
  223.     (display-buffer (process-buffer sable-ksh-process))
  224.     (message "Done!"))))
  225.     
  226.  
  227.  
  228.  
  229. (defun sable-reset()
  230.   "Reset all the sable temporary variables"
  231.   (setq sable-generic nil)
  232.   (setq sable-mr nil)
  233.   (setq sable-dir nil)
  234.   (setq sable-file nil)
  235.   (setq sable-command nil)
  236.   (setq sable-process-status nil)
  237.   (setq sable-query-relation nil)
  238.   (setq sable-autodependency nil))
  239.  
  240.  
  241. (defun sable-key-bind()
  242.   (define-key (current-global-map) "\C-c?" 'sable-status)
  243.   (define-key (current-global-map) "\C-ci" 'sable)
  244.   (define-key (current-global-map) "\C-cr" 'sable-report)
  245.   (define-key (current-global-map) "\C-cg" 'sable-edget)
  246.   (define-key (current-global-map) "\C-cp" 'sable-edput)
  247.   (define-key (current-global-map) "\C-cn" 'sable-next-short)
  248.   (define-key (current-global-map) "\C-cN" 'sable-next-long)
  249.   (define-key (current-global-map) "\C-cu" 'sable-unedget-short)
  250.   (define-key (current-global-map) "\C-cU" 'sable-unedget-long)
  251.   (define-key (current-global-map) "\C-cq" 'sable-query-short)
  252.   (define-key (current-global-map) "\C-cQ" 'sable-query-long)
  253.   (define-key (current-global-map) "\C-c\C-g" 'sable-getversion)
  254.   (define-key (current-global-map) "\C-c\C-s" 'sable-submit)
  255.   (define-key (current-global-map) "\C-ch" 'sable-help))
  256.  
  257. ;;;
  258. ;;; Minibuffer commands
  259. ;;;
  260.  
  261.  
  262. (defun sable(generic)
  263.   "Initialize the sable generic and calls korn shell"
  264.   (interactive "sGeneric: ")
  265.   (sable-reset)
  266.   (sable-key-bind)
  267.   (setq sable-generic generic)
  268.   (sable-start-ksh))
  269.  
  270. (defun sable-next-short()
  271.   "Invoke the logical form of next short sable edit command"
  272.   (interactive)
  273.   (if (eq sable-generic nil) (error "Sable not Initialized")
  274.     (if buffer-read-only (sable-edget-)
  275.       (sable-edput-))))
  276.  
  277. (defun sable-next-long()
  278.   "Invoke the logical form of next long sable edit command"
  279.   (interactive)
  280.   (if (eq sable-generic nil) (error "Sable not Initialized")
  281.     (if buffer-read-only (sable-edget- 1)
  282.       (sable-edput- 1))))
  283.  
  284. (defun sable-edget()
  285.   "Invoke the short form of sable edget"
  286.   (interactive)
  287.   (if (eq sable-generic nil) (error "Sable not Initialized")
  288.     (sable-edget-)))
  289.  
  290. (defun sable-edput()
  291.   "Invoke the short form of sable edput"
  292.   (interactive)
  293.   (if (eq sable-generic nil) (error "Sable not Initialized")
  294.     (sable-edput-)))
  295.  
  296.  
  297. (defun sable-query-short()
  298.   "Invoke short query"
  299.   (interactive)
  300.   (if (eq sable-generic nil) (error "Sable not Initialized")
  301.     (sable-query-)))
  302.  
  303. (defun sable-query-long()
  304.   "Invoke query with parameter prompting"
  305.   (interactive)
  306.   (if (eq sable-generic nil) (error "Sable not Initialized")
  307.     (sable-query- 1)))
  308.  
  309. (defun sable-unedget-short()
  310.   "Invoke short unedget"
  311.   (interactive)
  312.   (if (eq sable-generic nil) (error "Sable not Initialized")
  313.     (sable-unedget-)))
  314.  
  315. (defun sable-unedget-long()
  316.   "Invoke unedget with parameter prompting"
  317.   (interactive)
  318.   (if (eq sable-generic nil) (error "Sable not Initialized")
  319.     (sable-unedget- 1)))
  320.  
  321. (defun sable-report()
  322.   "Produce a short report of all MRs"
  323.   (interactive)
  324.   (if (eq sable-generic nil) (error "Sable not Initialized")
  325.     (progn 
  326.       (setq sable-command (format
  327.                "report prompt=n"))
  328.       (sable-process-command)
  329.       (if (eq sable-process-status 1)
  330.       (save-excursion
  331.         (display-buffer (process-buffer sable-ksh-process))
  332.         (message "Done!"))))))
  333.  
  334.  
  335. (defun sable-getversion()
  336.   "Do a getversion on the generic"
  337.   (interactive)
  338.   (if (eq sable-generic nil) (error "Sable not Initialized")
  339.     (progn
  340.       (setq sable-command (concat
  341.                "getversion br="
  342.                (read-string "Branch <mr/ofc>: " "mr")))
  343.       (let* ((sable-tmp-mrs 
  344.           (read-string "MRs for file selection: "))
  345.          (sable-tmp-umrs 
  346.           (read-string "MRs for additional changes: ")))
  347.     (if (string= sable-tmp-mrs "")nil
  348.       (setq sable-command (concat
  349.                    sable-command " mrs=" sable-tmp-mrs)))
  350.     (if (string= sable-tmp-umrs "")nil
  351.       (setq sable-command (concat
  352.                    sable-command " umrs=" sable-tmp-umrs))))
  353.       (if (string= (read-string "List of files only <y/n>: ") "n")
  354.       (setq sable-command (concat
  355.                    sable-command 
  356.                    " list=n"
  357.                    " node=" (read-string "Target-node: ")
  358.                    " rm=" (read-string "Remove files: ")))
  359.     (setq sable-command (concat
  360.                  sable-command
  361.                  " list=y")))
  362.       (setq sable-command (concat
  363.                sable-command
  364.                " prompt=n"))
  365.       (sable-process-command)
  366.       (if (eq sable-process-status 1)
  367.       (save-excursion
  368.         (display-buffer (process-buffer sable-ksh-process))
  369.         (message "Done!"))))))
  370.  
  371.  
  372. (defun sable-submit()
  373.   "a simple sable submit mechanism"
  374.   (interactive)
  375.   (if (eq sable-generic nil) (error "Sable not Initialized")
  376.     (progn
  377.       (setq sable-command (concat
  378.                "getversion mr="
  379.                (read-string "MR Number: ")
  380.                " copyto="
  381.                (read-string "Resolution File[Mandatory]: ")
  382.                " prompt=n"))
  383.       (if (y-or-n-p "Will submit the MR. Are you sure?")
  384.       (progn
  385.         (sable-process-command)
  386.         (if (eq sable-process-status 1)
  387.         (save-excursion
  388.           (display-buffer (process-buffer sable-ksh-process))
  389.           (message "Done!"))))))))             
  390.       
  391.  
  392.       
  393.  
  394. (defun sable-status()
  395.   "Show the internal states and the default variables"
  396.   (interactive)
  397.   (if (eq sable-generic nil) (error "Sable not Initialized")
  398.   (save-excursion
  399.     (set-buffer (process-buffer sable-ksh-process))
  400.     (goto-char 1)
  401.     (insert "---------> Internal State of the Sable Mode <---------\n\n")
  402.     (insert "Background Korn Shell process: " sable-ksh-program "\n")
  403.     (insert "Sable Generic: ")
  404.     (if (and sable-generic (not (string= sable-generic "")))
  405.     (insert sable-generic "\n") 
  406.     (insert "*Not Set*\n"))
  407.     (insert "Sable Directory: ") 
  408.     (if sable-dir (insert sable-dir "\n") (insert "*Not Set*\n")) 
  409.     (insert "Sable File: ") 
  410.     (if sable-file (insert sable-file "\n") (insert "*Not Set*\n")) 
  411.     (insert "MR: ") 
  412.     (if sable-mr (insert sable-mr "\n") (insert "*Not Set*\n")) 
  413.     (insert "Sable Autodependency: ")
  414.     (if sable-autodependency (insert sable-autodependency "\n") 
  415.       (insert "*Not Set*\n")) 
  416.     (insert "Sable Query Relation: ")
  417.     (if sable-query-relation (insert sable-query-relation "\n") 
  418.       (insert "*Not Set*\n")) 
  419.     (insert "Last Sable Command: ")
  420.     (if sable-command (insert sable-command "\n") (insert "*Not Set*\n")) 
  421.     (insert "\n------------------------------------------------------\n\n")
  422.     (insert "Buffer History: \n\n")
  423.     (display-buffer (process-buffer sable-ksh-process)))))
  424.  
  425.  
  426. (defun sable-help()
  427.   "Print an explanation of keyboard macros in the sable environment"
  428.   (interactive)
  429.   (if (eq sable-generic nil) (error "Sable not Initialized")
  430.   ;; there should be a better way to do this
  431.     (save-excursion
  432.       (set-buffer (process-buffer sable-ksh-process))
  433.       (erase-buffer)
  434.       (insert
  435.        "\nThe Following Keyboard sequence is activated globally after the first\n"
  436.        "time sable is called\n"
  437.        "\n"
  438.        "   Key     Command              Description\n"
  439.        "   ---     -------              -----------\n"
  440.        "\n"
  441.        "  \\C\-c?  sable-status         Show the internal variables of emacs sable.\n"
  442.        "\n"
  443.        "  \\C\-ci  sable                Initialize the sable environment for a \n"
  444.        "                                new modification request. This command is\n"
  445.        "                                required before executing any other sable\n"
  446.        "                                commands.\n"
  447.        "\n"
  448.        "  \\C\-cr  sable-report         Generate a short sable report\n"
  449.        "\n"
  450.        "  \\C\-cn  sable-next-short     Initiate the next logical sable operation.\n"
  451.        "                                This will execute edget or edput.\n"
  452.        "\n"
  453.        "  \\C\-cN  sable-next-long      Long version of the initiate the next request.\n"
  454.        "\n"
  455.        "  \\C\-cg  sable-edget          Initiate the short edget operation.\n"
  456.        "\n"
  457.        "  \\C\-cp  sable-edput          Initiate the short edput operation.\n"
  458.        "\n"
  459.        "  \\C\-cu  sable-unedget-short  Initiate the short unedget operation.\n"
  460.        "\n"
  461.        "  \\C\-cU  sable-unedget-long   Long version of the unedget\n"
  462.        "\n"
  463.        "  \\C\-ch  sable-help           Print this help message\n"
  464.        "\n"
  465.        "  \\C\-cq  sable-query-short    Initiate the sable query.\n"
  466.        "\n"
  467.        "  \\C\-cQ  sable-query-long     Initiate the query with parameter prompting.\n"
  468.        "\n"
  469.        "  \\C\-c\\C-g  sable-getversion  \n"
  470.        "\n"
  471.        "  \\C\-c\\C-s  sable-submit  \n"
  472.        )
  473.       (display-buffer (process-buffer sable-ksh-process)))))
  474.  
  475.  
  476.  
  477.  
  478.  
  479. ;;; Wish List
  480. ;;; ---------
  481. ;;; have a new sable mode
  482. ;;; have a dired show up with getversion
  483. ;;; deal with the resolution file of the submit command correctly
  484. ;;; add some more commands with some more user abstractions
  485.  
  486. ;;; Bugs
  487. ;;; ----
  488. ;;; reports get screwed up if the cursor is in the *sable* window when the report
  489. ;;; command is executed. Looks like the buffer is not erasing properly - 10312250
  490. ;;; Fixed - 11011430
  491.  
  492.  
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.