Shell of commit command
[mw] / src / mw / clicommands.py
index 1d5f5c8589173e5a4e7bdf91a279d072e424e7c0..fd5e69cdd05dc709a696e0ce08bf4db39bf7d3bb 100644 (file)
@@ -1,6 +1,6 @@
 ###
 # mw - VCS-like nonsense for MediaWiki websites
-# Copyright (C) 2009  Ian Weller <ian@ianweller.org>
+# Copyright (C) 2010  Ian Weller <ian@ianweller.org>
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -23,20 +23,24 @@ from optparse import OptionParser, OptionGroup
 import os
 import sys
 
+
 class CommandBase(object):
+
     def __init__(self, name, description, usage=None):
         self.me = os.path.basename(sys.argv[0])
         self.description = description
         if usage is None:
             usage = '%prog ' + name
+        else:
+            usage = '%%prog %s %s' % (name, usage)
         self.parser = OptionParser(usage=usage, description=description)
         self.name = name
         self.metadir = mw.metadir.Metadir()
-        global_options = OptionGroup(self.parser, "Global Options")
-        global_options.add_option('-u', '--use-auth', action='store_true',
-                                  dest='use_auth', help='force authentication '
-                                  'even if not required')
-        self.parser.add_option_group(global_options)
+        #global_options = OptionGroup(self.parser, "Global Options")
+        #global_options.add_option('-u', '--use-auth', action='store_true',
+        #                          dest='use_auth', help='force authentication '
+        #                          'even if not required')
+        #self.parser.add_option_group(global_options)
         self.shortcuts = []
 
     def main(self):
@@ -44,9 +48,17 @@ class CommandBase(object):
         self.args = self.args[1:] # don't need the first thing
         self._do_command()
 
+    def _do_command(self):
+        pass
+
     def _login(self):
         user = raw_input('Username: ')
         passwd = getpass.getpass()
+        result = self.api.call({'action': 'login',
+                                'lgname': user,
+                                'lgpassword': passwd})
+        if result['login']['result'] != 'Success':
+            raise Exception('Login error: %s' % result['login']['result'])
 
     def _die_if_no_init(self):
         if self.metadir.config is None:
@@ -59,30 +71,33 @@ class CommandBase(object):
 
 
 class InitCommand(CommandBase):
+
     def __init__(self):
-        usage = '%prog init API_URL'
+        usage = 'API_URL'
         CommandBase.__init__(self, 'init', 'start a mw repo', usage)
+        self.parser.add_option('-u', '--username', dest='username',
+                               help='use wiki with login')
 
     def _do_command(self):
         if len(self.args) < 1:
             self.parser.error('must have URL to remote api.php')
         elif len(self.args) > 1:
             self.parser.error('too many arguments')
-        self.metadir.create(self.args[0])
+        self.metadir.create(self.args[0], self.options.username)
+
 
+class PullCommand(CommandBase):
 
-class FetchCommand(CommandBase):
     def __init__(self):
-        usage = '%prog fetch [options] PAGENAME ...'
-        CommandBase.__init__(self, 'fetch', 'fetch remote pages', usage)
-        self.shortcuts.append('ft')
+        usage = '[options] PAGENAME ...'
+        CommandBase.__init__(self, 'pull', 'add remote pages to repo', usage)
 
     def _do_command(self):
         self._die_if_no_init()
         self._api_setup()
         pages = []
         pages += self.args
-        for these_pages in [pages[i:i+25] for i in range(0, len(pages), 25)]:
+        for these_pages in [pages[i:i + 25] for i in range(0, len(pages), 25)]:
             data = {
                     'action': 'query',
                     'titles': '|'.join(these_pages),
@@ -96,11 +111,50 @@ class FetchCommand(CommandBase):
                     print '%s: %s: page does not exist, file not created' % \
                             (self.me, pagename)
                     continue
-                revid = [x['revid'] for x in response[pageid]['revisions']]
-                self.metadir.pagedict_add(pagename, int(pageid))
-                self.metadir.pages_add_rev(int(pageid),
-                                           response[pageid]['revisions'][0])
+                revids = [x['revid'] for x in response[pageid]['revisions']]
+                revids.sort()
+                self.metadir.pagedict_add(pagename, pageid, revids[-1])
+                self.metadir.pages_add_rv(int(pageid),
+                                          response[pageid]['revisions'][0])
                 filename = mw.api.pagename_to_filename(pagename)
                 fd = file(os.path.join(self.metadir.root, filename + '.wiki'),
                           'w')
                 fd.write(response[pageid]['revisions'][0]['*'].encode('utf-8'))
+
+
+class StatusCommand(CommandBase):
+
+    def __init__(self):
+        CommandBase.__init__(self, 'status', 'check repo status')
+        self.shortcuts.append('st')
+
+    def _do_command(self):
+        self._die_if_no_init()
+        status = self.metadir.working_dir_status()
+        for file in status:
+            print '%s %s' % (status[file], file)
+
+
+class DiffCommand(CommandBase):
+
+    def __init__(self):
+        CommandBase.__init__(self, 'diff', 'diff wiki to working directory')
+
+    def _do_command(self):
+        self._die_if_no_init()
+        status = self.metadir.working_dir_status()
+        for file in status:
+            if status[file] == 'U':
+                print self.metadir.diff_rv_to_working(
+                    mw.api.filename_to_pagename(file[:-5])
+                ),
+
+
+class CommitCommand(CommandBase):
+
+    def __init__(self):
+        CommandBase.__init__(self, 'commit', 'commit changes to wiki')
+
+    def _do_command(self):
+        self._die_if_no_init()
+        self._api_setup()

Benjamin Mako Hill || Want to submit a patch?