[haiku-commits] r33695 - haiku/trunk/src/bin

  • From: revol@xxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 21 Oct 2009 12:05:48 +0200 (CEST)

Author: mmu_man
Date: 2009-10-21 12:05:47 +0200 (Wed, 21 Oct 2009)
New Revision: 33695
Changeset: http://dev.haiku-os.org/changeset/33695/haiku

Added:
   haiku/trunk/src/bin/checkitout.cpp
   haiku/trunk/src/bin/checkitout.h
   haiku/trunk/src/bin/checkitout.rdef
Log:
Introducing CheckItOut: a small urlwrapper spin-off that handles SCM urls and 
checks them out for you where you want them.
Supports git: for now.


Added: haiku/trunk/src/bin/checkitout.cpp
===================================================================
--- haiku/trunk/src/bin/checkitout.cpp                          (rev 0)
+++ haiku/trunk/src/bin/checkitout.cpp  2009-10-21 10:05:47 UTC (rev 33695)
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2007-2009 Haiku Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ * Authors:
+ *             François Revol, revol@xxxxxxx
+ *             Jonas Sundström, jonas@xxxxxxxxxxx
+ */
+
+/*
+ * CheckItOut: wraps URL mime types around command line apps
+ * or other apps that don't handle them directly.
+ */
+#define DEBUG 1
+
+#include <ctype.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <Alert.h>
+#include <Debug.h>
+#include <FilePanel.h>
+#include <NodeInfo.h>
+#include <Path.h>
+#include <Roster.h>
+#include <String.h>
+#include <Url.h>
+
+#include "checkitout.h"
+
+
+const char* kAppSig = "application/x-vnd.Haiku-checkitout";
+const char* kTrackerSig = "application/x-vnd.Be-TRAK";
+const char* kTerminalSig = "application/x-vnd.Haiku-Terminal";
+
+
+CheckItOut::CheckItOut() : BApplication(kAppSig)
+{
+}
+
+
+CheckItOut::~CheckItOut()
+{
+}
+
+
+status_t
+CheckItOut::_Warn(const char* url)
+{
+       BString message("An application has requested the system to open the "
+               "following url: \n");
+       message << "\n" << url << "\n\n";
+       message << "This type of URL has a potential security risk.\n";
+       message << "Proceed anyway?";
+       BAlert* alert = new BAlert("Warning", message.String(), "Proceed", 
"Stop", NULL,
+               B_WIDTH_AS_USUAL, B_WARNING_ALERT);
+       int32 button;
+       button = alert->Go();
+       if (button == 0)
+               return B_OK;
+               
+       return B_ERROR;
+}
+
+
+status_t
+CheckItOut::_FilePanel(uint32 nodeFlavors, BString &name)
+{
+       BFilePanel *panel = new BFilePanel(B_SAVE_PANEL);
+       /*
+                       BMessenger* target = NULL, const entry_ref* directory = 
NULL,
+                       uint32 nodeFlavors = 0, bool allowMultipleSelection = 
true,
+                       BMessage* message = NULL, BRefFilter* refFilter = NULL,
+                       bool modal = false, bool hideWhenDone = true);
+       */
+       panel->Window()->SetTitle("Check It Out to...");
+       panel->SetSaveText(name);
+       panel->Show();
+       return B_OK;
+}
+
+
+void
+CheckItOut::RefsReceived(BMessage* msg)
+{
+}
+
+
+void
+CheckItOut::MessageReceived(BMessage* msg)
+{
+                       msg->PrintToStream();
+       switch (msg->what) {
+               case B_SAVE_REQUESTED:
+               {
+                       entry_ref ref;
+                       BString name;
+                       msg->FindRef("directory", &ref);
+                       msg->FindString("name", &name);
+                       _DoCheckItOut(&ref, name);
+                       break;
+               }
+               case B_CANCEL:
+                       Quit();
+                       break;
+       }
+}
+
+
+void
+CheckItOut::ArgvReceived(int32 argc, char** argv)
+{
+       if (argc <= 1)
+               return;
+       
+       BPrivate::Support::BUrl url(argv[1]);
+       fUrlString = url;
+
+       BString full = url.Full();
+       BString proto = url.Proto();
+       BString host = url.Host();
+       BString port = url.Port();
+       BString user = url.User();
+       BString pass = url.Pass();
+       BString path = url.Path();
+
+       if (url.InitCheck() < 0) {
+               fprintf(stderr, "malformed url: '%s'\n", url.String());
+               return;
+       }
+       
+       // XXX: debug
+       PRINT(("PROTO='%s'\n", proto.String()));
+       PRINT(("HOST='%s'\n", host.String()));
+       PRINT(("PORT='%s'\n", port.String()));
+       PRINT(("USER='%s'\n", user.String()));
+       PRINT(("PASS='%s'\n", pass.String()));
+       PRINT(("PATH='%s'\n", path.String()));
+
+       BString leaf(url.Path());
+       if (leaf.FindLast('/') > -1)
+               leaf.Remove(0, leaf.FindLast('/') + 1);
+       PRINT(("leaf %s\n", leaf.String()));
+       _FilePanel(B_DIRECTORY_NODE, leaf);
+
+}
+
+status_t
+CheckItOut::_DoCheckItOut(entry_ref *ref, const char *name)
+{
+       const char* failc = " || read -p 'Press any key'";
+       const char* pausec = " ; read -p 'Press any key'";
+       char* args[] = { (char *)"/bin/sh", (char *)"-c", NULL, NULL};
+
+       BPrivate::Support::BUrl url(fUrlString);
+       BString full = url.Full();
+       BString proto = url.Proto();
+       BString host = url.Host();
+       BString port = url.Port();
+       BString user = url.User();
+       BString pass = url.Pass();
+       BString path = url.Path();
+printf("url %s\n", url.String());
+       BPath refPath(ref);
+
+       if (proto == "git") {
+               BString cmd("git clone ");
+               cmd << url;
+               cmd << " '" << refPath.Path() << "/" << name << "'";
+               PRINT(("CMD='%s'\n", cmd.String()));
+               cmd << " && open '" << refPath.Path() << "/" << name << "'";
+               cmd << failc;
+               PRINT(("CMD='%s'\n", cmd.String()));
+               args[2] = (char*)cmd.String();
+               be_roster->Launch(kTerminalSig, 3, args);
+               return B_OK;
+       }
+       return B_OK;
+}
+
+
+status_t
+CheckItOut::_DecodeUrlString(BString& string)
+{
+       // TODO: check for %00 and bail out!
+       int32 length = string.Length();
+       int i;
+       for (i = 0; string[i] && i < length - 2; i++) {
+               if (string[i] == '%' && isxdigit(string[i+1])
+                       && isxdigit(string[i+2])) {
+                       int c;
+                       sscanf(string.String() + i + 1, "%02x", &c);
+                       string.Remove(i, 3);
+                       string.Insert((char)c, 1, i);
+                       length -= 2;
+               }
+       }
+       
+       return B_OK;
+}
+
+
+void
+CheckItOut::ReadyToRun(void)
+{
+       //Quit();
+}
+
+
+// #pragma mark
+
+
+int main(int argc, char** argv)
+{
+       CheckItOut app;
+       if (be_app)
+               app.Run();
+       return 0;
+}
+

Added: haiku/trunk/src/bin/checkitout.h
===================================================================
--- haiku/trunk/src/bin/checkitout.h                            (rev 0)
+++ haiku/trunk/src/bin/checkitout.h    2009-10-21 10:05:47 UTC (rev 33695)
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2007-2009 Haiku Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _CHECKITOUT_H
+#define _CHECKITOUT_H
+ 
+#include <Application.h>
+#include <String.h>
+
+
+class CheckItOut : public BApplication
+{
+public:
+                                                               CheckItOut();
+                                                               ~CheckItOut();
+
+       virtual void                            RefsReceived(BMessage* msg);
+       virtual void                            MessageReceived(BMessage* msg);
+       virtual void                            ArgvReceived(int32 argc, char** 
argv);
+       virtual void                            ReadyToRun(void);
+
+private:
+                       status_t                        _Warn(const char* url);
+                       status_t                        
_DecodeUrlString(BString& string);
+                       status_t                        _FilePanel(uint32 
nodeFlavors, BString &name);
+                       status_t                        _DoCheckItOut(entry_ref 
*ref, const char *name);
+
+       BString                                         fUrlString;
+};
+
+#endif // _CHECKITOUT_H
+

Added: haiku/trunk/src/bin/checkitout.rdef
===================================================================
--- haiku/trunk/src/bin/checkitout.rdef                         (rev 0)
+++ haiku/trunk/src/bin/checkitout.rdef 2009-10-21 10:05:47 UTC (rev 33695)
@@ -0,0 +1,11 @@
+resource app_signature "application/x-vnd.Haiku-checkitout";
+
+resource app_flags B_MULTIPLE_LAUNCH | B_BACKGROUND_APP;
+
+resource(1, "BEOS:FILE_TYPES") message
+{
+       "types" = "application/x-vnd.Be.URL.svn",
+       "types" = "application/x-vnd.Be.URL.svn+ssh",
+       "types" = "application/x-vnd.Be.URL.git"
+};
+


Other related posts:

  • » [haiku-commits] r33695 - haiku/trunk/src/bin - revol