Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vagrant - paver devstack error: "[Errno 20] Not a directory"

I am attempting to get edx Devstack installed with Vagrant, and I'm on a Windows machine. I'm getting errors that appear to result from symlinks that aren't supported by Windows.

According to the edx troubleshooting guide under Dealing with line endings and symlinks under Windows, I should run the following commands in cygwin to deal with symlinks.

git rm --cached -r . && git reset --hard

git config --global alias.add-symlink '!__git_add_symlink(){
    dst=$(echo "$2")/../$(echo "$1"); 
    if [ -e "$dst" ]; then 
        hash=$(echo "$1" | git hash-object -w --stdin); 
        git update-index --add --cacheinfo 120000 "$hash" "$2"; 
        git checkout -- "$2"; 
    else 
        echo "ERROR: Target $dst does not exist!"; 
        echo "       Not creating invalid symlink."; 
    fi; 
    }; __git_add_symlink "$1" "$2"'

git config --global alias.rm-symlink '!__git_rm_symlink(){
    git checkout -- "$1"; link=$(echo "$1"); 
    POS=$'\''/'\''; DOS=$'\''\\\\'\''; 
    doslink=${link//$POS/$DOS}; 
    dest=$(dirname "$link")/$(cat "$link"); 
    dosdest=${dest//$POS/$DOS}; 
    if [ -f "$dest" ]; then 
        rm -f "$link"; 
        cmd //C mklink //H "$doslink" "$dosdest"; 
    elif [ -d "$dest" ]; then 
        rm -f "$link"; 
        cmd //C mklink //J "$doslink" "$dosdest"; 
    else 
        echo "ERROR: Something went wrong when processing $1 . . ."; 
        echo "       $dest may not actually exist as a valid target."; 
    fi; 
    }; __git_rm_symlink "$1"'

git config --global alias.rm-symlinks '!__git_rm_symlinks(){
    for symlink in `git ls-files -s | grep -E "^120000" | cut -f2`; 
    do 
        git rm-symlink "$symlink"; 
        git update-index --assume-unchanged "$symlink"; 
    done; 
    }; __git_rm_symlinks'

git config --global alias.checkout-symlinks '!__git_checkout_symlinks(){
    POS=$'\''/'\''; DOS=$'\''\\\\'\''; 
    for symlink in `git ls-files -s | grep -E "^120000" | cut -f2`; 
    do 
        git update-index --no-assume-unchanged "$symlink"; 
        if [ -d "$symlink" ]; then 
            dossymlink=${symlink//$POS/$DOS}; 
            cmd //C rmdir //S //Q "$dossymlink"; 
        fi; 
        git  checkout -- "$symlink"; 
        echo "Restored git symlink $symlink <<===>> `cat $symlink`"; 
    done; 
    }; __git_checkout_symlinks'

git rm-symlinks

I have also tried the commands in the SO answer to Git symlinks in Windows, which produces the same results.

Output:

The output I get after running the above commands is a little odd, so I'm not sure if the script is successful.

User@Computer /cygdrive/c/.../Local/devstack/edx-platform/edx-platform $./symlinks-fix.sh
**Git checkout output**
...
Checking out files: 100% (6983/6983), done.
HEAD is now at 222bdd9 Merge pull request #10411 from edx/mobile/course-blocks-api

Microsoft Windows [Version 6.2.9200]
(c) 2012 Microsoft Corporation. All rights reserved.

C:\Users\...\Local\devstack\edx-platform\edx-platform>

Why does it go into the Windows-style command prompt at the end? This is where I'm unsure if the git commands are working.

In Vagrant:

After running vagrant up and vagrant ssh, I get the following errors when running paver devstack lms (similar output for paver devstack studio):

vagrant@precise64:~$ sudo su edxapp
edxapp@precise64:~/edx-platform$ paver devstack lms
...
pip install -q --disable-pip-version-check --exists-action w -r requirements/edx/github.txt
  Could not find a tag or branch '96e1922348bfe6d99201b9512a9ed946c87b7e0b', assuming commit.
  .... 20 similar ....
  Could not find a tag or branch 'e7a6c95c300e95c51e42bfd1eba70489c05a6527', assuming commit.

pip install -q --disable-pip-version-check --exists-action w -r requirements/edx/local.txt
pip install -q --disable-pip-version-check --exists-action w -r requirements/edx/base.txt
  Requested meliae==0.4.0 (from -r requirements/edx/base.txt (line 47)), but installing version 0.4.0.final.0
