Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

if ~/.config/afx is a relative link, cannot execute the afx command #43

Open
menghuu opened this issue May 3, 2022 · 10 comments
Open

Comments

@menghuu
Copy link

menghuu commented May 3, 2022

WHAT

if ~/.config/afx is a relative link, cannot execute the afx command

m ~/.config
❯ ls -la
total 20
drwxr-xr-x  5 m m 4096 May  3 20:29 .
drwxr-xr-x 22 m m 4096 May  3 20:29 ..
lrwxrwxrwx  1 m m   38 May  3 20:29 afx -> /home/m/projs/dotfiles/afx/.config/afx


m ~/.config
❯ afx
Package manager for CLI
...
...
Use "afx [command] --help" for more information about a command.

but, if ~/.config/afx is a relative link

❯ ls ~/.config/ -l
total 12
lrwxrwxrwx 1 m m   33 May  3 20:30 afx -> ../projs/dotfiles/afx/.config/afx

m ~/projs/dotfiles master ≡*+9 ~2 -1
❯ afx
[ERROR]: failed to initialize afx: /home/m/.config/afx: failed to walk dir: stat ../projs/dotfiles/afx/.config/afx: no such file or directory

WHY

@babarot
Copy link
Owner

babarot commented May 4, 2022

Which version did you use? Maybe this case has been fixed on v0.1.21 (#41)

@menghuu
Copy link
Author

menghuu commented May 4, 2022

  • the version is 0.1.21
  • it works with regular dir/file
❯ ls -ld .config/afx
drwxr-xr-x 2 m m 4096 May  5 02:37 .config/afx
❯ afx --version  # it works
afx version 0.1.21 (v0.1.21/054f74c)
  • it also works with absolute link
❯ ls -la
total 24
drwxr-xr-x  6 m m 4096 May  5 02:52 .
drwxr-xr-x 24 m m 4096 May  5 02:51 ..
lrwxrwxrwx  1 m m   11 May  5 02:52 afx -> /home/m/afx
❯ afx --version
afx version 0.1.21 (v0.1.21/054f74c)
  • but, it not works with relative link
❯ ls ~/.config/afx -ld
lrwxrwxrwx 1 m m 34 May  5 02:41 /home/m/.config/afx -> ../projs/dotfiles/main/.config/afx
❯ afx --version # it not works
[ERROR]: failed to initialize afx: /home/m/.config/afx: failed to walk dir: stat ../projs/dotfiles/main/.config/afx: no such file or directory
❯ cat ~/.config/afx/main.yaml
github:
- name: stedolan/jq
  description: Command-line JSON processor
  owner: stedolan
  repo: jq
  release:
    name: jq
    tag: jq-1.6
  command:
    link:
    - from: '*jq*'
      to: jqm ~

@b4b4r07

@babarot
Copy link
Owner

babarot commented May 4, 2022

Thank you. Now fixed on new version.

@menghuu
Copy link
Author

menghuu commented May 5, 2022

@b4b4r07

  • there is another problem: afx will fails if ~/.config/afx is not exist, Is it a design or a bug?
❯ afx --version
[ERROR]: failed to initialize afx: /home/m/.config/afx: failed to walk dir: lstat /home/m/.config/afx: no such file or directory
  • if the ~/.config/afx is a link(or more accuracy, a relative link?), afx will not install or update the package
❯ afx --version
afx version 0.1.22 (v0.1.22/4b34e4c)
❯ afx install
No packages to install
❯ afx update
No packages to update
❯ ls -ld ~/.config/afx
lrwxrwxrwx 1 m m 34 May  5 14:45 /home/m/.config/afx -> ../projs/dotfiles/main/.config/afx
❯ cat ~/.config/afx/main.yaml
github:
- name: stedolan/jq
  description: Command-line JSON processor
  owner: stedolan
  repo: jq
  release:
    name: jq
    tag: jq-1.6
  command:
    link:
    - from: '*jq*'
      to: jqm ~/projs/dotfiles
  • if ~/.config/afx is a regular dir, it works
❯ rm ~/.config/afx -fr
❯ mkdir ~/.config/afx
❯ cp main/.config/afx/main.yaml ~/.config/afx/
❯ afx --version
afx version 0.1.22 (v0.1.22/4b34e4c)
❯ afx install
? OK to install these packages? stedolan/jq No
Cancelled

@babarot
Copy link
Owner

babarot commented May 5, 2022

Okay,

let me think about this from the beginning...

if ~/.config/afx is a relative link, cannot execute the afx command

Why should I take care of this case? What kind of motivations or backgrounds do you have?

@menghuu
Copy link
Author

menghuu commented May 5, 2022

em...

  • ~/projs/dotfiles is my dotfile repo
  • I use stow to link $HOME dotfiles towords my dotfile repo, stow creates the relative link
  • I want to add afx-package-infos in my dotfile repo, and stow will link ~/.config/afx to my dotfile repo's subdir main/.config/afx
  • if i am in a new system, i can stow -t ~ main and afx install to install packages

@babarot
Copy link
Owner

babarot commented May 5, 2022

I think using relative symlink is rarely in the first place. I'm getting the feeling like relative link itself is not good link and also should not support it in app.

This is because generally we should use readlink system call in order to resolve symbolic link but that API will return just a linked path whether its path is relative or not. In that case, it's difficult to resolve absolute path. I can construct an absolute path by using filepath.Join and filepath.Clean etc but also difficult to continue to do walk dir inside app .

What do you think about this?

@menghuu
Copy link
Author

menghuu commented May 5, 2022

actually, I donot familiar with golang, but, if afx will suopprt (almost) unlimited dir level(with link), the simplest implement is: recurrence like this:

def to_absolute_path(filepath):
    if filepath is absolutepath:
        return filepath
    else:
        return to_abs(filepath)  # maybe using joining


def walk(absolute_filepath, reutrn_list, visited_list):
    # make sure: absolute_filepath is not visited
    # make sure: absolute_filepath is absolute path not link

    visited_list.append(absolute_filepath)

    if absolute_filepath is regulare_file:
        reutrn_list.append(absolute_filepath) # maybe check wheather it is a valid yaml
        return 
    else:
        for sub_filepath in absolute_filepath:
            sub_filepath = to_absolute_path(sub_filepath)
            
            if sub_filepath in visited_list:
                raise Exception('loop') # or just pass
            else:
                # sub_filepath is absolute path and not link 
                # sub_filepath is not visited
                walk(sub_filepath, reutrn_list=reutrn_list, visited_list=visited_list) 


config_root_dir_path = '/absolute/relative/or/regular/dir/path'
# make sure: config_root_dir_path is absolute path not link
config_root_dir_path = to_absolute_path(config_root_dir_path)

# make sure: config_root_dir_path is not visited
_visited_list = [] # a set

all_config_file_paths = [] # a set

walk(config_root_dir_path, reutrn_list=all_config_file_paths, visited_list=_visited_list)


@babarot
Copy link
Owner

babarot commented May 5, 2022

Of course we can implement this but what I wanted to say is whether I should support this case or not. Relative symbolic link is rare case, right?

@menghuu
Copy link
Author

menghuu commented May 5, 2022

ok, It's up to you to decide

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants