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

1

11

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
Calyces answered 6/11, 2015 at 7:55 Comment(3)
Are you trying to create/use symlinks in Windows, or are you trying to create/use symlinks in VirtualBox (assuming a linux VM)?Tarrah
@Jonathan I'm trying to use symlinks in files that are stored on my Windows machine and shared via VirtualBox to a linux VM... At least I think that's how vagrant works.Calyces
There is a bug in the first script where hash=$(echo "$1" | git hash-object -w --stdin); should be hash=$(echo -n "$1" | git hash-object -w --stdin); (note the additional "-n")Undeceive
U
3

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

Undeceive answered 16/11, 2015 at 13:11 Comment(4)
I get the same error after I edit that file. It also still goes to windows-style command after running the script. I am using cygwin in administrator mode, and mount shows the following (after editing fstab): C:/cygwin/bin on /usr/bin type ntfs (binary,auto) C:/cygwin/lib on /usr/lib type ntfs (binary,auto) C:/cygwin on / type ntfs (binary,auto) C: on /c type ntfs (binary,posix=0,user,noumount,auto) Calyces
this "option" in fstab is for auto mounted drives It allows you to have /cygdrive/c/windows when you change it it will become /c/windows Seems you need to add all manually mounted paths in fstab as it is described in cygwin manualUndeceive
I edited the answer to add some other stuff. I think your .sh lineendings might be off. They should be UNIX style.Undeceive
The .sh line endings are UNIX style, but I think you're right about my cygdrive having some issues, because even after I edited the .gitconfig and ran the commands, it still didn't work. However! I opened up the git bash terminal, tried the commands again, and it worked! Thanks!Calyces

© 2022 - 2024 — McMap. All rights reserved.