refactor(pull_requests): make sure the PR compare diff is correct
+ 78
- 12
app/controllers/repository/getRepositoryPullRequestCreateView.ts
@@ -111,11 +111,16 @@ const getRepositoryPullRequestCreateView: ReqHandler = async (
       },
     };
   } else {
-    let target: RepositoryPullRequestTarget = {
+    let source: RepositoryPullRequestTarget = {
       branch: from_branch,
       parentOrg,
       repo,
     };
+    let target: RepositoryPullRequestTarget = {
+      branch: Const.PRIMARY_BRANCH_REF,
+      parentOrg,
+      repo,
+    };
 
     const orgRepoBranchRegExp = /^([\w\-_\.]+)\/([\w\-_\.]+)@(.*)/i;
     const matches = from_branch.match(orgRepoBranchRegExp);

...
@@ -149,11 +154,7 @@ const getRepositoryPullRequestCreateView: ReqHandler = async (
       variant = {
         state: PullRequestFormState.COMPARE,
         data: {
-          source: {
-            branch: Const.PRIMARY_BRANCH_REF,
-            parentOrg,
-            repo,
-          },
+          source,
           target,
           fileDiffs,
         },

app/services/repository/getRepositoryRemoteRefDiff.ts
@@ -90,11 +90,33 @@ const makeGetRepositoryRemoteRefDiff: ServiceMethodFactory<
     let isTargetRemoteSetup = false;
 
     try {
-      // - gitAddSourceRemoteInTargetRepoProcess
-      spawn("git", ["remote", "add", sourceRemoteName, sourceRepoPath], {
-        cwd: targetRepoPath,
-      });
-      isTargetRemoteSetup = true;
+      const gitAddSourceRemoteInTargetRepoProcess = spawn(
+        "git",
+        ["remote", "add", sourceRemoteName, sourceRepoPath],
+        {
+          cwd: targetRepoPath,
+          env: {
+            LANG: "C",
+          },
+        }
+      );
+
+      const gitAddSourceRemoteInTargetRepoResult = await new Promise<string>(
+        (resolve, reject) => {
+          let buffer = [] as string[];
+          gitAddSourceRemoteInTargetRepoProcess.stdout.on("data", (data) =>
+            buffer.push(data)
+          );
+          gitAddSourceRemoteInTargetRepoProcess.stderr.on("data", (data) => {
+            reject(new Error(Buffer.from(data).toString("utf-8")));
+          });
+          gitAddSourceRemoteInTargetRepoProcess.stdout.on("close", () => {
+            resolve(buffer.join(""));
+          });
+        }
+      );
+
+      isTargetRemoteSetup = gitAddSourceRemoteInTargetRepoResult != null;
     } catch (err) {
       const error = err as Error;
       if (error.message.includes("already exists")) {

...
@@ -111,15 +133,58 @@ const makeGetRepositoryRemoteRefDiff: ServiceMethodFactory<
       return [];
     }
 
+    try {
+      const gitFetchSourceBranchInTargetRepoProcess = spawn(
+        "git",
+        ["fetch", sourceRemoteName],
+        {
+          cwd: targetRepoPath,
+          env: {
+            LANG: "C",
+          },
+        }
+      );
+
+      const gitFetchSourceBranchInTargetRepoResult = await new Promise<string>(
+        (resolve, reject) => {
+          let buffer = [] as string[];
+          gitFetchSourceBranchInTargetRepoProcess.stdout.on("data", (data) =>
+            buffer.push(data)
+          );
+          gitFetchSourceBranchInTargetRepoProcess.stderr.on("data", (data) => {
+            reject(new Error(Buffer.from(data).toString("utf-8")));
+          });
+          gitFetchSourceBranchInTargetRepoProcess.stdout.on("close", () => {
+            resolve(buffer.join(""));
+          });
+        }
+      );
+
+      isTargetRemoteSetup = gitFetchSourceBranchInTargetRepoResult != null;
+    } catch (err) {
+      isTargetRemoteSetup = false;
+      const error = err as Error;
+      console.warn(
+        `Could not fetch from remote "${sourceRemoteName}" in repository at: "${targetRepoPath}".\n\nError: ${error.message}`
+      );
+    }
+
+    if (isTargetRemoteSetup === false) {
+      return [];
+    }
+
     try {
       const gitDiffRefsProcess = spawn(
         "git",
         [
           "diff",
-          `${sourceRemoteName}/${sourceFromBranch}..${targetDestBranch}`,
+          `${targetDestBranch}..${sourceRemoteName}/${sourceFromBranch}`,
         ],
         {
           cwd: targetRepoPath,
+          env: {
+            LANG: "C",
+          },
         }
       );