pip install -q --disable-pip-version-check --exists-action w -r requirements/edx/post.txt
python manage.py cms --settings=devstack reindex_course --setup
2015-11-06 01:37:40,353 WARNING 4797 [xblock.plugin] plugin.py:147 - Unable to load XBlock 'html'
    Traceback...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'
2015-11-06 01:37:40,660 WARNING 4797 [xblock.plugin] plugin.py:147 - Unable to load XBlock 'course_info'
    Traceback...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'
    Traceback...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'
    Traceback ...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'
    Traceback ...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'

Build failed running pavelib.servers.devstack: Subprocess return code: 1

From what I understand, this is a problem with symlinks (See this post on Google groups).

Am I running the above symlinks script properly? How can I check if the symlinks have been dealt with successfully?

Other attempts:

Following the suggestions in the google group (link above), I have also made the following adjustments:

  • setting the VAGRANT_USE_VBOXFS = true
  • using the Vagrantfile provided here
  • setting the environment variable OPENEDX_RELEASE="named-release/cypress"
  • installing libxmlsec1 from Vagrant instance.

After multiple vagrant destroy and vagrant provision's, I still have the same IOError: [Error 20] Not a directory problem. Any help would be much appreciated!

Versions:

  • Windows version: 8
  • Vagrant version: 1.7.4
  • VirtualBox version: 5.0.8
  • openEdx release: named-release/cypress
like image 591
Evelyn Avatar asked Nov 06 '15 07:11

Evelyn


1 Answers

I think the problem is caused by your cydrive path is wrong.

Try to change in c:\cygwin\etc\fstab

none /cydrive cygdrive binary,posix=0,user 0 0

to

none / cygdrive binary,posix=0,user 0 0

refs: https://cygwin.com/cygwin-ug-net/using.html#cygdrive

UPDATE:

From CMD Type 'bash' and then copy/paste the contents of the script

If you get the same result try:

Open .gitconfig (with Notepad++ or similar) and add this section if it is not yet existing

[alias]
add-symlink = "!__git_add_symlink(){\n    dst=$(echo \"$2\")/../$(echo \"$1\"); \n    if [ -e \"$dst\" ]; then \n        hash=$(echo -n \"$1\" | git hash-object -w --stdin); \n        git update-index --add --cacheinfo 120000 \"$hash\" \"$2\"; \n        git checkout -- \"$2\"; \n    else \n        echo \"ERROR: Target $dst does not exist!\"; \n        echo \"       Not creating invalid symlink.\"; \n    fi; \n    }; __git_add_symlink \"$1\" \"$2\""
rm-symlink = "!__git_rm_symlink(){\n    git checkout -- \"$1\"; link=$(echo \"$1\"); \n    POS=$'/'; DOS=$'\\\\\\\\'; \n    doslink=${link//$POS/$DOS}; \n    dest=$(dirname \"$link\")/$(cat \"$link\"); \n    dosdest=${dest//$POS/$DOS}; \n    if [ -f \"$dest\" ]; then \n        rm -f \"$link\"; \n        cmd //C mklink //H \"$doslink\" \"$dosdest\"; \n    elif [ -d \"$dest\" ]; then \n        rm -f \"$link\"; \n        cmd //C mklink //J \"$doslink\" \"$dosdest\"; \n    else \n        echo \"ERROR: Something went wrong when processing $1 . . .\"; \n        echo \"       $dest may not actually exist as a valid target.\"; \n    fi; \n    }; __git_rm_symlink \"$1\""
rm-symlinks = "!__git_rm_symlinks(){\n    for symlink in `git ls-files -s | grep -E \"^120000\" | cut -f2`; \n    do \n        git rm-symlink \"$symlink\"; \n        git update-index --assume-unchanged \"$symlink\"; \n    done; \n    }; __git_rm_symlinks"
checkout-symlinks = "!__git_checkout_symlinks(){\n    POS=$'/'; DOS=$'\\\\\\\\'; \n    for symlink in `git ls-files -s | grep -E \"^120000\" | cut -f2`; \n    do \n        git update-index --no-assume-unchanged \"$symlink\"; \n        if [ -d \"$symlink\" ]; then \n            dossymlink=${symlink//$POS/$DOS}; \n            cmd //C rmdir //S //Q \"$dossymlink\"; \n        fi; \n        git  checkout -- \"$symlink\"; \n        echo \"Restored git symlink $symlink <<===>> `cat $symlink`\"; \n    done; \n    }; __git_checkout_symlinks"

This will create some git commands for symlinks

Note: File uses Unix line endings, don't edit with windows Notepad!

Then execute the commands

git rm --cached -r .
git reset --hard
git rm-symlinks

I tested it in my env and it works

like image 114
venimus Avatar answered Nov 18 '22 04:11

venimus