summary refs log tree commit diff
diff options
context:
space:
mode:
authorDaniel Shahaf <danielsh@apache.org>2019-12-01 00:04:47 +0000
committerDaniel Shahaf <danielsh@apache.org>2019-12-03 03:03:05 +0000
commit61262ae2821d375929bd418b6acc8d253bfb2faa (patch)
tree5374839a86670922b4d6ff0ab0a3f6b985716e5a
parent9e771a0b203ad9cc953b42111da55207304cdc19 (diff)
downloadzsh-61262ae2821d375929bd418b6acc8d253bfb2faa.tar.gz
zsh-61262ae2821d375929bd418b6acc8d253bfb2faa.tar.xz
zsh-61262ae2821d375929bd418b6acc8d253bfb2faa.zip
44960: vcs_info cvs: Fix infinite loop when /CVS exists.
-rw-r--r--ChangeLog3
-rw-r--r--Functions/VCS_Info/Backends/VCS_INFO_get_data_cvs12
2 files changed, 12 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 3469ad643..a2b2f3073 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2019-12-03  Daniel Shahaf  <danielsh@apache.org>
 
+	* 44960: Functions/VCS_Info/Backends/VCS_INFO_get_data_cvs:
+	vcs_info cvs: Fix infinite loop when /CVS exists.
+
 	* 44961: Functions/VCS_Info/Backends/VCS_INFO_get_data_svn:
 	vcs_info svn: Fix infinite loop when /.svn exists.
 
diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_cvs b/Functions/VCS_Info/Backends/VCS_INFO_get_data_cvs
index e9d172052..9b828bd11 100644
--- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_cvs
+++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_cvs
@@ -5,11 +5,17 @@
 setopt localoptions NO_shwordsplit
 local cvsbranch cvsbase
 
+# Look for the most distant parent that still has a CVS subdirectory.
+# VCS_INFO_detect_cvs ensured that ./CVS/Repository exists.
 cvsbase="."
-while [[ -d "${cvsbase}/../CVS" ]]; do
-    cvsbase="${cvsbase}/.."
-done
 cvsbase=${cvsbase:P}
+while [[ -d "${cvsbase:h}/CVS" ]]; do
+    cvsbase="${cvsbase:h}"
+    if [[ $cvsbase == '/' ]]; then
+        break
+    fi
+done
+
 cvsbranch=$(< ./CVS/Repository)
 rrn=${cvsbase:t}
 cvsbranch=${cvsbranch##${rrn}/}