1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
// Copyright The gittuf Authors
// SPDX-License-Identifier: Apache-2.0
package gitinterface
import (
"os"
"testing"
"github.com/stretchr/testify/assert"
)
func TestStatus(t *testing.T) {
tmpDir := t.TempDir()
repo := CreateTestGitRepository(t, tmpDir, false)
cwd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
if err := os.Chdir(tmpDir); err != nil {
t.Fatal(err)
}
defer os.Chdir(cwd) //nolint:errcheck
// NOTE: we don't use traditional methods like WriteBlob or TreeBuilder so
// we can more closely simulate user actions, such as with updating index,
// etc.
filename := "foo"
filename2 := "bar"
if err := os.WriteFile(filename, []byte("foo"), 0o644); err != nil { //nolint:gosec
t.Fatal(err)
}
statuses, err := repo.Status()
assert.Nil(t, err)
assert.Equal(t, map[string]FileStatus{filename: {X: StatusCodeUntracked, Y: StatusCodeUntracked}}, statuses)
// Add item to index
if _, err := repo.executor("add", filename).executeString(); err != nil {
t.Fatal(err)
}
statuses, err = repo.Status()
assert.Nil(t, err)
assert.Equal(t, map[string]FileStatus{filename: {X: StatusCodeAdded, Y: StatusCodeUnmodified}}, statuses)
// Modify file that has been staged
if err := os.WriteFile(filename, []byte("bar"), 0o644); err != nil { //nolint:gosec
t.Fatal(err)
}
statuses, err = repo.Status()
assert.Nil(t, err)
assert.Equal(t, map[string]FileStatus{filename: {X: StatusCodeAdded, Y: StatusCodeModified}}, statuses)
// Add and commit
if _, err := repo.executor("add", filename).executeString(); err != nil {
t.Fatal(err)
}
if _, err := repo.executor("commit", "-m", "Commit\n").executeString(); err != nil {
t.Fatal(err)
}
statuses, err = repo.Status()
assert.Nil(t, err)
assert.Empty(t, statuses)
// Modify file again
if err := os.WriteFile(filename, []byte("foo"), 0o644); err != nil { //nolint:gosec
t.Fatal(err)
}
statuses, err = repo.Status()
assert.Nil(t, err)
assert.Equal(t, map[string]FileStatus{filename: {X: StatusCodeModified, Y: StatusCodeUnmodified}}, statuses)
// Remove file
if err := os.Remove(filename); err != nil {
t.Fatal(err)
}
statuses, err = repo.Status()
assert.Nil(t, err)
assert.Equal(t, map[string]FileStatus{filename: {X: StatusCodeDeleted, Y: StatusCodeUnmodified}}, statuses)
// Commit
if _, err := repo.executor("add", filename).executeString(); err != nil {
t.Fatal(err)
}
if _, err := repo.executor("commit", "-m", "Commit\n", "--allow-empty").executeString(); err != nil {
t.Fatal(err)
}
statuses, err = repo.Status()
assert.Nil(t, err)
assert.Empty(t, statuses)
// Add two files, commit, then make one a symlink to the other
if err := os.WriteFile(filename, []byte("foo"), 0o644); err != nil { //nolint:gosec
t.Fatal(err)
}
if err := os.WriteFile(filename2, []byte("foo"), 0o644); err != nil { //nolint:gosec
t.Fatal(err)
}
if _, err := repo.executor("add", filename, filename2).executeString(); err != nil {
t.Fatal(err)
}
if _, err := repo.executor("commit", "-m", "Commit\n").executeString(); err != nil {
t.Fatal(err)
}
statuses, err = repo.Status()
assert.Nil(t, err)
assert.Empty(t, statuses)
if err := os.Remove(filename2); err != nil {
t.Fatal(err)
}
if err := os.Symlink(filename, filename2); err != nil {
t.Fatal(err)
}
statuses, err = repo.Status()
assert.Nil(t, err)
assert.Equal(t, map[string]FileStatus{filename2: {X: StatusCodeTypeChanged, Y: StatusCodeUnmodified}}, statuses)
// Add and commit
if _, err := repo.executor("add", filename2).executeString(); err != nil {
t.Fatal(err)
}
if _, err := repo.executor("commit", "-m", "Commit\n").executeString(); err != nil {
t.Fatal(err)
}
statuses, err = repo.Status()
assert.Nil(t, err)
assert.Empty(t, statuses)
}
|