forked from tangled.org/core
this repo has no description

appview: state: fix forking across knots

Turns out we were accidentally using the destination knot as the
sourceUrl, and git was understandably annoyed. This also improves the
error checking when fetching the existingRepo from the database to
verify the forkName won't clash.

Changed files
+16 -6
appview
state
+16 -6
appview/state/repo.go
···
breadcrumbs = append(breadcrumbs, []string{elem, fmt.Sprintf("%s/%s", breadcrumbs[idx][1], elem)})
}
}
-
+
showRendered := false
renderToggle := false
···
renderToggle = true
showRendered = r.URL.Query().Get("code") != "true"
}
-
+
user := s.auth.GetUser(r)
s.pages.RepoBlob(w, pages.RepoBlobParams{
LoggedInUser: user,
···
forkName := fmt.Sprintf("%s", f.RepoName)
+
// this check is *only* to see if the forked repo name already exists
+
// in the user's account.
existingRepo, err := db.GetRepo(s.db, user.Did, f.RepoName)
-
if err == nil && existingRepo != nil {
+
if err != nil {
+
if errors.Is(err, sql.ErrNoRows) {
+
// no existing repo with this name found, we can use the name as is
+
} else {
+
log.Println("error fetching existing repo from db", err)
+
s.pages.Notice(w, "repo", "Failed to fork this repository. Try again later.")
+
return
+
}
+
} else if existingRepo != nil {
+
// repo with this name already exists, append random string
forkName = fmt.Sprintf("%s-%s", forkName, randomString(3))
-
secret, err := db.GetRegistrationKey(s.db, knot)
if err != nil {
s.pages.Notice(w, "repo", fmt.Sprintf("No registration key found for knot %s.", knot))
···
client, err := NewSignedClient(knot, secret, s.config.Dev)
if err != nil {
-
s.pages.Notice(w, "repo", "Failed to connect to knot server.")
+
s.pages.Notice(w, "repo", "Failed to reach knot server.")
return
···
} else {
uri = "https"
-
sourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, knot, f.OwnerDid(), f.RepoName)
+
sourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, f.Knot, f.OwnerDid(), f.RepoName)
sourceAt := f.RepoAt.String()
rkey := s.TID()