]> git.ozlabs.org Git - patchwork/blobdiff - apps/patchwork/bin/pwclient
pwclient: lookup patch_id given Message-Id
[patchwork] / apps / patchwork / bin / pwclient
index 9d8cad994d49b217884bb175c64b2773eaa6c391..958861581815ca64094691cb8623383aa785ed76 100755 (executable)
@@ -111,6 +111,7 @@ def usage():
     sys.stderr.write("Where <action> is one of:\n")
     sys.stderr.write(
 """        apply <ID>    : Apply a patch (in the current dir, using -p1)
+        git-am <ID>   : Apply a patch to current git branch using "git am"
         get <ID>      : Download a patch and save it locally
         projects      : List all projects
         states        : Show list of potential patch states
@@ -126,7 +127,8 @@ def usage():
         -p <project>  : Filter by project name (see 'projects' for list)
         -w <who>      : Filter by submitter (name, e-mail substring search)
         -d <who>      : Filter by delegate (name, e-mail substring search)
-        -n <max #>    : Restrict number of results\n""")
+        -n <max #>    : Restrict number of results
+        -m <messageid>: Filter by Message-Id\n""")
     sys.stderr.write("""\nActions that take an ID argument can also be \
 invoked with:
         -h <hash>     : Lookup by patch hash\n""")
@@ -250,18 +252,25 @@ def action_get(rpc, patch_id):
         sys.stderr.write("Failed to write to %s\n" % fname)
         sys.exit(1)
 
-def action_apply(rpc, patch_id):
+def action_apply(rpc, patch_id, apply_cmd=None):
     patch = rpc.patch_get(patch_id)
     if patch == {}:
         sys.stderr.write("Error getting information on patch ID %d\n" % \
                          patch_id)
         sys.exit(1)
-    print "Applying patch #%d to current directory" % patch_id
+
+    if apply_cmd is None:
+      print "Applying patch #%d to current directory" % patch_id
+      apply_cmd = ['patch', '-p1']
+    else:
+      print "Applying patch #%d using %s" % (
+          patch_id, repr(' '.join(apply_cmd)))
+
     print "Description: %s" % patch['name']
     s = rpc.patch_get_mbox(patch_id)
     if len(s) > 0:
-        proc = subprocess.Popen(['patch', '-p1'], stdin = subprocess.PIPE)
-        proc.communicate(s)
+        proc = subprocess.Popen(apply_cmd, stdin = subprocess.PIPE)
+        proc.communicate(unicode(s).encode('utf-8'))
     else:
         sys.stderr.write("Error: No patch content found\n")
         sys.exit(1)
@@ -311,7 +320,7 @@ auth_actions = ['update']
 
 def main():
     try:
-        opts, args = getopt.getopt(sys.argv[2:], 's:p:w:d:n:c:h:')
+        opts, args = getopt.getopt(sys.argv[2:], 's:p:w:d:n:c:h:m:')
     except getopt.GetoptError, err:
         print str(err)
         usage()
@@ -329,6 +338,7 @@ def main():
     commit_str = ""
     state_str = ""
     hash_str = ""
+    msgid_str = ""
     url = DEFAULT_URL
 
     config = ConfigParser.ConfigParser()
@@ -354,6 +364,8 @@ def main():
             commit_str = value
         elif name == '-h':
             hash_str = value
+        elif name == '-m':
+            msgid_str = value
         elif name == '-n':
             try:
                 filt.add("max_count", int(value))
@@ -392,6 +404,9 @@ def main():
     if state_str:
         filt.add("state", state_str)
 
+    if msgid_str:
+        filt.add("msgid", msgid_str)
+
     try:
         rpc = xmlrpclib.Server(url, transport = transport)
     except:
@@ -446,6 +461,15 @@ def main():
 
         action_apply(rpc, patch_id)
 
+    elif action == 'git-am':
+        try:
+            patch_id = patch_id or int(args[0])
+        except:
+            sys.stderr.write("Invalid patch ID given\n")
+            sys.exit(1)
+
+        action_apply(rpc, patch_id, ['git', 'am'])
+
     elif action == 'update':
         try:
             patch_id = patch_id or int(args[0])