Merge pull request #4 from agorararmard/rid-off-shell-calls

Remove unnecessary shell calls and reduce reliance on shell calls.
diff --git a/modules-pr-backporter/library_multi_pull_requests.py b/modules-pr-backporter/library_multi_pull_requests.py
index 012a2a4..eef3574 100644
--- a/modules-pr-backporter/library_multi_pull_requests.py
+++ b/modules-pr-backporter/library_multi_pull_requests.py
@@ -18,7 +18,8 @@
 import os
 import subprocess
 import sys
-from library_submodules import run
+import urllib3
+import requests
 from library_submodules import reset_branches
 from library_submodules import label_exists
 from library_submodules import get_git_root
@@ -46,32 +47,41 @@
     git_root = get_git_root()
 
     git_fetch(git_root)
-    prs_open_url = \
-        'https://api.github.com/repos/{0}/pulls?state=open'.format(repo_name)
-    curl_grep = \
-        "curl -sS {0} | grep -o -E 'pull/[[:digit:]]+'".format(prs_open_url)
-    comp_cmd = "{0} | sed 's/pull\\///g' | sort | uniq".format(curl_grep)
-    all_open_pull_requests = subprocess.check_output(
-        comp_cmd, shell=True).decode('utf-8').split()
-
+    r = requests.get(
+        'https://api.github.com/repos/{0}/pulls?state=open'.format(
+            repo_name))
+    all_open_pull_requests = \
+        sorted(list(set([str(item['number']) for item in r.json()])))
+    pr_hash_list = subprocess.check_output(
+        "git ls-remote origin 'pull/*/head'",
+        shell=True).decode('utf-8').split('\n')
     print("All Open Pull Requests: ", all_open_pull_requests)
     library_clean_submodules(all_open_pull_requests)
     for pull_request_id in all_open_pull_requests:
         print()
         print("Processing:", str(pull_request_id))
         print('-'*20, flush=True)
-        commit_hash = subprocess.check_output(
-            "git ls-remote origin 'pull/*/head'| grep 'pull/{0}/head'".format(
-                pull_request_id) +
-            " | tail -1 | awk '{ print $1F }'",
-            shell=True).decode('utf-8')
+        commit_hash = ''
+        for pr_hash in pr_hash_list:
+            if 'pull/{0}/head'.format(pull_request_id) in pr_hash:
+                commit_hash = pr_hash.split()[0]
+                break
+        print("head commit hash: ", commit_hash)
         print()
         print("Getting Patch")
         print()
-        run('wget https://github.com/{0}/pull/{1}.patch'
-            .format(repo_name, pull_request_id))
-        run('mv {0}.patch {1}/'.format(pull_request_id, external_path))
+        http = urllib3.PoolManager()
+        patch_request = \
+            http.request('GET',
+                         'https://github.com/{0}/pull/{1}.patch'
+                         .format(repo_name, pull_request_id))
+        if patch_request.status != 200:
+            print('Unable to get patch. Skipping...')
+            continue
+
         patchfile = '{0}/{1}.patch'.format(external_path, pull_request_id)
+        with open(patchfile, 'w') as f:
+            f.write(patch_request.data.decode('utf-8'))
         print("Will try to apply: ", patchfile)
 
         if library_patch_submodules(
diff --git a/modules-pr-backporter/library_patch_submodules.py b/modules-pr-backporter/library_patch_submodules.py
index 10da33b..a737697 100644
--- a/modules-pr-backporter/library_patch_submodules.py
+++ b/modules-pr-backporter/library_patch_submodules.py
@@ -34,12 +34,12 @@
 
 GH_PULLREQUEST_NAMESPACE = 'pullrequest/temp/{pr_id}/{seq_id}/{branch}'
 
+
 def library_patch_submodules(
         patchfile, pull_request_id, repo_name, access_token, commit_hash):
 
     assert os.path.exists(patchfile), patchfile
     assert os.path.isfile(patchfile), patchfile
-    assert pull_request_id.isdigit(), pull_request_id
 
     print()
     print()
@@ -95,7 +95,9 @@
     if old_git_sequence != -1:
         old_pr_branch = \
             GH_PULLREQUEST_NAMESPACE.format(
-                pr_id=pull_request_id, seq_id=old_git_sequence, branch='master')
+                pr_id=pull_request_id,
+                seq_id=old_git_sequence,
+                branch='master')
         git('checkout {0}'.format(old_pr_branch), git_root)
         internal_patch = subprocess.check_output(
             'git diff {0}..master'.format(old_pr_branch),