Never list index.mf at the top of the tree in gen and freshen (closes #233)
check / check (push) Waiting to run
check / check (push) Waiting to run
fetch saves the manifest as index.mf at the top of the tree and refuses a manifest that lists a file there. gen given --output, and freshen with its manifest outside the base directory, listed such a file, so they wrote manifests fetch would not take. Both now leave out each file the manifest would list as index.mf: one at the top of the tree, or a file given to gen by that name. The rule goes by that path alone and looks up no file, so a symlink named index.mf never hides the file it points to. index.mf in a subdirectory is still listed. The scanner in package mfer gets an option to leave out files by the path they would be listed by. Model: opus-5-5
This commit was merged in pull request #234.
This commit is contained in:
@@ -413,6 +413,77 @@ func TestFreshenLeavesLeftoverTempFileOutOfListing(t *testing.T) {
|
||||
manifestPaths(t, fs, manifestPath))
|
||||
}
|
||||
|
||||
// TestFreshenLeavesTopIndexMFOutOfListing freshens a manifest kept outside
|
||||
// the directory --base names, after index.mf and sub/index.mf are added
|
||||
// there: index.mf at the top is not listed, since fetch saves the manifest
|
||||
// there, while sub/index.mf is listed.
|
||||
func TestFreshenLeavesTopIndexMFOutOfListing(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
root := t.TempDir()
|
||||
tree := filepath.Join(root, "tree")
|
||||
manifestPath := filepath.Join(root, "other.mf")
|
||||
|
||||
fs := afero.NewOsFs()
|
||||
require.NoError(t, fs.MkdirAll(filepath.Join(tree, testSubdir), 0o750))
|
||||
writeTestFile(t, fs, filepath.Join(tree, testFileTxt), "hello")
|
||||
|
||||
opts := testOpts([]string{testApp, cmdGenerate, "-q", "-o", manifestPath, tree}, fs)
|
||||
require.Equal(t, 0, runCLI(opts), "stderr: %s", testStderr(t, opts))
|
||||
|
||||
writeTestFile(t, fs, filepath.Join(tree, defaultManifestName), "an ordinary file")
|
||||
writeTestFile(t, fs, filepath.Join(tree, testSubdirManifest), "an ordinary file")
|
||||
|
||||
runFreshen(t, fs, tree, manifestPath)
|
||||
|
||||
assert.ElementsMatch(t, []string{testFileTxt, testSubdirManifest},
|
||||
manifestPaths(t, fs, manifestPath))
|
||||
}
|
||||
|
||||
// TestFreshenListsTargetOfTopIndexMFSymlink freshens a manifest kept
|
||||
// outside the directory --base names, after sub/index.mf is added there
|
||||
// and index.mf at the top is made a symlink to it: sub/index.mf is listed,
|
||||
// and the symlink, which freshen lists only with --follow-symlinks, is left
|
||||
// out like any index.mf at the top.
|
||||
func TestFreshenListsTargetOfTopIndexMFSymlink(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
for name, flags := range map[string][]string{
|
||||
"plain freshen": nil,
|
||||
"freshen --follow-symlinks": {testFlagFollowSymlinks},
|
||||
} {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
root := t.TempDir()
|
||||
tree := filepath.Join(root, "tree")
|
||||
manifestPath := filepath.Join(root, "other.mf")
|
||||
|
||||
fs := afero.NewOsFs()
|
||||
require.NoError(t, fs.MkdirAll(filepath.Join(tree, testSubdir), 0o750))
|
||||
writeTestFile(t, fs, filepath.Join(tree, testFileTxt), "hello")
|
||||
|
||||
opts := testOpts([]string{
|
||||
testApp, cmdGenerate, "-q", "-o", manifestPath, tree,
|
||||
}, fs)
|
||||
require.Equal(t, 0, runCLI(opts), "stderr: %s", testStderr(t, opts))
|
||||
|
||||
writeTestFile(t, fs, filepath.Join(tree, testSubdirManifest), "an ordinary file")
|
||||
require.NoError(t, os.Symlink(testSubdirManifest,
|
||||
filepath.Join(tree, defaultManifestName)))
|
||||
|
||||
opts = testOpts(slices.Concat(
|
||||
[]string{testApp, cmdFreshen, "-q"}, flags,
|
||||
[]string{testFlagBase, tree, manifestPath},
|
||||
), fs)
|
||||
require.Equal(t, 0, runCLI(opts), "stderr: %s", testStderr(t, opts))
|
||||
|
||||
assert.ElementsMatch(t, []string{testFileTxt, testSubdirManifest},
|
||||
manifestPaths(t, fs, manifestPath))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// TestFreshenResolvesEntriesAgainstManifestDirectory adds sub/c.txt, then
|
||||
// runs freshen from the directory above sub, on the manifest in sub.
|
||||
// Without --base, the manifest then lists the files in sub, whether freshen
|
||||
|
||||
Reference in New Issue
Block a user