-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcommit.go
More file actions
146 lines (135 loc) · 3.73 KB
/
commit.go
File metadata and controls
146 lines (135 loc) · 3.73 KB
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
142
143
144
145
146
package main
import(
"os"
"strconv"
"crypto/sha1"
"encoding/hex"
"compress/zlib"
"bytes"
"path/filepath"
"fmt"
"time"
"strings"
"errors"
)
func content(commit *Commit)[]byte{
s1 := "tree" + " " + commit.parent_tree + "\n"
var s2 string
if len(commit.parents) >= 1{
for _, entry := range commit.parents{
data := "parent" + " " + entry + "\n"
s2 += data
}
}else{
s2 = ""
}
s3 := "author" + " " + commit.Author.Username + " " + "<"+ commit.Author.Useremail + ">"+ " " + commit.Author.EventDate.String() + "\n"
s4 := "committer" + " " + commit.Author.Username + " " + "<"+ commit.Author.Useremail + ">" + " " + commit.Author.EventDate.String() + "\n"
s5 := "\n"
s6 := commit.message + "\n"
var buffer []byte
buffer = append(buffer, s1...)
buffer = append(buffer, s2...)
buffer = append(buffer, s3...)
buffer = append(buffer, s4...)
buffer = append(buffer, s5...)
buffer = append(buffer, s6...)
return buffer
}
func Header_commit(commit *Commit)[]byte{
s1 := "commit"
s2 := " "
s3 := strconv.Itoa(len(content(commit)))
s4 := "\000"
var buffer []byte
buffer = append(buffer, s1...)
buffer = append(buffer, s2...)
buffer = append(buffer, s3...)
buffer = append(buffer, s4...)
return buffer
}
func get_data(commit *Commit)[]byte{
var data []byte
data = append(data, Header_commit(commit)...)
data = append(data, content(commit)...)
return data
}
func Sha1_commit(commit *Commit)string{//generating the sha-1 commit id.
data := get_data(commit)
hash := sha1.Sum(data)
str := hex.EncodeToString(hash[:])
return str
}
func Compression_commit(data []byte)[]byte{//compressing the headered data to store as data into the objects directory
var b bytes.Buffer
w := zlib.NewWriter(&b)
w.Write(data)
w.Close()
return b.Bytes()
}
func insert_into_db(my_hash string, data []byte){//to insert the commit int the objects db
folder_name := FirstN(string(my_hash), 2)
file_name := LastN(string(my_hash), 2)
objDir := filepath.Join(".ugit", "objects", folder_name)
os.MkdirAll(objDir, 0755)
objPath := filepath.Join(objDir, file_name)
compressed := Compression_commit(data)
os.WriteFile(objPath, compressed, 0444)
}
func get_info()*User{//to retrieve the user infos
var username string
var usermail string
fmt.Print("Enter your UserName: ")
fmt.Scanln(&username)
fmt.Print("Enter your email address: ")
fmt.Scanln(&usermail)
new_user := User{
Username : username,
Useremail : usermail,
EventDate : time.Now(),
}
return &new_user
}
func get_parent()(string,int){// a function to return the sha-1 id of the parent commit
data, err := os.ReadFile(".ugit/refs/heads/main") //read the refs/heads/main
if err != nil {
return "", 0
}
trimmedData := strings.TrimSpace(string(data))
return trimmedData, 1
}
func ugit_commit(input_message string){
var parents_list []string
parent_tree_id := Ugit_write_tree()
user_info := get_info()
parent, exists := get_parent()
if exists == 1{
parents_list = append(parents_list, parent)
}else{
}
new_commit := Commit{
Author : user_info,
parent_tree : parent_tree_id,
parents : parents_list,
message : input_message,
}
id := Sha1_commit(&new_commit)
new_commit.Commit_ID = id
data := get_data(&new_commit)
insert_into_db(id, data)
//-------commit object created succesfully.-----------
//writing to the refs/heads/main
objDir := filepath.Join(".ugit", "refs", "heads")
objPath := filepath.Join(objDir, "main")
_, err := os.Stat(objPath)
if errors.Is(err, os.ErrNotExist) {
os.MkdirAll(objDir, 0755) // File does not exist
}
content := []byte(id)
err = os.WriteFile(objPath, content, 0644)
if err != nil {
fmt.Println("CRITICAL ERROR: Could not write main ref:", err)
return // Stop here so we don't lie to the user
}
fmt.Println("Commit created succesfully")
}