mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| ## vim:ft=zsh
 | |
| ## perforce support by: Phil Pennock
 | |
| ## Distributed under the same BSD-ish license as zsh itself.
 | |
| 
 | |
| # If user-server is true in the :vcs_info:p4:... context, contact the
 | |
| # server to decide whether the directory is handled by Perforce.  This can
 | |
| # cause a delay if the network times out, in particular if looking up the
 | |
| # server name failed.  Hence this is not the default.  If a timeout
 | |
| # occurred, the server:port pair is added to the associative array
 | |
| # vcs_info_p4_dead_servers and the server is never contacted again.  The
 | |
| # array must be edited by hand to remove it.
 | |
| #
 | |
| # If user-server is false or not set, the function looks to see if there is
 | |
| # a file $P4CONFIG somewhere above in the hierarchy.  This is far from
 | |
| # foolproof; in fact it relies on you using the particular working practice
 | |
| # of having such files in all client root directories and nowhere above.
 | |
| 
 | |
| 
 | |
| VCS_INFO_p4_get_server() {
 | |
|   emulate -L zsh
 | |
|   setopt extendedglob
 | |
| 
 | |
|   local -a settings
 | |
|   settings=(${(f)"$(${vcs_comm[cmd]} set)"})
 | |
|   serverport=${${settings[(r)P4PORT=*]##P4PORT=}%% *}
 | |
|   case $serverport in
 | |
|     (''|:)
 | |
|     serverport=perforce:1666
 | |
|     ;;
 | |
| 
 | |
|     (:*)
 | |
|     serverport=perforce${serverport}
 | |
|     ;;
 | |
| 
 | |
|     (*:)
 | |
|     serverport=${serverport}1666
 | |
|     ;;
 | |
| 
 | |
|     (<->)
 | |
|     serverport=perforce:${serverport}
 | |
|     ;;
 | |
|   esac
 | |
| }
 | |
| 
 | |
| 
 | |
| VCS_INFO_detect_p4() {
 | |
|   local serverport p4where
 | |
| 
 | |
|   if zstyle -t ":vcs_info:p4:${usercontext}:${rrn}" use-server; then
 | |
|     # Use "p4 where" to decide whether the path is under the
 | |
|     # client workspace.
 | |
|     if (( ${#vcs_info_p4_dead_servers} )); then
 | |
|       # See if the server is in the list of defunct servers
 | |
|       VCS_INFO_p4_get_server
 | |
|       [[ -n $vcs_info_p4_dead_servers[$serverport] ]] && return 1
 | |
|     fi
 | |
|     if p4where="$(${vcs_comm[cmd]} where 2>&1)"; then
 | |
|       return 0
 | |
|     fi
 | |
|     if [[ $p4where = *"Connect to server failed"* ]]; then
 | |
|       # If the connection failed, mark the server as defunct.
 | |
|       # Otherwise it worked but we weren't within a client.
 | |
|       typeset -gA vcs_info_p4_dead_servers
 | |
|       [[ -z $serverport ]] && VCS_INFO_p4_get_server
 | |
|       vcs_info_p4_dead_servers[$serverport]=1
 | |
|     fi
 | |
|     return 1
 | |
|   else
 | |
|     [[ -n ${P4CONFIG} ]] || return 1
 | |
|     VCS_INFO_check_com ${vcs_comm[cmd]} || return 1
 | |
|     vcs_comm[detect_need_file]="${P4CONFIG}"
 | |
|     VCS_INFO_bydir_detect .
 | |
|     return $?
 | |
|   fi
 | |
| }
 | |
| 
 | |
| VCS_INFO_detect_p4 "$@"
 |