Skip to content

Commit

Permalink
feat: add a linter to check for dangling symlink
Browse files Browse the repository at this point in the history
Signed-off-by: Tuan Anh Tran <me@tuananh.org>
  • Loading branch information
tuananh committed Dec 23, 2023
1 parent 3a7d2fc commit 13d15d6
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 0 deletions.
1 change: 1 addition & 0 deletions pkg/linter/defaults/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ var defaultLinters = []string{
"dev",
"documentation",
"empty",
"danglingsymlink",
"opt",
"object",
"python/docs",
Expand Down
54 changes: 54 additions & 0 deletions pkg/linter/linter.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,12 @@ var postLinterMap = map[string]postLinter{
FailOnError: false,
Explain: "Verify that this package is supposed to be empty; if it is, disable this linter; otherwise check the build",
},
"danglingsymlink": {
LinterFunc: danglingSymlinkLinter,
LinterClass: linter_defaults.LinterClassBuild | linter_defaults.LinterClassApk,
FailOnError: false,
Explain: "Verify that this package has no dangling symlink",
},
"python/docs": {
LinterFunc: pythonDocsPostLinter,
LinterClass: linter_defaults.LinterClassBuild | linter_defaults.LinterClassApk,
Expand Down Expand Up @@ -644,3 +650,51 @@ func LintApk(ctx context.Context, path string, warn func(error), linters []strin

return lctx.lintPackageFs(warn, linters, linter_defaults.LinterClassApk)
}

func danglingSymlinkLinter(lctx LinterContext, fsys fs.FS) error {
founddanglingsymlink := false
walkCb := func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}

if isIgnoredPath(path) {
return nil
}

if d.IsDir() {
// Ignore directories
return nil
}

if d.Type() == fs.ModeSymlink {
realpath, err := filepath.EvalSymlinks(path)
if err != nil {
return err
}

f, err := lctx.fsys.Open(realpath)
if err != nil {
founddanglingsymlink = true
return fs.SkipAll
}

defer f.Close()

return nil
}

return nil
}

err := fs.WalkDir(fsys, ".", walkCb)
if err != nil {
return err
}

if founddanglingsymlink {
return fmt.Errorf("found dangling symlink %w", err)
}

return nil
}

0 comments on commit 13d15d6

Please sign in to comment.