forked from tangled.org/core
Monorepo for Tangled

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
··· 453 breadcrumbs = append(breadcrumbs, []string{elem, fmt.Sprintf("%s/%s", breadcrumbs[idx][1], elem)}) 454 } 455 } 456 - 457 showRendered := false 458 renderToggle := false 459 ··· 461 renderToggle = true 462 showRendered = r.URL.Query().Get("code") != "true" 463 } 464 - 465 user := s.auth.GetUser(r) 466 s.pages.RepoBlob(w, pages.RepoBlobParams{ 467 LoggedInUser: user, ··· 1698 1699 forkName := fmt.Sprintf("%s", f.RepoName) 1700 1701 existingRepo, err := db.GetRepo(s.db, user.Did, f.RepoName) 1702 - if err == nil && existingRepo != nil { 1703 forkName = fmt.Sprintf("%s-%s", forkName, randomString(3)) 1704 } 1705 - 1706 secret, err := db.GetRegistrationKey(s.db, knot) 1707 if err != nil { 1708 s.pages.Notice(w, "repo", fmt.Sprintf("No registration key found for knot %s.", knot)) ··· 1711 1712 client, err := NewSignedClient(knot, secret, s.config.Dev) 1713 if err != nil { 1714 - s.pages.Notice(w, "repo", "Failed to connect to knot server.") 1715 return 1716 } 1717 ··· 1721 } else { 1722 uri = "https" 1723 } 1724 - sourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, knot, f.OwnerDid(), f.RepoName) 1725 sourceAt := f.RepoAt.String() 1726 1727 rkey := s.TID()
··· 453 breadcrumbs = append(breadcrumbs, []string{elem, fmt.Sprintf("%s/%s", breadcrumbs[idx][1], elem)}) 454 } 455 } 456 + 457 showRendered := false 458 renderToggle := false 459 ··· 461 renderToggle = true 462 showRendered = r.URL.Query().Get("code") != "true" 463 } 464 + 465 user := s.auth.GetUser(r) 466 s.pages.RepoBlob(w, pages.RepoBlobParams{ 467 LoggedInUser: user, ··· 1698 1699 forkName := fmt.Sprintf("%s", f.RepoName) 1700 1701 + // this check is *only* to see if the forked repo name already exists 1702 + // in the user's account. 1703 existingRepo, err := db.GetRepo(s.db, user.Did, f.RepoName) 1704 + if err != nil { 1705 + if errors.Is(err, sql.ErrNoRows) { 1706 + // no existing repo with this name found, we can use the name as is 1707 + } else { 1708 + log.Println("error fetching existing repo from db", err) 1709 + s.pages.Notice(w, "repo", "Failed to fork this repository. Try again later.") 1710 + return 1711 + } 1712 + } else if existingRepo != nil { 1713 + // repo with this name already exists, append random string 1714 forkName = fmt.Sprintf("%s-%s", forkName, randomString(3)) 1715 } 1716 secret, err := db.GetRegistrationKey(s.db, knot) 1717 if err != nil { 1718 s.pages.Notice(w, "repo", fmt.Sprintf("No registration key found for knot %s.", knot)) ··· 1721 1722 client, err := NewSignedClient(knot, secret, s.config.Dev) 1723 if err != nil { 1724 + s.pages.Notice(w, "repo", "Failed to reach knot server.") 1725 return 1726 } 1727 ··· 1731 } else { 1732 uri = "https" 1733 } 1734 + sourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, f.Knot, f.OwnerDid(), f.RepoName) 1735 sourceAt := f.RepoAt.String() 1736 1737 rkey := s.TID()