Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

knotserver: state: Sync fork without fast-forward checks

authored by

BrookJeynes and committed by
Tangled
8b6482d2 7aa0e09f

+97 -1
+20
appview/knotclient/signer.go
··· 106 106 return s.client.Do(req) 107 107 } 108 108 109 + func (s *SignedClient) SyncRepoFork(ownerDid, source, name, branch string) (*http.Response, error) { 110 + const ( 111 + Method = "POST" 112 + ) 113 + endpoint := fmt.Sprintf("/repo/fork/sync/%s", branch) 114 + 115 + body, _ := json.Marshal(map[string]any{ 116 + "did": ownerDid, 117 + "source": source, 118 + "name": name, 119 + }) 120 + 121 + req, err := s.newRequest(Method, endpoint, body) 122 + if err != nil { 123 + return nil, err 124 + } 125 + 126 + return s.client.Do(req) 127 + } 128 + 109 129 func (s *SignedClient) ForkRepo(ownerDid, source, name string) (*http.Response, error) { 110 130 const ( 111 131 Method = "POST"
+76 -1
appview/state/repo.go
··· 121 121 emails := uniqueEmails(commitsTrunc) 122 122 123 123 user := s.oauth.GetUser(r) 124 + repoInfo := f.RepoInfo(s, user) 125 + 126 + secret, err := db.GetRegistrationKey(s.db, f.Knot) 127 + if err != nil { 128 + log.Printf("failed to get registration key for %s: %s", f.Knot, err) 129 + s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.") 130 + } 131 + 132 + // update the hidden tracking branch to latest 133 + signedClient, err := knotclient.NewSignedClient(f.Knot, secret, s.config.Core.Dev) 134 + if err != nil { 135 + log.Printf("failed to create signed client for %s: %s", f.Knot, err) 136 + s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.") 137 + } 138 + 139 + newHiddenRefResp, err := signedClient.NewHiddenRef(user.Did, repoInfo.Name, f.Ref, f.Ref) 140 + if err != nil || newHiddenRefResp.StatusCode != http.StatusNoContent { 141 + log.Printf("failed to update tracking branch: %s", err) 142 + s.pages.Notice(w, "resubmit-error", "Failed to create pull request. Try again later.") 143 + } 144 + 145 + hiddenRef := fmt.Sprintf("hidden/%s/%s", f.Ref, f.Ref) 146 + comparison, err := us.Compare(user.Did, repoInfo.Name, f.Ref, hiddenRef) 147 + if err != nil { 148 + log.Printf("failed to compare branches: %s", err) 149 + s.pages.Notice(w, "resubmit-error", err.Error()) 150 + } 151 + log.Println(comparison) 152 + 124 153 s.pages.RepoIndexPage(w, pages.RepoIndexParams{ 125 154 LoggedInUser: user, 126 - RepoInfo: f.RepoInfo(s, user), 155 + RepoInfo: repoInfo, 127 156 TagMap: tagMap, 128 157 RepoIndexResponse: result, 129 158 CommitsTrunc: commitsTrunc, ··· 1830 1801 } 1831 1802 1832 1803 s.pages.HxLocation(w, fmt.Sprintf("/%s/issues/%d", f.OwnerSlashRepo(), issueId)) 1804 + return 1805 + } 1806 + } 1807 + 1808 + func (s *State) SyncRepoFork(w http.ResponseWriter, r *http.Request) { 1809 + user := s.auth.GetUser(r) 1810 + f, err := s.fullyResolvedRepo(r) 1811 + if err != nil { 1812 + log.Printf("failed to resolve source repo: %v", err) 1813 + return 1814 + } 1815 + 1816 + params := r.URL.Query() 1817 + knot := params.Get("knot") 1818 + branch := params.Get("branch") 1819 + 1820 + switch r.Method { 1821 + case http.MethodPost: 1822 + secret, err := db.GetRegistrationKey(s.db, knot) 1823 + if err != nil { 1824 + s.pages.Notice(w, "repo", fmt.Sprintf("No registration key found for knot %s.", knot)) 1825 + return 1826 + } 1827 + 1828 + client, err := NewSignedClient(knot, secret, s.config.Dev) 1829 + if err != nil { 1830 + s.pages.Notice(w, "repo", "Failed to reach knot server.") 1831 + return 1832 + } 1833 + 1834 + var uri string 1835 + if s.config.Dev { 1836 + uri = "http" 1837 + } else { 1838 + uri = "https" 1839 + } 1840 + forkName := fmt.Sprintf("%s", f.RepoName) 1841 + forkSourceUrl := fmt.Sprintf("%s://%s/%s/%s", uri, f.Knot, f.OwnerDid(), f.RepoName) 1842 + 1843 + _, err = client.SyncRepoFork(user.Did, forkSourceUrl, forkName, branch) 1844 + if err != nil { 1845 + s.pages.Notice(w, "repo", "Failed to sync repository fork.") 1846 + return 1847 + } 1848 + 1849 + s.pages.HxRefresh(w) 1833 1850 return 1834 1851 } 1835 1852 }
+1
appview/state/router.go
··· 113 113 r.Use(middleware.AuthMiddleware(s.oauth)) 114 114 r.Get("/", s.ForkRepo) 115 115 r.Post("/", s.ForkRepo) 116 + r.Post("/sync", s.SyncRepoFork) 116 117 }) 117 118 118 119 r.Route("/pulls", func(r chi.Router) {