Skip to content

Commit 8b95f34

Browse files
committed
make setvirtualenvproject honor relative paths
Resolve relative paths before storing the project directory reference. Fixes #207 Change-Id: I9bd37207a5ecf2aec09f0d0e32a95ddee881315f
1 parent f47faa6 commit 8b95f34

File tree

3 files changed

+116
-1
lines changed

3 files changed

+116
-1
lines changed

docs/source/history.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ dev
1717
:ref:`command-mkvirtualenv`, based on work by Xupeng Yun.
1818
- Dropped python 3.2 testing.
1919
- Updated test configuration so they work properly under Linux.
20+
- Resolve relative paths before storing the project directory
21+
reference in :ref:`command-setvirtualenvproject`. (:bbissue:`207`)
2022

2123
4.1.1
2224
=====

tests/test_setvirtualenvproject.sh

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# -*- mode: shell-script -*-
2+
3+
test_dir=$(dirname $0)
4+
source "$test_dir/setup.sh"
5+
6+
oneTimeSetUp() {
7+
rm -rf "$WORKON_HOME"
8+
mkdir -p "$WORKON_HOME"
9+
rm -rf "$PROJECT_HOME"
10+
mkdir -p "$PROJECT_HOME"
11+
source "$test_dir/../virtualenvwrapper.sh"
12+
}
13+
14+
oneTimeTearDown() {
15+
rm -rf "$WORKON_HOME"
16+
rm -rf "$PROJECT_HOME"
17+
}
18+
19+
setUp () {
20+
echo
21+
}
22+
23+
test_setvirtualenvproject() {
24+
n=1
25+
project="$WORKON_HOME/project$n"
26+
mkdir "$project"
27+
env="env$n"
28+
ptrfile="$WORKON_HOME/$env/.project"
29+
mkvirtualenv "$env" >/dev/null 2>&1
30+
setvirtualenvproject "$env" "$project" >/dev/null 2>&1
31+
assertTrue ".project not found" "[ -f $ptrfile ]"
32+
assertEquals "$ptrfile contains wrong content" "$project" "$(cat $ptrfile)"
33+
}
34+
35+
test_setvirtualenvproject_relative_path() {
36+
cd "$WORKON_HOME"
37+
n=2
38+
project="project$n"
39+
mkdir "$project"
40+
env="env$n"
41+
ptrfile="$WORKON_HOME/$env/.project"
42+
mkvirtualenv "$env" >/dev/null 2>&1
43+
setvirtualenvproject "$env" "$project" >/dev/null 2>&1
44+
assertTrue ".project not found" "[ -f $ptrfile ]"
45+
assertEquals "$ptrfile contains wrong content" "$WORKON_HOME/$project" "$(cat $ptrfile)"
46+
}
47+
48+
test_setvirtualenvproject_not_a_directory() {
49+
cd "$WORKON_HOME"
50+
n=3
51+
project="project$n"
52+
touch "$project"
53+
env="env$n"
54+
ptrfile="$WORKON_HOME/$env/.project"
55+
mkvirtualenv "$env" >/dev/null 2>&1
56+
setvirtualenvproject "$env" "$project" >/dev/null 2>&1
57+
RC=$?
58+
assertTrue "setvirtualenvproject should have failed" "[ $RC -ne 0 ]"
59+
}
60+
61+
test_setvirtualenvproject_does_not_exist() {
62+
n=4
63+
project="project$n"
64+
env="env$n"
65+
ptrfile="$WORKON_HOME/$env/.project"
66+
mkvirtualenv "$env" >/dev/null 2>&1
67+
setvirtualenvproject "$env" "$project" >/dev/null 2>&1
68+
RC=$?
69+
assertTrue "setvirtualenvproject should have failed" "[ $RC -ne 0 ]"
70+
}
71+
72+
test_setvirtualenvproject_relative_with_dots() {
73+
cd "$WORKON_HOME"
74+
n=5
75+
project="project$n"
76+
mkdir $project
77+
mkdir $project.sibling
78+
cd $project.sibling
79+
# Change the reference to a sibling directory
80+
project="../$project"
81+
env="env$n"
82+
ptrfile="$WORKON_HOME/$env/.project"
83+
mkvirtualenv "$env" >/dev/null 2>&1
84+
setvirtualenvproject "$env" "$project" >/dev/null 2>&1
85+
assertTrue ".project not found" "[ -f $ptrfile ]"
86+
assertEquals "$ptrfile contains wrong content" "$WORKON_HOME/project$n" "$(cat $ptrfile)"
87+
}
88+
89+
. "$test_dir/shunit2"

virtualenvwrapper.sh

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ function mkvirtualenv {
407407
project="${in_args[$i]}"
408408
if [ ! -d "$project" ]
409409
then
410-
echo "$project is not a directory" 1>&2
410+
echo "Cannot associate project with $project, it is not a directory" 1>&2
411411
return 1
412412
fi
413413
project="$(virtualenvwrapper_absolutepath ${project})";;
@@ -471,6 +471,8 @@ function mkvirtualenv {
471471
if [ ! -z "$project" ]
472472
then
473473
setvirtualenvproject "$WORKON_HOME/$envname" "$project"
474+
RC=$?
475+
[ $RC -ne 0 ] && return $RC
474476
fi
475477

476478
# Now activate the new environment
@@ -976,7 +978,29 @@ function setvirtualenvproject {
976978
if [ -z "$prj" ]
977979
then
978980
prj="$(pwd)"
981+
else
982+
prj=$(virtualenvwrapper_absolutepath "${prj}")
979983
fi
984+
985+
# If what we were given isn't a directory, see if it is under
986+
# $WORKON_HOME.
987+
if [ ! -d "$venv" ]
988+
then
989+
venv="$WORKON_HOME/$venv"
990+
fi
991+
if [ ! -d "$venv" ]
992+
then
993+
echo "No virtualenv $(basename $venv)" 1>&2
994+
return 1
995+
fi
996+
997+
# Make sure we have a valid project setting
998+
if [ ! -d "$prj" ]
999+
then
1000+
echo "Cannot associate virtualenv with \"$prj\", it is not a directory" 1>&2
1001+
return 1
1002+
fi
1003+
9801004
echo "Setting project for $(basename $venv) to $prj"
9811005
echo "$prj" > "$venv/$VIRTUALENVWRAPPER_PROJECT_FILENAME"
9821006
}

0 commit comments

Comments
 (0)