From e7e001e640727b97b9431fab6cd8e90d20e83940 Mon Sep 17 00:00:00 2001 From: itaigilo Date: Sun, 7 Jul 2024 20:44:40 +0300 Subject: [PATCH] Add esti tests for lakectl local with POSIX permissions (#7962) * Add esti tests for lakectl local with POSIX permissions * Fix docs * Remove temp code * Revert docs change * Fix tests * Update tests --- esti/lakectl_local_test.go | 35 +++++++++++++++++++++++++++++++++++ esti/lakectl_util.go | 9 +++++++++ pkg/local/sync.go | 3 ++- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/esti/lakectl_local_test.go b/esti/lakectl_local_test.go index 395e5111dd2..fa491fbdede 100644 --- a/esti/lakectl_local_test.go +++ b/esti/lakectl_local_test.go @@ -255,6 +255,41 @@ func TestLakectlLocal_clone(t *testing.T) { require.Contains(t, sanitizedResult, vars["PREFIX"]+"test2.txt") require.NotContains(t, sanitizedResult, vars["PREFIX"]+"nodiff.txt") }) + + t.Run("diff with posix permissions", func(t *testing.T) { + dataDir, err := os.MkdirTemp(tmpDir, "") + require.NoError(t, err) + vars["LOCAL_DIR"] = dataDir + vars["PREFIX"] = "posix" + + lakectl := LakectlWithPosixPerms() + RunCmdAndVerifyContainsText(t, lakectl+" local clone lakefs://"+repoName+"/"+mainBranch+"/"+vars["PREFIX"]+" "+dataDir, false, "Successfully cloned lakefs://${REPO}/${REF}/${PREFIX}/ to ${LOCAL_DIR}.", vars) + localVerifyDirContents(t, dataDir, []string{}) + + // Add new files to path + localCreateTestData(t, vars, []string{ + vars["PREFIX"] + uri.PathSeparator + "with-diff.txt", + vars["PREFIX"] + uri.PathSeparator + "no-diff.txt", + }) + + res := runCmd(t, lakectl+" local pull "+dataDir, false, false, vars) + require.Contains(t, res, "download with-diff.txt") + require.Contains(t, res, "download no-diff.txt") + + commitMessage := "'initialize' posix permissions for the remote repo" + runCmd(t, lakectl+" local commit "+dataDir+" -m \""+commitMessage+"\"", false, false, vars) + + sanitizedResult := runCmd(t, lakectl+" local status "+dataDir, false, false, vars) + require.Contains(t, sanitizedResult, "No diff found") + + err = os.Chmod(filepath.Join(dataDir, "with-diff.txt"), 0755) + require.NoError(t, err) + + sanitizedResult = runCmd(t, lakectl+" local status "+dataDir, false, false, vars) + + require.Contains(t, sanitizedResult, "with-diff.txt") + require.NotContains(t, sanitizedResult, "no-diff.txt") + }) } func TestLakectlLocal_pull(t *testing.T) { diff --git a/esti/lakectl_util.go b/esti/lakectl_util.go index c03fdc2d0ec..72c8bb03257 100644 --- a/esti/lakectl_util.go +++ b/esti/lakectl_util.go @@ -41,9 +41,14 @@ func lakectlLocation() string { } func LakectlWithParams(accessKeyID, secretAccessKey, endPointURL string) string { + return LakectlWithParamsWithPosixPerms(accessKeyID, secretAccessKey, endPointURL, false) +} + +func LakectlWithParamsWithPosixPerms(accessKeyID, secretAccessKey, endPointURL string, withPosixPerms bool) string { lakectlCmdline := "LAKECTL_CREDENTIALS_ACCESS_KEY_ID=" + accessKeyID + " LAKECTL_CREDENTIALS_SECRET_ACCESS_KEY=" + secretAccessKey + " LAKECTL_SERVER_ENDPOINT_URL=" + endPointURL + + " LAKECTL_EXPERIMENTAL_LOCAL_POSIX_PERMISSIONS_ENABLED=" + strconv.FormatBool(withPosixPerms) + " " + lakectlLocation() return lakectlCmdline @@ -53,6 +58,10 @@ func Lakectl() string { return LakectlWithParams(viper.GetString("access_key_id"), viper.GetString("secret_access_key"), viper.GetString("endpoint_url")) } +func LakectlWithPosixPerms() string { + return LakectlWithParamsWithPosixPerms(viper.GetString("access_key_id"), viper.GetString("secret_access_key"), viper.GetString("endpoint_url"), true) +} + func runShellCommand(t *testing.T, command string, isTerminal bool) ([]byte, error) { t.Helper() t.Logf("Run shell command '%s'", command) diff --git a/pkg/local/sync.go b/pkg/local/sync.go index 7361009f7bf..09c0bc6d842 100644 --- a/pkg/local/sync.go +++ b/pkg/local/sync.go @@ -277,7 +277,8 @@ func (s *SyncManager) upload(ctx context.Context, rootPath string, remote *uri.U if err := fileutil.VerifySafeFilename(source); err != nil { return err } - dest := strings.TrimPrefix(filepath.ToSlash(fmt.Sprintf("%s%s%s", remote.GetPath(), uri.PathSeparator, path)), uri.PathSeparator) + remotePath := strings.TrimRight(remote.GetPath(), uri.PathSeparator) + dest := strings.TrimPrefix(filepath.ToSlash(fmt.Sprintf("%s%s%s", remotePath, uri.PathSeparator, path)), uri.PathSeparator) f, err := os.Open(source) if err != nil {