From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16207 invoked from network); 23 Sep 2008 16:05:53 -0000 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.2.5 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 23 Sep 2008 16:05:53 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 36111 invoked from network); 23 Sep 2008 16:05:48 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 23 Sep 2008 16:05:48 -0000 Received: (qmail 18291 invoked by alias); 23 Sep 2008 16:05:44 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 25732 Received: (qmail 18275 invoked from network); 23 Sep 2008 16:05:43 -0000 Received: from bifrost.dotsrc.org (130.225.254.106) by sunsite.dk with SMTP; 23 Sep 2008 16:05:43 -0000 Received: from cluster-d.mailcontrol.com (cluster-d.mailcontrol.com [217.69.20.190]) by bifrost.dotsrc.org (Postfix) with ESMTPS id 0888180307AB for ; Tue, 23 Sep 2008 18:05:35 +0200 (CEST) Received: from cameurexb01.EUROPE.ROOT.PRI ([193.128.72.68]) by rly45d.srv.mailcontrol.com (MailControl) with ESMTP id m8NG5HOf006035 for ; Tue, 23 Sep 2008 17:05:34 +0100 Received: from news01 ([10.103.143.38]) by cameurexb01.EUROPE.ROOT.PRI with Microsoft SMTPSVC(6.0.3790.3959); Tue, 23 Sep 2008 17:02:50 +0100 Date: Tue, 23 Sep 2008 17:02:45 +0100 From: Peter Stephenson To: zsh-workers@sunsite.dk (Zsh hackers list) Subject: Re: Minor VCS Info things Message-ID: <20080923170245.4da323c0@news01> In-Reply-To: <15055.1222092662@csr.com> References: <15055.1222092662@csr.com> Organization: CSR X-Mailer: Claws Mail 3.5.0 (GTK+ 2.12.8; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 23 Sep 2008 16:02:50.0686 (UTC) FILETIME=[D45B5DE0:01C91D95] X-Scanned-By: MailControl A-08-50-15 (www.mailcontrol.com) on 10.68.0.155 X-Virus-Scanned: ClamAV 0.92.1/8316/Tue Sep 23 11:40:56 2008 on bifrost X-Virus-Status: Clean On Mon, 22 Sep 2008 15:11:02 +0100 Peter Stephenson 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 Software Engineer CSR PLC, Churchill House, Cambridge Business Park, Cowley Road Cambridge, CB4 0WZ, UK Tel: +44 (0)1223 692070