refactor(pull_requests): make sure the PR compare diff is correct@@ -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,
},
@@ -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",
+ },
}
);