Record file mode in the manifest, 0000 unless asked (closes #161)
check / check (push) Failing after 6s
check / check (push) Failing after 6s
MFFilePath gains mode (field 304): a file's permission bits, 0777 at most, or 0000, meaning none recorded. gen and freshen record real modes only with --include-permissions (ScannerOptions.IncludePermissions); the builder keeps only mode.Perm(), so setuid, setgid and sticky are never written. list -l and export show the mode in octal. check reports MODE_MISMATCH for a recorded mode other than 0000 the file lacks. fetch refuses a manifest with a mode above 0777 before requesting any file, sets only the permission bits of each recorded mode on the files it writes, and downloads again a present file whose mode differs. The decoding-cost bound counts a file entry at 176 bytes, up from 160. Model: opus-5-5
This commit is contained in:
@@ -99,6 +99,42 @@ func TestFreshenUnchanged(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestFreshenRecordsModeOnlyWhenAsked changes only the modes of a tree
|
||||
// after gen made its manifest, which recorded every mode as 0000. freshen
|
||||
// --include-permissions must record each file's permission bits, and a
|
||||
// later freshen without it must record 0000 again, although no file's
|
||||
// content or mtime changed.
|
||||
func TestFreshenRecordsModeOnlyWhenAsked(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
fs := afero.NewOsFs()
|
||||
root, manifestPath := setupFreshenDir(t, fs,
|
||||
map[string]string{testFileTxt: "a file", testDirFile: "a file in dir"})
|
||||
require.NoError(t, fs.Chmod(filepath.Join(root, testFileTxt), 0o640))
|
||||
require.NoError(t, fs.Chmod(filepath.Join(root, testDirFile), 0o755))
|
||||
|
||||
recordedModes := func() map[string]uint32 {
|
||||
modes := map[string]uint32{}
|
||||
for _, f := range manifestFiles(t, fs, manifestPath) {
|
||||
modes[f.GetPath()] = f.GetMode()
|
||||
}
|
||||
|
||||
return modes
|
||||
}
|
||||
|
||||
opts := testOpts([]string{
|
||||
testApp, cmdFreshen, "-q", "--" + flagIncludePermissions,
|
||||
testFlagBase, root, manifestPath,
|
||||
}, fs)
|
||||
require.Equal(t, 0, runCLI(opts), "stderr: %s", testStderr(t, opts))
|
||||
assert.Equal(t, map[string]uint32{testFileTxt: 0o640, testDirFile: 0o755},
|
||||
recordedModes())
|
||||
|
||||
runFreshen(t, fs, root, manifestPath)
|
||||
assert.Equal(t, map[string]uint32{testFileTxt: 0, testDirFile: 0},
|
||||
recordedModes())
|
||||
}
|
||||
|
||||
// assertManifestLists asserts that the manifest at manifestPath lists
|
||||
// exactly the files in want, each with the size and SHA-256 hash of its
|
||||
// content in want and the mtime of the file of that name under root.
|
||||
|
||||
Reference in New Issue
Block a user