forked from jfrog/jfrog-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Michael Sverdlov <[email protected]>
- Loading branch information
1 parent
360095a
commit 160cd26
Showing
4 changed files
with
213 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
package cliutils | ||
|
||
import ( | ||
"encoding/json" | ||
"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils" | ||
"github.com/jfrog/jfrog-client-go/utils/errorutils" | ||
"os" | ||
"path/filepath" | ||
gosync "sync" | ||
) | ||
|
||
const persistenceFileName = "persistence.json" | ||
|
||
// PersistenceInfo represents the fields we are persisting | ||
type PersistenceInfo struct { | ||
LatestVersionCheckTime *int64 `json:"latestVersionCheckTime,omitempty"` | ||
AiTermsVersion *int `json:"aiTermsVersion,omitempty"` | ||
} | ||
|
||
var ( | ||
persistenceFilePath string | ||
fileLock gosync.Mutex | ||
) | ||
|
||
// init initializes the persistence file path once, and stores it for future use | ||
func init() { | ||
homeDir, err := coreutils.GetJfrogHomeDir() | ||
if err != nil { | ||
panic("Failed to get JFrog home directory: " + err.Error()) | ||
} | ||
persistenceFilePath = filepath.Join(homeDir, persistenceFileName) | ||
} | ||
|
||
// SetLatestVersionCheckTime updates the latest version check time in the persistence file | ||
func SetLatestVersionCheckTime(timestamp int64) error { | ||
info, err := getPersistenceInfo() | ||
if err != nil { | ||
return err | ||
} | ||
|
||
info.LatestVersionCheckTime = ×tamp | ||
return setPersistenceInfo(info) | ||
} | ||
|
||
// GetLatestVersionCheckTime retrieves the latest version check time from the persistence file | ||
func GetLatestVersionCheckTime() (*int64, error) { | ||
info, err := getPersistenceInfo() | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
return info.LatestVersionCheckTime, nil | ||
} | ||
|
||
// SetAiTermsVersion updates the AI terms version in the persistence file | ||
func SetAiTermsVersion(version int) error { | ||
info, err := getPersistenceInfo() | ||
if err != nil { | ||
return err | ||
} | ||
|
||
info.AiTermsVersion = &version | ||
return setPersistenceInfo(info) | ||
} | ||
|
||
// GetAiTermsVersion retrieves the AI terms version from the persistence file | ||
func GetAiTermsVersion() (*int, error) { | ||
info, err := getPersistenceInfo() | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
return info.AiTermsVersion, nil | ||
} | ||
|
||
// getPersistenceInfo reads the persistence file, creates it if it doesn't exist, and returns the persisted info | ||
func getPersistenceInfo() (*PersistenceInfo, error) { | ||
if _, err := os.Stat(persistenceFilePath); os.IsNotExist(err) { | ||
// Create an empty persistence file if it doesn't exist | ||
pFile := &PersistenceInfo{} | ||
if err = setPersistenceInfo(pFile); err != nil { | ||
return nil, errorutils.CheckErrorf("failed while attempting to initialize persistence file" + err.Error()) | ||
} | ||
return pFile, nil | ||
} | ||
|
||
fileLock.Lock() | ||
defer fileLock.Unlock() | ||
data, err := os.ReadFile(persistenceFilePath) | ||
if err != nil { | ||
return nil, errorutils.CheckErrorf("failed while attempting to read persistence file" + err.Error()) | ||
} | ||
|
||
var info PersistenceInfo | ||
if err = json.Unmarshal(data, &info); err != nil { | ||
return nil, errorutils.CheckErrorf("failed while attempting to parse persistence file" + err.Error()) | ||
} | ||
|
||
return &info, nil | ||
} | ||
|
||
// setPersistenceInfo writes the given info to the persistence file | ||
func setPersistenceInfo(info *PersistenceInfo) error { | ||
fileLock.Lock() | ||
defer fileLock.Unlock() | ||
|
||
data, err := json.MarshalIndent(info, "", " ") | ||
if err != nil { | ||
return errorutils.CheckErrorf("failed while attempting to create persistence file" + err.Error()) | ||
} | ||
|
||
err = os.WriteFile(persistenceFilePath, data, 0644) | ||
if err != nil { | ||
return errorutils.CheckErrorf("failed while attempting to write persistence file" + err.Error()) | ||
} | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
package cliutils | ||
|
||
import ( | ||
"os" | ||
"path/filepath" | ||
"testing" | ||
"time" | ||
) | ||
|
||
// TestSetAndGetLatestVersionCheckTime tests setting and getting the LatestVersionCheckTime | ||
func TestSetAndGetLatestVersionCheckTime(t *testing.T) { | ||
// Setup temporary directory | ||
persistenceFilePath = filepath.Join(t.TempDir(), persistenceFileName) | ||
|
||
// Set the timestamp | ||
timestamp := time.Now().UnixMilli() | ||
err := SetLatestVersionCheckTime(timestamp) | ||
if err != nil { | ||
t.Fatalf("Failed to set LatestVersionCheckTime: %v", err) | ||
} | ||
|
||
// Get the timestamp | ||
storedTimestamp, err := GetLatestVersionCheckTime() | ||
if err != nil { | ||
t.Fatalf("Failed to get LatestVersionCheckTime: %v", err) | ||
} | ||
|
||
// Assert equality | ||
if *storedTimestamp != timestamp { | ||
t.Fatalf("Expected %d, got %d", timestamp, *storedTimestamp) | ||
} | ||
} | ||
|
||
// TestSetAndGetAiTermsVersion tests setting and getting the AiTermsVersion | ||
func TestSetAndGetAiTermsVersion(t *testing.T) { | ||
// Setup temporary directory | ||
persistenceFilePath = filepath.Join(t.TempDir(), persistenceFileName) | ||
|
||
// Set the AI terms version | ||
version := 42 | ||
err := SetAiTermsVersion(version) | ||
if err != nil { | ||
t.Fatalf("Failed to set AiTermsVersion: %v", err) | ||
} | ||
|
||
// Get the AI terms version | ||
storedVersion, err := GetAiTermsVersion() | ||
if err != nil { | ||
t.Fatalf("Failed to get AiTermsVersion: %v", err) | ||
} | ||
|
||
// Assert equality | ||
if *storedVersion != version { | ||
t.Fatalf("Expected %d, got %d", version, *storedVersion) | ||
} | ||
} | ||
|
||
// TestPersistenceFileCreation tests if the persistence file is created when it doesn't exist | ||
func TestPersistenceFileCreation(t *testing.T) { | ||
// Setup temporary directory | ||
persistenceFilePath = filepath.Join(t.TempDir(), persistenceFileName) | ||
|
||
// Ensure the persistence file doesn't exist | ||
_, err := os.Stat(persistenceFilePath) | ||
if !os.IsNotExist(err) { | ||
t.Fatalf("Expected file to not exist, but it does: %v", err) | ||
} | ||
|
||
// Trigger file creation by setting version check time | ||
timestamp := time.Now().UnixMilli() | ||
err = SetLatestVersionCheckTime(timestamp) | ||
if err != nil { | ||
t.Fatalf("Failed to set LatestVersionCheckTime: %v", err) | ||
} | ||
|
||
// Verify the persistence file was created | ||
_, err = os.Stat(persistenceFilePath) | ||
if os.IsNotExist(err) { | ||
t.Fatalf("Expected file to exist, but it does not: %v", err) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters