Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Minor VCS Info things
- X-seq: zsh-workers 25732
- From: Peter Stephenson <pws@xxxxxxx>
- To: zsh-workers@xxxxxxxxxx (Zsh hackers list)
- Subject: Re: Minor VCS Info things
- Date: Tue, 23 Sep 2008 17:02:45 +0100
- In-reply-to: <15055.1222092662@xxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- Organization: CSR
- References: <15055.1222092662@xxxxxxx>
On Mon, 22 Sep 2008 15:11:02 +0100
Peter Stephenson <pws@xxxxxxx> wrote:
> The Perforce detector doesn't work very well. $P4CONFIG is not tied to
> being in the Perforce workspace: you can have a config file outside a
> workspace to set a default client etc., and you don't need one at all if
> the client etc. are set via environment variables. The only good way of
> detecting whether you're in a workspace is to ask the server.
> Unfortunately this can hang (though not permanently) if the server is
> not available, so I haven't sent a patch. It could be fixed by adding
> an explicit style to use the server and also a global (per server:port
> pair) flag that the server didn't respond, so that it only hangs (for a
> second or two) the first time.
I've done this. It seems to work OK.
Index: Doc/Zsh/contrib.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/contrib.yo,v
retrieving revision 1.88
diff -u -r1.88 contrib.yo
--- Doc/Zsh/contrib.yo 22 Sep 2008 17:22:48 -0000 1.88
+++ Doc/Zsh/contrib.yo 23 Sep 2008 15:55:51 -0000
@@ -502,6 +502,21 @@
repositories (checked in the var(-init-) context, too). Only used if
tt(enable) contains tt(ALL).
)
+kindex(use-server)
+item(tt(use-server))(
+This is used by the Perforce backend (tt(p4)) to decide if it should
+contact the Perforce server to find out if a directory is managed
+by Perforce. This is the only reliable way of doing this, but runs
+the risk of a delay if the server name cannot be found. If the
+server (more specifically, the var(host)tt(:)var(port) pair describing the
+server) cannot be contacted its name is put into the associative array
+tt(vcs_info_p4_dead_servers) and not contacted again during the session
+until it is removed by hand. If you do not set this style, the tt(p4)
+backend is only usable if you have set the environment variable
+tt(P4CONFIG) to a file name and have corresponding files in the root
+directories of each Perforce client. See comments in the function
+tt(VCS_INFO_detect_p4) for more detail.
+)
kindex(use-simple)
item(tt(use-simple))(
If there are two different ways of gathering
Index: Functions/VCS_Info/Backends/VCS_INFO_detect_p4
===================================================================
RCS file: /cvsroot/zsh/zsh/Functions/VCS_Info/Backends/VCS_INFO_detect_p4,v
retrieving revision 1.1
diff -u -r1.1 VCS_INFO_detect_p4
--- Functions/VCS_Info/Backends/VCS_INFO_detect_p4 19 Sep 2008 12:58:53 -0000 1.1
+++ Functions/VCS_Info/Backends/VCS_INFO_detect_p4 23 Sep 2008 15:55:51 -0000
@@ -2,8 +2,76 @@
## perforce support by: Phil Pennock
## Distributed under the same BSD-ish license as zsh itself.
-[[ -n ${P4CONFIG} ]] || return 1
-VCS_INFO_check_com p4 || return 1
-vcs_comm[detect_need_file]="${P4CONFIG}"
-VCS_INFO_bydir_detect .
-return $?
+# 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)"$(p4 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="$(p4 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 p4 || return 1
+ vcs_comm[detect_need_file]="${P4CONFIG}"
+ VCS_INFO_bydir_detect .
+ return $?
+ fi
+}
+
+VCS_INFO_detect_p4 "$@"
--
Peter Stephenson <pws@xxxxxxx> Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070
Messages sorted by:
Reverse Date,
Date,
Thread,
Author