if `~/.config/afx` is a relative link, cannot execute the `afx` command
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
Which version did you use? Maybe this case has been fixed on v0.1.21 (#41)
- 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
Thank you. Now fixed on new version.
@b4b4r07
- there is another problem:
afxwill fails if~/.config/afxis 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/afxis a link(or more accuracy, a relative link?),afxwill 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/afxis 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
Okay,
let me think about this from the beginning...
if
~/.config/afxis a relative link, cannot execute theafxcommand
Why should I take care of this case? What kind of motivations or backgrounds do you have?
em...
-
~/projs/dotfilesis my dotfile repo - I use
stowto link$HOMEdotfiles 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/afxto my dotfile repo's subdirmain/.config/afx - if i am in a new system, i can
stow -t ~ mainandafx installto install packages
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?
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)
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?
ok, It's up to you to decide