mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-04 19:33:18 +00:00
478 lines
16 KiB
Plaintext
478 lines
16 KiB
Plaintext
(*
|
||
*
|
||
* ***** BEGIN LICENSE BLOCK *****
|
||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||
*
|
||
* The contents of this file are subject to the Mozilla Public License Version
|
||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||
* the License. You may obtain a copy of the License at
|
||
* http://www.mozilla.org/MPL/
|
||
*
|
||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||
* for the specific language governing rights and limitations under the
|
||
* License.
|
||
*
|
||
* The Original Code is mozilla.org code.
|
||
*
|
||
* The Initial Developer of the Original Code is
|
||
* Netscape Communications Corporation.
|
||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||
* the Initial Developer. All Rights Reserved.
|
||
*
|
||
* Contributor(s):
|
||
*
|
||
* Alternatively, the contents of this file may be used under the terms of
|
||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||
* of those above. If you wish to allow use of your version of this file only
|
||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||
* use your version of this file under the terms of the MPL, indicate your
|
||
* decision by deleting the provisions above and replace them with the notice
|
||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||
* the provisions above, a recipient may use your version of this file under
|
||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||
*
|
||
* ***** END LICENSE BLOCK ***** *)
|
||
|
||
-- edit.cgi
|
||
--
|
||
-- A very basic CGI example. Use this script as a skeleton for creating more sophisticated
|
||
-- CGIs. All this one does is echo back all the CGI variables passed to it.
|
||
-- As with all AppleScript CGIs, make sure you save this as an application, with the
|
||
-- "Stay Open" and "Never Show Startup Screen" options selected.
|
||
--
|
||
-- This file is part of the WebCenter distribution. You are free to do
|
||
-- whatever you wish with it.
|
||
--
|
||
-- Please report bugs to me, Chris Hawk, chris@slaphappy.com
|
||
|
||
-- Change this to point to the Camelot root directory.
|
||
property gCamelotRoot : "Ringo:Camelot:"
|
||
property gSourceTree : gCamelotRoot & "tree:"
|
||
property gSessionPath : gCamelotRoot & "Raptor.mcvs"
|
||
|
||
-- Create the standard HTTP header. We'll prepend this to any result we return
|
||
property crlf : (ASCII character 13) & (ASCII character 10)
|
||
property http_header : "HTTP/1.0 200 OK" & crlf & "Server: QuidProQuo" & crlf & <20>
|
||
"MIME-Version: 1.0" & crlf & "Content-type: text/html" & crlf & crlf
|
||
|
||
(*
|
||
This is the AppleEvent handler. After this CGI is launched, is spins its wheels waiting for
|
||
an AppleEvent to get here. When it does, this next section of code is executed. After it returns
|
||
its result, it goes back to waiting for another AppleEvent.
|
||
*)
|
||
|
||
on handle CGI request path_args <20>
|
||
searching for http_search_args <20>
|
||
with posted data post_args <20>
|
||
using access method access_method <20>
|
||
from address client_address <20>
|
||
from user user_name <20>
|
||
using password using_password <20>
|
||
with user info from_user <20>
|
||
from server server_name <20>
|
||
via port server_port <20>
|
||
executing by script_name <20>
|
||
of content type content_type <20>
|
||
referred by referrer <20>
|
||
from browser user_agent
|
||
|
||
-- This example extracts all the possible variables passed to CGIs.
|
||
-- You probably won't need all of these in a typical CGI,
|
||
-- but it doesn't really hurt to get them.
|
||
|
||
try
|
||
-- Debug the arguments.
|
||
-- return http_header & "<H2>Post Args</H2>" & post_args
|
||
|
||
-- use CGI parser to break apart post_args.
|
||
set formData to (parse CGI arguments post_args)
|
||
|
||
set formAction to (CGI field "formAction" from formData)
|
||
set cvsUser to (CGI field "cvsUser" from formData default value "")
|
||
set cvsPassword to (CGI field "cvsPassword" from formData default value "")
|
||
set projectToEdit to (CGI field "projectToEdit" from formData default value "")
|
||
set filesToAdd to (CGI field "filesToAdd" from formData default value "")
|
||
set filesToRemove to (CGI field "filesToRemove" from formData default value "")
|
||
|
||
-- validate parameters.
|
||
if (cvsUser is "") then
|
||
error "Please specify a valid CVS user name."
|
||
end if
|
||
|
||
if (cvsPassword is "") then
|
||
error "Please specify a valid CVS password."
|
||
end if
|
||
|
||
if (projectToEdit is "") then
|
||
error "Please specify a valid Mac project name."
|
||
end if
|
||
|
||
if (formAction is "Query") then
|
||
return http_header & "<H2>Project Query Results</H2>" & <20>
|
||
query_project(cvsUser, cvsPassword, projectToEdit)
|
||
else
|
||
set AppleScript's text item delimiters to {crlf}
|
||
set filesToAddList to tokenize(filesToAdd)
|
||
set filesToRemoveList to tokenize(filesToRemove)
|
||
|
||
return http_header & "<H2>Project Editor Results</H2>" & <20>
|
||
edit_project(cvsUser, cvsPassword, projectToEdit, filesToAddList, filesToRemoveList)
|
||
end if
|
||
on error error_message
|
||
-- last ditch attempt, logout of cvs.
|
||
try
|
||
cvs_logout()
|
||
on error
|
||
end try
|
||
-- We're not doing much here, so there shouldn't be any errors, but just in case...
|
||
return http_header & "<H2>Project Editor Error</H2>" & error_message
|
||
end try
|
||
end handle CGI request
|
||
|
||
on query_project(cvsUser, cvsPassword, projectToQuery)
|
||
-- "login" to CVS.
|
||
cvs_login(cvsUser, cvsPassword)
|
||
|
||
-- make sure we have latest versions of all referenced files.
|
||
checkout_files({projectToQuery})
|
||
|
||
-- "logout" of cvs.
|
||
cvs_logout()
|
||
|
||
-- make sure the project is in fact a project file.
|
||
validate_project(projectToQuery)
|
||
|
||
-- used to convert Mac paths to mozilla tree paths.
|
||
set mozillaTreePathOffset to (1 + (count of gSourceTree))
|
||
|
||
set query_results to "<H3>Project: " & projectToQuery & "</H3>"
|
||
|
||
-- perform the query.
|
||
set projectPath to (gSourceTree & replace(projectToQuery, "/", ":"))
|
||
openProject(projectPath)
|
||
set targetsList to getTargets()
|
||
set targetNames to names of targetsList
|
||
repeat with targetNameRef in targetNames
|
||
set targetName to (contents of targetNameRef)
|
||
set query_results to query_results & "<H3>Source files in target " & targetName & ":</H3>"
|
||
setCurrentTarget(targetName)
|
||
set targetFiles to getTargetFiles(targetName)
|
||
repeat with targetFile in targetFiles
|
||
-- only store the path name relative to the source tree itself.
|
||
set targetFilePath to substring(contents of targetFile, mozillaTreePathOffset)
|
||
set query_results to query_results & (replace(targetFilePath, ":", "/") & "<BR>")
|
||
end repeat
|
||
end repeat
|
||
closeProject(projectToQuery)
|
||
|
||
return query_results
|
||
end query_project
|
||
|
||
on edit_project(cvsUser, cvsPassword, projectToEdit, filesToAddList, filesToRemoveList)
|
||
if (filesToAddList = {}) and (filesToRemoveList = {}) then
|
||
return "No files added or removed from project " & projectToEdit & "."
|
||
end if
|
||
|
||
-- "login" to CVS.
|
||
cvs_login(cvsUser, cvsPassword)
|
||
|
||
-- make sure we have latest versions of all referenced files.
|
||
set filesToCheckout to {projectToEdit} & filesToAddList & filesToRemoveList
|
||
checkout_files(filesToCheckout)
|
||
|
||
-- make sure the project is in fact a project file.
|
||
validate_project(projectToEdit)
|
||
|
||
-- perform the edits.
|
||
modify_read_only(projectToEdit)
|
||
if (filesToAddList <20> {}) then add_files(projectToEdit, filesToAddList)
|
||
if (filesToRemoveList <20> {}) then remove_files(projectToEdit, filesToRemoveList)
|
||
|
||
-- finally, check in the project, with a comment stating what was done.
|
||
set checkInComment to summarize_edits(filesToAddList, filesToRemoveList)
|
||
-- if (projectToEdit starts with "mozilla/build/mac/test") then
|
||
checkin_files({projectToEdit}, checkInComment)
|
||
-- end if
|
||
|
||
-- "logout" of cvs.
|
||
cvs_logout()
|
||
|
||
return <20>
|
||
"Checked in project: " & projectToEdit & "<BR>" & <20>
|
||
"Checkin Comment: " & checkInComment & "<BR>"
|
||
end edit_project
|
||
|
||
(* returns a list of tokens according to AppleScript's text item delimiters. *)
|
||
on tokenize(aString)
|
||
set itemList to {}
|
||
repeat with anItemRef in (text items of aString)
|
||
set anItem to (contents of anItemRef)
|
||
if (anItem <20> "") then
|
||
set itemList to itemList & anItem
|
||
end if
|
||
end repeat
|
||
return itemList
|
||
end tokenize
|
||
|
||
(* replaces oldChar with newChar in a string. *)
|
||
on replace(aString, oldChar, newChar)
|
||
set newString to ""
|
||
repeat with aChar in (every character of aString)
|
||
if (contents of aChar = oldChar) then
|
||
set newString to newString & newChar
|
||
else
|
||
set newString to newString & aChar
|
||
end if
|
||
end repeat
|
||
return newString
|
||
end replace
|
||
|
||
on substring(aString, anOffset)
|
||
set aSubString to ""
|
||
repeat with charIndex from anOffset to (count aString)
|
||
set aSubString to aSubString & (character charIndex of aString)
|
||
end repeat
|
||
return aSubString
|
||
end substring
|
||
|
||
on summarize_edits(aAddedFilesList, aRemovedFilesList)
|
||
set AppleScript's text item delimiters to {", "}
|
||
set addedFiles to (aAddedFilesList as string)
|
||
set removedFiles to (aRemovedFilesList as string)
|
||
set editList to {}
|
||
if (addedFiles <20> "") then
|
||
set editList to editList & ("added files: " & addedFiles)
|
||
end if
|
||
if (removedFiles <20> "") then
|
||
set editList to editList & ("removed files: " & removedFiles)
|
||
end if
|
||
return (editList as string)
|
||
end summarize_edits
|
||
|
||
on cvs_login(aUser, aPassword)
|
||
tell application "MacCVS Pro 2.2.2 debug"
|
||
-- store a reference to the session, for convenience
|
||
set myDoc to the first session
|
||
|
||
-- customize the session for this user.
|
||
tell myDoc
|
||
set the remote user of myDoc to aUser
|
||
set the password of myDoc to aPassword
|
||
end tell
|
||
end tell
|
||
end cvs_login
|
||
|
||
on cvs_logout()
|
||
cvs_login("", "")
|
||
end cvs_logout
|
||
|
||
on checkout_files(aFileList)
|
||
tell application "MacCVS Pro 2.2.2 debug"
|
||
-- store a reference to the session, for convenience
|
||
set myDoc to the first session
|
||
|
||
-- checkout the specified files.
|
||
try
|
||
repeat with aFileRef in aFileList
|
||
set aFile to (contents of aFileRef)
|
||
checkout myDoc module aFile
|
||
end repeat
|
||
on error errMsg number errNum
|
||
-- display dialog "The checkout could not be completed because " & errMsg & return & errNum with icon 0
|
||
error errMsg number errNum
|
||
end try
|
||
end tell
|
||
end checkout_files
|
||
|
||
on checkin_files(aFileList, aCheckinComment)
|
||
tell application "MacCVS Pro 2.2.2 debug"
|
||
-- store a reference to the session, for convenience
|
||
set myDoc to the first session
|
||
|
||
-- display dialog "checking into session " & (name of myDoc)
|
||
|
||
-- checkin the specified files.
|
||
try
|
||
repeat with aFileRef in aFileList
|
||
set aFile to (contents of aFileRef)
|
||
tell myDoc
|
||
-- display dialog "checking in file " & aFile
|
||
check in file aFile comment aCheckinComment
|
||
end tell
|
||
end repeat
|
||
on error errMsg number errNum
|
||
display dialog "The commit could not be completed because " & errMsg & return & errNum with icon 0
|
||
error errMsg number errNum
|
||
end try
|
||
end tell
|
||
end checkin_files
|
||
|
||
(* ensures that only a valid CodeWarrior project is specified for editing. *)
|
||
on validate_project(aProject)
|
||
set projectPath to (gSourceTree & replace(aProject, "/", ":"))
|
||
tell application "Finder"
|
||
set projectFileType to get file type of alias projectPath
|
||
end tell
|
||
if (projectFileType is not "MMPr") then
|
||
error "Can only edit project files. The file: ``" & aProject & "'' isn't a valid CodeWarrior project file."
|
||
end if
|
||
end validate_project
|
||
|
||
(* uses MacCVS to MRO a file. *)
|
||
on modify_read_only(aFilePath)
|
||
tell application "MacCVS Pro 2.2.2 debug"
|
||
-- store a reference to the session, for convenience
|
||
set myDoc to the first session
|
||
tell myDoc
|
||
try
|
||
if (status of file aFilePath is not locally modified) then
|
||
modify read only file aFilePath
|
||
end if
|
||
on error
|
||
-- do nothing; it's ok
|
||
end try
|
||
end tell
|
||
end tell
|
||
end modify_read_only
|
||
|
||
(* CW Pro IDE Interface Handlers. *)
|
||
|
||
on openProject(aProjectFile)
|
||
tell application "CodeWarrior IDE 3.2"
|
||
-- activate
|
||
open aProjectFile
|
||
end tell
|
||
end openProject
|
||
|
||
on closeProject(aProjectFile)
|
||
tell application "CodeWarrior IDE 3.2"
|
||
Close Project
|
||
end tell
|
||
end closeProject
|
||
|
||
on getTargets()
|
||
set targetList to {}
|
||
set nameList to {}
|
||
tell application "CodeWarrior IDE 3.2"
|
||
set currentProject to project document 1
|
||
repeat with targetIndex from 1 to (count of targets of currentProject)
|
||
set currentTarget to (target targetIndex of currentProject)
|
||
set targetList to targetList & {currentTarget}
|
||
set nameList to nameList & {name of currentTarget}
|
||
end repeat
|
||
return {target:targetList, names:nameList}
|
||
end tell
|
||
end getTargets
|
||
|
||
on getTargetFiles(targetKey)
|
||
set targetFiles to {}
|
||
tell application "CodeWarrior IDE 3.2"
|
||
set currentProject to project document 1
|
||
set currentTarget to (target targetKey of currentProject)
|
||
repeat with fileIndex from 1 to (count of target files of currentTarget)
|
||
set targetFile to (target file fileIndex of currentTarget)
|
||
-- only consider text files, since other platforms won't be managing binaries.
|
||
-- also, only consider if target file is directly linked.
|
||
if (type of targetFile is text file) and (linked of targetFile) then
|
||
set targetFiles to targetFiles & {Access Paths of targetFile}
|
||
end if
|
||
end repeat
|
||
end tell
|
||
return targetFiles
|
||
end getTargetFiles
|
||
|
||
on addTargetFile(targetFile, targetList)
|
||
tell application "CodeWarrior IDE 3.2"
|
||
add (project document 1) new target file with data {targetFile} to targets targetList
|
||
end tell
|
||
end addTargetFile
|
||
|
||
on setCurrentTarget(currentTargetName)
|
||
tell application "CodeWarrior IDE 3.2"
|
||
Set Current Target currentTargetName
|
||
end tell
|
||
end setCurrentTarget
|
||
|
||
on removeTargetFile(targetFile)
|
||
tell application "CodeWarrior IDE 3.2"
|
||
Remove Files {targetFile}
|
||
end tell
|
||
end removeTargetFile
|
||
|
||
(* adds a list of "/" delimited file paths to the specified project. *)
|
||
on add_files(aProject, aFileList)
|
||
set projectPath to (gSourceTree & replace(aProject, "/", ":"))
|
||
-- display dialog "adding files to project: " & projectPath
|
||
openProject(projectPath)
|
||
set targetsList to getTargets()
|
||
set targetNames to names of targetsList
|
||
repeat with aFileRef in aFileList
|
||
set aFile to (contents of aFileRef)
|
||
set filePath to (gSourceTree & replace(aFile, "/", ":"))
|
||
-- display dialog "adding file: " & filePath
|
||
try
|
||
addTargetFile(filePath, targetNames)
|
||
on error errMsg number errNum
|
||
try
|
||
-- something failed, try closing/opening project, adding it again.
|
||
closeProject(projectPath)
|
||
openProject(projectPath)
|
||
addTargetFile(filePath, targetNames)
|
||
on error errMsg2 number errNum2
|
||
-- give up, and attempt to at least close the project before bailing.
|
||
try
|
||
closeProject(projectPath)
|
||
on error
|
||
end try
|
||
error "Error adding files: " & errMsg2 number errNum2
|
||
end try
|
||
end try
|
||
end repeat
|
||
closeProject(projectPath)
|
||
end add_files
|
||
|
||
(* removes a list of files from the specified project. *)
|
||
on remove_files(aProject, aFileList)
|
||
set projectPath to (gSourceTree & replace(aProject, "/", ":"))
|
||
-- display dialog "removing files from project: " & projectPath
|
||
openProject(projectPath)
|
||
try
|
||
set targetsList to getTargets()
|
||
set targetNames to names of targetsList
|
||
repeat with targetNameRef in targetNames
|
||
set targetName to (contents of targetNameRef)
|
||
setCurrentTarget(targetName)
|
||
repeat with aFileRef in aFileList
|
||
set aFile to (contents of aFileRef)
|
||
set filePath to (gSourceTree & replace(aFile, "/", ":"))
|
||
-- display dialog "removing file: " & filePath & " from target: " & targetName
|
||
removeTargetFile(filePath)
|
||
end repeat
|
||
end repeat
|
||
on error errMsg number errNum
|
||
try
|
||
closeProject(projectPath)
|
||
on error
|
||
end try
|
||
error "Error removing files: " & errMsg number errNum
|
||
end try
|
||
closeProject(projectPath)
|
||
end remove_files
|
||
|
||
on open_session(aSessionPath)
|
||
tell application "Finder"
|
||
-- open the session file
|
||
open alias aSessionPath
|
||
end tell
|
||
end open_session
|
||
|
||
(* When the CGI is first loaded, this will cause MacCVS to load the Raptor CVS Session file. *)
|
||
|
||
on run
|
||
-- open the MacCVS session file.
|
||
open_session(gSessionPath)
|
||
end run
|